From 72968f5e5d650affe79dfaa86773e695f20530f1 Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Sun, 26 May 2024 10:53:15 -0500 Subject: [PATCH] Add MLB Player support --- batters/creation.py | 18 +++++++++++++++++- creation_helpers.py | 13 ++++++++++++- db_calls.py | 4 +++- pitchers/calcs_pitcher.py | 3 ++- pitchers/creation.py | 18 +++++++++++++++++- 5 files changed, 51 insertions(+), 5 deletions(-) diff --git a/batters/creation.py b/batters/creation.py index 535fa9b..87898b2 100644 --- a/batters/creation.py +++ b/batters/creation.py @@ -81,7 +81,7 @@ def get_batting_stats( def match_player_lines(all_batting: pd.DataFrame, all_players: pd.DataFrame, is_custom: bool = False): def get_pids(df_data): - return get_all_pybaseball_ids([df_data["playerId"]], 'fangraphs', is_custom) + return get_all_pybaseball_ids([df_data["playerId"]], 'fangraphs', is_custom, df_data['Name_vL']) print(f'Now pulling mlbam player IDs...') ids_and_names = all_batting.apply(get_pids, axis=1) @@ -100,6 +100,7 @@ def match_player_lines(all_batting: pd.DataFrame, all_players: pd.DataFrame, is_ async def create_new_players( final_batting: pd.DataFrame, cardset: dict, card_base_url: str, release_dir: str, player_desc: str): new_players = [] + new_mlbplayers = {} def create_batters(df_data): f_name = sanitize_name(df_data["name_first"]).title() @@ -120,10 +121,25 @@ async def create_new_players( 'fangr_id': int(float(df_data['key_fangraphs'])), 'strat_code': int(float(df_data['key_mlbam'])) }) + new_mlbplayers[df_data.name] = { + 'first_name': sanitize_name(df_data["name_first"]).title(), + 'last_name': sanitize_name(df_data["name_last"]).title(), + 'key_mlbam': int(float(df_data['key_mlbam'])), + 'key_fangraphs': int(float(df_data['key_fangraphs'])), + 'key_bbref': df_data['key_bbref'], + 'key_retro': df_data['key_retro'] + } final_batting[final_batting['player_id'].isnull()].apply(create_batters, axis=1) print(f'Creating {len(new_players)} new players...') for x in new_players: + mlb_query = await db_get('mlbplayers', params=[('key_bbref', x['bbref_id'])]) + if mlb_query['count'] > 0: + x['mlbplayer_id'] = mlb_query['players'][0]['id'] + else: + new_mlb = await db_post('mlbplayers/one', payload=new_mlbplayers[x['bbref_id']]) + x['mlbplayer_id'] = new_mlb['id'] + this_player = await db_post('players', payload=x) final_batting.at[x['bbref_id'], 'player_id'] = this_player['player_id'] final_batting.at[x['bbref_id'], 'p_name'] = this_player['p_name'] diff --git a/creation_helpers.py b/creation_helpers.py index 787dd3d..70b6be6 100644 --- a/creation_helpers.py +++ b/creation_helpers.py @@ -943,7 +943,7 @@ def mlbteam_and_franchise(mlbam_playerid): return p_data -def get_all_pybaseball_ids(player_id: list, key_type: str, is_custom: bool = False): +def get_all_pybaseball_ids(player_id: list, key_type: str, is_custom: bool = False, full_name: str = None): if is_custom: try: long_player_id = int(player_id[0]) @@ -995,6 +995,17 @@ def get_all_pybaseball_ids(player_id: list, key_type: str, is_custom: bool = Fal q = pb.playerid_reverse_lookup(player_id, key_type=key_type) if len(q.values) > 0: return_val = q.loc[0] + # Check manual players + elif full_name is not None: + names = full_name.split(' ') + q = pb.playerid_lookup(last=names[-1], first=' '.join(names[:-1]), fuzzy=True) + if len(q.values) > 0: + return_val = q.loc[0] + return_val['key_fangraphs'] = player_id[0] + else: + logging.error(f'get_all_pybaseball_ids - Could not find id {player_id} / {key_type} or ' + f'{full_name} / full name in pybaseball') + return_val = None else: logging.error(f'get_all_pybaseball_ids - Could not find id {player_id} / {key_type} in pybaseball') return_val = None diff --git a/db_calls.py b/db_calls.py index 38b0dd6..e0fc047 100644 --- a/db_calls.py +++ b/db_calls.py @@ -10,7 +10,9 @@ master_debug = True alt_database = False if alt_database == 'dev': - DB_URL = 'https://pd.manticorum.com/api' + DB_URL = 'https://pddev.manticorum.com/api' +elif alt_database == 'sba': + DB_URL = 'https://sba.manticorum.com/api' def param_char(other_params): diff --git a/pitchers/calcs_pitcher.py b/pitchers/calcs_pitcher.py index f722561..504a7fc 100644 --- a/pitchers/calcs_pitcher.py +++ b/pitchers/calcs_pitcher.py @@ -546,7 +546,8 @@ def balks(total_balks: int, innings: float, season_pct): def wild_pitches(total_wps: int, innings: float, season_pct): if innings == 0: return 0 - return min(round((int(total_wps) * 200 * season_pct) / float(innings)), 20) + # return min(round((int(total_wps) * 200 * season_pct) / float(innings)), 20) + return min(round((int(total_wps) * 200) / float(innings)), 20) def closer_rating(gf: int, saves: int, games: int): diff --git a/pitchers/creation.py b/pitchers/creation.py index a894dc7..32da757 100644 --- a/pitchers/creation.py +++ b/pitchers/creation.py @@ -90,7 +90,7 @@ async def pd_pitchingcardratings_df(cardset_id: int): def match_player_lines( all_pitching: pd.DataFrame, all_players: pd.DataFrame, df_p: pd.DataFrame, is_custom: bool = False): def get_pids(df_data): - return get_all_pybaseball_ids([df_data["playerId"]], 'fangraphs', is_custom) + return get_all_pybaseball_ids([df_data["playerId"]], 'fangraphs', is_custom, df_data['Name_vL']) print(f'Now pulling mlbam player IDs...') ids_and_names = all_pitching.apply(get_pids, axis=1) @@ -111,6 +111,7 @@ def match_player_lines( async def create_new_players( final_pitching: pd.DataFrame, cardset: dict, card_base_url: str, release_dir: str, player_desc: str): new_players = [] + new_mlbplayers = {} def create_pitchers(df_data): f_name = sanitize_name(df_data["name_first"]).title() @@ -131,10 +132,25 @@ async def create_new_players( 'fangr_id': int(float(df_data['key_fangraphs'])), 'strat_code': int(float(df_data['key_mlbam'])) }) + new_mlbplayers[df_data.name] = { + 'first_name': sanitize_name(df_data["name_first"]).title(), + 'last_name': sanitize_name(df_data["name_last"]).title(), + 'key_mlbam': int(float(df_data['key_mlbam'])), + 'key_fangraphs': int(float(df_data['key_fangraphs'])), + 'key_bbref': df_data['key_bbref'], + 'key_retro': df_data['key_retro'] + } final_pitching[final_pitching['player_id'].isnull()].apply(create_pitchers, axis=1) print(f'Creating {len(new_players)} new players...') for x in new_players: + mlb_query = await db_get('mlbplayers', params=[('key_bbref', x['bbref_id'])]) + if mlb_query['count'] > 0: + x['mlbplayer_id'] = mlb_query['players'][0]['id'] + else: + new_mlb = await db_post('mlbplayers/one', payload=new_mlbplayers[x['bbref_id']]) + x['mlbplayer_id'] = new_mlb['id'] + this_player = await db_post('players', payload=x) final_pitching.at[x['bbref_id'], 'player_id'] = this_player['player_id'] final_pitching.at[x['bbref_id'], 'p_name'] = this_player['p_name']