Python案例看好的球队近期状态如何?

wen python案例 2

本文目录导读:

Python案例看好的球队近期状态如何?

  1. 案例目标:分析“利物浦”近10场英超比赛的“状态”
  2. 方法一:使用模拟数据(快速上手,理解逻辑)
  3. 方法二:使用真实数据 API(football-data.org)
  4. 如何判断球队“状态好”?
  5. 如果你没有数据,但想看“某队真实状态”

这是一个很好的数据分析实战案例,评估一支球队(比如英超、NBA、中超等)的“近期状态”,通常需要获取该球队最近几场比赛的数据(胜负、进球、失球、对手强弱等)。

以下我会提供一个通用且可运行的Python案例,以足球为例,演示如何分析一支球队的近期状态,该案例会结合数据抓取(模拟或使用真实API)和数据可视化

由于直接爬取某些实时网站可能涉及反爬或法律风险,我会提供两种方式:

  1. 方式A(推荐):模拟数据 + 真实逻辑 —— 你可以在任何环境下立刻运行,理解分析框架。
  2. 方式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)

这是获取真实足球数据的常用免费方式。

步骤:

  1. 申请 API Key:https://www.football-data.org/ 免费注册,获取 API Key
  2. 安装 requests: pip install requests
  3. 运行代码:
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}")

如果你没有数据,但想看“某队真实状态”

推荐两步找数据:

  1. 手动整理:去 懂球帝WhoscoredESPN 网站,抄录近10场比分。
  2. 用Excel + Python:把数据存成 CSV,然后用上面的 pandas 代码分析。

如果你只想知道“我看好的球队最近状态好不好”,最直接的方式是:看他们最近5场比赛的“净胜球”趋势(进球-失球),如果连续为正且扩大,状态火热;如果连续为负,则状态低迷。


这个案例足够你分析任何球队了,如果你有具体球队(湖人队”、“曼城”),我可以帮你调整代码适配对应的数据源(NBA可用 nba_api,足球可用 football-data)。

抱歉,评论功能暂时关闭!