The PigPro formula¶
Exact weights โ v1.1 Hybrid (current)¶
raw_score = (
ml_projection_score ร ml_weight
+ adp_value_score ร 0.230
+ vor_score ร 0.184
+ consistency_score ร 0.092
+ boom_potential_score ร 0.092
+ usage_score ร usage_weight
+ situation_score ร 0.023
+ news_impact_score ร 0.023
)
pigpro_score = min(10.0, raw_score ร position_multiplier)
Default weights (skill positions):
| Component | Weight |
|---|---|
| ml_projection | 0.276 |
| adp_value | 0.230 |
| vor | 0.184 |
| consistency | 0.092 |
| boom_potential | 0.092 |
| usage | 0.080 |
| situation | 0.023 |
| news_impact | 0.023 |
| sum | 1.000 |
All eight component scores are on a 0โ10 scale. Position multipliers range from ~0.9 (QB) to ~1.35 (elite RB). Source of truth: ml_pipeline/value_scorer.py โ ValueScorer.WEIGHTS.
QB override¶
For position == 'QB', the Usage component zeros out and that 8% folds into ML Projection:
ml_weight = WEIGHTS['ml_projection'] + WEIGHTS['usage'] # 0.276 + 0.080 = 0.356
usg_weight = 0.0
Why: in initial v1.1 backtests, the Usage formula 0.7 ร snap_pct + 0.3 ร rush_share couldn't differentiate pocket QBs (snap 1.0 / rush 0.0) from mobile QBs (snap 1.0 / rush 0.15) by enough percentile range. Result: QB top-12 precision fell from 50% to 42%. Folding the weight into ML โ which actually has good signal for QBs once draft capital + prior-season passing volume are in the feature set โ recovered the 8-point drop. See the backtest page โ "Generation 3" for the head-to-head data.
Where each signal comes from¶
| Component | DB source | Populated by | Fallback if missing |
|---|---|---|---|
| ML Projection | ml_draft_predictions.predicted_ppg |
ml-draft-retrain CronJob |
5.0 |
| ADP Value | adp_records (Sleeper + FFC + Yahoo; Yahoo rows are source='yahoo', scoring_format='global' โ one global Yahoo pool) โ fallback to v1 lookup |
sleeper-adp-persist + ffc-adp-persist + yahoo-adp-persist CronJobs |
5.0 (linear from ADP=999) |
| VOR | league_format.py replacement tables |
computed at run time | 0 |
| Consistency | nflverse_weekly_stats stdev/mean prior season |
pigpro-scoring SQL aggregate |
5.0 |
| Boom Potential | nflverse_weekly_stats p90/median prior season |
same | 5.0 |
| Usage | nflverse_weekly_stats (target_share, carries) + nflverse_snap_counts.offense_pct |
pigpro-scoring SQL aggregate; rookie-proxy fallback from nflverse_player_ids.draft_ovr |
5.0 |
| Situation | situation_scores latest snapshot |
situation-tracking CronJob |
0 |
| News Impact | news_player_impacts last 7 days |
news-digest CronJob |
5.0 (neutral) |
Every value is stamped into pigpro_score_history.components (JSONB) per scoring run, so every trading-card breakdown is a live read of the actual contributions, not a retrospective estimate.
v1 โ v1.1 head-to-head¶
Ran the comparison harness (PR #43, see ml_pipeline/pigpro_compare.py) against actual 2025 finishes (533 players matched).
| Metric | v1 (7-component) | v1.1 Hybrid | ฮ |
|---|---|---|---|
| Overall Spearman r | 0.753 | 0.772 | +0.019 |
| QB Spearman r | 0.71 | 0.73 | +0.02 |
| RB Spearman r | 0.83 | 0.84 | +0.01 |
| WR Spearman r | 0.79 | 0.81 | +0.02 |
| TE Spearman r | 0.83 | 0.86 | +0.03 |
| QB top-12 precision | 50% | 50% | hold (after QB override) |
| RB top-24 precision | 75% | 75% | hold |
| WR top-30 precision | 67% | 70% | +3 |
| TE top-12 precision | 58% | 67% | +9 |
The TE top-12 jump is the standout: ascending TEs Bowers, McBride, Hockenson, Kmet, Freiermuth, Conklin all moved up significantly under v1.1 because Usage finally rewards target share + snap share for that position group.
Variants C (90/10 v1+usage) and D (85/15) had marginally higher Spearman but regressed RB top-24 to 71%. Variant B (92/8) was the Goldilocks โ promoted to live as v1.1.
Files to look at¶
ml_pipeline/value_scorer.pyโ theValueScorerclass, weights, per-position max PPG, QB override block.ml_pipeline/draft_value_features.pyโ feature engineering + name normalization.ml_pipeline/draft_value_trainer.pyโ per-position GBR training.ml_pipeline/backtest.pyโ temporal split + baseline comparisons.ml_pipeline/pigpro_compare.pyโ v1 vs v1.5 vs v1.1 head-to-head harness.ml_pipeline/pigpro_v1_1_hybrid.pyโ the variant tester used to pick v1.1-B before promotion.pigpro/scorer.pyโ tier + recommendation thresholds.pigpro/pipeline.pyโ the orchestrator that batches DB signals and calls the scorer.
Known limitations¶
- QB override is a workaround, not a final answer. A reformulated QB Usage (passing-attempt share, designed-run rate, red-zone designed touches) is on the backlog.
- Usage for new rookies uses draft-capital proxy until they accumulate 12 NFL games. UDFAs and late-round picks land at 1โ3 from the proxy, which is fine โ they're not fantasy-relevant absent a depth-chart break.
- Weights aren't currently learned from data. A constrained-regression weight fitter is in
pigpro_v1_1_hybrid.fit_weightsbut only had n=127 complete-component rows during PR #47 โ too small for meaningful divergence from defaults. Expected to revisit once we have a season of v1.1 outcomes to fit against.