NSBA Draft Analyticsembargoed · 2026-06-06

01_player_season_master.md

Spine build: player_season_master.csv + team_season.csv

Spine build: player_season_master.csv + team_season.csv

Date: 2026-05-30 Script: scripts/build_master.py (idempotent; re-run reproduces byte-identical output) Outputs: data/processed/player_season_master.csv (207 rows × 50 cols), data/processed/team_season.csv (41 rows × 19 cols)

This is the analytical backbone every downstream analysis reads. It is built only from GAME data (standard Science Bowl: TU +4 / neg −4 / bonus +10). The combine — a pyramidal, gameable tryout — is attached as a same-season link, never mixed into value stats. Per the priors, the combine is treated as a gamed ceiling (a seed signal); game data is the trusted value source.

Method

  1. Clean game set. games_meta filtered to reconciles==True AND not(score_a==0 & score_b==0) → 180 games (nsba1=66, nsba2=61, nsba3=53). All player/team stats inner-join to this game_id set. - Filter note: games_meta has 181 reconciling games; the not-both-zero guard drops one more — nsba2 RR10|cryo v caleb, a genuine 0-0 game — yielding 180. This applies the stated guardrail filter exactly.
  2. Team-name canonicalization. Folded case/whitespace variants within each season (e.g. Mount Ellismount ellis, no like bluenolikeblue) to the most-frequent spelling, applied across all game tables so win%/rosters don't split. Merged 8 split team-seasons (1 nsba1, 7 nsba3); team_season went 49 → 41 rows.
  3. Identity. Joined game players via canonical_players.csv on (source='game', season, player_raw). All 241 clean-game player-seasons matched — 0 join losses.
  4. Value stats from clean games: games_played, toss_points, n_correct, n_negs, neg_rate, points_per_game, and PPTF = toss_points / tossups_faced. - tossups_faced = recorded tossups_present (TUH) where the sheet has it, else games × season-mean tossups/game. tuh_source ∈ {sheet, estimated, mixed} flags this. TUH is on-sheet for all nsba1 games and ~13 nsba2 games; nsba3 records no TUH (paired layout), so its PPTF denominator is a games×rate proxy. - Per-category points + per-subject PPTF for b/ch/cs/ess/m/p (+ene for nsba1).
  5. Context & links: team bonus points (team-attributed), team win% and playoff-game count, same-season combine (overall/rank/paid/eligible + per-category, crosswalked), and qualitative flags from discord_player_signals.csv (merged by canonical_id).

Numbers

table rows nsba1 nsba2 nsba3
player_season_master 207 75 60 72
team_season 41 12 13 16

Validation passed

Limitations / caveats


NSBA Draft Analytics · embargoed until after the SSB draft · ← hub