Open In Colab

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()
dataset.head()
<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

Copyright © 2019 Taruma Sakti Megariansyah

Source code in this notebook is licensed under a MIT License. Data in this notebook is licensed under a Creative Common Attribution 4.0 International.