Skip to content

Train Frozen Offense/Defense RAPM

Run the full forward regular-season chain and frozen 2025-26 evaluation with:

uv run nba-train-frozen-offense-defense-rapm --season 2025-26

The command fits 1996-97 through 2024-25 sequentially, selecting lambda within each season on chronological folds. The completed 2024-25 offense and defense coefficients are frozen before the 2025-26 regular season and playoffs are scored.

The run is published under:

artifacts/models/frozen_offense_defense_rapm/<season>/<run-id>/

Key outputs are:

  • historical_player_coefficients.parquet: season-by-season offense, defense, net, and prior coefficients;
  • historical_cv_results.parquet: per-season lambda-selection evidence;
  • frozen_player_priors.parquet: the completed source-season O/D state;
  • cohort_metrics.parquet: separate regular-season and playoff metrics;
  • team NetRtg and Pythagorean-win prediction tables;
  • source_state.json: the explicit no-target-refit declaration.

Publish Completed-Season Rankings

After a regular season is complete, build retrospective offense and defense rankings with:

uv run nba-rank-offense-defense-rapm --season 2025-26

This command starts from the immutable completed 2024-25 frozen O/D state, selects lambda on chronological folds within the completed 2025-26 regular season, and refits all 2025-26 regular-season stints. It writes a distinct artifact under:

artifacts/models/offense_defense_rapm/<season>/<run-id>/

It does not update the frozen preseason forecast or its leaderboard metrics. The artifact includes player_coefficients.parquet, cv_results.parquet, a three-sided player_rankings.parquet, separate top_25_overall.parquet, top_25_offense.parquet, and top_25_defense.parquet tables, the immutable frozen-prior provenance, and file hashes. Every published list requires at least 500 relevant possessions; overall RAPM is offense plus defense, and higher defense is better because it is measured as points prevented per 100 possessions.