paper-dynasty-card-creation/scouting_pitchers.py
2025-02-09 01:17:02 -06:00

107 lines
4.2 KiB
Python

import asyncio
import datetime
from functools import partial
import multiprocessing
import sys
from db_calls import db_get
from exceptions import logger, log_exception
from scouting_batters import log_time, fetch_data
from typing import Literal
import pandas as pd
async def get_scouting_dfs(cardset_id: list = None):
# all_ratings = PitchingCardRatings.select()
# if cardset_id is not None:
# set_players = Player.select(Player.player_id).where(Player.cardset_id << cardset_id)
# set_cards = PitchingCard.select(PitchingCard.id).where(PitchingCard.player << set_players)
# all_ratings = all_ratings.where(PitchingCardRatings.pitchingcard << set_cards)
cardset_params = [('cardset_id', x) for x in cardset_id]
ratings_params = [('team_id', 31), ('ts', 's37136685556r6135248705'), *cardset_params]
API_CALLS = [
('pitchingcardratings', [('vs_hand', 'vL'), *ratings_params]),
('pitchingcardratings', [('vs_hand', 'vR'), *ratings_params]),
('cardpositions', [('position', 'P'), *cardset_params])
]
# vl_query = all_ratings.where(PitchingCardRatings.vs_hand == 'L')
# vr_query = all_ratings.where(PitchingCardRatings.vs_hand == 'R')
start_time = log_time('start', message='Pulling all pitching card ratings and positions')
tasks = [fetch_data(params) for params in API_CALLS]
api_data = await asyncio.gather(*tasks)
log_time('end', f'Pulled {api_data[0]['count'] + api_data[1]['count']} batting card ratings and {api_data[2]['count']} positions', start_time=start_time)
start_time = log_time('start', message='Building base dataframes')
vl_vals = api_data[0]['ratings']
for x in vl_vals:
x.update(x['pitchingcard'])
x['player_id'] = x['pitchingcard']['player']['player_id']
x['player_name'] = x['pitchingcard']['player']['p_name']
x['rarity'] = x['pitchingcard']['player']['rarity']['name']
x['cardset_id'] = x['pitchingcard']['player']['cardset']['id']
x['cardset_name'] = x['pitchingcard']['player']['cardset']['name']
x['starter_rating'] = x['pitchingcard']['starter_rating']
x['relief_rating'] = x['pitchingcard']['relief_rating']
x['closer_rating'] = x['pitchingcard']['closer_rating']
del x['pitchingcard'], x['player']
vr_vals = api_data[1]['ratings']
for x in vr_vals:
x['player_id'] = x['pitchingcard']['player']['player_id']
del x['pitchingcard']
vl = pd.DataFrame(vl_vals)
vr = pd.DataFrame(vr_vals)
pit_df = pd.merge(vl, vr, on='player_id', suffixes=('_vl', '_vr')).set_index('player_id', drop=False)
log_time('end', f'Base dataframes are complete', start_time=start_time)
start_time = log_time('start', message='Building defense series')
# positions = CardPosition.select().where(CardPosition.position == 'P')
# if cardset_id is not None:
# set_players = Player.select(Player.player_id).where(Player.cardset_id << cardset_id)
# positions = positions.where(CardPosition.player << set_players)
positions = api_data[2]['positions']
series_list = [pd.Series(
dict([(x['player']['player_id'], x['range']) for x in positions]),
name=f'Range P'
), pd.Series(
dict([(x['player']['player_id'], x['error']) for x in positions]),
name=f'Error P'
)]
log_time('end', f'Processed {len(positions)} defense series', start_time=start_time)
logger.info(f'series_list: {series_list}')
return pit_df.join(series_list)
async def main():
start_time = log_time('start', 'Pulling scouting data')
overall_start_time = start_time
pitching_dfs = await get_scouting_dfs(range(1, 25))
print(f'Received {pitching_dfs} rows')
log_time('end', 'Pulled scouting data', start_time=start_time)
start_time = log_time('start', 'Beginning basic scouting')
await post_calc_basic(pitching_dfs)
log_time('end', 'Completed pitching scouting', start_time=start_time)
start_time = log_time('start', 'Beginning ratings guide')
await post_calc_ratings(pitching_dfs)
log_time('end', 'Completed ratings guide', start_time=start_time)
log_time('end', 'Total batter scouting', start_time=overall_start_time)
if __name__ == '__main__':
asyncio.run(main())