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')