waste-prediction-api / scripts /generate_localized_dataset.py
ALAMDIENG's picture
refactor(arch): structure repository into scalable models/, scripts/, docs/, and data/ directories
53f2a50
Raw
History Blame Contribute Delete
5.56 kB
import pandas as pd
import numpy as np
def generate_local_data():
print("Starting localized dataset generation...")
# Load original dataset
try:
df_global = pd.read_csv("dataset_vibe_coder_2026.csv")
except Exception as e:
print(f"Error loading dataset: {e}")
return
# Ensure chronological order
df_global['TANGGAL'] = pd.to_datetime(df_global['TANGGAL'])
df_global = df_global.sort_values('TANGGAL').reset_index(drop=True)
# Add lag features on global level (weather is shared across Jakarta)
df_global['Rain_Lag_1'] = df_global['RR'].shift(1).fillna(0.0)
df_global['Rain_Lag_2'] = df_global['RR'].shift(2).fillna(0.0)
# Holiday checker for major Indonesian holidays in 2026
def get_holiday_flag(date_obj):
m, d = date_obj.month, date_obj.day
# Specific holiday dates in 2026
holidays = {
(1, 1), # New Year
(2, 17), # Imlek
(3, 18), # Nyepi
(3, 19), # Eid al-Fitr Day 1
(3, 20), # Eid al-Fitr Day 2
(4, 3), # Good Friday
(5, 1), # Labor Day
(5, 14), # Ascension Day
(5, 27), # Eid al-Adha Day 1
(5, 28), # Eid al-Adha Day 2
(5, 31), # Waisak
(6, 16), # Islamic New Year
(8, 17), # Independence Day
(8, 25), # Prophet Birthday
(12, 25) # Christmas
}
# Eid al-Fitr mudik window: March 15 to March 26
if m == 3 and (15 <= d <= 26):
return 1
if (m, d) in holidays:
return 1
return 0
df_global['Is_Holiday'] = df_global['TANGGAL'].apply(get_holiday_flag)
df_global['Hari_Dalam_Minggu'] = df_global['TANGGAL'].dt.dayofweek
df_global['Bulan'] = df_global['TANGGAL'].dt.month
local_rows = []
for idx, row in df_global.iterrows():
date_str = row['TANGGAL'].strftime("%Y-%m-%d")
global_vol = row['Volume_Total_Ton']
rr = row['RR']
rain_lag1 = row['Rain_Lag_1']
rain_lag2 = row['Rain_Lag_2']
is_holiday = row['Is_Holiday']
ada_event = row['Ada_Event']
crowd_scale = row['Crowd_Scale']
hari_ke = row['Hari_Ke']
is_weekend = row['Is_Weekend']
hari_dalam_minggu = row['Hari_Dalam_Minggu']
bulan = row['Bulan']
# Apply Lebaran mudik population drop factor
# If inside March Lebaran window, drop global base volume by 35%
vol_scale = global_vol
if is_holiday == 1 and row['TANGGAL'].month == 3:
vol_scale = global_vol * 0.65
# JIS (North Jakarta)
# Base volume: ~120 tons average
jis_vol = vol_scale * (120.0 / 7700.0)
# Event spikes at Stadium
if ada_event == 1:
jis_vol += crowd_scale * 15.0
# Weekend recreation factor
if is_weekend == 1:
jis_vol *= 1.05
local_rows.append({
'Tanggal': date_str, 'Location': 'JIS', 'Volume_Ton': jis_vol,
'RR': rr, 'Rain_Lag_1': rain_lag1, 'Rain_Lag_2': rain_lag2,
'Is_Holiday': is_holiday, 'Ada_Event': ada_event, 'Crowd_Scale': crowd_scale,
'Hari_Ke': hari_ke, 'Is_Weekend': is_weekend, 'Hari_Dalam_Minggu': hari_dalam_minggu, 'Bulan': bulan
})
# GBK (Central/South)
# Base volume: ~85 tons average
gbk_vol = vol_scale * (85.0 / 7700.0)
# Event spikes at Stadium
if ada_event == 1:
gbk_vol += crowd_scale * 12.0
# Weekend public sports factor
if is_weekend == 1:
gbk_vol *= 1.15
local_rows.append({
'Tanggal': date_str, 'Location': 'GBK', 'Volume_Ton': gbk_vol,
'RR': rr, 'Rain_Lag_1': rain_lag1, 'Rain_Lag_2': rain_lag2,
'Is_Holiday': is_holiday, 'Ada_Event': ada_event, 'Crowd_Scale': crowd_scale,
'Hari_Ke': hari_ke, 'Is_Weekend': is_weekend, 'Hari_Dalam_Minggu': hari_dalam_minggu, 'Bulan': bulan
})
# Pasar Senen (Central)
# Base volume: ~45 tons average
senen_vol = vol_scale * (45.0 / 7700.0)
# Weekday market commerce factor
if is_weekend == 0:
senen_vol *= 1.10
local_rows.append({
'Tanggal': date_str, 'Location': 'Pasar Senen', 'Volume_Ton': senen_vol,
'RR': rr, 'Rain_Lag_1': rain_lag1, 'Rain_Lag_2': rain_lag2,
'Is_Holiday': is_holiday, 'Ada_Event': 0, 'Crowd_Scale': 0,
'Hari_Ke': hari_ke, 'Is_Weekend': is_weekend, 'Hari_Dalam_Minggu': hari_dalam_minggu, 'Bulan': bulan
})
# Gang Sempit Tambora (West)
# Base volume: ~8.5 tons average
tambora_vol = vol_scale * (8.5 / 7700.0)
# Hujan block factor (heavy rain delays alley collection)
if rr > 20:
tambora_vol *= 0.75
local_rows.append({
'Tanggal': date_str, 'Location': 'Gang Sempit Tambora', 'Volume_Ton': tambora_vol,
'RR': rr, 'Rain_Lag_1': rain_lag1, 'Rain_Lag_2': rain_lag2,
'Is_Holiday': is_holiday, 'Ada_Event': 0, 'Crowd_Scale': 0,
'Hari_Ke': hari_ke, 'Is_Weekend': is_weekend, 'Hari_Dalam_Minggu': hari_dalam_minggu, 'Bulan': bulan
})
df_local = pd.DataFrame(local_rows)
df_local.to_csv("dataset_local_2026.csv", index=False)
print("dataset_local_2026.csv generated successfully with 1460 rows!")
if __name__ == "__main__":
generate_local_data()