evidence / Frontier measurements
The industry's player-metric landscape -- mapped, approximated where honest, and a do-not-fake list for the rest
A credible analytics shop knows which metrics its data can actually support and which it cannot -- and says so out loud. This page does that: we mapped the public NBA player-metric landscape against our raw input coverage, built transparent approximations of the three families our box-score data genuinely supports, and published a do-not-fake list for the rest, with the RAPM family (RAPM/EPM/DARKO/LEBRON/RAPTOR) declared explicitly out of reach. Every number below is quoted verbatim from committed JSON. The single truth-source for any figure is docs/JOB_EVIDENCE_PACKET.md. No dollar/ROI/edge is claimed anywhere -- every module carries a DESCRIPTIVE_ONLY label.
strongest single receipt
the claim
We mapped the industry's player-metric landscape, built honest approximations of the three families our data supports, and published a do-not-fake list for the rest. Concretely:
1. A capability matrix grades every well-known player-metric family supported / partial / not_supported against our actual input-column coverage -- and refuses to claim any branded metric is reproduced. 2. Three built approximations -- a box-only value index, an on/off net-rating differential, and a per-36 rate cast -- each with frozen weights or an unchanged source formula, each labelled for exactly what it is not. 3. An honest refusal -- aging curves -- where the data does not exist, returned as a not_buildable verdict rather than a fabricated curve.
The discipline is the point: approximate only what the columns support, name every metric it is not, and refuse the rest.
cited artifacts
| committed artifact |
|---|
| scripts/platformkit/analytics_showcase/out/player_metric_landscape.json |
| scripts/platformkit/analytics_showcase/out/box_value_index.json |
| scripts/platformkit/analytics_showcase/out/on_off_showcase.json |
| scripts/platformkit/analytics_showcase/out/aging_curve_lite.json |
why this matters
The hard part of sports analytics is not computing a box index -- it is knowing where your data runs out and refusing to fake the rest. This page maps the full public metric landscape, builds only the three families the columns actually support (each labelled for what it is not), declares the RAPM family out of reach, and returns a not_buildable refusal for aging curves rather than inventing a curve from three seasons with no age field. It even surfaces a real upstream data bug (diacritic-split player ids) instead of hiding it. The throughline: approximate only what the columns support, name every confound, and never dress a descriptive metric as an edge.
reproduce
cd nba-ai-system
# capability matrix (the map)
python scripts/platformkit/analytics_showcase/player_metric_landscape.py
# built approximations
python scripts/platformkit/analytics_showcase/box_value_index.py
python scripts/platformkit/analytics_showcase/on_off_showcase.py
# the honest refusal (writes JSON only, no chart)
python scripts/platformkit/analytics_showcase/aging_curve_lite.py
# each module ships a self-check
python scripts/platformkit/analytics_showcase/box_value_index.py --check
python scripts/platformkit/analytics_showcase/on_off_showcase.py --check
python scripts/platformkit/analytics_showcase/aging_curve_lite.py --checkThis site reports calibration and sharpness only, never a dollar edge, ROI, or bankroll result. An honest null is a success.