NBA 2026–27 Projection Board

Just Dog Labs model — direct LightGBM per-stat decomposition
CATEGORIES & MULTIPLIERS Checked categories feed TOTAL at the selected weight (3x amplifies, 0.25x attenuates). FG%/FT% enter as volume-weighted impact zs by default (PCT IMPACT above can switch to pure-rate) — unchecking removes the percentage and its volume effect. Cell colors always show the raw z on the active PCT IMPACT basis, in both value views.
LEAGUE / AUCTION EST $ is our own z-to-$ conversion; formula in Definitions below.
LEGEND continuous red→yellow→green heat on each category's z; shades clamp at the two ends (z ≤ −3 / z ≥ +3):
DEFINITIONS & METHODOLOGY
Z (Averages basis)
per-game z vs the refined reference pool (suite method: qualified = projected GP≥20 and MIN≥10; pool = top 156 by first-pass z-total; TOV negated; FG%/FT% volume-weighted impact). Our pool, our z - not Hashtag's. This is the basis BASED ON: Averages shows.
BASED ON (ours, three views)
Averages: the shipped per-game z's above — how good the player is per game. Total: season-total z's computed in your browser from our projected per-game stats × our projected GP — counting stats are z-scored on season totals against the qualified board (projected GP≥20 & MIN≥10, the suite's own qualification bar, whole-board one-shot pool; the top-156 refinement is suite-side); FG%/FT% impact uses season makes/attempts (makes = rate × attempts × GP, so the percentage math stays makes/attempts-consistent); A/TO is GP-invariant (games cancel in the ratio) and is re-z'd on the same pool; TOV negated as in Averages. Combined: per-category mean of the Averages z and the Total z — our transparent 50/50 per-game-vs-total blend. All three views recompute TOTAL, the rank chips, VAL, VALz and EST$ live through the same math path. Naming follows the reference UI's dropdown; every formula is ours.
Per-Game Stats / Z Scores (values toggle)
out of the box the category cells show per-game (or, under BASED ON: Total, season-total) numbers and FG%/FT% rates, exactly as pulled from our own projected stat lines; Z Scores swaps every category cell to its z value. The toggle is display-only: ranks, TOTAL, chips, VAL/VALz/EST$ and all cell colors are driven by the z's either way.
RANK Δ (custom-view chips)
whenever any multiplier, GP penalty, PCT IMPACT or BASED ON setting leaves the default full-weight basis, the R# column shows YOUR basis's rank with a grey-circle ↑/↓ chip = change vs the model's canonical R# (↑n = this view ranks the player n spots higher than the model does). Basis rank = ordinal position by your recomputed TOTAL among qualified players; ties order by canonical R#, then name, so ranks never share a number. At full defaults the column is the plain canonical R#, which never renumbers with filters or column sorts.
TOTAL
sum of each checked category's z × its multiplier. Defaults: all nine board categories (FG%, FT%, 3PM, PTS, TREB, AST, STL, BLK, TO) at x1.0 — the same full-category basis as the model's canonical R#, so the default board reads exactly in the model's rank order. Attenuating TO (x0.25, the visible default in the reference UI) is one click in the panel. Multiplier ladder: 3x / 2x / 1.5x / 1.25x / 1x / 0.75x / 0.5x / 0.25x — 1x+ weights amplify a category's weight inside TOTAL the way the reference UI's positive ranges do.
R# (canonical rank)
the model's own rank: order of projected z-total across the nine board categories at full weight (TO x1) among qualified projections (GP ≥ 20 & MIN ≥ 10). R# never renumbers with filters, column sorts, GP penalty, the PCT IMPACT view, or BASED ON — it is the model speaking. When every multiplier, GP penalty, PCT IMPACT and BASED ON sit at their defaults the board is ordered by R# (note above the table); any change switches ordering to your recomputed TOTAL while the rank column shows your basis rank with its Δ chip (see RANK Δ above).
PCT IMPACT (ours, both)
volume-weighted (default): a percentage's z measures excess makes — (makes − pool rate × attempts), scaled — so high-volume efficiency counts more; this is the basis the shipped z's and the model's R# use. pure-rate: (player % − board mean %) / board standard deviation, computed over every player on the served board, attempts ignored; TOTAL, VALz, and EST$ recompute on it live. Under BASED ON: Total the volume-weighted setting uses season makes/attempts instead of per-game; pure-rate is GP-invariant. Both formulas are our in-house methodology choices, computed from our own projections — neither mirrors any other site's internals.
Cell colors vs multipliers (colors are z-driven in BOTH value views)
every category cell is colored by that category's RAW z on the active PCT IMPACT basis (FG%/FT% follow the toggle) on a continuous red→yellow→green ramp, clamped at the deepest shades for z ≤ −3 or z ≥ +3 — this coloring is identical whether the cell displays per-game stats (the default view) or Z Scores; only the printed numbers change. A 3x weight amplifies TOTAL math only — it never pushes a cell past the Elite shade (there is no beyond-elite tier). TOTAL / GPADJ cells use the same ramp applied to the value's position within the currently visible board.
GP PENALTY (ours)
penalized TOTAL = TOTAL × (1 − p × (82 − GP)/82), p = selected penalty. Transparent in-house formula; Hashtag's is proprietary.
ADP / POS (display-only)
average-draft-position reference column. NEVER a model input. Yahoo column = rank mirrored on FantasyPros' public ADP page (Yahoo's own page requires a logged-in session for its data XHR; mirroring page retrieved 2026-10-09 PT, coverage top ~205). ESPN column = first-party ESPN league-defaults snapshot (retrieved 2026-10-09 PT, 1,095 players). Sleeper column = Sleeper projections endpoint adp_std (retrieved 2026-10-09 PT). POS* = source-site position listing: FantasyPros mirror listing for Yahoo/ESPN (the mirror shows one composite position string per player, not separated per source), Sleeper's own fantasy_positions for Sleeper; the player's own sub-line always shows the suite's position label.
VAL / VALz (value view)
VAL = ADP rank − our rank (positive → we project the player better than draft market). VALz = our TOTAL − ADP-implied z (probit of the ADP rank within the source's ranked pool). Both recompute live with the current TOTAL settings.
EST $ (ours)
our estimated auction value: drafted pool = teams × roster spots; replacement TOTAL = the pool-edge TOTAL (after current multipliers & GP penalty); EST$ = max(1, round( (TOTAL − replacement) / Σ(positive values) × teams × budget )). Changes live with settings. We never ingest published auction values.
FG% / FT% cells
projected percentage with (makes/attempts) per game beneath, e.g. FG% (7.9/17.3).
Team codes
canonical 3–4 letter codes everywhere (GSW / SAS / NYK / NOP / PHX / UTAH forms). “FA” team = unsigned in the Sleeper roster snapshot 2026-10-09.
Omitted vs reference UI
3P% (our model does not project 3PA yet, so a 3P% category would be fabricated), OREB/DREB and DD (no projected fields yet) — all four are queued as round-8 model extensions; a category only ships here when its predicted field exists. Daily/ROS modes (preseason board), Punt presets (out of scope). TYPE carries the single honest Category option for now.