summaryrefslogtreecommitdiff
path: root/nba/leaders.py
diff options
context:
space:
mode:
Diffstat (limited to 'nba/leaders.py')
-rw-r--r--nba/leaders.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/nba/leaders.py b/nba/leaders.py
new file mode 100644
index 0000000..aa6f3b4
--- /dev/null
+++ b/nba/leaders.py
@@ -0,0 +1,72 @@
+"""
+Fetches and formats NBA statistical leaders.
+"""
+
+import json
+
+from tabulate import tabulate
+from nba_api.stats.endpoints.leagueleaders import LeagueLeaders
+
+BOLD = "\033[1m"
+END = "\033[0m"
+
+# Ordered list of (api_abbreviation, display_label)
+CATEGORIES = [
+ ("PTS", "Points"),
+ ("REB", "Rebounds"),
+ ("AST", "Assists"),
+ ("STL", "Steals"),
+ ("BLK", "Blocks"),
+ ("EFF", "Efficiency"),
+ ("FG_PCT", "FG%"),
+ ("FT_PCT", "FT%"),
+ ("FG3_PCT", "3P%"),
+]
+
+# Extra columns to show alongside RANK, PLAYER, TEAM, GP for each category
+_EXTRA_COLS = {
+ "PTS": ["PTS", "FGM", "FGA", "FG_PCT", "FTM", "FTA", "FT_PCT"],
+ "REB": ["REB", "OREB", "DREB", "GP"],
+ "AST": ["AST", "TOV", "AST_TOV", "GP"],
+ "STL": ["STL", "TOV", "GP"],
+ "BLK": ["BLK", "PF", "GP"],
+ "EFF": ["EFF", "PTS", "REB", "AST", "GP"],
+ "FG_PCT": ["FG_PCT", "FGM", "FGA", "PTS"],
+ "FT_PCT": ["FT_PCT", "FTM", "FTA", "PTS"],
+ "FG3_PCT":["FG3_PCT", "FG3M", "FG3A", "PTS"],
+}
+
+_DISPLAY_NAMES = {
+ "FG_PCT": "FG%", "FT_PCT": "FT%", "FG3_PCT": "3P%",
+ "FG3M": "3PM", "FG3A": "3PA",
+ "AST_TOV": "AST/TO",
+}
+
+
+def fetch_leaders(category: str = "PTS") -> dict:
+ endpoint = LeagueLeaders(
+ stat_category_abbreviation=category,
+ season_type_all_star="Regular Season",
+ )
+ return json.loads(endpoint.get_json())
+
+
+def get_leaders_table(data: dict, category: str = "PTS") -> str:
+ result = data["resultSet"]
+ headers = result["headers"]
+ rows = result["rowSet"]
+
+ base = ["RANK", "PLAYER", "TEAM", "GP"]
+ extra = [c for c in _EXTRA_COLS.get(category, [category]) if c not in base]
+ wanted = base + extra
+
+ idx = {h: i for i, h in enumerate(headers)}
+ table_data = [
+ [row[idx[col]] for col in wanted if col in idx]
+ for row in rows[:25]
+ ]
+ display_headers = [_DISPLAY_NAMES.get(c, c) for c in wanted if c in idx]
+
+ cat_label = dict(CATEGORIES).get(category, category)
+ title = f"{BOLD}League Leaders — {cat_label}{END}"
+ return title + "\n" + tabulate(table_data, headers=display_headers, tablefmt="grid")