2026_MLB_Model / tests /test_strikeout_probability_engine_v2.py
Syntrex's picture
Promote strikeout v2 and harden telemetry models
50dc123
raw
history blame
2.01 kB
import pandas as pd
from models.strikeout_probability_engine_v2 import build_strikeout_probability_result_v2
def test_strikeout_probability_result_v2_missing_inputs():
result = build_strikeout_probability_result_v2(
pitcher_statcast_df=pd.DataFrame(),
pitcher_name="",
line=None,
selection_side=None,
)
assert result["formula_version"] == "strikeout_v2_live"
assert result["expected_strikeouts"] is None
assert result["skipped_layers"] == "missing_pitcher_or_line"
assert result["confidence_score"] is None
assert result["confidence_component_bonuses"] == []
assert result["confidence_component_penalties"] == []
def test_strikeout_probability_result_v2_exposes_canonical_opportunity_outputs():
pitcher_df = pd.DataFrame(
[
{
"player_name": "Ace Arm",
"release_speed": 96.1,
"release_spin_rate": 2450,
"release_extension": 6.4,
"description": "swinging_strike",
}
]
* 220
)
result = build_strikeout_probability_result_v2(
pitcher_statcast_df=pitcher_df,
pitcher_name="Ace Arm",
batter_statcast_df=pd.DataFrame(),
opponent_batters=["A", "B", "C", "D", "E", "F", "G", "H", "I"],
opponent_team="Away",
line=6.5,
selection_side="over",
game_row={
"projected_starter_available": True,
"projected_starter_match_status": "matched_projected_home",
"team_total": 4.2,
},
)
assert result["fair_prob"] is not None
assert result["expected_strikeouts"] is not None
assert result["projected_pitch_count"] is not None
assert result["projected_batters_faced"] is not None
assert result["projected_innings"] is not None
assert result["pitches_per_bf"] is not None
assert result["role_certainty_score"] is not None
assert result["confidence_source"] == "strikeout_v2_live"