| 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!") |
|
|