diff --git a/calculate/coaching_efficiency.py b/calculate/coaching_efficiency.py index 3875d23..046ec23 100644 --- a/calculate/coaching_efficiency.py +++ b/calculate/coaching_efficiency.py @@ -9,6 +9,7 @@ from dao.base import BasePlayer, BaseLeague from utilities.constants import prohibited_statuses from utilities.logger import get_logger +from utilities.utils import normalize_player_name logger = get_logger(__name__, propagate=False) @@ -70,7 +71,11 @@ def _is_player_ineligible(self, player: BasePlayer, week, inactives): if player.points != 0.0: return False else: - return player.status in self.inactive_statuses or player.bye_week == week or player.full_name in inactives + return ( + player.status in self.inactive_statuses + or player.bye_week == week + or normalize_player_name(player.full_name) in inactives + ) def _get_player_open_positions(self, player: BasePlayer, optimal_lineup: Dict[str, RosterSlot]): @@ -255,7 +260,8 @@ def execute_coaching_efficiency(self, team_name, team_roster, team_points, posit p for p in team_roster if p.selected_position == "BN" ] # exclude IR players ineligible_efficiency_player_count = len( - [p for p in bench_players if self._is_player_ineligible(p, week, inactive_players)]) + [p for p in bench_players if self._is_player_ineligible(p, week, inactive_players)] + ) if Counter(self.roster_active_slots) == Counter(positions_filled_active): num_bench_slots = self.roster_slot_counts.get("BN", 0) # excludes IR players/slots diff --git a/compose.yaml b/compose.yaml index d9fe889..0a6b7ed 100644 --- a/compose.yaml +++ b/compose.yaml @@ -2,7 +2,7 @@ services: app: - image: ghcr.io/uberfastman/fantasy-football-metrics-weekly-report:19.2.2 + image: ghcr.io/uberfastman/fantasy-football-metrics-weekly-report:19.2.3 platform: linux/amd64 ports: - "5001:5000" diff --git a/features/base/feature.py b/features/base/feature.py index 202fd82..6f00f04 100644 --- a/features/base/feature.py +++ b/features/base/feature.py @@ -6,7 +6,7 @@ from abc import ABC, abstractmethod from datetime import datetime from pathlib import Path -from typing import Dict, List, Any +from typing import Dict, Any from utilities.logger import get_logger @@ -38,9 +38,6 @@ def __init__(self, feature_type: str, feature_web_base_url: str, data_dir: Path, self.raw_feature_data_file_path: Path = self.data_dir / f"{self.feature_type_str}_raw_data.json" self.feature_data_file_path: Path = self.data_dir / f"{self.feature_type_str}_data.json" - self.player_name_punctuation: List[str] = [".", "'"] - self.player_name_suffixes: List[str] = ["Jr", "Sr", "V", "IV", "III", "II", "I"] # ordered for str.removesuffix - start = datetime.now() data_retrieved_from_web = False @@ -107,21 +104,6 @@ def _save_feature_data(self) -> None: with open(self.raw_feature_data_file_path, "w", encoding="utf-8") as feature_raw_data_out: json.dump(self.raw_feature_data, feature_raw_data_out, ensure_ascii=False, indent=2) - def _normalize_player_name(self, player_name: str) -> str: - """Remove all punctuation and name suffixes from player names and covert them to title case. - """ - normalized_player_name: str = player_name.strip() - if (any(punc in player_name for punc in self.player_name_punctuation) - or any(suffix in player_name for suffix in self.player_name_suffixes)): - - for punc in self.player_name_punctuation: - normalized_player_name = normalized_player_name.replace(punc, "") - - for suffix in self.player_name_suffixes: - normalized_player_name = normalized_player_name.removesuffix(suffix) - - return normalized_player_name.strip().title() - @abstractmethod def _get_feature_data(self) -> None: raise NotImplementedError diff --git a/features/high_roller.py b/features/high_roller.py index 97e4ba7..7b23d67 100644 --- a/features/high_roller.py +++ b/features/high_roller.py @@ -11,6 +11,7 @@ from features.base.feature import BaseFeature from utilities.constants import nfl_team_abbreviations, nfl_team_abbreviation_conversions from utilities.logger import get_logger +from utilities.utils import normalize_player_name logger = get_logger(__name__, propagate=False) @@ -101,7 +102,7 @@ def _get_feature_data(self): if player_name not in self.feature_data.keys(): self.feature_data[player_name] = { - "normalized_name": self._normalize_player_name(player_name), + "normalized_name": normalize_player_name(player_name), "team": player_team, "position": player_position, "position_type": self.position_types[player_position], @@ -172,7 +173,7 @@ def _get_player_high_roller_stats(self, player_first_name: str, player_last_name }) else: player.update({ - "normalized_name": self._normalize_player_name(player_full_name), + "normalized_name": normalize_player_name(player_full_name), "team": player_team_abbr, "fines": [], }) diff --git a/report/data.py b/report/data.py index bf99cc1..83f59e8 100644 --- a/report/data.py +++ b/report/data.py @@ -10,6 +10,7 @@ from utilities.app import add_report_team_stats, get_player_game_time_statuses from utilities.logger import get_logger from utilities.settings import settings +from utilities.utils import normalize_player_name logger = get_logger(__name__, propagate=False) @@ -39,7 +40,7 @@ def __init__(self, league: BaseLeague, season_weekly_teams_results, week_counter if player_status_info: player_status = player_status_info.text.strip() if player_status == "Out": - inactive_players.append(player_name) + inactive_players.append(normalize_player_name(player_name)) self.teams_results = { team.team_id: add_report_team_stats( diff --git a/utilities/constants.py b/utilities/constants.py index 0ebe38b..23f1785 100644 --- a/utilities/constants.py +++ b/utilities/constants.py @@ -17,7 +17,7 @@ } # prohibited player statuses to check team coaching efficiency eligibility if dq_ce = True -prohibited_statuses = { +prohibited_statuses: Dict[str, str] = { "O": "Out", "Out": "Out", "NA": "Inactive: Coach's Decision or Not on Roster", @@ -40,3 +40,7 @@ "RET": "Reserve: Retired", "Reserve-Ret": "Reserve: Retired" } + +player_name_punctuation: List[str] = [".", "'"] + +player_name_suffixes: List[str] = ["Jr", "Sr", "V", "IV", "III", "II", "I"] # ordered for str.removesuffix support diff --git a/utilities/utils.py b/utilities/utils.py index 977c5ae..81b0a47 100644 --- a/utilities/utils.py +++ b/utilities/utils.py @@ -1,6 +1,9 @@ __author__ = "Wren J. R. (uberfastman)" __email__ = "uberfastman@uberfastman.dev" +import re + +from utilities.constants import player_name_punctuation, player_name_suffixes from utilities.logger import get_logger from utilities.settings import settings @@ -35,3 +38,21 @@ def truncate_cell_for_display(cell_text: str, halve_max_chars: bool = False, ses else: return cell_text + + +def normalize_player_name(player_full_name: str) -> str: + """Remove all punctuation and name suffixes from player names, combine whitespace, and covert them to title case. + """ + regex_all_whitespace = re.compile(r"\s+") + normalized_player_name: str = regex_all_whitespace.sub(" ", player_full_name).strip() + + if (any(punc in player_full_name for punc in player_name_punctuation) + or any(suffix in player_full_name for suffix in player_name_suffixes)): + + for punc in player_name_punctuation: + normalized_player_name = normalized_player_name.replace(punc, "") + + for suffix in player_name_suffixes: + normalized_player_name = normalized_player_name.removesuffix(suffix) + + return normalized_player_name.strip().title()