pitwall-f1-copilot / src /fastf1_loader.py
ashish-doing's picture
fix: chart PNG render fix
11b96a1
Raw
History Blame Contribute Delete
2.52 kB
import fastf1
import pandas as pd
import os
CACHE_DIR = "/tmp/f1cache"
os.makedirs(CACHE_DIR, exist_ok=True)
fastf1.Cache.enable_cache(CACHE_DIR)
def get_race_session(year: int, grand_prix: str, session_type: str = 'R'):
"""Load a race session from FastF1."""
session = fastf1.get_session(year, grand_prix, session_type)
session.load(telemetry=True, weather=True, messages=False)
return session
def get_driver_stints(session, driver: str):
"""Get stint/tire data for a specific driver."""
laps = session.laps.pick_drivers(driver)
stints = laps[['LapNumber', 'Compound', 'TyreLife', 'LapTime', 'PitInTime', 'PitOutTime']].copy()
stints['LapTimeSeconds'] = stints['LapTime'].dt.total_seconds()
return stints
def get_pit_stops(session, driver: str):
"""Extract pit stop laps for a driver."""
laps = session.laps.pick_drivers(driver)
pit_laps = laps[laps['PitInTime'].notna()][['LapNumber', 'Compound', 'TyreLife']].copy()
return pit_laps
def get_race_summary(session, driver: str):
"""Get a concise race summary dict for Granite to analyze."""
stints = get_driver_stints(session, driver)
pit_stops = get_pit_stops(session, driver)
summary = {
"driver": driver,
"grand_prix": session.event['EventName'],
"year": session.event.year,
"total_laps": int(stints['LapNumber'].max()) if not stints.empty else 0,
"compounds_used": stints['Compound'].dropna().unique().tolist(),
"pit_stop_laps": pit_stops['LapNumber'].tolist(),
"avg_lap_time": round(stints['LapTimeSeconds'].mean(), 3),
"best_lap_time": round(stints['LapTimeSeconds'].min(), 3),
"stint_breakdown": []
}
# Build stint breakdown
current_compound = None
stint_start = None
for _, row in stints.iterrows():
if row['Compound'] != current_compound:
if current_compound is not None:
summary['stint_breakdown'].append({
"compound": current_compound,
"start_lap": int(stint_start),
"end_lap": int(row['LapNumber'] - 1),
"length": int(row['LapNumber'] - stint_start)
})
current_compound = row['Compound']
stint_start = row['LapNumber']
return summary
if __name__ == "__main__":
print("Loading 2024 Monaco GP...")
session = get_race_session(2024, 'Monaco', 'R')
summary = get_race_summary(session, 'LEC')
print(summary)