2026_MLB_Model / tests /test_mlb_starters.py
Syntrex's picture
Remove Fangraphs starter fallback in favor of MLB and Odds API
0dfe795
raw
history blame
5.15 kB
from __future__ import annotations
import os
import sys
import unittest
import pandas as pd
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
from data.mlb_starters import (
build_oddsapi_starter_fallback_map,
merge_probable_starters_with_odds_fallback,
)
class TestMlbStarters(unittest.TestCase):
def test_oddsapi_fallback_can_fill_tba_matchup_from_pitcher_team_inference(self) -> None:
props_feed = pd.DataFrame(
[
{
"event_id": "event-1",
"away_team": "New York Yankees",
"home_team": "San Francisco Giants",
"market_family": "k",
"selection_scope": "pitcher",
"player_name_raw": "Max Fried",
},
{
"event_id": "event-1",
"away_team": "New York Yankees",
"home_team": "San Francisco Giants",
"market_family": "k",
"selection_scope": "pitcher",
"player_name_raw": "Logan Webb",
},
]
)
pitcher_statcast_df = pd.DataFrame(
[
{
"player_name": "Max Fried",
"inning_topbot": "Bottom",
"away_team": "New York Yankees",
"home_team": "San Francisco Giants",
},
{
"player_name": "Logan Webb",
"inning_topbot": "Top",
"away_team": "New York Yankees",
"home_team": "San Francisco Giants",
},
]
)
primary = {
("new york yankees", "san francisco giants"): {
"away_team_raw": "New York Yankees",
"home_team_raw": "San Francisco Giants",
"away_pitcher": None,
"home_pitcher": None,
"away_pitcher_source": "unresolved",
"home_pitcher_source": "unresolved",
"starter_cache_source": "statsapi_probable_pitcher",
"fallback_used": False,
}
}
fallback = build_oddsapi_starter_fallback_map(
props_feed=props_feed,
primary_starters=primary,
pitcher_statcast_df=pitcher_statcast_df,
)
merged = merge_probable_starters_with_odds_fallback(primary, fallback)
row = merged[("new york yankees", "san francisco giants")]
self.assertEqual(row["away_pitcher"], "Max Fried")
self.assertEqual(row["home_pitcher"], "Logan Webb")
self.assertEqual(row["away_pitcher_source"], "oddsapi_pitcher_strikeouts_two_candidate_match")
self.assertEqual(row["home_pitcher_source"], "oddsapi_pitcher_strikeouts_two_candidate_match")
self.assertEqual(row["starter_cache_source"], "statsapi_plus_oddsapi_fallback")
self.assertTrue(bool(row["fallback_used"]))
def test_oddsapi_fallback_does_not_override_existing_mlb_side(self) -> None:
props_feed = pd.DataFrame(
[
{
"event_id": "event-2",
"away_team": "Cleveland Guardians",
"home_team": "Detroit Tigers",
"market_family": "k",
"selection_scope": "pitcher",
"player_name_raw": "Tanner Bibee",
},
{
"event_id": "event-2",
"away_team": "Cleveland Guardians",
"home_team": "Detroit Tigers",
"market_family": "k",
"selection_scope": "pitcher",
"player_name_raw": "Tarik Skubal",
},
]
)
primary = {
("cleveland guardians", "detroit tigers"): {
"away_team_raw": "Cleveland Guardians",
"home_team_raw": "Detroit Tigers",
"away_pitcher": "Tanner Bibee",
"home_pitcher": None,
"away_pitcher_source": "statsapi_probable_pitcher",
"home_pitcher_source": "unresolved",
"starter_cache_source": "statsapi_probable_pitcher",
"fallback_used": False,
}
}
fallback = build_oddsapi_starter_fallback_map(
props_feed=props_feed,
primary_starters=primary,
pitcher_statcast_df=None,
)
merged = merge_probable_starters_with_odds_fallback(primary, fallback)
row = merged[("cleveland guardians", "detroit tigers")]
self.assertEqual(row["away_pitcher"], "Tanner Bibee")
self.assertEqual(row["away_pitcher_source"], "statsapi_probable_pitcher")
self.assertEqual(row["home_pitcher"], "Tarik Skubal")
self.assertEqual(row["home_pitcher_source"], "oddsapi_pitcher_strikeouts_single_candidate_match")
self.assertEqual(row["starter_cache_source"], "statsapi_plus_oddsapi_fallback")
if __name__ == "__main__":
unittest.main()