File size: 2,011 Bytes
d3b6f35
 
 
 
 
 
 
 
 
 
 
 
 
50dc123
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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"