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()