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