diff --git a/batters/creation.py b/batters/creation.py index 2eb9c44..dca40a1 100644 --- a/batters/creation.py +++ b/batters/creation.py @@ -410,6 +410,32 @@ async def post_player_updates( return len(player_updates) +async def run_batter_fielding(season: int, offense_stats: pd.DataFrame, season_pct: float, post_batters: bool): + print(f'Pulling catcher defense...') + df_c = cde.get_bbref_fielding_df('c', season) + print(f'Pulling first base defense...') + df_1b = cde.get_bbref_fielding_df('1b', season) + print(f'Pulling second base defense...') + df_2b = cde.get_bbref_fielding_df('2b', season) + print(f'Pulling third base defense...') + df_3b = cde.get_bbref_fielding_df('3b', season) + print(f'Pulling short stop defense...') + df_ss = cde.get_bbref_fielding_df('ss', season) + print(f'Pulling left field defense...') + df_lf = cde.get_bbref_fielding_df('lf', season) + print(f'Pulling center field defense...') + df_cf = cde.get_bbref_fielding_df('cf', season) + print(f'Pulling right field defense...') + df_rf = cde.get_bbref_fielding_df('rf', season) + print(f'Pulling outfield defense...') + df_of = cde.get_bbref_fielding_df('of', season) + print(f'Positions data is retrieved') + + await cde.create_positions( + offense_stats, season_pct, post_batters, df_c, df_1b, df_2b, df_3b, df_ss, df_lf, df_cf, df_rf, df_of + ) + + async def run_batters( cardset: dict, input_path: str, post_players: bool, card_base_url: str, release_directory: str, player_description: str, season_pct: float, post_batters: bool, pull_fielding: bool, season: int, @@ -440,29 +466,7 @@ async def run_batters( await calculate_batting_ratings(offense_stats, post_batters) if pull_fielding: - print(f'Pulling catcher defense...') - df_c = cde.get_bbref_fielding_df('c', season) - print(f'Pulling first base defense...') - df_1b = cde.get_bbref_fielding_df('1b', season) - print(f'Pulling second base defense...') - df_2b = cde.get_bbref_fielding_df('2b', season) - print(f'Pulling third base defense...') - df_3b = cde.get_bbref_fielding_df('3b', season) - print(f'Pulling short stop defense...') - df_ss = cde.get_bbref_fielding_df('ss', season) - print(f'Pulling left field defense...') - df_lf = cde.get_bbref_fielding_df('lf', season) - print(f'Pulling center field defense...') - df_cf = cde.get_bbref_fielding_df('cf', season) - print(f'Pulling right field defense...') - df_rf = cde.get_bbref_fielding_df('rf', season) - print(f'Pulling outfield defense...') - df_of = cde.get_bbref_fielding_df('of', season) - print(f'Positions data is retrieved') - - await cde.create_positions( - offense_stats, season_pct, post_batters, df_c, df_1b, df_2b, df_3b, df_ss, df_lf, df_cf, df_rf, df_of - ) + await run_batter_fielding(season, offense_stats, season_pct, post_batters) await post_player_updates( cardset, card_base_url, release_directory, player_description, is_liveseries, post_batters, is_custom diff --git a/manual_pull_fielding.py b/manual_pull_fielding.py new file mode 100644 index 0000000..f65477f --- /dev/null +++ b/manual_pull_fielding.py @@ -0,0 +1,44 @@ +import asyncio +import sys + +import batters.creation +import pitchers.creation + +from creation_helpers import get_args, pd_players_df, pd_positions_df +from db_calls import db_get +from defenders import calcs_defense as cde + + +async def main(args): + arg_data = get_args(args) + + cardset_name = arg_data['cardset_name'] + print(f'Searching for cardset: {cardset_name}') + c_query = await db_get('cardsets', params=[('name', cardset_name)]) + + if c_query['count'] == 0: + print(f'I do not see a cardset named {cardset_name}') + return + cardset = c_query['cardsets'][0] + del c_query + + if 'season' in arg_data: + season = arg_data['season'] + else: + season = int(cardset['name'][:4]) + + post_batters = True if 'post_batters' not in arg_data or arg_data['post_batters'].lower() == 'true' else False + post_pitchers = True if 'post_pitchers' not in arg_data or arg_data['post_pitchers'].lower() == 'true' else False + post_players = True if 'post_players' not in arg_data or arg_data['post_players'].lower() == 'true' else False + season_pct = 1.0 if 'season_pct' not in arg_data else float(arg_data['season_pct']) + + all_players = await pd_players_df(cardset['id']) + if post_batters: + await batters.creation.run_batter_fielding(season, all_players, season_pct, post_batters) + if post_pitchers: + df_p = cde.get_bbref_fielding_df('p', season) + await pitchers.creation.create_position(season_pct, all_players, post_pitchers, df_p) + + +if __name__ == '__main__': + asyncio.run(main(sys.argv[1:])) \ No newline at end of file diff --git a/raw play tracking.py b/raw play tracking.py new file mode 100644 index 0000000..9c6f64d --- /dev/null +++ b/raw play tracking.py @@ -0,0 +1,28 @@ +import asyncio +import datetime +import sys + +import pandas as pd +from db_calls import db_get + + +async def main(args): + start_time = datetime.datetime.now() + print(f'Pulling in season 9 scoring plays...') + play_query = await db_get( + 'plays', + api_ver=3, + params=[('season', 9), ('s_type', 'regular'), ('limit', 100000), ('short_output', True)] + ) + p_run_time = datetime.datetime.now() - start_time + print(f'Pulled in {play_query["count"]} total plays in {round(p_run_time.total_seconds())} seconds') + + s_plays = pd.DataFrame(play_query['plays']) + print(f'Built the dataframe\nSaving to csv...') + + s_plays.to_csv('regular-season-plays.csv', encoding='utf-8', index=False) + print('Saved to regular-season-plays.csv') + + +if __name__ == '__main__': + asyncio.run(main(sys.argv[1:])) diff --git a/refresh_cards.py b/refresh_cards.py new file mode 100644 index 0000000..4a57f5c --- /dev/null +++ b/refresh_cards.py @@ -0,0 +1,108 @@ +import asyncio +import datetime +import logging +import sys +import urllib.parse + +from creation_helpers import get_args +from db_calls import db_get, url_get, db_post, db_patch, DB_URL + +date = f'{datetime.datetime.now().year}-{datetime.datetime.now().month}-{datetime.datetime.now().day}' +log_level = logging.INFO +logging.basicConfig( + filename=f'logs/{date}.log', + format='%(asctime)s - check-cards - %(levelname)s - %(message)s', + level=log_level +) +CARD_BASE_URL = f'{DB_URL}/v2/players' + + +async def main(args): + arg_data = get_args(args) + + cardset_name = arg_data['cardset_name'] + print(f'Searching for cardset: {cardset_name}') + c_query = await db_get('cardsets', params=[('name', cardset_name)]) + + if c_query['count'] == 0: + print(f'I do not see a cardset named {cardset_name}') + return + cardset = c_query['cardsets'][0] + del c_query + + p_query = await db_get( + 'players', + params=[('inc_dex', False), ('cardset_id', cardset['id']), ('short_output', True)] + ) + if p_query['count'] == 0: + raise ValueError(f'No players returned from Paper Dynasty API') + all_players = p_query['players'] + del p_query + + errors = [] + successes = [] + cxn_error = False + count = -1 + start_time = datetime.datetime.now() + + for x in all_players: + if 'pitching' in x['image'] and 'skip_arms' in arg_data and arg_data['skip_arms'].lower() == 'true': + pass + elif 'batting' in x['image'] and 'skip_bats' in arg_data and arg_data['skip_bats'].lower() == 'true': + pass + elif 'start_id' in arg_data and int(arg_data['start_id']) > x['player_id']: + pass + # elif 'sombaseball' in x['image']: + # errors.append((x, f'Bad card url: {x["image"]}')) + elif 'sombaseball' in x['image']: + print(f'Found old image URL for {x["p_name"]} - setting card type by pos_1: {x["pos_1"]}') + release_dir = f'{start_time.year}-{start_time.month}-{start_time.day}' + if x['pos_1'] in ['SP', 'RP', 'CP', 'P']: + image_url = (f'{CARD_BASE_URL}/{x["player_id"]}/pitchingcard' + f'{urllib.parse.quote("?d=")}{release_dir}') + else: + image_url = (f'{CARD_BASE_URL}/{x["player_id"]}/battingcard' + f'{urllib.parse.quote("?d=")}{release_dir}') + this_player = await db_patch( + 'players', + object_id=x["player_id"], + params=[('image', image_url)] + ) + else: + count += 1 + if count % 20 == 0: + print(f'Card #{count + 1} being updated is {x["p_name"]}...') + elif 'test_count' in arg_data and int(arg_data['test_count']) < count: + print(f'Done test run') + break + + try: + resp = await db_post(f'players/{x["player_id"]}/image-reset') + + except ConnectionError as e: + if cxn_error: + raise e + + cxn_error = True + errors.append((x, e)) + + except ValueError as e: + errors.append((x, e)) + + if len(errors) > 0: + logging.error(f'All Errors:') + for x in errors: + logging.error(f'ID {x[0]["player_id"]} {x[0]["p_name"]} - Error: {x[1]}') + + if len(successes) > 0: + logging.debug(f'All Successes:') + for x in successes: + logging.info(f'ID {x["player_id"]} {x["p_name"]}') + + p_run_time = datetime.datetime.now() - start_time + print(f'\nAll done!\nErrors: {len(errors)}\nSuccesses: {len(successes)}') + print(f'Total runtime: {p_run_time.total_seconds()} seconds') + + +if __name__ == '__main__': + asyncio.run(main(sys.argv[1:]))