Skip to main content

LiveF1 - An Open-Source Formula 1 Data Processing Toolkit

Written in Python PyPI version License: MIT View livef1 on GitHub Author goktugocal

LiveF1 is a powerful Python toolkit for accessing and analyzing Formula 1 data in real-time or from historical archives. It's designed for developers, analysts, and F1 fans building applications around Formula 1 insights.

LiveF1 Data Flow

Features

  • Real-Time Race Data: Provides live telemetry, timing, and position updates, ideal for powering dashboards and live analytics.
  • Historical Data Access: Includes comprehensive race data from past seasons, perfect for performance analysis and comparisons.
  • Data Processing Modules: Built-in ETL tools make raw data immediately usable, supporting analysis and seamless data storage.
  • Easy Integration: Simple API for both real-time and historical data

In a nutshell:

Using LiveF1, you can access real-time and historical racing data, making it easy to feed analytics and visualizations.

Data sources

LiveF1 combines two backends:

  • Formula 1 Livetiming — Official timing static JSON and feeds for session discovery and archived high-frequency topics (telemetry, timing, position, weather, etc.).
  • Jolpica F1 API — Community Ergast-style JSON REST API for seasons, calendars, drivers, constructors, results, standings, and related structured data.

Livetiming alone does not cover every object shape users need; Jolpica fills and enriches the season calendar when Livetiming is incomplete and supplies championship-oriented data. The HTTP client for Jolpica is BaseF1 (source), a separate library that LiveF1 depends on.

Installation

Install using pip:

pip install livef1

Quick Start

Historical Data

Access data from past races:

import livef1

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

# Load position data
position_data = session.get_data(
    dataNames="Position.z"
)

print(position_data.head())
  |    |   SessionKey | timestamp    | Utc                          |   DriverNo | Status   |   X |   Y |   Z |
  |---:|-------------:|:-------------|:-----------------------------|-----------:|:---------|----:|----:|----:|
  |  0 |         9574 | 00:01:45.570 | 2024-07-28T12:10:22.7877313Z |          1 | OnTrack  |   0 |   0 |   0 |
  |  1 |         9574 | 00:01:45.570 | 2024-07-28T12:10:22.7877313Z |          2 | OnTrack  |   0 |   0 |   0 |
  |  2 |         9574 | 00:01:45.570 | 2024-07-28T12:10:22.7877313Z |          3 | OnTrack  |   0 |   0 |   0 |
  |  3 |         9574 | 00:01:45.570 | 2024-07-28T12:10:22.7877313Z |          4 | OnTrack  |   0 |   0 |   0 |
  |  4 |         9574 | 00:01:45.570 | 2024-07-28T12:10:22.7877313Z |         10 | OnTrack  |   0 |   0 |   0 |

Data Processing

LiveF1 uses a medallion architecture to process F1 data into analysis-ready formats:

# Generate processed data tables
session.generate(silver=True)

# Access refined data
laps_data = session.get_laps()
telemetry_data = session.get_car_telemetry()

print(laps_data.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 |

Real-Time Data

Stream live race data:

from livef1.adapters import RealF1Client

# Initialize client with topics to subscribe
client = RealF1Client(
    topics=["CarData.z", "Position.z"],
    log_file_name="race_data.json"  # Optional: log data to file
)

# Define callback for incoming data
@client.callback("telemetry_handler")
async def handle_data(records):
    for record in records:
        print(record)  # Process incoming data

# Start receiving data
client.run()

Documentation

For detailed documentation, examples, and API reference, visit our documentation page.

Testing

The project uses pytest for unit tests. Install dev dependencies and run the test suite:

pip install -r requirements-dev.txt
pytest tests/ -v

With coverage:

pytest tests/ -v --cov=livef1 --cov-report=term-missing

Example scripts that use the library (without assertions) live in the examples/ directory.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

FEEL FREE TO CONTACT ME

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

livef1-1.2.6.tar.gz (87.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

livef1-1.2.6-py3-none-any.whl (81.1 kB view details)

Uploaded Python 3

File details

Details for the file livef1-1.2.6.tar.gz.

File metadata

  • Download URL: livef1-1.2.6.tar.gz
  • Upload date:
  • Size: 87.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for livef1-1.2.6.tar.gz
Algorithm Hash digest
SHA256 bad301d6ba4b339c01433ee68bf2de8e1bcf1ac9086954dcf6631b80ba2bd37f
MD5 90e9f6e6d259ac5600f8386317852e6f
BLAKE2b-256 7484c0f835305355209e94640704b0af26163b9329cd9a87c3b31b043802c6d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for livef1-1.2.6.tar.gz:

Publisher: publish.yml on GoktugOcal/LiveF1

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file livef1-1.2.6-py3-none-any.whl.

File metadata

  • Download URL: livef1-1.2.6-py3-none-any.whl
  • Upload date:
  • Size: 81.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for livef1-1.2.6-py3-none-any.whl
Algorithm Hash digest
SHA256 ed160f806f10649810a1bfb8cd9a2079b0fdf6462e354d12f9b0f4b269d5d8b3
MD5 a77fa4971511b4063f679a5375f6bf33
BLAKE2b-256 ade488e7bcaa0c5b7d44345da45e0ae93fbb2820e85780aa0d5a9d138736278f

See more details on using hashes here.

Provenance

The following attestation bundles were made for livef1-1.2.6-py3-none-any.whl:

Publisher: publish.yml on GoktugOcal/LiveF1

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.2.10

2 files

1.2.9

2 files

1.2.8

2 files

1.2.7

2 files

This release

1.2.6 This release

2 files

1.2.5

2 files

1.2.4

2 files

1.2.3

2 files

1.2.2

2 files

1.2.1

2 files

1.2.0

2 files

1.1.107

2 files

1.1.106

2 files

1.1.105

2 files

1.1.104

2 files

1.1.103

2 files

1.1.102

2 files

1.1.101

2 files

1.1.100

2 files

1.1.0

2 files

1.0.975

2 files

1.0.973

2 files

1.0.972

2 files

1.0.971

2 files

1.0.970

2 files

1.0.961

2 files

1.0.960

2 files

1.0.953

2 files

1.0.952

2 files

1.0.951

2 files

1.0.96

2 files

1.0.94

2 files

1.0.93

2 files

1.0.92

2 files

1.0.9

2 files

1.0.8

2 files

1.0.7

2 files

1.0.6

2 files

1.0.5

2 files

1.0.4

2 files

1.0.3

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

0.1.55

2 files

0.1.54

2 files

0.1.53

2 files

0.1.52

2 files

0.1.51

2 files

0.1.50

2 files

0.1.49

2 files

0.1.48

2 files

0.1.47

2 files

0.1.46

2 files

0.1.45

2 files

0.1.44

2 files

0.1.43

2 files

0.1.41

2 files

0.1.40

2 files

0.1.34

2 files

0.1.33

2 files

0.1.32

2 files

0.1.31

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page