Update stratplay.py

- Added hit param to /plays
- Added to /plays/batting and /plays/pitching:
-- "league"  group_by option
-- inning param
-- rbi% output
This commit is contained in:
Cal Corum 2023-08-31 11:41:34 -05:00
parent b3d2854210
commit f9c578187e

View File

@ -125,7 +125,8 @@ async def get_plays(
batter_pos: list = Query(default=None), catcher_id: list = Query(default=None),
defender_id: list = Query(default=None), runner_id: list = Query(default=None),
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,
hit: Optional[int] = 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),
run: Optional[int] = None, e_run: Optional[int] = None, rbi: list = Query(default=None),
outs: list = Query(default=None), wild_pitch: Optional[int] = None, is_final_out: Optional[bool] = None,
@ -180,6 +181,8 @@ async def get_plays(
all_plays = all_plays.where(
(StratPlay.catcher_team << all_teams) | (StratPlay.defender_team << all_teams)
)
if hit is not None:
all_plays = all_plays.where(StratPlay.hit == hit)
if double is not None:
all_plays = all_plays.where(StratPlay.double == double)
if triple is not None:
@ -252,9 +255,9 @@ async def get_batting_totals(
season: list = Query(default=None), week: list = Query(default=None),
s_type: Literal['regular', 'post', 'total', None] = None, position: list = Query(default=None),
player_id: list = Query(default=None), min_wpa: Optional[float] = -999, max_wpa: Optional[float] = 999,
group_by: Literal['team', 'player', 'playerteam', 'playergame', 'teamgame'] = 'player',
group_by: Literal['team', 'player', 'playerteam', 'playergame', 'teamgame', 'league'] = 'player',
min_pa: Optional[int] = 1, team_id: list = Query(default=None), manager_id: list = Query(default=None),
obc: list = Query(default=None), risp: Optional[bool] = None,
obc: list = Query(default=None), risp: Optional[bool] = None, inning: 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:
@ -340,6 +343,8 @@ async def get_batting_totals(
bat_plays = bat_plays.where(StratPlay.on_base_code << obc)
if risp is not None:
bat_plays = bat_plays.where(StratPlay.on_base_code << ['100', '101', '110', '111', '010', '011'])
if inning is not None:
bat_plays = bat_plays.where(StratPlay.inning_num << inning)
if group_by is not None:
if group_by == 'player':
@ -362,6 +367,11 @@ async def get_batting_totals(
bat_plays = bat_plays.group_by(StratPlay.batter_team, StratPlay.game)
run_plays = run_plays.group_by(StratPlay.runner_team, StratPlay.game)
def_plays = def_plays.group_by(StratPlay.defender_team, StratPlay.game)
elif group_by == 'league':
bat_plays = bat_plays.join(StratGame)
bat_plays = bat_plays.group_by(StratPlay.game.season)
run_plays = run_plays.join(StratGame)
run_plays = run_plays.group_by(StratPlay.game.season)
if sort is not None:
if sort == 'player':
bat_plays = bat_plays.order_by(StratPlay.batter)
@ -397,9 +407,6 @@ async def get_batting_totals(
}
for x in bat_plays:
logging.info(
f'batter: {x.batter_id} / left on 1: {x.count_lo1} / left on 2: {x.count_lo2} / left on 3: {x.count_lo3}'
)
this_run = run_plays.where(StratPlay.runner == x.batter)
if this_run.count() > 0:
sum_sb = this_run[0].sum_sb
@ -426,10 +433,11 @@ async def get_batting_totals(
if group_by in ['playergame', 'teamgame']:
this_game = x.game_id if short_output else model_to_dict(x.game, recurse=False)
lob_all_rate, lob_2outs_rate = 0, 0
lob_all_rate, lob_2outs_rate, rbi_rate = 0, 0, 0
if x.count_runner1 + x.count_runner2 + x.count_runner3 > 0:
lob_all_rate = (x.count_lo1 + x.count_lo2 + x.count_lo3) / \
(x.count_runner1 + x.count_runner2 + x.count_runner3)
rbi_rate = (x.sum_rbi - x.sum_hr) / (x.count_runner1 + x.count_runner2 + x.count_runner3)
return_stats['stats'].append({
'player': x.batter_id if short_output else model_to_dict(x.batter, recurse=False),
@ -464,7 +472,8 @@ async def get_batting_totals(
'game': this_game,
'lob_all': x.count_lo1 + x.count_lo2 + x.count_lo3,
'lob_all_rate': lob_all_rate,
'lob_2outs': x.count_lo1_3out + x.count_lo2_3out + x.count_lo3_3out
'lob_2outs': x.count_lo1_3out + x.count_lo2_3out + x.count_lo3_3out,
'rbi%': rbi_rate
})
# Get Running Stats
@ -479,9 +488,9 @@ async def get_batting_totals(
async def get_pitching_totals(
season: list = Query(default=None), week: list = Query(default=None),
s_type: Literal['regular', 'post', 'total', None] = None, player_id: list = Query(default=None),
group_by: Literal['team', 'player', 'playerteam', 'playergame', 'teamgame'] = 'player',
group_by: Literal['team', 'player', 'playerteam', 'playergame', 'teamgame', 'league'] = 'player',
min_pa: Optional[int] = 1, team_id: list = Query(default=None), manager_id: list = Query(default=None),
obc: list = Query(default=None), risp: Optional[bool] = None,
obc: list = Query(default=None), risp: Optional[bool] = None, inning: 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:
@ -550,6 +559,8 @@ async def get_pitching_totals(
pit_plays = pit_plays.where(StratPlay.on_base_code << obc)
if risp is not None:
pit_plays = pit_plays.where(StratPlay.on_base_code << ['100', '101', '110', '111', '010', '011'])
if inning is not None:
pit_plays = pit_plays.where(StratPlay.inning_num << inning)
if group_by is not None:
if group_by == 'player':
@ -562,6 +573,9 @@ async def get_pitching_totals(
pit_plays = pit_plays.group_by(StratPlay.pitcher, StratPlay.game)
elif group_by == 'teamgame':
pit_plays = pit_plays.group_by(StratPlay.pitcher_team, StratPlay.game)
elif group_by == 'league':
pit_plays = pit_plays.join(StratGame)
pit_plays = pit_plays.group_by(StratPlay.game.season)
if sort is not None:
if sort == 'player':
pit_plays = pit_plays.order_by(StratPlay.pitcher)
@ -610,6 +624,7 @@ async def get_pitching_totals(
if x.count_runner1 + x.count_runner2 + x.count_runner3 > 0:
lob_all_rate = (x.count_lo1 + x.count_lo2 + x.count_lo3) / \
(x.count_runner1 + x.count_runner2 + x.count_runner3)
rbi_rate = (x.sum_rbi - x.sum_hr) / (x.count_runner1 + x.count_runner2 + x.count_runner3)
return_stats['stats'].append({
'player': x.pitcher_id if short_output else model_to_dict(x.pitcher, recurse=False),
@ -659,7 +674,8 @@ async def get_pitching_totals(
'bb/9': x.sum_bb * 9 / (tot_outs / 3),
'k/bb': x.sum_so / tot_bb,
'game': this_game,
'lob_2outs': x.count_lo1_3out + x.count_lo2_3out + x.count_lo3_3out
'lob_2outs': x.count_lo1_3out + x.count_lo2_3out + x.count_lo3_3out,
'rbi%': rbi_rate
})
db.close()
return return_stats