Refactor for manual updates

This commit is contained in:
Cal Corum 2024-07-14 13:22:22 -05:00
parent bf35bca7d8
commit 48c9cec364
4 changed files with 207 additions and 23 deletions

View File

@ -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

44
manual_pull_fielding.py Normal file
View File

@ -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:]))

28
raw play tracking.py Normal file
View File

@ -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:]))

108
refresh_cards.py Normal file
View File

@ -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:]))