Spaces:
Sleeping
Sleeping
| 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" | |