本文目录导读:

- 方案一:使用
nba_api(最主流,NBA专用) - 方案二:只使用
requests和pandas(通用性更强) - 方案三:处理“两队”直接对话的主客场差异
- 常见陷阱与注意事项(开源项目踩坑点)
- 扩展:如果只是想要“可视化”结果
这个问题要分两种情况来回答,因为“两队的主客场战绩差异”可能指宏观的球队数据,也可能指微观的球员表现,针对开源项目,最常用的方案是使用篮球数据 API(如 NBA Stats API)。
假设你想看 NBA 或 CBA 数据,以下是具体的开源解决方案和代码思路:
使用 nba_api(最主流,NBA专用)
这是一个非常流行的开源 Python 库,能直接抓取 NBA 官方的统计数据。
核心思路: 利用 LeagueGameLog 接口获取球队所有比赛,然后根据 MATCHUP(比赛对阵)字段判断主客场,再进行分组汇总。
示例代码(Python):
from nba_api.stats.endpoints import leaguegamelog
from nba_api.stats.static import teams
import pandas as pd
# 1. 获取目标球队(金州勇士)
nuggets = teams.find_teams_by_full_name("Golden State Warriors")
team_id = nuggets[0]['id']
# 2. 获取该球队整个赛季的比赛日志
# season 可以是 '2023-24',season_type 可以是 'Regular Season'
game_log = leaguegamelog.LeagueGameLog(team_id=team_id, season='2023-24', season_type_all_star='Regular Season')
df = game_log.get_data_frames()[0]
# 3. 判断主客场:MATCHUP 字段格式为 "GSW vs. LAL" 或 "GSW @ LAL"
# '@' 代表客场,'vs.' 代表主场
df['Is_Home'] = df['MATCHUP'].str.contains('vs.')
# 4. 计算主客场胜率差异
home_games = df[df['Is_Home'] == True]
away_games = df[df['Is_Home'] == False]
home_wins = (home_games['WL'] == 'W').sum()
away_wins = (away_games['WL'] == 'W').sum()
# 5. 输出结果
print(f"主场战绩: {home_wins}胜{len(home_games)-home_wins}负,胜率: {home_wins/len(home_games):.2%}")
print(f"客场战绩: {away_wins}胜{len(away_games)-away_wins}负,胜率: {away_wins/len(away_games):.2%}")
print(f"主客场胜率差: {home_wins/len(home_games) - away_wins/len(away_games):.2%}")
只使用 requests 和 pandas(通用性更强)
不依赖特定库,直接调用 NBA 的官方 JSON API,适合想自研代码或处理非 NBA 数据的朋友。
API 端点:
https://stats.nba.com/stats/leaguegamelog?LeagueID=00&Season=2023-24&SeasonType=Regular%20Season&PlayerOrTeam=T
关键点:
- 需要伪造请求头(
User-Agent等),否则会被拦截。 - 解析 JSON 后,同样依赖
MATCHUP字段判断主客场。
处理“两队”直接对话的主客场差异
如果问题是“A队和B队直接交锋时,谁的主场优势更大”,那就是另一种逻辑:
思路: 获取两队所有交手的比赛(比如常规赛 4 场),分别看 A 队在主场表现和 B 队在主场表现。
# 假设 A 队是 Golden State,B 队是 Denver
# 获取两队的比赛日志,然后过滤出对手是另一队的比赛
def get_head_to_head(a_team_id, b_team_id, season):
# 获取 A 队比赛
log_a = leaguegamelog.LeagueGameLog(team_id=a_team_id, season=season).get_data_frames()[0]
# 找到对手是 B 队的比赛(可以通过 TEAM_ID 或 MATCHUP 里包含对方球队简称来判断)
matchups = log_a[log_a['MATCHUP'].str.contains('DEN')] # 假设 B 队简称是 DEN
# 再进一步按主客场拆分
a_home = matchups[matchups['MATCHUP'].str.contains('vs.')]
a_away = matchups[matchups['MATCHUP'].str.contains('@')]
return a_home, a_away
常见陷阱与注意事项(开源项目踩坑点)
- 赛季格式:NBA 的赛季参数是
'2023-24'(跨年),不是'2023'。 - 客场判断:
MATCHUP字段的格式非常规范,是 (客场)和vs.(主场)的唯一差异,直接字符串匹配即可。 - 数据接口限制:NBA 官方 API 没有提供专门的“球队主客场战绩”这个聚合接口,所有主客场数据都要通过
LeagueGameLog去跑一遍,时间复杂度 O(球队比赛场次)。 - CBA 等国内联赛:开源库较少,通常需要自己爬取虎扑或联赛官网的数据,解析 HTML 或抓取隐藏的 JSON 接口,逻辑同理。
扩展:如果只是想要“可视化”结果
如果你用的是可视化 BI 工具(如 Superset、Grafana)连接数据库,代码逻辑一样:
- 从
games表里WHERE (home_team_id = X AND away_team_id = Y)筛选比赛。 - 直接
SELECT主场胜率减客场胜率即可。
总结一句话: 在开源项目中,除了少数内置了“主客场胜率”字段的数据库外,绝大多数场景都需要你自己通过比赛日志(Game Log)数据,用 MATCHUP 字段或者 HOME_TEAM_ID 字段人工打标签,GROUP BY 分组计算差异,如果你需要具体的某个球队(比如湖人 vs 凯尔特人)的直接对比,带上具体队名我可以帮你把代码跑通。