File size: 5,559 Bytes
fa0e01d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | 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()
|