<jupyter_start><jupyter_text>Berdasarkan [102](https://github.com/taruma/hidrokit/issues/102): **upsampling data**Referensi Isu:- `hidrokit.contrib.taruma.hk98`. ([manual/notebook](https://gist.github.com/taruma/aca7f90c8fbb0034587809883d0d9e92)\). **buat ringkasan/rekap data deret waktu**Deskripsi permasalahan:- Mengubah data bulanan menjadi data harian sehingga dapat di rekap menggunakan fungsi yang tersedia di `hidrokit.contrib.taruma.hk98`.Strategi penyelesaian:- Pada melakukan upsampling, nilai yang kosong bisa diisi menggunakan metode interpolasi atau diisi dengan nilai pada awal bulan (_default_).  PERSIAPAN DAN DATASET<jupyter_code>import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [15, 5]
try:
    import hidrokit
except ModuleNotFoundError:
    !pip install git+https://github.com/taruma/hidrokit.git@latest -q
    import hidrokit
print(f'hidrokit version: {hidrokit.__version__}')
!wget -O pet.xlsx "https://taruma.github.io/assets/hidrokit_dataset/fjmock_sample.xlsx" -q
!wget -O sta.xlsx "https://taruma.github.io/assets/hidrokit_dataset/data_daily_sample.xlsx" -q
sta_path = 'sta.xlsx'
pet_path = 'sample.xlsx'
df_pet = (pd.read_excel(pet_path, usecols=[3])
            .set_index(
                pd.date_range('20050101', '20160101', freq='MS', closed='left')
            )
         )
df_pet.head()
from hidrokit.contrib.taruma import hk88

df_sta = hk88.read_workbook(sta_path, ['STA_B'])
df_sta.head()<jupyter_output><empty_output><jupyter_text>KODE<jupyter_code># ref: https://stackoverflow.com/q/29612705/4886384
def upsampling(df, freq='D', fill_method='ffill', 
               use_inter=False, inter_method='linear', inter_keys={}, 
               reindex=False):
    start = df.index.min() - pd.DateOffset(day=1)
    end = df.index.max() - pd.DateOffset(day=31)
    date = pd.date_range(start, end, freq=freq)

    newdf = df.reindex(date)

    if reindex:
        return newdf

    if use_inter:
        return newdf.interpolate(method=inter_method, **inter_keys)
    else:
        return newdf.fillna(method=fill_method)<jupyter_output><empty_output><jupyter_text>PENERAPANPada _notebook_ ini terdapat dua dataset yaitu `df_sta` (data hujan stasiun B) dan `df_pet` (data evapotranspirasi). Dua dataset ini memiliki perbedaan dari jumlah data dan observasinya, pada `df_sta` data dalam bentuk observasi harian, sedangkan pada `df_pet` data berupa observasi bulanan. Dalam pemodelan F.J. Mock (`hidrokit.contrib.taruma.hk96`) data masukan bisa memiliki sembarang periode (per 3 hari, 15 hari, dll). Untuk data `df_sta` bisa dilakukan rekap data menggunakan modul `contrib.taruma.hk98`, sedangkan data `df_pet` tidak bisa menyesuaikan dengan periode tersebut karena data bukan data harian.Fungsi `upsampling` menangani permasalahan tersebut dengan mengubah data bulanan menjadi harian dengan pengisian berbagai metode (interpolasi, atau isian dari awal bulan).   Fungsi `upsampling`Fungsi ini mengubah data bulanan/periode ke data harian dengan menggunakan berbagai metode (isian atau interpolasi). Argumen yang harus diberikan:- `df`: dataset dalam objek `pandas.DataFrame` dengan index berupa objek `DateTimeIndex`/`Timestamp`.Argumen opsional:- `fill_method='ffill'`: mengisi data yang kosong dengan metode _forward fill_. Metode merupakan isian valid untuk argumen `method` pada metode `pandas.DataFrame.fillna()`.- `freq='D'`: mengubah dalam bentuk harian.- `use_inter=None`: isi `True` jika ingin menggunakan `inter_method`.- `inter_method='linear'`: metode interpolasi.- `inter_keys={}`: _keywords_ untuk metode interpolasi.- `reindex=False`: isi `True` jika hanya mendapatkan keluaran tanpa mengisi data yang kosong.   Dataset `df_pet`Berikut informasi `df_pet` sebelum dilakukan _upsampling_.<jupyter_code>df_pet.info()
df_pet.head()
df_pet.plot();<jupyter_output><empty_output><jupyter_text>Sebelum dilakukan _upsampling_ data hanya memiliki $132$ data observasi dengan frekuensi bulanan `MS`.  Menggunakan _forward fill_ (_default_)<jupyter_code>df_pet_ffill = upsampling(df_pet)
df_pet_ffill.info()
df_pet_ffill.head()
df_pet_ffill.plot();<jupyter_output><empty_output><jupyter_text>Dataframe `df_pet` setelah dilakukan _upsampling_ menjadi $4017$ data observasi dengan frekuensi harian `D`.   Menggunakan interpolasi<jupyter_code>df_pet_inter = upsampling(df_pet, use_inter=True, inter_method='linear')
df_pet_inter.info()
df_pet_inter.head()
df_pet_inter.plot();<jupyter_output><empty_output><jupyter_text>Perbedaan dengan _forward fill_ dapat dilihat dari grafiknya.<jupyter_code>df_pet_quad = upsampling(df_pet, use_inter=True, inter_method='quadratic')
df_pet_quad.info()
df_pet_quad.head()
df_pet_quad.plot();<jupyter_output><empty_output><jupyter_text>Jika menggunakan metode `quadratic`, grafik menjadi lebih halus.  Melakukan _reindex_ sajaArgumen ini disediakan agar memberi kebebasan jika tidak ingin menggunakan metode interpolasi/isian.<jupyter_code>df_pet_re = upsampling(df_pet, reindex=True)
df_pet_re.info()
df_pet_re.head()<jupyter_output><class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 4017 entries, 2005-01-01 to 2015-12-31
Freq: D
Data columns (total 1 columns):
PET    132 non-null float64
dtypes: float64(1)
memory usage: 62.8 KB<jupyter_text>Menggabungkan dengan modul `taruma.hk98` (rekap data harian)Modul ini bisa digabungkan dengan modul `taruma.hk98` yang digunakan untuk merekap data harian.Karena `df_pet` sudah diubah menjadi data harian (`df_pet_ffill`), maka bisa digabungkan dengan `df_sta`. Dataframe `dataset` dimulai dari tahun 2005 karena `df_pet` hanya dimulai dari tahun 2005.<jupyter_code>dataset = pd.concat([df_sta, df_pet_ffill], axis=1).loc['20050101':]
dataset<jupyter_output><empty_output><jupyter_text>Setelah mempersiapkan `dataset`, dapat dilakukan rekap menggunakan modul `taruma.hk98`. Pada data curah hujan, akan dilakukan penjumlahan curah hujan, jumlah hari hujan, jumlah hari periode. Sedangkan pada data PET, hanya merekap dengan merata-ratakan nilainya setiap periode. Periode yang akan digunakan adalah per 11 hari (3 periode).<jupyter_code>from hidrokit.contrib.taruma import hk98

NDAYS = '11D'
n_rain = lambda x: (x>0).sum()
ufunc, ufunc_col = [np.sum, n_rain, len], ['SUM', 'NRAIN', 'NDAYS']

dataset_pet = hk98.summary_station(dataset, 'PET', np.mean, 'PET', 
                                   n_days=NDAYS)
dataset_prep = hk98.summary_station(dataset, 'STA_B', ufunc, ufunc_col, 
                                    n_days=NDAYS)

data_input = pd.concat([dataset_prep, dataset_pet], axis=1)
data_input.columns = data_input.columns.droplevel(0)
data_input.head(10)
data_input.sample(10)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10549154571300315, 'fraction_numerical': 0.02394134370791561, 'mean_word_length': 5.637537239324727, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 38, 'https://': 6, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '304845', 'license': 'MIT', 'n_tokens_mistral': 2730, 'n_tokens_neox': 2510, 'n_words': 566, 'path': 'booklet_hidrokit/0.4.0/ipynb/manual/taruma_0_3_5_hk102_upsampling.ipynb', 'repo_name': 'hidrokit/manual', 'size': '6683'}