diff --git a/retrosheet_data.py b/retrosheet_data.py index e65b07b..01fa7f8 100644 --- a/retrosheet_data.py +++ b/retrosheet_data.py @@ -222,18 +222,22 @@ def get_player_ids(plays: pd.DataFrame, which: Literal['batters', 'pitchers']) - r_vs_l = 0 if 'r' not in pa_vl else pa_vl['r'] r_vs_r = 0 if 'r' not in pa_vr else pa_vr['r'] + # If player ONLY batted from one side (zero PAs from other side), classify as single-handed if sum([l_vs_l, l_vs_r]) == 0 and sum([r_vs_l, r_vs_r]) > 0: return 'R' elif sum([l_vs_l, l_vs_r]) > 0 and sum([r_vs_l, r_vs_r]) == 0: return 'L' - - if sum([l_vs_l, l_vs_r, r_vs_l, r_vs_r]) < 10: - if sum([l_vs_l, l_vs_r]) > sum([r_vs_l, r_vs_r]): - return 'L' - else: - return 'R' - else: + + # If player batted from both sides (even if limited sample), they're a switch hitter + # This correctly identifies switch hitters regardless of total PA count + if sum([l_vs_l, l_vs_r]) > 0 and sum([r_vs_l, r_vs_r]) > 0: return 'S' + + # Fallback for edge cases (shouldn't reach here in normal flow) + if sum([l_vs_l, l_vs_r]) > sum([r_vs_l, r_vs_r]): + return 'L' + else: + return 'R' def get_pitch_hand(row): first_event = plays.drop_duplicates('pitcher_id').loc[plays.pitcher_id == row['key_retro'], 'pitcher_hand'] @@ -1096,8 +1100,15 @@ async def get_or_post_players(bstat_df: pd.DataFrame = None, bat_rat_df: pd.Data return mlb_player def new_player_payload(row, ratings_df: pd.DataFrame): + # Append handedness indicator to player name (* for left, # for switch) + name_suffix = '' + if row.get('bat_hand') == 'L': + name_suffix = '*' + elif row.get('bat_hand') == 'S': + name_suffix = '#' + return { - 'p_name': f'{row["use_name"]} {row["last_name"]}', + 'p_name': f'{row["use_name"]} {row["last_name"]}{name_suffix}', 'cost': f'{ratings_df.loc[row['key_bbref']]["cost"]}', 'image': f'change-me', 'mlbclub': CLUB_LIST[row['Tm']],