107 lines
4.2 KiB
Python
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())
|