diff --git a/pybaseball/playerid_lookup.py b/pybaseball/playerid_lookup.py index 5ccbbc7a..5c2c1795 100644 --- a/pybaseball/playerid_lookup.py +++ b/pybaseball/playerid_lookup.py @@ -77,21 +77,27 @@ def get_lookup_table(save=False): # make these lowercase to avoid capitalization mistakes when searching table['name_last'] = table['name_last'].str.lower() table['name_first'] = table['name_first'].str.lower() + table['normalized_name_last'] = table['name_last'].apply(normalize_accents) + table['normalized_name_first'] = table['name_first'].apply(normalize_accents) return table -def get_closest_names(last: str, first: str, player_table: pd.DataFrame) -> pd.DataFrame: +def get_closest_names(last: str, first: str, player_table: pd.DataFrame, ignore_accents:bool=False) -> pd.DataFrame: """Calculates similarity of first and last name provided with all players in player_table Args: last (str): Provided last name first (str): Provided first name player_table (pd.DataFrame): Chadwick player table including names + ignore_accets (bool, optional): Normalizes accented letters. Defaults to False Returns: pd.DataFrame: 5 nearest matches from difflib.get_close_matches """ - filled_df = player_table.fillna("").assign(chadwick_name=lambda row: row.name_first + " " + row.name_last) + if ignore_accents: + filled_df = player_table.fillna("").assign(chadwick_name=lambda row: row.normalized_name_first + " " + row.normalized_name_last) + else: + filled_df = player_table.fillna("").assign(chadwick_name=lambda row: row.name_first + " " + row.name_last) fuzzy_matches = pd.DataFrame( get_close_matches(f"{first} {last}", filled_df.chadwick_name, n=5, cutoff=0) ).rename({0: "chadwick_name"}, axis=1) @@ -119,25 +125,30 @@ def search(self, last: str, first: str = None, fuzzy: bool = False, ignore_accen last = last.lower() first = first.lower() if first else None + last_column = 'name_last' + first_column = 'name_first' + if ignore_accents: last = normalize_accents(last) first = normalize_accents(first) if first else None - self.table['name_last'] = self.table['name_last'].apply(normalize_accents) - self.table['name_first'] = self.table['name_first'].apply(normalize_accents) + last_column = 'normalized_name_last' + first_column = 'normalized_name_first' if first is None: - results = self.table.loc[self.table['name_last'] == last] + results = self.table.loc[self.table[last_column] == last] else: - results = self.table.loc[(self.table['name_last'] == last) & (self.table['name_first'] == first)] + results = self.table.loc[(self.table[last_column] == last) & (self.table[first_column] == first)] results = results.reset_index(drop=True) # If no matches, return 5 closest names if len(results) == 0 and fuzzy: print("No identically matched names found! Returning the 5 most similar names.") - results=get_closest_names(last=last, first=first, player_table=self.table) - + results=get_closest_names(last=last, first=first, player_table=self.table, ignore_accents=ignore_accents) + + results.drop(['normalized_name_last', 'normalized_name_first'], axis=1, inplace=True) + return results diff --git a/tests/integration/pybaseball/test_playerid_lookup.py b/tests/integration/pybaseball/test_playerid_lookup.py index f10666f6..1c2e121b 100644 --- a/tests/integration/pybaseball/test_playerid_lookup.py +++ b/tests/integration/pybaseball/test_playerid_lookup.py @@ -11,7 +11,7 @@ def test_playerid_lookup_misspelling() -> None: def test_playerid_lookup_multiple_player() -> None: """Test multiple players per name - two pedro martinez""" - assert len(playerid_lookup("martinez", "pedro", fuzzy=True)) == 2 + assert len(playerid_lookup("griffey", "ken", fuzzy=True)) == 2 def test_playerid_lookup_last_name() -> None: """Test last name-only search""" @@ -69,19 +69,40 @@ def test_playerid_lookup_accents_df() -> None: """Tests ignore accents. No accents in params, accents in df""" # Yordan Alvarez alvarez_df = playerid_lookup("Alvarez", "Yordan", ignore_accents=True) - assert alvarez_df["name_last"][0] == 'alvarez' + assert alvarez_df["name_last"][0] == 'álvarez' assert alvarez_df["name_first"][0] == 'yordan' def test_playerid_lookup_accents_params() -> None: """Tests ignore accents. Accents in params, not in df""" # Victor Martinez martinez_df = playerid_lookup('martiñez', 'victor', ignore_accents=True) - assert martinez_df['name_last'][0] == 'martinez' - assert martinez_df['name_first'][0] == 'victor' + assert martinez_df['name_last'][0] == 'martínez' + assert martinez_df['name_first'][0] == 'víctor' def test_playerid_lookup_accents_both() -> None: """Tests ignore accents. Accents in params and df""" # Ronald Acuana acuna_df = playerid_lookup("acuña", "ronald", ignore_accents=True) - assert acuna_df["name_last"][0] == 'acuna' + assert acuna_df["name_last"][0] == 'acuña' assert acuna_df["name_first"][0] == 'ronald' + +def test_playerid_lookup_phonetics_accent_df() -> None: + """Tests ignore accents. No accents in params, accents in df, phonetic matching""" + # Yordan Alvarez + alvarez_df = playerid_lookup("Alvarez", "Jordan", ignore_accents=True, fuzzy=True) + assert alvarez_df["name_last"][0] == 'álvarez' + assert alvarez_df["name_first"][0] == 'yordan' + +def test_playerid_lookup_phonetics_accent_params() -> None: + """Tests ignore accents. Accents in params, not in df, phonetic matching""" + # Victor Martinez + martinez_df = playerid_lookup('martiñez', 'wictor', ignore_accents=True, fuzzy=True) + assert martinez_df['name_last'][0] == 'martínez' + assert martinez_df['name_first'][0] == 'víctor' + +def test_playerid_lookup_phonetics_accents_both() -> None: + """Tests ignore accents. Accents in params and df, phonetic matching""" + # Ronald Acuana + acuna_df = playerid_lookup("acuña", "ronold", ignore_accents=True, fuzzy=True) + assert acuna_df["name_last"][0] == 'acuña' + assert acuna_df["name_first"][0] == 'ronald' \ No newline at end of file