xSLG / xSLG
Batter
Expected slugging: Savant's per-batted-ball estimate divided by at-bats, excluding at-bats whose batted ball carries no estimate. See runbook section 22.
Agreement with Savant
Checked nightly. Agreement tolerance: ±0.
Pitcher
Expected slugging against: Savant's per-batted-ball estimate divided by at-bats against, excluding at-bats whose batted ball carries no estimate. See runbook section 22.
Agreement with Savant
Checked nightly. Agreement tolerance: ±0.
Shown for: batter and pitcher.
Formula
COALESCE(sum(xslg_num), 0) / NULLIF(sum(ab) - sum((ab = 1 AND bip = 1 AND xba_num IS NULL)::int), 0) — Savant's per-batted-ball slugging estimate averaged over at-bats, excluding at-bats whose batted ball carries no estimate. The subtracted term keys off xba_num for both rates: xba_num and xslg_num are null on exactly the same at-bats.
Inputs
pitches.estimated_slg_using_speedangleplate_appearances.xslg_numplate_appearances.abplate_appearances.bipplate_appearances.xba_num
Era caveats
Untracked contact leaves the denominator
Savant excludes batted balls it could not track rather than imputing them, and matching that is what closed the residual. The exclusion reaches the three expected stats by two different routes: xBA and xSLG subtract at aggregation time — at-bats minus at-bats whose batted ball carries no estimate — while xwOBA never counts them at all, because a plate appearance with no estimate never enters xwoba_den when its fact row is built. (runbook §10)
Three tracking systems across the seasons shown
Rows carry a tracking_era of trackman, hawkeye or hawkeye_bat (migration 001). The systems differ in what they measure and how precisely, so long spans cross a measurement boundary as well as a rule one.
Version history
- 2026-08-14 — Added with the expected-stats slice, alongside xBA. (runbook §22)