Add baserunning stats to /plays/batting

This commit is contained in:
Cal Corum 2023-08-03 22:20:58 -05:00
parent cc1cb66593
commit 6396250bf6

View File

@ -205,11 +205,17 @@ async def get_plays(
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)
min_pa: Optional[int] = 1, team_id: list = Query(default=None), manager_id: list = Query(default=None),
sort: Optional[str] = None, limit: Optional[int] = None, short_output: Optional[bool] = False):
season_games = StratGame.select()
if season is not None:
season_games = season_games.where(StratGame.season << season)
if manager_id is not None:
season_games = season_games.where(
(StratGame.away_manager_id << manager_id) | (StratGame.home_manager_id << manager_id)
)
all_plays = (
bat_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'),
@ -226,40 +232,84 @@ async def get_totalplays(
.where((StratPlay.game << season_games) & (StratPlay.batter.is_null(False)))
.having(fn.SUM(StratPlay.pa) >= min_pa)
)
run_plays = (
StratPlay
.select(StratPlay.runner, StratPlay.runner_team, fn.SUM(StratPlay.sb).alias('sum_sb'),
fn.SUM(StratPlay.cs).alias('sum_cs'), fn.SUM(StratPlay.pick_off).alias('sum_pick'),
fn.SUM(StratPlay.wpa).alias('sum_wpa'))
.where((StratPlay.game << season_games) & (StratPlay.runner.is_null(False)))
)
def_plays = (
StratPlay
.select(StratPlay.defender, StratPlay.defender_team, fn.SUM(StratPlay.error).alias('sum_error'),
fn.SUM(StratPlay.hit).alias('sum_hit'), fn.SUM(StratPlay.pa).alias('sum_chances'),
fn.SUM(StratPlay.wpa).alias('sum_wpa'))
.where((StratPlay.game << season_games) & (StratPlay.defender.is_null(False)))
)
if player_id is not None:
all_players = Player.select().where(Player.id << player_id)
all_plays = all_plays.where(StratPlay.batter << all_players)
bat_plays = bat_plays.where(StratPlay.batter << all_players)
run_plays = run_plays.where(StratPlay.runner << all_players)
def_plays = def_plays.where(StratPlay.defender << 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)
bat_plays = bat_plays.where(StratPlay.batter_team << all_teams)
run_plays = run_plays.where(StratPlay.runner_team << all_teams)
def_plays = def_plays.where(StratPlay.defender_team << all_teams)
if group_by is not None:
if group_by == 'player':
all_plays = all_plays.group_by(StratPlay.batter)
bat_plays = bat_plays.group_by(StratPlay.batter)
run_plays = run_plays.group_by(StratPlay.runner)
def_plays = def_plays.group_by(StratPlay.defender)
elif group_by == 'team':
all_plays = all_plays.group_by(StratPlay.batter_team)
bat_plays = bat_plays.group_by(StratPlay.batter_team)
run_plays = run_plays.group_by(StratPlay.runner_team)
def_plays = def_plays.group_by(StratPlay.defender_team)
elif group_by == 'playerteam':
all_plays = all_plays.group_by(StratPlay.batter, StratPlay.batter_team)
bat_plays = bat_plays.group_by(StratPlay.batter, StratPlay.batter_team)
run_plays = run_plays.group_by(StratPlay.runner, StratPlay.runner_team)
def_plays = def_plays.group_by(StratPlay.defender, StratPlay.defender_team)
if sort is not None:
if sort == 'player':
all_plays = all_plays.order_by(StratPlay.batter)
bat_plays = bat_plays.order_by(StratPlay.batter)
run_plays = run_plays.order_by(StratPlay.runner)
def_plays = def_plays.order_by(StratPlay.defender)
elif sort == 'team':
all_plays = all_plays.order_by(StratPlay.batter_team)
bat_plays = bat_plays.order_by(StratPlay.batter_team)
run_plays = run_plays.order_by(StratPlay.runner_team)
def_plays = def_plays.order_by(StratPlay.defender_team)
# elif sort == 'wpa-desc':
# all_plays = all_plays.order_by(-StratPlay.sum_wpa)
# bat_plays = bat_plays.order_by(-StratPlay.sum_wpa)
# elif sort == 'wpa-asc':
# all_plays = all_plays.order_by(StratPlay.sum_wpa)
# bat_plays = bat_plays.order_by(StratPlay.sum_wpa)
if limit is not None:
if limit < 1:
limit = 1
all_plays = all_plays.limit(limit)
bat_plays = bat_plays.limit(limit)
logging.info(f'play query: {all_plays}')
logging.info(f'bat_plays query: {bat_plays}')
logging.info(f'run_plays query: {run_plays}')
logging.info(f'def_plays query: {def_plays}')
return_stats = {
'count': all_plays.count(),
'stats': [{
'count': bat_plays.count(),
'stats': []
}
for x in bat_plays:
this_run = run_plays.where(StratPlay.runner == x.batter)
if this_run.count() > 0:
sum_sb = this_run[0].sum_sb
sum_cs = this_run[0].sum_cs
sum_wpa = this_run[0].sum_wpa
else:
sum_sb = 0
sum_cs = 0
sum_wpa = 0
return_stats['stats'].append({
'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,
@ -276,15 +326,19 @@ async def get_totalplays(
'sac': x.sum_sac,
'ibb': x.sum_ibb,
'gidp': x.sum_gidp,
'sb': x.sum_sb,
'cs': x.sum_cs,
'sb': sum_sb,
'cs': 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]
}
'wpa': x.sum_wpa + sum_wpa
})
# Get Running Stats
# Get Fielding Stats
db.close()
return return_stats