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())