krz/nba-scores

A CLI/TUI app for NBA scores.

clone: git clone https://gitbay.org/krz/nba-scores.git

main: nba/leaders.py · raw

 1"""
 2Fetches and formats NBA statistical leaders.
 3"""
 4
 5import json
 6
 7from nba_api.stats.endpoints.leagueleaders import LeagueLeaders
 8from tabulate import tabulate
 9
10BOLD = "\033[1m"
11END = "\033[0m"
12
13# Ordered list of (api_abbreviation, display_label)
14CATEGORIES = [
15    ("PTS", "Points"),
16    ("REB", "Rebounds"),
17    ("AST", "Assists"),
18    ("STL", "Steals"),
19    ("BLK", "Blocks"),
20    ("EFF", "Efficiency"),
21    ("FG_PCT", "FG%"),
22    ("FT_PCT", "FT%"),
23    ("FG3_PCT", "3P%"),
24]
25
26# Extra columns to show alongside RANK, PLAYER, TEAM, GP for each category
27_EXTRA_COLS = {
28    "PTS": ["PTS", "FGM", "FGA", "FG_PCT", "FTM", "FTA", "FT_PCT"],
29    "REB": ["REB", "OREB", "DREB", "GP"],
30    "AST": ["AST", "TOV", "AST_TOV", "GP"],
31    "STL": ["STL", "TOV", "GP"],
32    "BLK": ["BLK", "PF", "GP"],
33    "EFF": ["EFF", "PTS", "REB", "AST", "GP"],
34    "FG_PCT": ["FG_PCT", "FGM", "FGA", "PTS"],
35    "FT_PCT": ["FT_PCT", "FTM", "FTA", "PTS"],
36    "FG3_PCT": ["FG3_PCT", "FG3M", "FG3A", "PTS"],
37}
38
39_DISPLAY_NAMES = {
40    "FG_PCT": "FG%",
41    "FT_PCT": "FT%",
42    "FG3_PCT": "3P%",
43    "FG3M": "3PM",
44    "FG3A": "3PA",
45    "AST_TOV": "AST/TO",
46}
47
48
49def fetch_leaders(category: str = "PTS") -> dict:
50    endpoint = LeagueLeaders(
51        stat_category_abbreviation=category,
52        season_type_all_star="Regular Season",
53    )
54    return json.loads(endpoint.get_json())
55
56
57def get_leaders_table(data: dict, category: str = "PTS") -> str:
58    result = data["resultSet"]
59    headers = result["headers"]
60    rows = result["rowSet"]
61
62    base = ["RANK", "PLAYER", "TEAM", "GP"]
63    extra = [c for c in _EXTRA_COLS.get(category, [category]) if c not in base]
64    wanted = base + extra
65
66    idx = {h: i for i, h in enumerate(headers)}
67    table_data = [[row[idx[col]] for col in wanted if col in idx] for row in rows[:25]]
68    display_headers = [_DISPLAY_NAMES.get(c, c) for c in wanted if c in idx]
69
70    cat_label = dict(CATEGORIES).get(category, category)
71    title = f"{BOLD}League Leaders — {cat_label}{END}"
72    return title + "\n" + tabulate(table_data, headers=display_headers, tablefmt="grid")