fast-forward
Fast, Rust-powered tracking data loader for soccer analytics.
fast-forward loads tracking data from all major providers into Polars DataFrames with a unified API. Built on a Rust core for speed, it handles parsing, coordinate transformations, and orientation normalization out of the box.
pip install fast-forward-football
Key Features¶
- 11 providers supported with a consistent
load_tracking()interface - Polars DataFrame and PySpark DataFrame support for fast, memory-efficient data processing
- Coordinate transformations between all major coordinate systems
- Orientation normalization to ensure consistent attacking directions
- 3 layouts (long, long_ball, wide) for different analysis workflows
Benchmarks¶
fast-forward's Rust core is significantly faster than pure-Python alternatives. See the full Benchmarks page for details.

Quick Example¶
from fastforward import secondspectrum
dataset = secondspectrum.load_tracking(
raw_data="tracking.jsonl",
meta_data="metadata.json",
)
# Access data via properties
dataset.tracking # Polars DataFrame with tracking data
dataset.metadata # Match-level metadata (1 row)
dataset.teams # Team info (2 rows)
dataset.players # Player roster
dataset.periods # Period boundaries
# Transform coordinates
transformed = dataset.transform(
to_coordinates="opta",
to_orientation="home_away",
)
Supported Providers¶
| Provider | Format | Files Required |
|---|---|---|
| CDF | JSONL + JSON | 2 |
| GradientSports | JSONL + JSON | 3 |
| HawkEye | Per-minute text + JSON/XML | Multiple |
| OptaVision | Text + XML | 2 |
| Respovision | JSONL (embedded metadata) | 1 |
| SecondSpectrum | JSONL + JSON | 2 |
| Signality | JSON (per-period) | 3+ |
| SkillCorner | JSONL + JSON | 2 |
| Sportec | XML | 2 |
| StatsPerform | MA25 text + MA1 JSON/XML | 2 |
| Tracab | DAT/JSON + XML/JSON | 2 |
Next Steps¶
- Getting Started - Installation and first steps
- TrackingDataset - Understand the data structure
- Coordinate Systems - How coordinates work
- Providers - Detailed provider documentation
Credit¶
This project owes a depth of gratitude to Kloppy and the hard work put into that project by all its contributors. Without their dedication and commitment this project would not exist. 💙