Skip to content

Instantly share code, notes, and snippets.

@taruma
Created December 15, 2019 01:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save taruma/906e1577111208291e0725229c7d0a76 to your computer and use it in GitHub Desktop.
Save taruma/906e1577111208291e0725229c7d0a76 to your computer and use it in GitHub Desktop.
taruma_hk90_kalibrasi_NRECA.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "taruma_hk90_kalibrasi_NRECA.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/taruma/906e1577111208291e0725229c7d0a76/taruma_hk90_kalibrasi_nreca.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MQPwmpY2nJwK",
"colab_type": "text"
},
"source": [
"Berdasarkan isu [#90](https://github.com/taruma/hidrokit/issues/90): **kalibrasi model NRECA**\n",
"\n",
"Referensi isu:\n",
"- `hidrokit.contrib.taruma.hk89` [#89](https://github.com/taruma/hidrokit/issues/89). \\([manual/notebook](https://gist.github.com/taruma/1502a7aa67cf074969d806cd3ffdf35c)\\). **Pemodelan NRECA**\n",
"- Roberts, W., Williams, G., Jackson, E., Nelson, E., Ames, D., 2018. Hydrostats: A Python Package for Characterizing Errors between Observed and Predicted Time Series. Hydrology 5(4) 66, doi:10.3390/hydrology5040066\n",
"\n",
"Deskripsi permasalahan:\n",
"- Mencari parameter model NRECA terbaik berdasarkan metrik yang digunakan (RMSE, NSE, MAE, dll)\n",
"\n",
"Strategi permasalahan:\n",
"- Mengikuti ide `GridSearchCV` pada `scikit-learn`, yang membuat _parameter grid_, dan melakukan pemodelan berdasarkan seluruh kombinasi yang memungkinkan dalam _parameter grid_.\n",
"- Input dalam kalibrasi berupa fungsi model (NRECA) dan metrik. Sehingga membuat kebebasan untuk menggunakan model atau metrik yang dikembangkan sendiri.\n",
"\n",
"Catatan:\n",
"- Fungsi metrik bisa dikembangkan sendiri dengan bentuk `nama_metrik(simulasi, prediksi)`.\n",
"- Dalam _notebook_ ini, metrik hidrologi menggunakan paket _HydroErr_ yang telah dikembangkan oleh BYU-Hydroinformatics ([github](https://github.com/BYU-Hydroinformatics/HydroErr/))."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ihpq_8h7nKPO",
"colab_type": "text"
},
"source": [
"# PERSIAPAN DAN DATASET"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-IA_EWvtpBC8",
"colab_type": "code",
"colab": {}
},
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "gVOLK8dymOov",
"colab_type": "code",
"outputId": "9f05b26d-ed01-4aef-d9d0-9ff4c9e061f5",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
}
},
"source": [
"try:\n",
" import hidrokit\n",
"except ModuleNotFoundError:\n",
" !pip install git+https://github.com/taruma/hidrokit.git@latest -q\n",
" import hidrokit\n",
"print(f'hidrokit version: {hidrokit.__version__}')"
],
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"text": [
" Building wheel for hidrokit (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
"hidrokit version: 0.3.5-beta.2\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "u0s3Op5IEkrn",
"colab_type": "code",
"outputId": "ec7701e8-025e-4ad8-b868-ce3d8d360019",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"try:\n",
" import HydroErr as he\n",
"except ModuleNotFoundError:\n",
" !pip install HydroErr -q\n",
" import HydroErr as he"
],
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"text": [
" Building wheel for HydroErr (setup.py) ... \u001b[?25l\u001b[?25hdone\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "TRYSfzYmqJKn",
"colab_type": "code",
"outputId": "e67fa657-7048-408f-ba73-768142515767",
"colab": {
"resources": {
"http://localhost:8080/nbextensions/google.colab/files.js": {
"data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7Ci8vIE1heCBhbW91bnQgb2YgdGltZSB0byBibG9jayB3YWl0aW5nIGZvciB0aGUgdXNlci4KY29uc3QgRklMRV9DSEFOR0VfVElNRU9VVF9NUyA9IDMwICogMTAwMDsKCmZ1bmN0aW9uIF91cGxvYWRGaWxlcyhpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IHN0ZXBzID0gdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKTsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIC8vIENhY2hlIHN0ZXBzIG9uIHRoZSBvdXRwdXRFbGVtZW50IHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsCiAgLy8gdG8gdXBsb2FkRmlsZXNDb250aW51ZSBmcm9tIFB5dGhvbi4KICBvdXRwdXRFbGVtZW50LnN0ZXBzID0gc3RlcHM7CgogIHJldHVybiBfdXBsb2FkRmlsZXNDb250aW51ZShvdXRwdXRJZCk7Cn0KCi8vIFRoaXMgaXMgcm91Z2hseSBhbiBhc3luYyBnZW5lcmF0b3IgKG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgeWV0KSwKLy8gd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIGFzeW5jaHJvbm91cyBzdGVwcyBhbmQgdGhlIFB5dGhvbiBzaWRlIGlzIGdvaW5nCi8vIHRvIHBvbGwgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBzdGVwLgovLyBUaGlzIHVzZXMgYSBQcm9taXNlIHRvIGJsb2NrIHRoZSBweXRob24gc2lkZSBvbiBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcCwKLy8gdGhlbiBwYXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgc3RlcCBhcyB0aGUgaW5wdXQgdG8gdGhlIG5leHQgc3RlcC4KZnVuY3Rpb24gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpIHsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIGNvbnN0IHN0ZXBzID0gb3V0cHV0RWxlbWVudC5zdGVwczsKCiAgY29uc3QgbmV4dCA9IHN0ZXBzLm5leHQob3V0cHV0RWxlbWVudC5sYXN0UHJvbWlzZVZhbHVlKTsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHQudmFsdWUucHJvbWlzZSkudGhlbigodmFsdWUpID0+IHsKICAgIC8vIENhY2hlIHRoZSBsYXN0IHByb21pc2UgdmFsdWUgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIG5leHQKICAgIC8vIHN0ZXAgb2YgdGhlIGdlbmVyYXRvci4KICAgIG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIG5leHQudmFsdWUucmVzcG9uc2U7CiAgfSk7Cn0KCi8qKgogKiBHZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGJldHdlZW4gZWFjaCBhc3luYyBzdGVwIG9mIHRoZSB1cGxvYWQKICogcHJvY2Vzcy4KICogQHBhcmFtIHtzdHJpbmd9IGlucHV0SWQgRWxlbWVudCBJRCBvZiB0aGUgaW5wdXQgZmlsZSBwaWNrZXIgZWxlbWVudC4KICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIG91dHB1dCBkaXNwbGF5LgogKiBAcmV0dXJuIHshSXRlcmFibGU8IU9iamVjdD59IEl0ZXJhYmxlIG9mIG5leHQgc3RlcHMuCiAqLwpmdW5jdGlvbiogdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKSB7CiAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7CiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CgogIGNvbnN0IG91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvdXRwdXRJZCk7CiAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSAnJzsKCiAgY29uc3QgcGlja2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsKICAgICAgcmVzb2x2ZShlLnRhcmdldC5maWxlcyk7CiAgICB9KTsKICB9KTsKCiAgY29uc3QgY2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgaW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FuY2VsKTsKICBjYW5jZWwudGV4dENvbnRlbnQgPSAnQ2FuY2VsIHVwbG9hZCc7CiAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBjYW5jZWwub25jbGljayA9ICgpID0+IHsKICAgICAgcmVzb2x2ZShudWxsKTsKICAgIH07CiAgfSk7CgogIC8vIENhbmNlbCB1cGxvYWQgaWYgdXNlciBoYXNuJ3QgcGlja2VkIGFueXRoaW5nIGluIHRpbWVvdXQuCiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9LCBGSUxFX0NIQU5HRV9USU1FT1VUX01TKTsKICB9KTsKCiAgLy8gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcGljayB0aGUgZmlsZXMuCiAgY29uc3QgZmlsZXMgPSB5aWVsZCB7CiAgICBwcm9taXNlOiBQcm9taXNlLnJhY2UoW3BpY2tlZFByb21pc2UsIHRpbWVvdXRQcm9taXNlLCBjYW5jZWxQcm9taXNlXSksCiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdzdGFydGluZycsCiAgICB9CiAgfTsKCiAgaWYgKCFmaWxlcykgewogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2U6IHsKICAgICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICAgIH0KICAgIH07CiAgfQoKICBjYW5jZWwucmVtb3ZlKCk7CgogIC8vIERpc2FibGUgdGhlIGlucHV0IGVsZW1lbnQgc2luY2UgZnVydGhlciBwaWNrcyBhcmUgbm90IGFsbG93ZWQuCiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKCiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBsaS5hcHBlbmQoc3BhbihmaWxlLm5hbWUsIHtmb250V2VpZ2h0OiAnYm9sZCd9KSk7CiAgICBsaS5hcHBlbmQoc3BhbigKICAgICAgICBgKCR7ZmlsZS50eXBlIHx8ICduL2EnfSkgLSAke2ZpbGUuc2l6ZX0gYnl0ZXMsIGAgKwogICAgICAgIGBsYXN0IG1vZGlmaWVkOiAkewogICAgICAgICAgICBmaWxlLmxhc3RNb2RpZmllZERhdGUgPyBmaWxlLmxhc3RNb2RpZmllZERhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbi9hJ30gLSBgKSk7CiAgICBjb25zdCBwZXJjZW50ID0gc3BhbignMCUgZG9uZScpOwogICAgbGkuYXBwZW5kQ2hpbGQocGVyY2VudCk7CgogICAgb3V0cHV0RWxlbWVudC5hcHBlbmRDaGlsZChsaSk7CgogICAgY29uc3QgZmlsZURhdGFQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7CiAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7CiAgICB9KTsKICAgIC8vIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlIHJlYWR5LgogICAgbGV0IGZpbGVEYXRhID0geWllbGQgewogICAgICBwcm9taXNlOiBmaWxlRGF0YVByb21pc2UsCiAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgYWN0aW9uOiAnY29udGludWUnLAogICAgICB9CiAgICB9OwoKICAgIC8vIFVzZSBhIGNodW5rZWQgc2VuZGluZyB0byBhdm9pZCBtZXNzYWdlIHNpemUgbGltaXRzLiBTZWUgYi82MjExNTY2MC4KICAgIGxldCBwb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAocG9zaXRpb24gPCBmaWxlRGF0YS5ieXRlTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGZpbGVEYXRhLmJ5dGVMZW5ndGggLSBwb3NpdGlvbiwgTUFYX1BBWUxPQURfU0laRSk7CiAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZmlsZURhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CgogICAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICAgICAgeWllbGQgewogICAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgICBhY3Rpb246ICdhcHBlbmQnLAogICAgICAgICAgZmlsZTogZmlsZS5uYW1lLAogICAgICAgICAgZGF0YTogYmFzZTY0LAogICAgICAgIH0sCiAgICAgIH07CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPQogICAgICAgICAgYCR7TWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCl9JSBkb25lYDsKICAgIH0KICB9CgogIC8vIEFsbCBkb25lLgogIHlpZWxkIHsKICAgIHJlc3BvbnNlOiB7CiAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgIH0KICB9Owp9CgpzY29wZS5nb29nbGUgPSBzY29wZS5nb29nbGUgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYiA9IHNjb3BlLmdvb2dsZS5jb2xhYiB8fCB7fTsKc2NvcGUuZ29vZ2xlLmNvbGFiLl9maWxlcyA9IHsKICBfdXBsb2FkRmlsZXMsCiAgX3VwbG9hZEZpbGVzQ29udGludWUsCn07Cn0pKHNlbGYpOwo=",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 74
}
},
"source": [
"# LOAD DATASET\n",
"try:\n",
" pd.read_excel('NRECA_sample.xlsx')\n",
" dataset_path = 'NRECA_sample.xlsx'\n",
"except:\n",
" from google.colab import files\n",
" dataset_path = list(files.upload().keys())[0]"
],
"execution_count": 5,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <input type=\"file\" id=\"files-615b374e-666f-4f2c-a44f-e98e9b615dc1\" name=\"files[]\" multiple disabled />\n",
" <output id=\"result-615b374e-666f-4f2c-a44f-e98e9b615dc1\">\n",
" Upload widget is only available when the cell has been executed in the\n",
" current browser session. Please rerun this cell to enable.\n",
" </output>\n",
" <script src=\"/nbextensions/google.colab/files.js\"></script> "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"Saving NRECA_sample.xlsx to NRECA_sample.xlsx\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "U41-J6bhqbjh",
"colab_type": "code",
"outputId": "6670d2ad-4762-4c03-bc8d-658657455729",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 340
}
},
"source": [
"dataset = pd.read_excel(dataset_path, header=0, index_col=0, parse_dates=True)\n",
"dataset.info()\n",
"dataset.head()"
],
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"DatetimeIndex: 120 entries, 1999-01-01 to 2008-12-01\n",
"Data columns (total 3 columns):\n",
"PRECIP 120 non-null float64\n",
"PET 120 non-null float64\n",
"OBS 120 non-null float64\n",
"dtypes: float64(3)\n",
"memory usage: 3.8 KB\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>PRECIP</th>\n",
" <th>PET</th>\n",
" <th>OBS</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1999-01-01</th>\n",
" <td>507.000000</td>\n",
" <td>142.63</td>\n",
" <td>259.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-02-01</th>\n",
" <td>374.228918</td>\n",
" <td>128.84</td>\n",
" <td>164.22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-03-01</th>\n",
" <td>211.762683</td>\n",
" <td>138.19</td>\n",
" <td>86.26</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-04-01</th>\n",
" <td>219.793874</td>\n",
" <td>138.32</td>\n",
" <td>60.21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-05-01</th>\n",
" <td>132.121255</td>\n",
" <td>125.36</td>\n",
" <td>64.82</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PRECIP PET OBS\n",
"1999-01-01 507.000000 142.63 259.00\n",
"1999-02-01 374.228918 128.84 164.22\n",
"1999-03-01 211.762683 138.19 86.26\n",
"1999-04-01 219.793874 138.32 60.21\n",
"1999-05-01 132.121255 125.36 64.82"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mlDTmRYInMNQ",
"colab_type": "text"
},
"source": [
"# KODE"
]
},
{
"cell_type": "code",
"metadata": {
"id": "RDRmdS9AqnYZ",
"colab_type": "code",
"colab": {}
},
"source": [
"from itertools import product\n",
"\n",
"#ref: sklearn.model_selection.ParameterGrid\n",
"def _parameter_grid(parameter):\n",
" items = parameter.items()\n",
" keys, values = zip(*items)\n",
" for combination in product(*values):\n",
" grid = dict(zip(keys, combination))\n",
" yield grid\n",
"\n",
"def _best_parameter(results, calibration_parameter):\n",
" key = list(calibration_parameter.keys())\n",
" return dict(zip(key, results.iloc[0][key].values))\n",
"\n",
"def calibration(observed, func, calibration_parameter, func_parameter,\n",
" metrics, met_names, met_sort, met_min=True, observed_func=None):\n",
" \n",
" metrics = metrics if isinstance(metrics, (list, tuple)) else [metrics]\n",
" met_names = (met_names if isinstance(met_names, (list)) \n",
" else [met_names])\n",
"\n",
" param_grid = list(_parameter_grid(calibration_parameter))\n",
" n_param = len(param_grid)\n",
" print('N = {}'.format(n_param))\n",
"\n",
" observed = (\n",
" observed_func(observed) if observed_func is not None else observed\n",
" )\n",
"\n",
" results = []\n",
"\n",
" print('PROGRESS 0 [-x--xx--x-] 100')\n",
" print('---------> [', end='')\n",
"\n",
" for i, p in enumerate(param_grid, start=1):\n",
" simulated = func(**p, **func_parameter)\n",
" met_res = [m(simulated, observed) for m in metrics]\n",
" results.append(\n",
" list(p.values()) + met_res\n",
" )\n",
" if (i % (n_param // 10)) == 0:\n",
" print('=', end='')\n",
" \n",
" print('] DONE')\n",
"\n",
" columns_name = list(p.keys()) + met_names\n",
"\n",
" results = (pd.DataFrame(results, columns=columns_name)\n",
" .sort_values(by=met_sort, ascending=met_min)\n",
" .reset_index(drop=True))\n",
"\n",
" return results\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "WKSY6Y2Zqn5y",
"colab_type": "text"
},
"source": [
"# FUNGSI"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "P3uW2xAP9fbC",
"colab_type": "text"
},
"source": [
"## Fungsi `calibration()`\n",
"\n",
"Fungsi `calibration()` mengiterasi seluruh kombinasi parameter yang ada dan memeriksa hasilnya dengan metrik yang diberikan, kemudian menyusunnya dan mengurutkan berdasarkan metrik pilihan dan disajikan dalam bentuk `pandas.DataFrame`.\n",
"\n",
"Fungsi ini tidak terbatas dengan fungsi model `model_NRECA()`, fungsi ini dirancang untuk menerima input fungsi model yang dikembangkan sendiri dengan syarat fungsi tersebut memberi keluaran dalam bentuk yang diminta oleh fungsi metrik."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8F0lpzm7-WSR",
"colab_type": "text"
},
"source": [
"### Argumen `calibration()`\n",
"\n",
"Fungsi meminta 7 argumen posisi dan 2 argumen opsional. Argumen ini bisa dibagi menjadi beberapa bagian:\n",
"\n",
"#### Argumen fungsi\n",
"\n",
"- `observed=`, argumen ini meminta data observasi atau data yang akan dibandingkan hasilnya dengan nilai dari pemodelan.\n",
"- `observed_func=` (_default_=`None`), argumen opsional ini membungkus nilai `observed` yang disediakan agar nilai `observed` menyesuaikan dengan jenis masukan yang diminta oleh fungsi metrik.\n",
"\n",
"#### Argumen model\n",
"- `func=`, argumen ini meminta fungsi model. Contoh: untuk NRECA maka `func=model_NRECA`.\n",
"- `calibration_parameter=`, argumen ini meminta _dictionary_ daftar argumen yang akan digunakan sebagai input `func` dan diiterasi seluruh kombinasi dari parameter yang disediakan.\n",
"- `func_parameter=`, argumen ini serupa dengan `calibration_parameter`, akan tetapi argumen ini meminta _dictionary_ daftar input `func` yang tidak akan diiterasi.\n",
"\n",
"#### Argumen metrik\n",
"- `metrics=`, argumen ini meminta _list_ fungsi atau fungsi yang digunakan untuk mengevaluasi nilai simulasi dengan observasi. Contoh: metrik NSE `metrics=he.NSE` atau dalam bentuk list `metrics=[he.NSE, he.rmse]`.\n",
"- `met_names=`, argumen ini meminta _list_ nama dari fungsi metrik.\n",
"- `met_sort=`, argumen ini meminta nama metrik yang akan diurutkan.\n",
"- `met_min=` (_default_=`True`), mengurutkan kolom `met_sort` dari kecil ke besar atau besar ke kecil jika `False`. \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "orMY4nYkEAkt",
"colab_type": "text"
},
"source": [
"# PENGGUNAAN\n",
"\n",
"Dalam _notebook_ ini akan menggunakan metrik yang telah disediakan pada paket HydroErr. "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IaLZkyVIHjT-",
"colab_type": "text"
},
"source": [
"## Parameter metrik\n",
"\n",
"Fungsi `calibration()` membutuhkan argumen untuk parameter metrik berupa `metrics`, `met_names`, dan `met_sort`; argumen opsional `met_min`.\n",
"\n",
"Metrik dapat dikembangkan sendiri dengan bentuk `nama_metrik(simulasi, observasi)`. Untuk penggunaan praktis, telah tersedia paket HydroErr oleh BYU-Hydroinformatics yang mempersiapkan daftar metrik dalam hidrologi. Daftar metrik yang tersedia bisa baca [disini](https://hydroerr.readthedocs.io/en/stable/list_of_metrics.html).\n",
"\n",
"Dalam _notebook_ ini akan diberikan contoh penggunaan fungsi metrik sendiri dan menggunakan metrik dari HydroErr. Metrik yang akan digunakan antara lain: `nama_metrik` (metrik buatan sendiri), `he.rmse` _root mean square error_, `he.r_squared` _coefficient of determination_, `he.nse` _Nash-Sutcliffe Efficiency_, `he.kge_2012` _Kling-Gupta efficiency_ (2012).\n",
"\n",
"Hasil kalibrasi akan diurutkan berdasarkan `NSE`. Karena performa `NSE` dinyatakan lebih baik jika nilainya mendekati maksimum (1), maka argumen `met_min=False` agar pengurutan nilai dari besar ke kecil.\n",
"\n",
"Fungsi metrik hanya menerima input dalam bentuk `numpy.array` atau _list_. Sehingga keluaran dari model harus disesuaikan dengan permintaan metrik.\n",
"\n",
"Isian untuk `metrics` dan `met_names` **harus berupa _list_**. Panjang (_list_) `met_names` dan `metrics` harus sama."
]
},
{
"cell_type": "code",
"metadata": {
"id": "K-vkIz7HHhPZ",
"colab_type": "code",
"colab": {}
},
"source": [
"import HydroErr as he\n",
"\n",
"def nama_metrik(simulasi, observasi):\n",
" return np.mean(simulasi)/np.mean(observasi)\n",
"\n",
"# Dalam bentuk dictionary agar lebih mudah dibaca\n",
"metrics_parameter = {\n",
" 'metrics': [nama_metrik, he.rmse, he.r_squared, he.nse, he.kge_2012],\n",
" 'met_names': ['NAMA_METRIK', 'RMSE', 'R2', 'NSE', 'KGE_2012'],\n",
" 'met_sort': 'NSE',\n",
" 'met_min': False\n",
"}"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "7-VkDAxYF0l2",
"colab_type": "text"
},
"source": [
"## Parameter Model NRECA\n",
"\n",
"Diketahui bahwa `model_NRECA()` membutuhkan 10 argumen dan 2 argumen opsional. Argumen tersebut dapat dibagi menjadi dua kategori yaitu `calibration_parameter` dan `func_parameter`. "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dpCGMw_cEU4C",
"colab_type": "text"
},
"source": [
"### `calibration_parameter`\n",
"\n",
"Dalam model NRECA, ingin mencari tahu kombinasi parameter terbaik dari `MSTOR`, `GSTOR`, `PSUB`, `GWF`. Isian setiap _key_ (_values_) **harus berupa _list_ / _iterable_**."
]
},
{
"cell_type": "code",
"metadata": {
"id": "2RHWdhFYEa9Z",
"colab_type": "code",
"colab": {}
},
"source": [
"calibration_parameter = {\n",
" 'MSTOR': [1000, 1100, 1200], # dalam bentuk list\n",
" 'GSTOR': (100, 110, 120), # dalam bentuk tuple\n",
" 'PSUB': np.linspace(0.3, 0.8, 31), # menggunakan numpy.linspace\n",
" 'GWF': np.arange(0.2, 0.91, 0.1), # menggunakan numpy.arange\n",
"}"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "nRTiT9IrFpQZ",
"colab_type": "text"
},
"source": [
"### `func_parameter`\n",
"\n",
"Argumen model yang diperlukan oleh `model_NRECA()` disertakan dalam `func_parameter`. Argumen `as_df=False` memastikan hasil keluaran model berbentuk `numpy.ndarray` karena permintaan dari fungsi metrik. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "Te50p3QbGgof",
"colab_type": "code",
"colab": {}
},
"source": [
"func_parameter = {\n",
" 'df': dataset,\n",
" 'precip_col': 'PRECIP',\n",
" 'pet_col': 'PET',\n",
" \n",
" 'AREA': 1450.6e6,\n",
" 'CF': 0.6,\n",
" 'C': 0.25,\n",
"\n",
" 'as_df': False\n",
"}"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "rhxCeK3ZGgXo",
"colab_type": "text"
},
"source": [
"## Kalibrasi\n",
"\n",
"Nilai observasi disimpan pada `dataset` kolom `OBS`. Karena fungsi metrik meminta input dalam bentuk `numpy.array` maka nilai observasi harus diubah sebelum disertakan ke dalam fungsi `calibration()`. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "LIt9mjE4sZYM",
"colab_type": "code",
"outputId": "c9277c03-5906-4680-9e8c-c0853e22ea07",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68
}
},
"source": [
"from hidrokit.contrib.taruma.hk89 import model_NRECA\n",
"\n",
"observed_values = dataset.loc[:, 'OBS'].values\n",
"\n",
"results = calibration(observed_values,\n",
" model_NRECA, calibration_parameter, func_parameter,\n",
" **metrics_parameter)"
],
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": [
"N = 2232\n",
"PROGRESS 0 [-x--xx--x-] 100\n",
"---------> [==========] DONE\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1oJw2kWSMprr",
"colab_type": "text"
},
"source": [
"## Hasil Kalibrasi\n",
"\n",
"Hasil kalibrasi disimpan di `results` dalam bentuk `pandas.DataFrame` yang telah diurutkan berdasarkan nilai `NSE`. Berikut nilai 10 NSE terbaik beserta parameter yang dikalibrasi disertai metrik yang lain:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "71BV2Uqd1-E_",
"colab_type": "code",
"outputId": "75c6dc22-53d7-4893-cb31-02404b7c1216",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 359
}
},
"source": [
"results.head(10)"
],
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>MSTOR</th>\n",
" <th>GSTOR</th>\n",
" <th>PSUB</th>\n",
" <th>GWF</th>\n",
" <th>NAMA_METRIK</th>\n",
" <th>RMSE</th>\n",
" <th>R2</th>\n",
" <th>NSE</th>\n",
" <th>KGE_2012</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1200</td>\n",
" <td>120</td>\n",
" <td>0.400000</td>\n",
" <td>0.2</td>\n",
" <td>1.047834</td>\n",
" <td>36.735131</td>\n",
" <td>0.553446</td>\n",
" <td>0.526348</td>\n",
" <td>0.701803</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1200</td>\n",
" <td>120</td>\n",
" <td>0.416667</td>\n",
" <td>0.2</td>\n",
" <td>1.047347</td>\n",
" <td>36.739909</td>\n",
" <td>0.549800</td>\n",
" <td>0.526225</td>\n",
" <td>0.693170</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1200</td>\n",
" <td>120</td>\n",
" <td>0.383333</td>\n",
" <td>0.2</td>\n",
" <td>1.048322</td>\n",
" <td>36.753441</td>\n",
" <td>0.556862</td>\n",
" <td>0.525876</td>\n",
" <td>0.709968</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1200</td>\n",
" <td>120</td>\n",
" <td>0.433333</td>\n",
" <td>0.2</td>\n",
" <td>1.046860</td>\n",
" <td>36.767768</td>\n",
" <td>0.545910</td>\n",
" <td>0.525506</td>\n",
" <td>0.684108</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1200</td>\n",
" <td>110</td>\n",
" <td>0.400000</td>\n",
" <td>0.2</td>\n",
" <td>1.047183</td>\n",
" <td>36.771415</td>\n",
" <td>0.552507</td>\n",
" <td>0.525412</td>\n",
" <td>0.701492</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1200</td>\n",
" <td>110</td>\n",
" <td>0.416667</td>\n",
" <td>0.2</td>\n",
" <td>1.046695</td>\n",
" <td>36.777133</td>\n",
" <td>0.548837</td>\n",
" <td>0.525264</td>\n",
" <td>0.692858</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1200</td>\n",
" <td>110</td>\n",
" <td>0.383333</td>\n",
" <td>0.2</td>\n",
" <td>1.047670</td>\n",
" <td>36.788763</td>\n",
" <td>0.555946</td>\n",
" <td>0.524964</td>\n",
" <td>0.709658</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1200</td>\n",
" <td>120</td>\n",
" <td>0.366667</td>\n",
" <td>0.2</td>\n",
" <td>1.048809</td>\n",
" <td>36.794806</td>\n",
" <td>0.560062</td>\n",
" <td>0.524808</td>\n",
" <td>0.717623</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>1200</td>\n",
" <td>110</td>\n",
" <td>0.433333</td>\n",
" <td>0.2</td>\n",
" <td>1.046208</td>\n",
" <td>36.805908</td>\n",
" <td>0.544922</td>\n",
" <td>0.524521</td>\n",
" <td>0.683794</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1200</td>\n",
" <td>100</td>\n",
" <td>0.400000</td>\n",
" <td>0.2</td>\n",
" <td>1.046531</td>\n",
" <td>36.808446</td>\n",
" <td>0.551555</td>\n",
" <td>0.524455</td>\n",
" <td>0.701176</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" MSTOR GSTOR PSUB GWF ... RMSE R2 NSE KGE_2012\n",
"0 1200 120 0.400000 0.2 ... 36.735131 0.553446 0.526348 0.701803\n",
"1 1200 120 0.416667 0.2 ... 36.739909 0.549800 0.526225 0.693170\n",
"2 1200 120 0.383333 0.2 ... 36.753441 0.556862 0.525876 0.709968\n",
"3 1200 120 0.433333 0.2 ... 36.767768 0.545910 0.525506 0.684108\n",
"4 1200 110 0.400000 0.2 ... 36.771415 0.552507 0.525412 0.701492\n",
"5 1200 110 0.416667 0.2 ... 36.777133 0.548837 0.525264 0.692858\n",
"6 1200 110 0.383333 0.2 ... 36.788763 0.555946 0.524964 0.709658\n",
"7 1200 120 0.366667 0.2 ... 36.794806 0.560062 0.524808 0.717623\n",
"8 1200 110 0.433333 0.2 ... 36.805908 0.544922 0.524521 0.683794\n",
"9 1200 100 0.400000 0.2 ... 36.808446 0.551555 0.524455 0.701176\n",
"\n",
"[10 rows x 9 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qE27yVdTNaKC",
"colab_type": "text"
},
"source": [
"Mengambil nilai parameter terbaik (baris pertama) dengan fungsi `_best_parameter()`"
]
},
{
"cell_type": "code",
"metadata": {
"id": "dx7mfC4iQEIV",
"colab_type": "code",
"outputId": "89beb4a2-5839-4ece-d75e-48bdaec0e239",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"best_param = _best_parameter(results, calibration_parameter)\n",
"best_param"
],
"execution_count": 13,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'GSTOR': 120.0, 'GWF': 0.2, 'MSTOR': 1200.0, 'PSUB': 0.4}"
]
},
"metadata": {
"tags": []
},
"execution_count": 13
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MQwO6Wx5NiMX",
"colab_type": "text"
},
"source": [
"Memodelkan dengan parameter terbaik yang diperoleh dari hasil kalibrasi. Karena pada `func_parameter` argumen `as_df=False` maka dibuat _dictionary_ baru yang memberikan argumen `as_df=True`."
]
},
{
"cell_type": "code",
"metadata": {
"id": "5dFOdXrSTIx0",
"colab_type": "code",
"outputId": "a5fd76a3-301c-4286-9b46-8d37c812d519",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 419
}
},
"source": [
"func_parameter_df = {\n",
" 'df': dataset,\n",
" 'precip_col': 'PRECIP',\n",
" 'pet_col': 'PET',\n",
" \n",
" 'AREA': 1450.6e6,\n",
" 'CF': 0.6,\n",
" 'C': 0.25,\n",
"\n",
" 'as_df': True\n",
"}\n",
"\n",
"# results with best parameter\n",
"model_NRECA(**func_parameter_df, \n",
" **best_param, report='full')"
],
"execution_count": 14,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>DAYS</th>\n",
" <th>PRECIP</th>\n",
" <th>PET</th>\n",
" <th>STORAGE</th>\n",
" <th>STORAT</th>\n",
" <th>PRERAT</th>\n",
" <th>ETRAT</th>\n",
" <th>AET</th>\n",
" <th>WATBAL</th>\n",
" <th>EXMRAT</th>\n",
" <th>DELSTOR</th>\n",
" <th>GWRECH</th>\n",
" <th>GWSTOR1</th>\n",
" <th>GWSTOR2</th>\n",
" <th>GWFLOW</th>\n",
" <th>DFLOW</th>\n",
" <th>FLOW</th>\n",
" <th>DISCHARGE</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1999-01-01</th>\n",
" <td>31.0</td>\n",
" <td>507.000000</td>\n",
" <td>142.63</td>\n",
" <td>1200.000000</td>\n",
" <td>1.587680</td>\n",
" <td>3.554652</td>\n",
" <td>1.000000</td>\n",
" <td>85.578000</td>\n",
" <td>421.422000</td>\n",
" <td>0.914996</td>\n",
" <td>35.822537</td>\n",
" <td>154.239785</td>\n",
" <td>120.000000</td>\n",
" <td>274.239785</td>\n",
" <td>54.847957</td>\n",
" <td>231.359678</td>\n",
" <td>286.207635</td>\n",
" <td>155.007764</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-02-01</th>\n",
" <td>28.0</td>\n",
" <td>374.228918</td>\n",
" <td>128.84</td>\n",
" <td>1235.822537</td>\n",
" <td>1.635075</td>\n",
" <td>2.904602</td>\n",
" <td>1.000000</td>\n",
" <td>77.304000</td>\n",
" <td>296.924918</td>\n",
" <td>0.933415</td>\n",
" <td>19.770735</td>\n",
" <td>110.861673</td>\n",
" <td>219.391828</td>\n",
" <td>330.253501</td>\n",
" <td>66.050700</td>\n",
" <td>166.292510</td>\n",
" <td>232.343210</td>\n",
" <td>139.317568</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-03-01</th>\n",
" <td>31.0</td>\n",
" <td>211.762683</td>\n",
" <td>138.19</td>\n",
" <td>1255.593272</td>\n",
" <td>1.661233</td>\n",
" <td>1.532402</td>\n",
" <td>1.000000</td>\n",
" <td>82.914000</td>\n",
" <td>128.848683</td>\n",
" <td>0.942619</td>\n",
" <td>7.393517</td>\n",
" <td>48.582067</td>\n",
" <td>264.202801</td>\n",
" <td>312.784868</td>\n",
" <td>62.556974</td>\n",
" <td>72.873100</td>\n",
" <td>135.430074</td>\n",
" <td>73.347844</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-04-01</th>\n",
" <td>30.0</td>\n",
" <td>219.793874</td>\n",
" <td>138.32</td>\n",
" <td>1262.986789</td>\n",
" <td>1.671016</td>\n",
" <td>1.589025</td>\n",
" <td>1.000000</td>\n",
" <td>82.992000</td>\n",
" <td>136.801874</td>\n",
" <td>0.945885</td>\n",
" <td>7.403086</td>\n",
" <td>51.759515</td>\n",
" <td>250.227894</td>\n",
" <td>301.987409</td>\n",
" <td>60.397482</td>\n",
" <td>77.639273</td>\n",
" <td>138.036755</td>\n",
" <td>77.251588</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-05-01</th>\n",
" <td>31.0</td>\n",
" <td>132.121255</td>\n",
" <td>125.36</td>\n",
" <td>1270.389874</td>\n",
" <td>1.680810</td>\n",
" <td>1.053935</td>\n",
" <td>1.000000</td>\n",
" <td>75.216000</td>\n",
" <td>56.905255</td>\n",
" <td>0.949059</td>\n",
" <td>2.898812</td>\n",
" <td>21.602577</td>\n",
" <td>241.589928</td>\n",
" <td>263.192505</td>\n",
" <td>52.638501</td>\n",
" <td>32.403866</td>\n",
" <td>85.042367</td>\n",
" <td>46.058265</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008-08-01</th>\n",
" <td>31.0</td>\n",
" <td>117.425578</td>\n",
" <td>137.29</td>\n",
" <td>1192.596156</td>\n",
" <td>1.577884</td>\n",
" <td>0.855310</td>\n",
" <td>0.969462</td>\n",
" <td>79.858473</td>\n",
" <td>37.567105</td>\n",
" <td>0.910909</td>\n",
" <td>3.346888</td>\n",
" <td>13.688086</td>\n",
" <td>142.509338</td>\n",
" <td>156.197425</td>\n",
" <td>31.239485</td>\n",
" <td>20.532130</td>\n",
" <td>51.771615</td>\n",
" <td>28.039092</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008-09-01</th>\n",
" <td>30.0</td>\n",
" <td>66.624410</td>\n",
" <td>161.50</td>\n",
" <td>1195.943044</td>\n",
" <td>1.582312</td>\n",
" <td>0.412535</td>\n",
" <td>0.877312</td>\n",
" <td>85.011488</td>\n",
" <td>-18.387078</td>\n",
" <td>0.000000</td>\n",
" <td>-18.387078</td>\n",
" <td>-0.000000</td>\n",
" <td>124.957940</td>\n",
" <td>124.957940</td>\n",
" <td>24.991588</td>\n",
" <td>0.000000</td>\n",
" <td>24.991588</td>\n",
" <td>13.986419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008-10-01</th>\n",
" <td>31.0</td>\n",
" <td>265.947354</td>\n",
" <td>166.58</td>\n",
" <td>1177.555966</td>\n",
" <td>1.557985</td>\n",
" <td>1.596514</td>\n",
" <td>1.000000</td>\n",
" <td>99.948000</td>\n",
" <td>165.999354</td>\n",
" <td>0.902311</td>\n",
" <td>16.216257</td>\n",
" <td>59.913239</td>\n",
" <td>99.966352</td>\n",
" <td>159.879591</td>\n",
" <td>31.975918</td>\n",
" <td>89.869858</td>\n",
" <td>121.845776</td>\n",
" <td>65.990697</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008-11-01</th>\n",
" <td>30.0</td>\n",
" <td>249.151252</td>\n",
" <td>150.56</td>\n",
" <td>1193.772224</td>\n",
" <td>1.579440</td>\n",
" <td>1.654830</td>\n",
" <td>1.000000</td>\n",
" <td>90.336000</td>\n",
" <td>158.815252</td>\n",
" <td>0.911565</td>\n",
" <td>14.044878</td>\n",
" <td>57.908150</td>\n",
" <td>127.903672</td>\n",
" <td>185.811822</td>\n",
" <td>37.162364</td>\n",
" <td>86.862225</td>\n",
" <td>124.024589</td>\n",
" <td>69.409749</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008-12-01</th>\n",
" <td>31.0</td>\n",
" <td>199.088447</td>\n",
" <td>144.15</td>\n",
" <td>1207.817102</td>\n",
" <td>1.598022</td>\n",
" <td>1.381120</td>\n",
" <td>1.000000</td>\n",
" <td>86.490000</td>\n",
" <td>112.598447</td>\n",
" <td>0.919207</td>\n",
" <td>9.097166</td>\n",
" <td>41.400512</td>\n",
" <td>148.649458</td>\n",
" <td>190.049970</td>\n",
" <td>38.009994</td>\n",
" <td>62.100769</td>\n",
" <td>100.110763</td>\n",
" <td>54.219188</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>120 rows × 18 columns</p>\n",
"</div>"
],
"text/plain": [
" DAYS PRECIP PET ... DFLOW FLOW DISCHARGE\n",
"1999-01-01 31.0 507.000000 142.63 ... 231.359678 286.207635 155.007764\n",
"1999-02-01 28.0 374.228918 128.84 ... 166.292510 232.343210 139.317568\n",
"1999-03-01 31.0 211.762683 138.19 ... 72.873100 135.430074 73.347844\n",
"1999-04-01 30.0 219.793874 138.32 ... 77.639273 138.036755 77.251588\n",
"1999-05-01 31.0 132.121255 125.36 ... 32.403866 85.042367 46.058265\n",
"... ... ... ... ... ... ... ...\n",
"2008-08-01 31.0 117.425578 137.29 ... 20.532130 51.771615 28.039092\n",
"2008-09-01 30.0 66.624410 161.50 ... 0.000000 24.991588 13.986419\n",
"2008-10-01 31.0 265.947354 166.58 ... 89.869858 121.845776 65.990697\n",
"2008-11-01 30.0 249.151252 150.56 ... 86.862225 124.024589 69.409749\n",
"2008-12-01 31.0 199.088447 144.15 ... 62.100769 100.110763 54.219188\n",
"\n",
"[120 rows x 18 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 14
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DkgdmQUKPVvg",
"colab_type": "text"
},
"source": [
"# Changelog\n",
"\n",
"```\n",
"- 20191215 - 1.0.0 - Initial\n",
"```\n",
"\n",
"#### Copyright &copy; 2019 [Taruma Sakti Megariansyah](https://taruma.github.io)\n",
"\n",
"Source code in this notebook is licensed under a [MIT License](https://choosealicense.com/licenses/mit/). Data in this notebook is licensed under a [Creative Common Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/). \n"
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment