[AIviVN_bandwidth_prediction] Baseline with moving average

bandwidth_prediction

#1

Chào mọi người, mình xin chia sẻ một baseline cho cuộc thi số 5. Moving average được tính theo từng zone và từng giờ khác nhau, có dùng log-transformation cho 2 biến bandwidth_total và max_user. Các bạn có thể thử experiment với các window size khác nhau.

df = pd.read_csv(train_path)
df.rename(columns=lambda x: x.lower().strip(), inplace=True)
test_df = pd.read_csv(test_path)
test_df.rename(columns=lambda x: x.lower().strip(), inplace=True)

# Moving avg function definition
def moving_average(series, n):
    """
        Calculate average of last n observations
    """
    return np.average(series[-n:])
    
# Log-transform the target variables 
df['bw_log'] = np.log1p(df['bandwidth_total'])
df['u_log'] = np.log1p(df['max_user'])

# Calculate moving avg - By zone and by hour
for z in df.zone_code.unique():
    zone = df[df.zone_code == z]
    for h in df.hour_id.unique():
        avg_bw = moving_average(zone[zone.hour_id == h]['bw_log'], 7)
        avg_u = moving_average(zone[zone.hour_id == h]['u_log'], 7)
        test_df.loc[(test_df['zone_code'] == z) & (test_df['hour_id'] == h), 'bandwidth_total'] = np.expm1(avg_bw).round(2)
        test_df.loc[(test_df['zone_code'] == z) & (test_df['hour_id'] == h), 'max_user'] = np.expm1(avg_u).round()

# Export the result to CSV file
test_df['label'] = test_df['bandwidth_total'].astype(str) + ' ' + test_df['max_user'].astype(int).astype(str)
test_df[['id', 'label']].to_csv('submission_moving_avg.csv', index=False)

Chúc mọi người thi tốt và có nhiều model hay.