本文目录导读:

- 案例目标:分析“利物浦”近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)。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播