File size: 1,476 Bytes
46c1c8b | 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 | import pandas as pd
import numpy as np
print("Loading existing dataset...")
df = pd.read_parquet('data_output/fastf1_races.parquet')
print("1. Calculating Bayesian pole_conversion_rate...")
if 'pole_conversion_rate' in df.columns:
df = df.drop(columns=['pole_conversion_rate'])
completed = df.dropna(subset=['finish_position']).copy()
poles = completed[completed['grid_position'] == 1].copy()
poles['pole_won'] = (poles['finish_position'] == 1).astype(int)
global_mean = poles['pole_won'].mean()
C = 3.0
stats = poles.groupby('circuit_id').agg(
wins=('pole_won', 'sum'),
total=('pole_won', 'count')
).reset_index()
stats['pole_conversion_rate'] = (stats['wins'] + C * global_mean) / (stats['total'] + C)
df = df.merge(stats[['circuit_id', 'pole_conversion_rate']], on='circuit_id', how='left')
df['pole_conversion_rate'] = df['pole_conversion_rate'].fillna(global_mean)
print("2. Calculating career_race_starts...")
if 'career_race_starts' in df.columns:
df = df.drop(columns=['career_race_starts'])
df_sorted = df.sort_values(by=['driver_id', 'season', 'round']).copy()
df_sorted['career_race_starts'] = df_sorted.groupby('driver_id').cumcount()
df = df.merge(df_sorted[['season', 'round', 'driver_id', 'career_race_starts']], on=['season', 'round', 'driver_id'], how='left')
df['career_race_starts'] = df['career_race_starts'].fillna(0)
print(f"Saving {len(df)} rows...")
df.to_parquet('data_output/fastf1_races.parquet', index=False)
print("Done!")
|