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.7.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.7-py3-none-any.whl (81.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: livef1-1.2.7.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.7.tar.gz
Algorithm Hash digest
SHA256 375694f6566eb0362b5ef1ac31a9984a8a43a658822a2f63a9cbad4da9521435
MD5 a56769e6b1a66254d1f206029b81824d
BLAKE2b-256 1d2d9b4851245303fad842c9123219e02c2237e2da4a81a6c28a1fa749f582b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for livef1-1.2.7.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.7-py3-none-any.whl.

File metadata

  • Download URL: livef1-1.2.7-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.7-py3-none-any.whl
Algorithm Hash digest
SHA256 1eab0b3da67699c5f8a4a703bcaa347747982199a69d7ae3f676ff9547f3db69
MD5 aad6d8b2ed8f52136a69916b889071b0
BLAKE2b-256 790b7fadb51b93e2b769bc49af185dbba3e2e2e22bcf92a5fb5d3761c9b93406

See more details on using hashes here.

Provenance

The following attestation bundles were made for livef1-1.2.7-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

This release

1.2.7 This release

2 files

1.2.6

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