krz/nba-scores
A CLI/TUI app for NBA scores.
clone: git clone https://gitbay.org/krz/nba-scores.git
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")