Docs / PigPro / The formula

Exact weights (v1.1 Hybrid), the QB-position override, and the head-to-head numbers from the v1 โ†’ v1.1 promotion.

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 โ€” the ValueScorer class, 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

  1. 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.
  2. 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.
  3. Weights aren't currently learned from data. A constrained-regression weight fitter is in pigpro_v1_1_hybrid.fit_weights but 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.