Add RP lookup
This commit is contained in:
parent
22bbb3e3bb
commit
23181d55e3
@ -1,8 +1,8 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from fastapi import APIRouter, Depends, HTTPException, Response
|
from fastapi import APIRouter, Depends, HTTPException, Response, Query
|
||||||
from typing import Optional
|
from typing import Optional, Literal
|
||||||
import logging
|
import logging
|
||||||
import pydantic
|
import pydantic
|
||||||
from pandas import DataFrame
|
from pandas import DataFrame
|
||||||
@ -341,6 +341,29 @@ async def get_team_lineup(team_id: int, difficulty_name: str, pitcher_name: str,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def sort_pitchers(pitching_card_query) -> DataFrame | None:
|
||||||
|
all_s = [model_to_dict(x, recurse=False) for x in pitching_card_query]
|
||||||
|
if len(all_s) == 0:
|
||||||
|
logging.error(f'Empty pitching_card_query: {pitching_card_query}')
|
||||||
|
return None
|
||||||
|
|
||||||
|
pitcher_df = pd.DataFrame(all_s).set_index('player', drop=False)
|
||||||
|
logging.info(f'pitcher_df: {pitcher_df}')
|
||||||
|
|
||||||
|
def get_total_ops(df_data):
|
||||||
|
vlval = PitchingCardRatings.get_or_none(
|
||||||
|
PitchingCardRatings.pitchingcard_id == df_data['id'], PitchingCardRatings.vs_hand == 'L')
|
||||||
|
vrval = PitchingCardRatings.get_or_none(
|
||||||
|
PitchingCardRatings.pitchingcard_id == df_data['id'], PitchingCardRatings.vs_hand == 'R')
|
||||||
|
|
||||||
|
ops_vl = vlval.obp + vlval.slg
|
||||||
|
ops_vr = vrval.obp + vrval.slg
|
||||||
|
return (ops_vr + ops_vl + min(ops_vl, ops_vr)) / 3
|
||||||
|
|
||||||
|
pitcher_df['total_ops'] = pitcher_df.apply(get_total_ops, axis=1)
|
||||||
|
return pitcher_df.sort_values(by='total_ops')
|
||||||
|
|
||||||
|
|
||||||
@router.get('/{team_id}/sp/{difficulty_name}')
|
@router.get('/{team_id}/sp/{difficulty_name}')
|
||||||
async def get_team_sp(team_id: int, difficulty_name: str, sp_rank: int):
|
async def get_team_sp(team_id: int, difficulty_name: str, sp_rank: int):
|
||||||
logging.info(f'get_team_sp - team_id: {team_id} / difficulty_name: {difficulty_name} / sp_rank: {sp_rank}')
|
logging.info(f'get_team_sp - team_id: {team_id} / difficulty_name: {difficulty_name} / sp_rank: {sp_rank}')
|
||||||
@ -424,6 +447,113 @@ async def get_team_sp(team_id: int, difficulty_name: str, sp_rank: int):
|
|||||||
raise HTTPException(status_code=500, detail=f'No SP #{sp_rank} found for Team {team_id}')
|
raise HTTPException(status_code=500, detail=f'No SP #{sp_rank} found for Team {team_id}')
|
||||||
|
|
||||||
|
|
||||||
|
@router.get('/{team_id}/rp/{difficulty_name}')
|
||||||
|
async def get_team_rp(
|
||||||
|
team_id: int, difficulty_name: str, need: Literal['length', 'setup', 'closer', 'middle'],
|
||||||
|
used_pitcher_ids: list = Query(default=[])):
|
||||||
|
logging.info(f'get_team_rp - team_id: {team_id} / difficulty_name: {difficulty_name} / need: {need} '
|
||||||
|
f'/ used_pitcher_ids: {used_pitcher_ids}')
|
||||||
|
this_team = Team.get_or_none(Team.id == team_id)
|
||||||
|
if this_team is None:
|
||||||
|
db.close()
|
||||||
|
raise HTTPException(status_code=404, detail=f'Team id {team_id} not found')
|
||||||
|
|
||||||
|
if difficulty_name not in CARDSETS.keys():
|
||||||
|
db.close()
|
||||||
|
raise HTTPException(status_code=400, detail=f'Difficulty name {difficulty_name} not a valid check')
|
||||||
|
|
||||||
|
all_players = Player.select().where(
|
||||||
|
(Player.mlbclub == this_team.lname) & (Player.player_id.not_in(used_pitcher_ids))
|
||||||
|
)
|
||||||
|
|
||||||
|
legal_players = all_players.where(Player.cardset_id << CARDSETS[difficulty_name]['primary'])
|
||||||
|
if 'secondary' in CARDSETS[difficulty_name]:
|
||||||
|
backup_players = all_players.where(Player.cardset_id << CARDSETS[difficulty_name]['secondary'])
|
||||||
|
else:
|
||||||
|
backup_players = None
|
||||||
|
|
||||||
|
if need == 'closer':
|
||||||
|
for query in [PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << legal_players) & (PitchingCard.closer_rating >= 3) &
|
||||||
|
(PitchingCard.starter_rating == 1)),
|
||||||
|
PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << legal_players) & (PitchingCard.closer_rating >= 1) &
|
||||||
|
(PitchingCard.starter_rating == 1)),
|
||||||
|
PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << backup_players) & (PitchingCard.closer_rating >= 3) &
|
||||||
|
(PitchingCard.starter_rating == 1)),
|
||||||
|
PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << backup_players) & (PitchingCard.closer_rating >= 1) &
|
||||||
|
(PitchingCard.starter_rating == 1)),
|
||||||
|
PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << backup_players) & (PitchingCard.starter_rating < 4))
|
||||||
|
]:
|
||||||
|
all_relievers = sort_pitchers(query)
|
||||||
|
|
||||||
|
if all_relievers is not None:
|
||||||
|
this_player_id = all_relievers.iloc[0].player
|
||||||
|
this_player = model_to_dict(Player.get_by_id(this_player_id), recurse=False)
|
||||||
|
db.close()
|
||||||
|
return this_player
|
||||||
|
|
||||||
|
elif need == 'setup':
|
||||||
|
for query in [PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << legal_players) & (PitchingCard.starter_rating == 1)),
|
||||||
|
PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << backup_players) & (PitchingCard.starter_rating < 4))
|
||||||
|
]:
|
||||||
|
all_relievers = sort_pitchers(query)
|
||||||
|
|
||||||
|
if all_relievers is not None and len(all_relievers.index) >= 2:
|
||||||
|
this_player_id = all_relievers.iloc[1].player
|
||||||
|
this_player = model_to_dict(Player.get_by_id(this_player_id), recurse=False)
|
||||||
|
db.close()
|
||||||
|
return this_player
|
||||||
|
|
||||||
|
elif need == 'length' or len(used_pitcher_ids) > 4:
|
||||||
|
for query in [PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << legal_players) & (PitchingCard.relief_rating >= 3) &
|
||||||
|
(PitchingCard.starter_rating < 4)),
|
||||||
|
PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << legal_players) & (PitchingCard.relief_rating >= 2) &
|
||||||
|
(PitchingCard.starter_rating < 4)),
|
||||||
|
PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << backup_players) & (PitchingCard.relief_rating >= 2) &
|
||||||
|
(PitchingCard.starter_rating < 4))
|
||||||
|
]:
|
||||||
|
all_relievers = sort_pitchers(query)
|
||||||
|
|
||||||
|
if all_relievers is not None:
|
||||||
|
this_player_id = all_relievers.iloc[0].player
|
||||||
|
this_player = model_to_dict(Player.get_by_id(this_player_id), recurse=False)
|
||||||
|
db.close()
|
||||||
|
return this_player
|
||||||
|
|
||||||
|
elif need == 'middle':
|
||||||
|
for query in [PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << legal_players) & (PitchingCard.starter_rating == 1)),
|
||||||
|
PitchingCard.select().join(Player).where(
|
||||||
|
(PitchingCard.player << backup_players) & (PitchingCard.starter_rating < 4))
|
||||||
|
]:
|
||||||
|
all_relievers = sort_pitchers(query)
|
||||||
|
|
||||||
|
if all_relievers is not None and len(all_relievers.index) >= 3:
|
||||||
|
this_player_id = all_relievers.iloc[2].player
|
||||||
|
this_player = model_to_dict(Player.get_by_id(this_player_id), recurse=False)
|
||||||
|
db.close()
|
||||||
|
return this_player
|
||||||
|
|
||||||
|
all_relievers = sort_pitchers(
|
||||||
|
PitchingCard.select().join(Player).where((PitchingCard.player << backup_players))
|
||||||
|
)
|
||||||
|
|
||||||
|
if all_relievers is not None:
|
||||||
|
this_player_id = all_relievers.iloc[len(all_relievers.index) - 1].player
|
||||||
|
this_player = model_to_dict(Player.get_by_id(this_player_id), recurse=False)
|
||||||
|
db.close()
|
||||||
|
return this_player
|
||||||
|
|
||||||
|
|
||||||
@router.get('/{team_id}/buy/players')
|
@router.get('/{team_id}/buy/players')
|
||||||
async def team_buy_players(team_id: int, ids: str, ts: str):
|
async def team_buy_players(team_id: int, ids: str, ts: str):
|
||||||
try:
|
try:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user