Skip to main content

AnalyzeRL Boxcars

Labelling and analyzing Rocket League replay data

AnalyzeRL Boxcars is a Rust package mounting the detection of events and player actions onto frame-wise Rocket League replay data parsed by the powerful boxcars library.

Requirements

  • Rocket League .replay files
  • The compiled Windows or Linux x86-64 binary from the repository's Releases page when using the CLI directly
  • Python 3.10 or newer when using the Python API
  • Rust 1.85 or newer only when building the binary from source

Parsing Pipeline

  • Collect replay objects from boxcars
  • Arrange frame-by-frame match dataframe
  • Mount EventModel and obtain interpretable frame-level events in a match

Installation

Download analyzerl_boxcars.exe from the assets attached to the latest repository release. Building locally is optional:

cargo build --release

Install the Python package when using the Python API:

python -m pip install analyzerl-boxcars

The Windows and Linux x86-64 wheels include the matching Rust binary, so Python API users do not need to download it separately.

The examples below use the downloaded release binary:

$analyzerl = "C:\path\to\analyzerl_boxcars.exe"
$replay = "C:\path\to\match.replay"

Python examples use the binary bundled with AnalyzeRLBoxcars:

from pathlib import Path

from analyzerl_boxcars import AnalyzeRLBoxcars

analyzer = AnalyzeRLBoxcars(
    n_workers=1,
)
replay = Path(r"C:\path\to\match.replay")

Usage

Parse Without Writing Files

CLI

The CLI parses silently when --export is omitted:

& $analyzerl $replay

Python

The Python API returns the frame-wise Polars dataframe directly:

frames = analyzer.parse_replay(replay, event_tagging=False)

Export Frame Data to CSV

CLI

& $analyzerl $replay --export "C:\path\to\match.csv"

Python

analyzer.parse_replay(
    replay,
    event_tagging=False,
    export="csv",
    export_dir=Path(r"C:\path\to\exports"),
)

Export Frame Data to Parquet

CLI

& $analyzerl $replay --export "C:\path\to\match.parquet"

Python

analyzer.parse_replay(
    replay,
    event_tagging=False,
    export="parquet",
    export_dir=Path(r"C:\path\to\exports"),
)

Stream or Return Frame Data

CLI

The CLI streams Parquet bytes to stdout and writes status text to stderr:

& $analyzerl $replay --event-tagging true --export stdout

Python

The Python API uses the same stdout transport internally and returns a Polars dataframe without writing a file:

frames = analyzer.parse_replay(replay, event_tagging=True)

Mount the Event Model

CLI

& $analyzerl $replay --event-tagging true --export "C:\path\to\match.parquet"

Python

labelled_frames = analyzer.parse_replay(replay, event_tagging=True)

Apply the Event Model to Frame Data

Frame data parsed with event_tagging=False retains the replay-native signals needed to mount the same event model later. Existing event columns are overwritten.

CLI

& $analyzerl "C:\path\to\frames.parquet" --apply-event-model --export "C:\path\to\labelled.parquet"

Python

from analyzerl_boxcars import EventModel, apply_event_model

labelled_frames = apply_event_model(frames)
labelled_frames = EventModel().apply(frames)

The Python API streams Parquet between Polars and the bundled Rust binary in memory; it does not create an intermediate file.

Generate Play-by-Play Data

PBP output contains one row per event instance. Replay files and existing CSV or Parquet frame tables are supported.

CLI

& $analyzerl $replay --pbp --export "C:\path\to\pbp.parquet"
& $analyzerl "C:\path\to\frames.parquet" --pbp --export stdout

Python

pbp = analyzer.parse_replay(replay, pbp=True)
pbp = analyzer.parse_replay(Path(r"C:\path\to\frames.parquet"), pbp=True)

Each PBP row includes event_type, event_id, event_start_frame, event_end_frame, and the inclusive frame count in event_duration. Stats calculation accepts PBP CSV and Parquet files directly.

Calculate Stats From a Replay

CLI

& $analyzerl $replay --calc-stats --export "C:\path\to\stats.csv"

Python

stats = analyzer.calculate_stats(replay)

Calculate Stats From Frame Data

Both CSV and Parquet frame exports are valid stats inputs.

CLI

& $analyzerl "C:\path\to\frames.csv" --calc-stats --export "C:\path\to\stats.csv"
& $analyzerl "C:\path\to\frames.parquet" --calc-stats --export "C:\path\to\stats.parquet"

Python

csv_stats = analyzer.calculate_stats(Path(r"C:\path\to\frames.csv"))
parquet_stats = analyzer.calculate_stats(Path(r"C:\path\to\frames.parquet"))

Export Stats

CLI

The CLI infers CSV or Parquet from the output extension:

& $analyzerl $replay --calc-stats --export "C:\path\to\stats.parquet"

Python

The Python API selects the format with export and writes through the Rust binary:

analyzer.calculate_stats(
    replay,
    export="parquet",
    export_dir=Path(r"C:\path\to\exports"),
)

The CLI supports .csv and .parquet export paths. The special stdout target always emits Parquet bytes. Python calls with export=False return a Polars dataframe; calls with export="csv" or export="parquet" write files and return None.

Output

The parser returns a frame-wise dataframe with replay, frame, ball, team, event, and player column groups. Player columns are kept together as the final column group so wide exports remain easier to scan.

When --pbp is supplied, the CLI returns event-wise rows and removes the frame-level *_in_progress columns. When --calc-stats is supplied, the CLI returns one row per replay_id and player_id instead of frame-level rows. Stats use all measurements available in the supplied frame or PBP dataframe.

When an export path is supplied, the CLI prints:

Parsed {replay_id}

Documentation

Full documentation coming soon.

License

AnalyzeRL Boxcars is closed-source, proprietary software. Copyright (c) 2026 Project Signal. All Rights Reserved. No permission is granted to use, copy, modify, or distribute the software except under a separate written agreement expressly authorized by Project Signal. See the proprietary license for complete terms.

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

analyzerl_boxcars-0.1.4-py3-none-win_amd64.whl (8.1 MB view details)

Uploaded Python 3Windows x86-64

analyzerl_boxcars-0.1.4-py3-none-manylinux_2_28_x86_64.whl (9.1 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

File details

Details for the file analyzerl_boxcars-0.1.4-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for analyzerl_boxcars-0.1.4-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 3639cea60b232505f769c02b8af6450f2bc433107530fad9a4330c6bede3d42c
MD5 eec88a0672b5eb7c37d9b6dd28e37ee9
BLAKE2b-256 e0a61cf89312adf9bd1307d30eec1bb03c733971091a45b8b3be561e0fe50b65

See more details on using hashes here.

File details

Details for the file analyzerl_boxcars-0.1.4-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for analyzerl_boxcars-0.1.4-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 55e059cdc87d51298714d6ef97238362b3f8b6cf29dc0330ff1d35ae3cbee01f
MD5 d47c26bf38bc8c6ed61b5b3e0984d6b0
BLAKE2b-256 cd028d7ef3b9eeada0fd2deae7d0c14e5e05b9f64de859d0082a13fa3766669a

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.4 This release

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

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