diff --git a/pybaseball/__init__.py b/pybaseball/__init__.py index 8249d0bb..9d10d799 100644 --- a/pybaseball/__init__.py +++ b/pybaseball/__init__.py @@ -23,7 +23,8 @@ statcast_batter_percentile_ranks, statcast_batter_pitch_arsenal, statcast_batter_bat_tracking, - statcast_batter_run_value + statcast_batter_run_value, + statcast_abs ) from .statcast_running import statcast_sprint_speed, statcast_running_splits from .statcast_fielding import ( diff --git a/pybaseball/statcast_batter.py b/pybaseball/statcast_batter.py index a6748078..59857391 100644 --- a/pybaseball/statcast_batter.py +++ b/pybaseball/statcast_batter.py @@ -134,10 +134,10 @@ def statcast_batter_run_value(year: int) -> pd.DataFrame(): ARGUMENTS: year(int): year data is retrieved for. - Data can only be retrieved for a single year at a time + Data is can only be retrieved for a single year at a time Returns: - data(pd.DataFrame): clean dataframe from Savant Return + data(pd.DataFrame): dataframe from Savant Return """ try: @@ -148,5 +148,30 @@ def statcast_batter_run_value(year: int) -> pd.DataFrame(): return data except HTTPException as error: raise ConnectionError(f"URL {error} is unreachable") - finally: - raise KeyError(f"An Error Occurred in Acquiring the Data") + + +@cache.df_cache() +def statcast_abs( + challengeType: str, level: str, gameType: str, year: int +) -> pd.DataFrame(): + """ + Retrieves Automated Ball-Strike Challenge (ABS) leaderboard + ARGUMENTS: + challengeType (enum): batter, batting-team, catcher, pitcher, etc + level (enum): mlb, aaa + gameType (enum): spring, regular, playoff + year: year of request + Returns: + data(pd.DataFrame): dataframe from Savant ABS Return + + """ + try: + url = f"https://baseballsavant.mlb.com/leaderboard/abs-challenges?challengeType={challengeType}&level={level}&gameType={gameType}&year={year}&csv=True" + res = requests.get(url, timeout=None).content + data = pd.read_csv(io.StringIO(res.decode("utf-8"))) + data = sanitize_statcast_columns(data) + return data + except HTTPException as error: + raise ConnectionError(f"URL {error} is unreachable") + + diff --git a/tests/integration/pybaseball/test_statcast_batter.py b/tests/integration/pybaseball/test_statcast_batter.py index 7bf2c1c3..e85d690f 100644 --- a/tests/integration/pybaseball/test_statcast_batter.py +++ b/tests/integration/pybaseball/test_statcast_batter.py @@ -10,6 +10,7 @@ statcast_batter_pitch_arsenal, statcast_batter_bat_tracking, statcast_batter_run_value, + statcast_abs, ) @@ -84,3 +85,12 @@ def test_statcast_batter_run_value() -> None: assert not result.empty assert len(result) > 0 + + +def test_statcast_abs() -> None: + result: pd.DataFrame = statcast_abs("batting-team", "mlb", "spring", 2026) + + assert result is not None + assert not result.empty + + assert len(result) > 0