Update stratplay.py
First pass at offensive stat totals
This commit is contained in:
parent
302d3fe3ac
commit
cc1cb66593
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user