Race Analysis Pipeline¶
This example demonstrates a complete end-to-end pipeline for analyzing Formula 1 race data, including lap times, tire strategies, and performance metrics.
Setup¶
First, let’s import the required libraries:
import livef1
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import timedelta
Loading Race Data¶
# Get the race session
race = livef1.get_session(
season=2024,
meeting_identifier="Spa",
session_identifier="Race"
)
# Generate silver tables
race.generate(silver=True)
# Load different data types
laps = race.get_laps()
telemetry = race.get_car_telemetry()
weather = race.get_weather()
timing = race.get_timing()
Lap Time Analysis¶
def analyze_lap_times(laps_df):
# Calculate average lap times per driver
avg_lap_times = laps_df.groupby('DriverNo')['lap_time'].mean()
# Create lap time evolution plot
plt.figure(figsize=(15, 8))
for driver in laps_df['DriverNo'].unique():
driver_laps = laps_df[(laps_df['DriverNo'] == driver) & (laps_df['lap_time'] > timedelta(seconds=10))]
plt.plot(
driver_laps['lap_number'],
driver_laps['lap_time'],
label=f'Driver {driver}'
)
plt.title('Lap Time Evolution')
plt.xlabel('Lap Number')
plt.ylabel('Lap Time (seconds)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid(True)
plt.tight_layout()
plt.show()
return avg_lap_times
avg_lap_times = analyze_lap_times(laps)
print("\nAverage Lap Times:")
print(avg_lap_times)
Performance Analysis¶
def analyze_performance(telemetry_df):
# Calculate speed statistics per driver
speed_stats = telemetry_df.groupby('DriverNo').agg({
'speed': ['mean', 'max', 'std']
})
# Create speed distribution plot
plt.figure(figsize=(15, 8))
sns.boxplot(data=telemetry_df, x='DriverNo', y='speed')
plt.title('Speed Distribution by Driver')
plt.xlabel('Driver Number')
plt.ylabel('Speed (km/h)')
plt.grid(True)
plt.show()
return speed_stats
performance_stats = analyze_performance(telemetry)
print("\nPerformance Statistics:")
print(performance_stats)
Complete Pipeline¶
Here’s how to combine all analyses into a complete pipeline:
def race_analysis_pipeline(session):
# Generate required data
session.generate(silver=True)
# Load data
laps = session.get_laps()
telemetry = session.get_car_telemetry()
# Run analyses
lap_analysis = analyze_lap_times(laps)
performance_analysis = analyze_performance(telemetry)
# Combine results
results = {
'lap_times': lap_analysis,
'performance': performance_analysis
}
return results
# Run the complete pipeline
race_results = race_analysis_pipeline(race)
# Export results
for analysis_name, data in race_results.items():
data.to_csv(f'{analysis_name}.csv')