Historical Data

The LiveF1 package provides access to historical Formula 1 data through Session objects, which contain comprehensive race data including timing, telemetry, and other metrics.

Accessing Historical Data

Direct Session Access

The most common way to access historical data is through sessions:

import livef1

# Get specific session directly
race = livef1.get_session(
    season=2024,
    meeting_identifier="Spa",  # Circuit/Location name
    session_identifier="Race"     # Session type
)

Note

You can also access data through Season and Meeting objects for broader data exploration:

# Alternative: Browse through season/meeting structure
season = livef1.get_season(2024)
belgian_gp = livef1.get_meeting(season=2024, meeting_identifier="Spa")

# View available sessions
print(belgian_gp.sessions_table)

Working with Session Data

Once you have a session object, you can access different types of data:

1. Raw Data Access

# Access specific data
weather_data = race.get_data("WeatherData")
car_data = race.get_data("CarData.z")

display(weather_data.head())
display(car_data.head())
|    |   SessionKey | timestamp    |   AirTemp |   Humidity |   Pressure |   Rainfall |   TrackTemp |   WindDirection |   WindSpeed |
|---:|-------------:|:-------------|----------:|-----------:|-----------:|-----------:|------------:|----------------:|------------:|
|  0 |         9574 | 00:00:14.052 |      21   |         52 |      978.1 |          0 |        42.1 |             217 |         0.5 |
|  1 |         9574 | 00:01:14.050 |      20.6 |         53 |      978   |          0 |        42.1 |               0 |         1.1 |
|  2 |         9574 | 00:02:14.047 |      20.6 |         52 |      978   |          0 |        42.2 |             284 |         0.7 |
|  3 |         9574 | 00:03:14.053 |      20.7 |         51 |      978.1 |          0 |        42   |             244 |         1.4 |
|  4 |         9574 | 00:04:14.057 |      20.7 |         51 |      978.1 |          0 |        41.1 |              13 |         1.2 |

|    |   SessionKey | timestamp    | Utc                          |   DriverNo |   rpm |   speed |   n_gear |   throttle |   brake |   drs |
|---:|-------------:|:-------------|:-----------------------------|-----------:|------:|--------:|---------:|-----------:|--------:|------:|
|  0 |         9574 | 00:02:28.746 | 2024-07-28T12:11:06.7233441Z |          1 |     0 |       0 |        0 |          0 |       0 |     0 |
|  1 |         9574 | 00:02:28.746 | 2024-07-28T12:11:06.7233441Z |          2 |     0 |       0 |        0 |          0 |       0 |     0 |
|  2 |         9574 | 00:02:28.746 | 2024-07-28T12:11:06.7233441Z |          3 |     0 |       0 |        0 |          0 |       0 |     0 |
|  3 |         9574 | 00:02:28.746 | 2024-07-28T12:11:06.7233441Z |          4 |     0 |       0 |        0 |          0 |       0 |     0 |
|  4 |         9574 | 00:02:28.746 | 2024-07-28T12:11:06.7233441Z |         10 |     0 |       0 |        0 |          0 |       0 |     0 |

See also

For a complete list of available topics and their descriptions, see LiveTiming Data Topics

2. Processed Data

Generate processed data tables using the medallion architecture:

# Generate silver and gold tables
race.generate()

# Access processed data
laps = race.get_laps()
telemetry = race.get_car_telemetry()

display(laps.head())
|    |   lap_number | lap_time               | in_pit                 | pit_out   | sector1_time           | sector2_time           | sector3_time           | None   |   speed_I1 |   speed_I2 |   speed_FL |   speed_ST |   no_pits | lap_start_time         |   DriverNo | lap_start_date             |
|---:|-------------:|:-----------------------|:-----------------------|:----------|:-----------------------|:-----------------------|:-----------------------|:-------|-----------:|-----------:|-----------:|-----------:|----------:|:-----------------------|-----------:|:---------------------------|
|  0 |            1 | NaT                    | 0 days 00:17:07.661000 | NaT       | NaT                    | 0 days 00:00:48.663000 | 0 days 00:00:29.571000 |        |        314 |        204 |            |        303 |         0 | NaT                    |         16 | 2024-07-28 13:03:52.742000 |
|  1 |            2 | 0 days 00:01:50.240000 | NaT                    | NaT       | 0 days 00:00:31.831000 | 0 days 00:00:48.675000 | 0 days 00:00:29.734000 |        |        303 |        203 |        219 |            |         0 | 0 days 00:57:07.067000 |         16 | 2024-07-28 13:05:45.045000 |
|  2 |            3 | 0 days 00:01:50.519000 | NaT                    | NaT       | 0 days 00:00:31.833000 | 0 days 00:00:49.132000 | 0 days 00:00:29.554000 |        |        311 |        202 |        215 |        304 |         0 | 0 days 00:58:57.307000 |         16 | 2024-07-28 13:07:35.285000 |
|  3 |            4 | 0 days 00:01:49.796000 | NaT                    | NaT       | 0 days 00:00:31.592000 | 0 days 00:00:48.778000 | 0 days 00:00:29.426000 |        |        312 |        201 |        217 |        309 |         0 | 0 days 01:00:47.870000 |         16 | 2024-07-28 13:09:25.848000 |
|  4 |            5 | 0 days 00:01:49.494000 | NaT                    | NaT       | 0 days 00:00:31.394000 | 0 days 00:00:48.729000 | 0 days 00:00:29.371000 |        |        313 |        197 |        217 |        311 |         0 | 0 days 01:02:37.721000 |         16 | 2024-07-28 13:11:15.699000 |

Example: Complete Historical Data Analysis

Here’s a complete example showing how to access and analyze historical race data:

import livef1

# Get a specific race session
race = livef1.get_session(
    season=2023,
    meeting_identifier="Monaco",
    session_identifier="Race"
)

# Generate processed data
race.generate()

# Get lap times and telemetry
laps_data = race.get_laps()
telemetry = race.get_car_telemetry()

# Analyze fastest laps
fastest_laps = laps_data.sort_values('LapTime').groupby('DriverNumber').first()
print("Fastest laps by driver:\n****************")
print(fastest_laps[['LapTime', 'LapNumber']])
Fastest laps by driver:
****************
|   DriverNo | lap_time               |   lap_number |
|-----------:|:-----------------------|-------------:|
|          1 | 0 days 00:01:46.128000 |           32 |
|         10 | 0 days 00:01:47.418000 |           30 |
|         11 | 0 days 00:01:44.701000 |           44 |
|         14 | 0 days 00:01:48.051000 |           42 |
|         16 | 0 days 00:01:47.013000 |           33 |
|         18 | 0 days 00:01:48.105000 |           44 |
|          2 | 0 days 00:01:47.490000 |           43 |
|         20 | 0 days 00:01:47.848000 |           44 |
|         22 | 0 days 00:01:47.969000 |           44 |
|         23 | 0 days 00:01:47.996000 |           44 |
|         24 | 0 days 00:01:52.099000 |            2 |
|         27 | 0 days 00:01:48.954000 |           44 |
|          3 | 0 days 00:01:47.435000 |           37 |
|         31 | 0 days 00:01:46.957000 |           43 |
|          4 | 0 days 00:01:45.563000 |           31 |
|         44 | 0 days 00:01:46.653000 |           33 |
|         55 | 0 days 00:01:46.364000 |           44 |
|         63 | 0 days 00:01:47.113000 |           44 |
|         77 | 0 days 00:01:47.019000 |           37 |
|         81 | 0 days 00:01:45.840000 |           32 |