From cc1cb66593163d5dd4212243737ceb3045a28c90 Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Tue, 1 Aug 2023 23:46:46 -0500 Subject: [PATCH] Update stratplay.py First pass at offensive stat totals --- app/routers_v3/stratplay.py | 95 ++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/app/routers_v3/stratplay.py b/app/routers_v3/stratplay.py index 8a0c88c..6a98ead 100644 --- a/app/routers_v3/stratplay.py +++ b/app/routers_v3/stratplay.py @@ -4,7 +4,7 @@ import copy import logging from pydantic import BaseModel, validator -from ..db_engine import db, StratPlay, StratGame, Team, model_to_dict, chunked, fn +from ..db_engine import db, StratPlay, StratGame, Team, Player, model_to_dict, chunked, fn from ..dependencies import oauth2_scheme, valid_token, LOG_DATA logging.basicConfig( @@ -124,6 +124,7 @@ async def get_plays( offense_team_id: list = Query(default=None), defense_team_id: list = Query(default=None), double: Optional[int] = None, triple: Optional[int] = None, homerun: Optional[int] = None, sb: Optional[int] = None, cs: Optional[int] = None, manager_id: list = Query(default=None), + outs: list = Query(default=None), wild_pitch: Optional[int] = None, short_output: Optional[bool] = False, sort: Optional[str] = None, limit: Optional[int] = 200): all_plays = StratPlay.select() @@ -170,6 +171,10 @@ async def get_plays( all_plays = all_plays.where(StratPlay.sb == sb) if cs is not None: all_plays = all_plays.where(StratPlay.cs == cs) + if wild_pitch is not None: + all_plays = all_plays.where(StratPlay.wild_pitch == wild_pitch) + if outs is not None: + all_plays = all_plays.where(StratPlay.outs << outs) if manager_id is not None: all_games = StratGame.select().where( (StratGame.away_manager_id << manager_id) | (StratGame.home_manager_id << manager_id) @@ -196,6 +201,94 @@ async def get_plays( return return_plays +@router.get('/batting') +async def get_totalplays( + season: list = Query(default=None), s_type: Literal['regular', 'post', 'total', None] = None, + player_id: list = Query(default=None), group_by: Literal['team', 'player', 'playerteam'] = 'player', + min_pa: Optional[int] = 1, team_id: list = Query(default=None), sort: Optional[str] = None, + limit: Optional[int] = None, short_output: Optional[bool] = False): + season_games = StratGame.select().where(StratGame.season << season) + + all_plays = ( + StratPlay + .select(StratPlay.batter, fn.SUM(StratPlay.pa).alias('sum_pa'), + fn.SUM(StratPlay.ab).alias('sum_ab'), fn.SUM(StratPlay.run).alias('sum_run'), + fn.SUM(StratPlay.hit).alias('sum_hit'), fn.SUM(StratPlay.rbi).alias('sum_rbi'), + fn.SUM(StratPlay.double).alias('sum_double'), fn.SUM(StratPlay.triple).alias('sum_triple'), + fn.SUM(StratPlay.homerun).alias('sum_hr'), fn.SUM(StratPlay.bb).alias('sum_bb'), + fn.SUM(StratPlay.so).alias('sum_so'), StratPlay.batter_team, + fn.SUM(StratPlay.hbp).alias('sum_hbp'), fn.SUM(StratPlay.sac).alias('sum_sac'), + fn.SUM(StratPlay.ibb).alias('sum_ibb'), fn.SUM(StratPlay.gidp).alias('sum_gidp'), + fn.SUM(StratPlay.sb).alias('sum_sb'), fn.SUM(StratPlay.cs).alias('sum_cs'), + fn.SUM(StratPlay.bphr).alias('sum_bphr'), fn.SUM(StratPlay.bpfo).alias('sum_bpfo'), + fn.SUM(StratPlay.bp1b).alias('sum_bp1b'), fn.SUM(StratPlay.bplo).alias('sum_bplo'), + fn.SUM(StratPlay.wpa).alias('sum_wpa')) + .where((StratPlay.game << season_games) & (StratPlay.batter.is_null(False))) + .having(fn.SUM(StratPlay.pa) >= min_pa) + ) + + if player_id is not None: + all_players = Player.select().where(Player.id << player_id) + all_plays = all_plays.where(StratPlay.batter << all_players) + if team_id is not None: + all_teams = Team.select().where(Team.id << team_id) + all_plays = all_plays.where(StratPlay.batter_team << all_teams) + + if group_by is not None: + if group_by == 'player': + all_plays = all_plays.group_by(StratPlay.batter) + elif group_by == 'team': + all_plays = all_plays.group_by(StratPlay.batter_team) + elif group_by == 'playerteam': + all_plays = all_plays.group_by(StratPlay.batter, StratPlay.batter_team) + if sort is not None: + if sort == 'player': + all_plays = all_plays.order_by(StratPlay.batter) + elif sort == 'team': + all_plays = all_plays.order_by(StratPlay.batter_team) + # elif sort == 'wpa-desc': + # all_plays = all_plays.order_by(-StratPlay.sum_wpa) + # elif sort == 'wpa-asc': + # all_plays = all_plays.order_by(StratPlay.sum_wpa) + if limit is not None: + if limit < 1: + limit = 1 + all_plays = all_plays.limit(limit) + + logging.info(f'play query: {all_plays}') + + return_stats = { + 'count': all_plays.count(), + 'stats': [{ + 'player': x.batter_id if short_output else model_to_dict(x.batter, recurse=False), + 'team': x.batter_team_id if short_output else model_to_dict(x.batter_team, recurse=False), + 'pa': x.sum_pa, + 'ab': x.sum_ab, + 'run': x.sum_run, + 'hit': x.sum_hit, + 'rbi': x.sum_rbi, + 'double': x.sum_double, + 'triple': x.sum_triple, + 'hr': x.sum_hr, + 'bb': x.sum_bb, + 'so': x.sum_so, + 'hbp': x.sum_hbp, + 'sac': x.sum_sac, + 'ibb': x.sum_ibb, + 'gidp': x.sum_gidp, + 'sb': x.sum_sb, + 'cs': x.sum_cs, + 'bphr': x.sum_bphr, + 'bpfo': x.sum_bpfo, + 'bp1b': x.sum_bp1b, + 'bplo': x.sum_bplo, + 'wpa': x.sum_wpa + } for x in all_plays] + } + db.close() + return return_stats + + @router.get('/{play_id}') async def get_one_play(play_id: int): if StratPlay.get_or_none(StratPlay.id == play_id) is None: