Open In Colab

Analisis hidrologi dengan hidrokit

Buku (notebook) ini mendemonstrasikan analisis hidrologi menggunakan python dan paket hidrokit sebagai alternatif dari penggunaan spreadsheet (Excel). Dataset yang digunakan merupakan dataset sembarang dengan nama sembarang. Kunjungi notebook manual untuk referensi lebih lanjut mengenai fungsi yang digunakan. Buku ini hanya untuk memeragakan penggunaan modul pada paket hidrokit sehingga kekeliruan teori/konsep mohon diabaikan.

Buku ini memeragakan:

  • Mengambil dataset harian dari berkas excel yang menggunakan template hidrokit. (hk88)
  • Mengolah data dari berkas excel BMKG. (hk73)
  • Menghitung curah hujan rerata dengan metode poligon thiessen (berdasarkan luas area yang telah diketahui). (hk99)
  • Merekap data harian menjadi bulanan, 2 periode, dan 4 hari. (hk98)
  • Perhitungan evapotranspirasi dengan 3 rumus yaitu Blaney-Criddle, Radiasi, dan Penman. (hk106)
  • Pemodelan FJ Mock dan NRECA. (hk96, hk89)
  • Menghitung debit andal (kurva durasi). (hk87)
  • Mencari parameter model terbaik berdasarkan metrik NSE. (hk90)

Catatan

TAHAP 0: PERSIAPAN DAN DATASET

Pengaturan Buku

In [ ]:
print(':: MEMERIKSA PAKET HIDROKIT')
try:
    import hidrokit
except ModuleNotFoundError:
    print(':: INSTALASI PAKET HIDROKIT')
    !pip install hidrokit -q
    import hidrokit
:: MEMERIKSA PAKET HIDROKIT
:: INSTALASI PAKET HIDROKIT

menggunakan paket HydroErr yang telah dikembangkan oleh BYU-Hydroinformatics (situs) untuk metrik evaluasi model hidrologi.

In [ ]:
print(':: MEMERIKSA PAKET HYDROERR')
try:
    import HydroErr
except ModuleNotFoundError:
    print(':: INSTALASI PAKET HYDROERR')
    !pip install HydroErr -q
    import HydroErr
:: MEMERIKSA PAKET HYDROERR
:: INSTALASI PAKET HYDROERR
  Building wheel for HydroErr (setup.py) ... done
In [ ]:
def _check_system(PACKAGE_LIST='numpy pandas matplotlib'):
    from pkg_resources import get_distribution
    from sys import version_info

    print(':: INFORMASI VERSI SISTEM')
    print(':: {:>12s} version: {:<10s}'.format(
            'python', 
            '{}.{}.{}'.format(*version_info[:3]))
        )
    for package in PACKAGE_LIST.split():
        print(':: {:>12s} version: {:<10s}'.format(
            package, 
            get_distribution(package).version)
        )

_check_system('numpy pandas matplotlib hydroerr hidrokit')
:: INFORMASI VERSI SISTEM
::       python version: 3.6.9     
::        numpy version: 1.17.5    
::       pandas version: 0.25.3    
::   matplotlib version: 3.1.3     
::     hydroerr version: 1.24      
::     hidrokit version: 0.3.5     
In [ ]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

pd.options.display.float_format = '{:.5f}'.format

print(':: IMPORT LIBRARY (NUMPY, PANDAS, MATPLOTLIB)')
:: IMPORT LIBRARY (NUMPY, PANDAS, MATPLOTLIB)

Dataset

In [ ]:
URL_DEBIT = 'https://taruma.github.io/assets/hidrokit_dataset/hidrokit_poc_demo_debit.xlsx'
URL_HUJAN = 'https://taruma.github.io/assets/hidrokit_dataset/hidrokit_poc_demo_hujan.xlsx'
URL_KLIMATOLOGI = 'https://taruma.github.io/assets/hidrokit_dataset/hidrokit_poc_demo_klimatologi.xlsx'

print(':: ALAMAT DATASET')
print(f':: URL_HUJAN = {URL_HUJAN}')
print(f':: URL_DEBIT = {URL_DEBIT}')
print(f':: URL_KLIMATOLOGI = {URL_KLIMATOLOGI}')
:: ALAMAT DATASET
:: URL_HUJAN = https://taruma.github.io/assets/hidrokit_dataset/hidrokit_poc_demo_hujan.xlsx
:: URL_DEBIT = https://taruma.github.io/assets/hidrokit_dataset/hidrokit_poc_demo_debit.xlsx
:: URL_KLIMATOLOGI = https://taruma.github.io/assets/hidrokit_dataset/hidrokit_poc_demo_klimatologi.xlsx

Membaca informasi pada dataset hujan dan debit menggunakan hidrokit.contrib.taruma.hk79 (manual). Modul ini hanya digunakan untuk membaca berkas excel yang telah mengikuti format penulisan oleh hidrokit.

In [ ]:
from hidrokit.contrib.taruma import hk79

print(':: MEMBACA INFO DATASET HUJAN DAN DEBIT')
info_hujan = hk79._get_info(URL_HUJAN)
info_debit = hk79._get_info(URL_DEBIT)
:: MEMBACA INFO DATASET HUJAN DAN DEBIT
In [ ]:
def _read_info(INFO):
    for key, value in INFO.items():
        print(':: {}: {}'.format(key, value)) if key != 'key' else None
    print()

print(':: INFO DATASET HUJAN')
_read_info(info_hujan)
print(':: INFO DATASET DEBIT')
_read_info(info_debit)
:: INFO DATASET HUJAN
:: n_stations: 8
:: stations: CIRI, YENNEFER, TRISS, JASKIER, EMHYR, CRACH, ZOLTAN, ROACH
:: source: SKELLIGE

:: INFO DATASET DEBIT
:: n_stations: 1
:: stations: GERALT
:: source: Kaer Mohen

In [ ]:
def _parse_stations(stations):
    return stations.replace(' ', '').split(',')

print(':: MEMPEROLEH LIST STASIUN')
stations_hujan = _parse_stations(info_hujan['stations'])
stations_debit = _parse_stations(info_debit['stations'])
print(f':: stations_hujan = {stations_hujan}')
print(f':: stations_debit = {stations_debit}')
:: MEMPEROLEH LIST STASIUN
:: stations_hujan = ['CIRI', 'YENNEFER', 'TRISS', 'JASKIER', 'EMHYR', 'CRACH', 'ZOLTAN', 'ROACH']
:: stations_debit = ['GERALT']

TAHAP 1: AKUISISI DATASET

Pembacaan dataset hujan dan debit menggunakan hidrokit.contrib.taruma.hk88 (manual), dan dataset klimatologi menggunakan hidrokit.contrib.taruma.hk73 (manual).

Data Hujan

In [ ]:
from hidrokit.contrib.taruma import hk88

print(':: MEMBACA DATA HUJAN DARI [URL_HUJAN]')
dataset_hujan = hk88.read_workbook(URL_HUJAN, stations_hujan)
print(':: MENAMPILKAN LIMA BARIS PERTAMA [dataset_hujan]')
dataset_hujan.head()
:: MEMBACA DATA HUJAN DARI [URL_HUJAN]
:: MENAMPILKAN LIMA BARIS PERTAMA [dataset_hujan]
Out[ ]:
CIRI YENNEFER TRISS JASKIER EMHYR CRACH ZOLTAN ROACH
1998-01-01 - - - - - - - NaN
1998-01-02 - - - 7 - - - NaN
1998-01-03 64 5 - - 5 - - -
1998-01-04 - - - - - - - -
1998-01-05 - - - - - - - -
In [ ]:
print(':: INFORMASI [dataset_hujan]')
dataset_hujan.info()
:: INFORMASI [dataset_hujan]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 4018 entries, 1998-01-01 to 2008-12-31
Freq: D
Data columns (total 8 columns):
CIRI        4016 non-null object
YENNEFER    4017 non-null object
TRISS       4018 non-null object
JASKIER     4018 non-null object
EMHYR       4018 non-null object
CRACH       4018 non-null object
ZOLTAN      4018 non-null object
ROACH       4016 non-null object
dtypes: object(8)
memory usage: 282.5+ KB

Data Debit

In [ ]:
print(':: MEMBACA DATA DEBIT DARI [URL_DEBIT]')
dataset_debit = hk88.read_workbook(URL_DEBIT, stations_debit)
print(':: MENAMPILKAN LIMA BARIS PERTAMA [dataset_debit]')
dataset_debit.head()
:: MEMBACA DATA DEBIT DARI [URL_DEBIT]
:: MENAMPILKAN LIMA BARIS PERTAMA [dataset_debit]
Out[ ]:
GERALT
1998-01-01 0
1998-01-02 0
1998-01-03 0
1998-01-04 0
1998-01-05 0
In [ ]:
print(':: INFORMASI [dataset_debit]')
dataset_debit.info()
:: INFORMASI [dataset_debit]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 4018 entries, 1998-01-01 to 2008-12-31
Freq: D
Data columns (total 1 columns):
GERALT    4017 non-null object
dtypes: object(1)
memory usage: 62.8+ KB

Data Klimatologi

In [ ]:
from hidrokit.contrib.taruma import hk73

print(':: MEMBACA DATA KLIMATOLOGI DARI [URL_KLIMATOLOGI]')
dataset_klimatologi = hk73._read_bmkg(URL_KLIMATOLOGI)
print(':: MENAMPILKAN LIMA BARIS PERTAMA [dataset_klimatologi]')
dataset_klimatologi.head()
:: MEMBACA DATA KLIMATOLOGI DARI [URL_KLIMATOLOGI]
:: MENAMPILKAN LIMA BARIS PERTAMA [dataset_klimatologi]
Out[ ]:
Tn Tx Tavg RH_avg RR ss ff_x ddd_x ff_avg ddd_car
Tanggal
1998-01-01 23.00000 34.60000 27.50000 75 0.00000 5.80000 5 225 2 SW
1998-01-02 23.20000 34.20000 28.60000 69 0.00000 7.60000 4 270 1 NE
1998-01-03 24.00000 34.60000 27.70000 76 0.00000 5.60000 7 270 2 W
1998-01-04 23.80000 34.40000 28.40000 70 0.00000 8.00000 7 225 3 SW
1998-01-05 23.50000 33.40000 27.70000 74 1.00000 3.50000 6 270 2 W
In [ ]:
print(':: INFORMASI [dataset_klimatologi]')
dataset_klimatologi.info()
:: INFORMASI [dataset_klimatologi]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 4018 entries, 1998-01-01 to 2008-12-31
Data columns (total 10 columns):
Tn         4018 non-null float64
Tx         4018 non-null float64
Tavg       4018 non-null float64
RH_avg     4018 non-null int64
RR         4018 non-null float64
ss         4017 non-null float64
ff_x       4018 non-null int64
ddd_x      4018 non-null int64
ff_avg     4018 non-null int64
ddd_car    4018 non-null object
dtypes: float64(5), int64(4), object(1)
memory usage: 345.3+ KB

TAHAP 2: PRAPEMROSESAN DATA

Dalam tahap ini menggunakan hidrokit.contrib.taruma.hk43 (manual) yang digunakan untuk memeriksa nilai invalid pada dataset.

In [ ]:
def find_invalid(df):
    results = {}
    for col in df.columns:
        results[col] = hk43._check_invalid(df.loc[:, col].values)
    return results

Data Hujan

In [ ]:
from hidrokit.contrib.taruma import hk43

print(':: MEMBACA NILAI INVALID PADA [dataset_hujan]')
invalid_hujan = find_invalid(dataset_hujan)

print(':: MENAMPILKAN NILAI INVALID PADA [dataset_hujan] SETIAP STASIUNNYA')
pd.DataFrame(invalid_hujan).T
:: MEMBACA NILAI INVALID PADA [dataset_hujan]
:: MENAMPILKAN NILAI INVALID PADA [dataset_hujan] SETIAP STASIUNNYA
Out[ ]:
- NaN
CIRI [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15... [211, 576]
YENNEFER [0, 1, 3, 4, 5, 6, 8, 9, 11, 14, 16, 17, 19, 2... [2558]
TRISS [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14,... NaN
JASKIER [0, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13, 15, 17, ... NaN
EMHYR [0, 1, 3, 4, 5, 8, 11, 12, 17, 19, 20, 22, 45,... NaN
CRACH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16,... NaN
ZOLTAN [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 14, 17, 18... NaN
ROACH [2, 3, 4, 5, 16, 17, 18, 19, 20, 21, 22, 24, 2... [0, 1]
In [ ]:
print(':: MENGOREKSI NILAI INVALID')
print(':: MENGUBAH NILAI "-" MENJADI 0.')
dataset_hujan[dataset_hujan == '-'] = 0
print(':: MENYESUAIKAN OBJEK [dataset_hujan] MENJADI NUMERIK')
dataset_hujan = dataset_hujan.infer_objects()
print(':: MENGISI NILAI KOSONG DENGAN METODE INTERPOLASI')
dataset_hujan.interpolate(method='linear', inplace=True)
print(':: MENGISI NILAI KOSONG PADA BARIS PERTAMA DENGAN METODE BACKFILL')
dataset_hujan.bfill(inplace=True)
:: MENGOREKSI NILAI INVALID
:: MENGUBAH NILAI "-" MENJADI 0.
:: MENYESUAIKAN OBJEK [dataset_hujan] MENJADI NUMERIK
:: MENGISI NILAI KOSONG DENGAN METODE INTERPOLASI
:: MENGISI NILAI KOSONG PADA BARIS PERTAMA DENGAN METODE BACKFILL
In [ ]:
print(':: MENAMPILKAN INFORMASI [dataset_hujan]')
dataset_hujan.info()
:: MENAMPILKAN INFORMASI [dataset_hujan]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 4018 entries, 1998-01-01 to 2008-12-31
Freq: D
Data columns (total 8 columns):
CIRI        4018 non-null float64
YENNEFER    4018 non-null float64
TRISS       4018 non-null float64
JASKIER     4018 non-null float64
EMHYR       4018 non-null float64
CRACH       4018 non-null float64
ZOLTAN      4018 non-null float64
ROACH       4018 non-null float64
dtypes: float64(8)
memory usage: 282.5 KB
In [ ]:
print(':: GRAFIK [dataset_hujan]')
dataset_hujan.plot(subplots=True, sharex=True, figsize=(15, 25), title=dataset_hujan.columns.to_list(), legend=False);
:: GRAFIK [dataset_hujan]

Data Debit

In [ ]:
print(':: MEMBACA NILAI INVALID PADA [dataset_debit]')
invalid_debit = find_invalid(dataset_debit)

print(':: MENAMPILKAN NILAI INVALID PADA [dataset_debit]')
pd.DataFrame(invalid_debit).T
:: MEMBACA NILAI INVALID PADA [dataset_debit]
:: MENAMPILKAN NILAI INVALID PADA [dataset_debit]
Out[ ]:
20.9.46 NaN tad
GERALT [309] [789] [2974]
In [ ]:
print(':: MENGOREKSI NILAI YANG KELIRU DARI "20.9.46" MENJADI "209.46"')
dataset_debit[dataset_debit == '20.9.46'] = 209.46
print(':: MENGUBAH NILAI "tad" MENJADI 0.')
dataset_debit[dataset_debit == 'tad'] = 0.
print(':: MENYESUAIKAN OBJEK [dataset_debit] MENJADI NUMERIK')
dataset_debit = dataset_debit.infer_objects()
print(':: MENGISI NILAI KOSONG DENGAN METODE INTERPOLASI')
dataset_debit.interpolate(method='linear', inplace=True)
:: MENGOREKSI NILAI YANG KELIRU DARI "20.9.46" MENJADI "209.46"
:: MENGUBAH NILAI "tad" MENJADI 0.
:: MENYESUAIKAN OBJEK [dataset_debit] MENJADI NUMERIK
:: MENGISI NILAI KOSONG DENGAN METODE INTERPOLASI
In [ ]:
print(':: MENAMPILKAN INFORMASI [dataset_debit]')
dataset_debit.info()
:: MENAMPILKAN INFORMASI [dataset_debit]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 4018 entries, 1998-01-01 to 2008-12-31
Freq: D
Data columns (total 1 columns):
GERALT    4018 non-null float64
dtypes: float64(1)
memory usage: 62.8 KB
In [ ]:
print(':: GRAFIK DEBIT [dataset_debit]')
ax = dataset_debit.plot(figsize=(20, 5))
ax.set_ylabel('Debit $m^3/s$');
:: GRAFIK DEBIT [dataset_debit]

melihat pada awal tahun terdapat nilai 0. secara berurutan setiap harinya, maka dataset dimulai dari Maret 1998.

Data Klimatologi

Pemrosesan data klimatologi menggunakan hidrokit.contrib.taruma.hk73 (manual)

In [ ]:
print(':: MEMILIH KOLOM KLIMATOLOGI YANG AKAN DIGUNAKAN')
_klim_col = ['Tavg', 'ss', 'RH_avg', 'ff_avg']
print(f':: KOLOM KLIMATOLOGI YANG DIGUNAKAN: {_klim_col}')
dataset_klimatologi = dataset_klimatologi[_klim_col].copy()
print(':: MENGISI NILAI KOSONG DENGAN METODE INTERPOLASI')
dataset_klimatologi.interpolate(method='linear', inplace=True)
print(':: MENGKONVERSI KOLOM "ss" DALAM SATUAN PERSEN')
dataset_klimatologi['ss'] = dataset_klimatologi['ss'] / 8 * 100
print(':: MENGUBAH NAMA KOLOM [dataset_klimatologi]')
dataset_klimatologi.columns = ['TEMP', 'SUN', 'HUMID', 'WIND']
print(':: MENAMPILKAN LIMA BARIS PERTAMA [dataset_klimatologi]')
dataset_klimatologi.head()
:: MEMILIH KOLOM KLIMATOLOGI YANG AKAN DIGUNAKAN
:: KOLOM KLIMATOLOGI YANG DIGUNAKAN: ['Tavg', 'ss', 'RH_avg', 'ff_avg']
:: MENGISI NILAI KOSONG DENGAN METODE INTERPOLASI
:: MENGKONVERSI KOLOM "ss" DALAM SATUAN PERSEN
:: MENGUBAH NAMA KOLOM [dataset_klimatologi]
:: MENAMPILKAN LIMA BARIS PERTAMA [dataset_klimatologi]
Out[ ]:
TEMP SUN HUMID WIND
Tanggal
1998-01-01 27.50000 72.50000 75 2
1998-01-02 28.60000 95.00000 69 1
1998-01-03 27.70000 70.00000 76 2
1998-01-04 28.40000 100.00000 70 3
1998-01-05 27.70000 43.75000 74 2
In [ ]:
print(':: MEMERIKSA APAKAH TERDAPAT DATA YANG HILANG (8888/9999)')
hk73._get_missing(dataset_klimatologi)
:: MEMERIKSA APAKAH TERDAPAT DATA YANG HILANG (8888/9999)
Out[ ]:
{'HUMID': array([], dtype=int64),
 'SUN': array([], dtype=int64),
 'TEMP': array([], dtype=int64),
 'WIND': array([], dtype=int64)}

diketahui bahwa dataset_klimatologi tidak memiliki data yang hilang (8888/9999).

In [ ]:
print(':: GRAFIK [dataset_klimatologi]')
_klim_title = ['TEMP (Celcius)', 'SUN (%)', 'HUMID (%)', 'WIND (m/detik)']
dataset_klimatologi.plot(subplots=True, sharex=True, figsize=(15, 10), 
                         title=_klim_title, legend=False);
:: GRAFIK [dataset_klimatologi]

TAHAP 3: INPUT ANALISIS

Periode dataset

In [ ]:
print(':: PERIODE DIMULAI DARI 1 MARET 1998')
_period = slice('19980301', None)

hujan = dataset_hujan[_period]
print('\n:: MENAMPILKAN INFORMASI [hujan]')
hujan.info()
debit = dataset_debit[_period]
print('\n:: MENAMPILKAN INFORMASI [debit]')
debit.info()
klimatologi = dataset_klimatologi[_period]
print('\n:: MENAMPILKAN INFORMASI [kilimatologi]')
klimatologi.info()
:: PERIODE DIMULAI DARI 1 MARET 1998

:: MENAMPILKAN INFORMASI [hujan]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 3959 entries, 1998-03-01 to 2008-12-31
Freq: D
Data columns (total 8 columns):
CIRI        3959 non-null float64
YENNEFER    3959 non-null float64
TRISS       3959 non-null float64
JASKIER     3959 non-null float64
EMHYR       3959 non-null float64
CRACH       3959 non-null float64
ZOLTAN      3959 non-null float64
ROACH       3959 non-null float64
dtypes: float64(8)
memory usage: 278.4 KB

:: MENAMPILKAN INFORMASI [debit]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 3959 entries, 1998-03-01 to 2008-12-31
Freq: D
Data columns (total 1 columns):
GERALT    3959 non-null float64
dtypes: float64(1)
memory usage: 61.9 KB

:: MENAMPILKAN INFORMASI [kilimatologi]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 3959 entries, 1998-03-01 to 2008-12-31
Data columns (total 4 columns):
TEMP     3959 non-null float64
SUN      3959 non-null float64
HUMID    3959 non-null int64
WIND     3959 non-null int64
dtypes: float64(2), int64(2)
memory usage: 154.6 KB

Hujan rata-rata dengan Metode Thiessen

Menghitung hujan rerata dari 8 stasiun dengan metode poligon thiessen. Perhitungan menggunakan modul hidrokit.contrib.taruma.hk99 (manual)

In [ ]:
print(':: BESAR WILAYAH MASING-MASING STASIUN DISIMPAN SEBAGAI [AREA_BASIN]')
AREA_BASIN = {
    'CIRI': 18.638,
    'YENNEFER': 208.920,
    'TRISS': 147.520,
    'JASKIER': 499.413,
    'EMHYR': 205.003,
    'CRACH': 76.695,
    'ZOLTAN': 127.507,
    'ROACH': 166.899
}
print(':: [AREA_BASIN] (DALAM SATUAN LUAS)')
print(AREA_BASIN)
:: BESAR WILAYAH MASING-MASING STASIUN DISIMPAN SEBAGAI [AREA_BASIN]
:: [AREA_BASIN] (DALAM SATUAN LUAS)
{'CIRI': 18.638, 'YENNEFER': 208.92, 'TRISS': 147.52, 'JASKIER': 499.413, 'EMHYR': 205.003, 'CRACH': 76.695, 'ZOLTAN': 127.507, 'ROACH': 166.899}
In [ ]:
from hidrokit.contrib.taruma import hk99

print(':: MENGHITUNG HUJAN RERATA')
hujan_thiessen = hk99.apply_thiessen(hujan, AREA_BASIN)
print(':: MENAMPILKAN LIMA BARIS PERTAMA NILAI [hujan_thiessen]')
hujan_thiessen.head()
:: MENGHITUNG HUJAN RERATA
:: MENAMPILKAN LIMA BARIS PERTAMA NILAI [hujan_thiessen]
Out[ ]:
thiessen
1998-03-01 1.22327
1998-03-02 13.29924
1998-03-03 6.95701
1998-03-04 12.76077
1998-03-05 11.10122
In [ ]:
print(':: GRAFIK [hujan_thiessen]')
hujan_thiessen.plot(figsize=(20, 5)).set_ylabel('Tinggi Hujan ($mm$)');
:: GRAFIK [hujan_thiessen]

Rekap data

Perekapan data menggunakan modul hidrokit.contrib.taruma.hk98 (manual)

Akan direkap per bulan, per 2 periode, per 4 hari. Untuk data klimatologi, direkap setelah dilakukan proses perhitungan evapotranspirasi.

In [ ]:
print(':: MEMBUAT FUNGSI UNTUK PEREKAPAN DATA HUJAN')
def n_rain(x):
    return (x > 0).sum()

hujan_func = [np.sum, n_rain, len]
hujan_func_col = ['precip', 'nrain', 'ndays']
:: MEMBUAT FUNGSI UNTUK PEREKAPAN DATA HUJAN

Bulanan

In [ ]:
from hidrokit.contrib.taruma import hk98

print(':: MEMBUAT REKAP BULANAN [hujan_thiessen] DAN [debit]')
hujan_bulanan = hk98.summary_station(
    hujan_thiessen, column='thiessen', ufunc=hujan_func, ufunc_col=hujan_func_col
    ).droplevel(0, axis=1)

debit_bulanan = hk98.summary_station(
    debit, column='GERALT', ufunc=np.mean, ufunc_col='debit'
    ).droplevel(0, axis=1)

print(':: MENGGABUNGKAN [hujan_bulanan] DAN [debit_bulanan] MENJADI [data_bulanan]')
data_bulanan = pd.concat([hujan_bulanan, debit_bulanan], axis=1)
print(':: MENAMPILKAN INFO [data_bulanan]')
data_bulanan.info()
print('\n:: MENAMPILKAN LIMA BARIS PERTAMA [data_bulanan]')
data_bulanan.head()
:: MEMBUAT REKAP BULANAN [hujan_thiessen] DAN [debit]
:: MENGGABUNGKAN [hujan_bulanan] DAN [debit_bulanan] MENJADI [data_bulanan]
:: MENAMPILKAN INFO [data_bulanan]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 130 entries, 1998-03-01 to 2008-12-01
Data columns (total 4 columns):
precip    130 non-null float64
nrain     130 non-null float64
ndays     130 non-null float64
debit     130 non-null float64
dtypes: float64(4)
memory usage: 5.1 KB

:: MENAMPILKAN LIMA BARIS PERTAMA [data_bulanan]
Out[ ]:
precip nrain ndays debit
1998-03-01 336.18655 30.00000 31.00000 129.03161
1998-04-01 331.19832 30.00000 30.00000 128.41067
1998-05-01 293.26513 29.00000 31.00000 114.43355
1998-06-01 166.98556 28.00000 30.00000 65.54133
1998-07-01 146.26108 28.00000 31.00000 52.90194
In [ ]:
print(':: GRAFIK HUJAN DAN DEBIT [data_bulanan]')
data_bulanan[['precip', 'debit']].plot(subplots=True, sharex=True, 
                                       title=['PRECIP ($mm/bulan$)',
                                              'DEBIT ($m^3/hari$)'],
                                       figsize=(20, 10));
:: GRAFIK HUJAN DAN DEBIT [data_bulanan]

2 Periode (per 16 hari)

Dipilih per 16 hari agar untuk bulan yang memiliki 31 hari, dibagi menjadi 16-15, jika digunakan nilai 15 hari akan menjadi 15-15-1 (3 bagian).

In [ ]:
_ndays = '16D'

print(':: MEMBUAT REKAP 2 PERIODE [hujan_thiessen] DAN [debit]')
hujan_2p = hk98.summary_station(
    hujan_thiessen, column='thiessen', 
    ufunc=hujan_func, ufunc_col=hujan_func_col,
    n_days=_ndays
    ).droplevel(0, axis=1)

debit_2p = hk98.summary_station(
    debit, column='GERALT', ufunc=np.mean, ufunc_col='debit', n_days=_ndays
    ).droplevel(0, axis=1)

print(':: MENGGABUNGKAN [hujan_2p] DAN [debit_2p] MENJADI [data_2p]')
data_2p = pd.concat([hujan_2p, debit_2p], axis=1)
print(':: MENAMPILKAN INFO [data_2p]')
data_2p.info()
print('\n:: MENAMPILKAN LIMA BARIS PERTAMA [data_2p]')
data_2p.head()
:: MEMBUAT REKAP 2 PERIODE [hujan_thiessen] DAN [debit]
:: MENGGABUNGKAN [hujan_2p] DAN [debit_2p] MENJADI [data_2p]
:: MENAMPILKAN INFO [data_2p]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 260 entries, 1998-03-01 to 2008-12-17
Data columns (total 4 columns):
precip    260 non-null float64
nrain     260 non-null float64
ndays     260 non-null float64
debit     260 non-null float64
dtypes: float64(4)
memory usage: 10.2 KB

:: MENAMPILKAN LIMA BARIS PERTAMA [data_2p]
Out[ ]:
precip nrain ndays debit
1998-03-01 148.04603 15.00000 16.00000 121.82375
1998-03-17 188.14052 15.00000 15.00000 136.72000
1998-04-01 155.98420 16.00000 16.00000 109.26625
1998-04-17 175.21412 14.00000 14.00000 150.29000
1998-05-01 204.95814 16.00000 16.00000 165.22125
In [ ]:
print(':: GRAFIK HUJAN DAN DEBIT [data_2p]')
data_2p[['precip', 'debit']].plot(subplots=True, sharex=True, 
                                       title=['PRECIP ($mm/periode$)',
                                              'DEBIT ($m^3/hari$)'],
                                       figsize=(20, 10));
:: GRAFIK HUJAN DAN DEBIT [data_2p]

4 hari

In [ ]:
_ndays = '4D'

print(':: MEMBUAT REKAP 4 HARI [hujan_thiessen] DAN [debit]')
hujan_4d = hk98.summary_station(
    hujan_thiessen, column='thiessen', 
    ufunc=hujan_func, ufunc_col=hujan_func_col,
    n_days=_ndays
    ).droplevel(0, axis=1)

debit_4d = hk98.summary_station(
    debit, column='GERALT', ufunc=np.mean, ufunc_col='debit', n_days=_ndays
    ).droplevel(0, axis=1)

print(':: MENGGABUNGKAN [hujan_4d] DAN [debit_4d] MENJADI [data_4d]')
data_4d = pd.concat([hujan_4d, debit_4d], axis=1)
print(':: MENAMPILKAN INFO [data_4d]')
data_4d.info()
print('\n:: MENAMPILKAN LIMA BARIS PERTAMA [data_4d]')
data_4d.head()
:: MEMBUAT REKAP 4 HARI [hujan_thiessen] DAN [debit]
:: MENGGABUNGKAN [hujan_4d] DAN [debit_4d] MENJADI [data_4d]
:: MENAMPILKAN INFO [data_4d]
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1033 entries, 1998-03-01 to 2008-12-29
Data columns (total 4 columns):
precip    1033 non-null float64
nrain     1033 non-null float64
ndays     1033 non-null float64
debit     1033 non-null float64
dtypes: float64(4)
memory usage: 40.4 KB

:: MENAMPILKAN LIMA BARIS PERTAMA [data_4d]
Out[ ]:
precip nrain ndays debit
1998-03-01 34.24029 4.00000 4.00000 91.80500
1998-03-05 39.90152 3.00000 4.00000 195.93500
1998-03-09 14.69375 4.00000 4.00000 85.15500
1998-03-13 59.21048 4.00000 4.00000 114.40000
1998-03-17 46.60314 4.00000 4.00000 93.14000
In [ ]:
print(':: GRAFIK HUJAN DAN DEBIT [data_4d]')
data_4d[['precip', 'debit']].plot(subplots=True, sharex=True, 
                                       title=['PRECIP ($mm/(4 hari)$)',
                                              'DEBIT ($m^3/hari$)'],
                                       figsize=(20, 10));
:: GRAFIK HUJAN DAN DEBIT [data_4d]

TAHAP 4: ANALISIS HIDROLOGI

Analisis hidrologi yang akan dilakukan adalah perhitungan evapotranspirasi dan pemodelan NRECA dan F.J. Mock.

Evapotranspirasi

Perhitungan evapotranspirasi menggunakan data klimatologi yang masih berupa data harian (bukan rekapan). Hasil perhitungan akan direkap per bulan, per 2 periode, per 4 hari.

Perhitungan evapotranspirasi menggunakan modul hidrokit.contrib.taruma.hk106 (manual).

In [ ]:
print(':: MENENTUKAN GARIS LINTANG LOKASI')
LATITUDE = '6.25 LS'
print(f':: LATITUDE = {LATITUDE}')
:: MENENTUKAN GARIS LINTANG LOKASI
:: LATITUDE = 6.25 LS

Perhitungan

Rumus Blaney-Craddle

In [ ]:
from hidrokit.contrib.taruma import hk106

print(':: MENGHITUNG EVAPOTRANSPIRASI MENGGUNAKAN RUMUS BLANEY-CRADDLE')
eto_bc = hk106.ETo_BlaneyCriddle(
    klimatologi, temp_col='TEMP', lat=LATITUDE)
print(':: GRAFIK [eto_bc]')
eto_bc.plot(figsize=(20, 5)).set_ylabel('Evapotranspirasi ($mm/hari$)');
:: MENGHITUNG EVAPOTRANSPIRASI MENGGUNAKAN RUMUS BLANEY-CRADDLE
:: GRAFIK [eto_bc]