本文目录导读:

- 案例目标:分析“利物浦”近10场英超比赛的“状态”
- 方法一:使用模拟数据(快速上手,理解逻辑)
- 方法二:使用真实数据 API(football-data.org)
- 如何判断球队“状态好”?
- 如果你没有数据,但想看“某队真实状态”
这是一个很好的数据分析实战案例,评估一支球队(比如英超、NBA、中超等)的“近期状态”,通常需要获取该球队最近几场比赛的数据(胜负、进球、失球、对手强弱等)。
以下我会提供一个通用且可运行的Python案例,以足球为例,演示如何分析一支球队的近期状态,该案例会结合数据抓取(模拟或使用真实API)和数据可视化。
由于直接爬取某些实时网站可能涉及反爬或法律风险,我会提供两种方式:
- 方式A(推荐):模拟数据 + 真实逻辑 —— 你可以在任何环境下立刻运行,理解分析框架。
- 方式B(进阶):使用免费 Sports API —— 我会告诉你如何调用真实数据(以
football-data.org为例)。
案例目标:分析“利物浦”近10场英超比赛的“状态”
我们将分析:
- 最近5场和10场的胜平负分布。
- 进/失球趋势(进攻和防守状态)。
- 综合状态评分。
使用模拟数据(快速上手,理解逻辑)
这是最实用的方式,核心在于理解状态分析逻辑。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 设置中文支持(如果你使用英文环境可忽略)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 或 'Arial Unicode MS' (Mac)
plt.rcParams['axes.unicode_minus'] = False
# --- 1. 模拟数据:代表利物浦最近10场比赛结果 ---
# 格式:[对手, 主/客, 我方进球, 对方进球]
mock_fixtures = [
("曼联", "客", 3, 0), # 胜
("阿森纳", "主", 1, 2), # 负
("曼城", "客", 1, 1), # 平
("切尔西", "主", 4, 1), # 胜
("热刺", "客", 2, 1), # 胜
("纽卡斯尔", "主", 0, 0),# 平
("布莱顿", "客", 3, 2), # 胜
("维拉", "主", 2, 0), # 胜
("西汉姆", "客", 1, 3), # 负
("狼队", "主", 5, 0), # 胜
]
# --- 2. 数据整理 ---
df = pd.DataFrame(mock_fixtures, columns=['对手', '主客', '进球', '失球'])
# 计算每场结果
def get_result(row):
if row['进球'] > row['失球']:
return '胜'
elif row['进球'] < row['失球']:
return '负'
else:
return '平'
df['结果'] = df.apply(get_result, axis=1)
df['比赛序号'] = range(1, len(df)+1)
# 计算累积积分(假设胜3分,平1分)
df['单场积分'] = df['结果'].map({'胜': 3, '平': 1, '负': 0})
df['累积积分'] = df['单场积分'].cumsum()
print("📋 近期赛果数据:")
print(df[['比赛序号', '对手', '结果', '进球', '失球', '单场积分']].to_string(index=False))
# --- 3. 状态分析 ---
print("\n📊 状态分析报告:")
print(f"📅 近10场总积分:{df['单场积分'].sum()}")
print(f"✅ 胜率:{ (df['结果']=='胜').mean()*100:.0f}%")
print(f"⚖️ 平率:{ (df['结果']=='平').mean()*100:.0f}%")
print(f"❌ 败率:{ (df['结果']=='负').mean()*100:.0f}%")
# 近5场与近10场对比(近期状态变化)
recent_5 = df.tail(5)
print(f"\n🆚 近5场积分:{recent_5['单场积分'].sum()}")
print(f"🔵 近5场场均进球:{recent_5['进球'].mean():.2f}")
print(f"🔴 近5场场均失球:{recent_5['失球'].mean():.2f}")
# --- 4. 可视化:状态趋势图 ---
plt.figure(figsize=(12, 5))
# 子图1:进球/失球趋势
plt.subplot(1, 2, 1)
plt.plot(df['比赛序号'], df['进球'], 'go-', label='进球', markersize=8)
plt.plot(df['比赛序号'], df['失球'], 'ro-', label='失球', markersize=8)
plt.axhline(y=df['进球'].mean(), color='green', linestyle='--', alpha=0.5, label='平均进球')
plt.axhline(y=df['失球'].mean(), color='red', linestyle='--', alpha=0.5, label='平均失球')'⚽ 进/失球趋势 (利物浦近10场)')
plt.xlabel('比赛序号 (1=最早)')
plt.ylabel('数量')
plt.legend()
plt.grid(True, alpha=0.3)
# 子图2:累积积分曲线
plt.subplot(1, 2, 2)
plt.plot(df['比赛序号'], df['累积积分'], 'b-s', label='积分走势', linewidth=2)
plt.fill_between(df['比赛序号'], df['累积积分'], alpha=0.2, color='blue')'📈 积分累计趋势')
plt.xlabel('比赛场次')
plt.ylabel('累积积分')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
运行结果解读: 你会看到一张表格和两张趋势图。
- 进/失球趋势图: 如果进球线(绿色)持续高于失球线(红色),说明状态好。
- 积分趋势图: 如果曲线越来越陡峭,说明最近连胜,状态正佳;如果变平,则近期低迷。
使用真实数据 API(football-data.org)
这是获取真实足球数据的常用免费方式。
步骤:
- 申请 API Key: 去 https://www.football-data.org/ 免费注册,获取
API Key。 - 安装 requests:
pip install requests - 运行代码:
import requests
import pandas as pd
import matplotlib.pyplot as plt
# --- 配置 ---
API_KEY = "你的API_KEY" # 替换为你自己的Key
HEADERS = {"X-Auth-Token": API_KEY}
# 球队:利物浦 (Premier League ID: 61, 利物浦Team ID: 64)
TEAM_ID = 64
COMPETITION_ID = 2021 # Premier League 2021
# --- 1. 获取球队近期赛程 ---
url = f"https://api.football-data.org/v4/teams/{TEAM_ID}/matches" # 注意:v4版本
params = {"status": "FINISHED", "limit": 10}
response = requests.get(url, headers=HEADERS, params=params)
data = response.json()
# --- 2. 解析数据 ---
matches = []
for match in data['matches']:
# 确定主客和比分
home_team = match['homeTeam']['name']
away_team = match['awayTeam']['name']
score = match['score']
# 注意:有些比赛可能未记录比分,需跳过
if score['fullTime']['home'] is None or score['fullTime']['away'] is None:
continue
home_goals = score['fullTime']['home']
away_goals = score['fullTime']['away']
# 判断是否利物浦相关
if match['homeTeam']['id'] == TEAM_ID:
our_goals = home_goals
opponent_goals = away_goals
venue = '主'
opponent = away_team
else:
our_goals = away_goals
opponent_goals = home_goals
venue = '客'
opponent = home_team
match_date = match['utcDate'][:10]
matches.append([match_date, opponent, venue, our_goals, opponent_goals])
df = pd.DataFrame(matches, columns=['日期', '对手', '主客', '进球', '失球'])
# --- 3. 后续分析 (和上面方法一相同) ---
# 计算胜平负、积分、可视化等 (代码同方法一的步骤2-4)
print(df)
# 然后复用方法一中的分析代码
注意:
- 免费API有调用频率限制(10次/分钟)。
- 返回的数据结构较复杂,建议先
print(data['matches'][0].keys())看看结构。
如何判断球队“状态好”?
除了看胜率,还可以使用加权移动平均(最近比赛权重更高)来量化状态:
# 计算加权状态得分 (示例)
weights = [0.05, 0.05, 0.1, 0.1, 0.15, 0.15, 0.2, 0.2] # 越近权重越大
recent_scores = df['单场积分'].values[-8:] # 取最近8场
state_score = np.sum(recent_scores * weights)
print(f"⚡ 加权状态评分 (满分2.4): {state_score:.2f}")
如果你没有数据,但想看“某队真实状态”
推荐两步找数据:
- 手动整理:去
懂球帝、Whoscored、ESPN网站,抄录近10场比分。 - 用Excel + Python:把数据存成 CSV,然后用上面的 pandas 代码分析。
如果你只想知道“我看好的球队最近状态好不好”,最直接的方式是:看他们最近5场比赛的“净胜球”趋势(进球-失球),如果连续为正且扩大,状态火热;如果连续为负,则状态低迷。
这个案例足够你分析任何球队了,如果你有具体球队(湖人队”、“曼城”),我可以帮你调整代码适配对应的数据源(NBA可用 nba_api,足球可用 football-data)。