Berdasarkan isu #99: buat perhitungan curah hujan dengan metode poligon Thiessen

Referensi isu:

• Limantara, Lily M. (2018). Rekayasa Hidrologi. Penerbit Andi, Yogyakarta. (hal. 57).

Deskripsi Permasalahan:

• Menghitung nilai hujan rata-rata daerah menggunakan metode poligon Thiessen

# PERSIAPAN DAN DATASET¶

In [0]:
import numpy as np
import pandas as pd

In [2]:
try:
import hidrokit
except ModuleNotFoundError:
!pip install git+https://github.com/taruma/hidrokit.git@latest -q
import hidrokit
print(f'hidrokit version: {hidrokit.__version__}')

  Building wheel for hidrokit (setup.py) ... done
hidrokit version: 0.3.5-beta.3

In [0]:
!wget -O sample.xlsx "https://taruma.github.io/assets/hidrokit_dataset/data_daily_sample.xlsx" -q
dataset_path = 'sample.xlsx'

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

_data = hk88.read_workbook(dataset_path, ['STA_A', 'STA_B', 'STA_C'],
as_df=False)
dataset = pd.concat(_data, sort=True, axis=1).infer_objects()
dataset.info()

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 5478 entries, 2001-01-01 to 2015-12-31
Freq: D
Data columns (total 3 columns):
STA_A    5477 non-null float64
STA_B    5470 non-null float64
STA_C    5475 non-null float64
dtypes: float64(3)
memory usage: 171.2 KB

Out[4]:
STA_A STA_B STA_C
2001-01-01 0.0 0.0 0.00
2001-01-02 0.0 0.0 0.65
2001-01-03 0.0 45.0 9.16
2001-01-04 0.0 0.0 0.00
2001-01-05 0.0 5.0 1.03

# KODE¶

In [0]:
def thiessen_weight(area):
area_val = list(area.values())
area_percent = area_val / np.sum(area_val)
key = list(area.keys())
return dict(zip(key, area_percent))

def apply_thiessen(dataset, area, columns=None, as_df=True):
weight = thiessen_weight(area)

columns = columns if columns is not None else dataset.columns

val = []
for col in columns:
val.append(dataset[col].values * weight[col])

np_val = np.stack(val, axis=1)

if as_df:
return pd.DataFrame(
data=np_val.sum(axis=1), index=dataset.index, columns=['thiessen']
)
else:
return np_val.sum(axis=1)


# FUNGSI¶

## Fungsi thiessen_weight()¶

Fungsi ini menerima input dictionary yang berisikan besar area setiap stasiun dan memberi keluaran bobotnya dalam bentuk dictionary.

In [6]:
AREA_BASIN = {
'STA_A': 49.54,
'STA_B': 144.39,
'STA_C': 0
}

weight = thiessen_weight(AREA_BASIN)
weight

Out[6]:
{'STA_A': 0.2554529985046151, 'STA_B': 0.744547001495385, 'STA_C': 0.0}

## Fungsi apply_thiessen()¶

Menerapkan perhitungan poligon thiessen dengan bobot masing-masing stasiun dan mengeluarkan hasil penjumlahannya.

Fungsi ini memiliki beberapa argumen opsional yaitu as_df dan columns.

In [7]:
apply_thiessen(dataset, AREA_BASIN)

Out[7]:
thiessen
2001-01-01 0.000000
2001-01-02 0.000000
2001-01-03 33.504615
2001-01-04 0.000000
2001-01-05 3.722735
... ...
2015-12-27 14.174496
2015-12-28 29.190017
2015-12-29 1.788171
2015-12-30 1.277265
2015-12-31 0.766359

5478 rows × 1 columns

### Argumen as_df=True¶

Argumen ini memberi keluaran dalam bentuk pandas.DataFrame jika as_df=True (default), dan dalam bentuk numpy.array jika as_df=False.

In [8]:
apply_thiessen(dataset, AREA_BASIN, as_df=False)

Out[8]:
array([ 0.        ,  0.        , 33.50461507, ...,  1.78817099,
1.27726499,  0.766359  ])

### Argumen columns=None¶

Argumen ini memastikan kolom mana saja yang dihitung. Jika tidak diisi, maka fungsi memproses seluruh kolom. Jika nilai kolom tidak tersedia dalam area, maka akan menghasilkan error. Gunakan opsi columns jika dataset berisikan kolom yang tidak digunakan dalam proses perhitungan thiessen.

In [9]:
apply_thiessen(dataset, AREA_BASIN, columns=['STA_A', 'STA_C'])

Out[9]:
thiessen
2001-01-01 0.000000
2001-01-02 0.000000
2001-01-03 0.000000
2001-01-04 0.000000
2001-01-05 0.000000
... ...
2015-12-27 9.707214
2015-12-28 5.364513
2015-12-29 1.788171
2015-12-30 1.277265
2015-12-31 0.766359

5478 rows × 1 columns

# Changelog¶

- 20191217 - 1.0.0 - Initial