python案例统计红黄牌数量哪队更多?

wen python案例 6

本文目录导读:

python案例统计红黄牌数量哪队更多?

  1. 项目背景:为什么统计红黄牌?
  2. 数据准备:从CSV到Pandas DataFrame
  3. 核心逻辑:分组聚合与条件计数
  4. 可视化对比:谁才是“吃牌大户”?
  5. 延伸思考:红黄牌数据背后的战术信号
  6. 常见问题FAQ(含代码优化技巧)

**
Python实战案例:用数据科学统计红黄牌数量,哪支球队更“暴力”?——基于Pandas与Matplotlib的足球赛事分析


目录导读

  1. 项目背景:为什么统计红黄牌?
  2. 数据准备:从CSV到Pandas DataFrame
  3. 核心逻辑:分组聚合与条件计数
  4. 可视化对比:谁才是“吃牌大户”?
  5. 延伸思考:红黄牌数据背后的战术信号
  6. 常见问题FAQ(含代码优化技巧)

项目背景:为什么统计红黄牌?

在足球赛事分析中,红黄牌不仅代表纪律处罚,更隐含球队的防守强度、比赛节奏甚至战术倾向,高位逼抢型球队往往犯规更多,而控球型球队则更少,通过Python自动统计各队红黄牌总数,可以快速定位“激进型”球队,为教练组或体育媒体提供数据支撑。本文以2023-2024赛季欧洲五大联赛部分比赛数据为例,演示如何用Python实现红黄牌统计并对比“哪队更多”。

数据准备:从CSV到Pandas DataFrame

假设你有一份比赛数据集(cards_data.csv),包含字段:match_idteam_hometeam_awayyellow_homeyellow_awayred_homered_away,我们将使用pandas读取数据:

import pandas as pd
df = pd.read_csv('cards_data.csv')
print(df.head())

关键点:数据需清洗,确保红黄牌列无缺失值(用fillna(0)处理),若数据源是比赛事件表(每行一张牌),则需用groupby()聚合。

核心逻辑:分组聚合与条件计数

假设数据是比赛级聚合(每行一场比赛),统计每队总红黄牌需分别计算主客场,再合并:

# 主队红黄牌
home_cards = df.groupby('team_home')[['yellow_home', 'red_home']].sum().reset_index()
home_cards.columns = ['team', 'yellow', 'red']
# 客队红黄牌
away_cards = df.groupby('team_away')[['yellow_away', 'red_away']].sum().reset_index()
away_cards.columns = ['team', 'yellow', 'red']
# 合并并求和
total_cards = pd.concat([home_cards, away_cards]).groupby('team')[['yellow', 'red']].sum()
total_cards['total'] = total_cards['yellow'] + total_cards['red'] * 2  # 红牌计2分权重
print(total_cards.sort_values('total', ascending=False).head(10))

逻辑优化:红牌权重通常>黄牌(红牌=2张黄牌),故可设置red_weight=2,便于对比“严重性”,若数据为事件明细表(每行包含teamcard_type),则直接用pivot_table

pivot = pd.pivot_table(event_df, index='team', columns='card_type', values='match_id', aggfunc='count', fill_value=0)

可视化对比:谁才是“吃牌大户”?

matplotlib绘制横向柱状图,直观显示前10名:

import matplotlib.pyplot as plt
top_teams = total_cards.nlargest(10, 'total')[['total']]
plt.figure(figsize=(10, 6))
plt.barh(top_teams.index, top_teams['total'], color='orange')
plt.xlabel('Total Cards (Red*2 + Yellow)')'Top 10 Teams by Card Counts in 2023-24 Season')
plt.gca().invert_yaxis()
plt.show()

见解:结果可能显示中下游球队或保级队更“脏”,因为强队控球率高、犯规少,但需注意红牌多也可能意味着防守策略较鲁莽。

延伸思考:红黄牌数据背后的战术信号

  • 相关性分析:计算红黄牌与“场均犯规”的相关性,判断是否冗余指标。
  • 时间维度:统计全场伤停补时阶段的红黄牌占比,洞察比赛最后时刻的紧张度。
  • 主客场差异:用groupby(['team', 'venue'])对比主场与客场吃牌数,验证“主场哨”是否存在。

常见问题FAQ(含代码优化技巧)

Q1:如果数据有上百万行,代码会卡吗?
A:用daskpolars替代pandas,或提前用category数据类型压缩内存,上述groupby在百万行内秒级完成,无需过度担忧。

Q2:怎么把结果导出为Excel报表?

total_cards.to_excel('cards_summary.xlsx', sheet_name='Total')

Q3:红黄牌权重怎么自定义?
A:只需修改total = yellow + red * weight中的weight变量,若按欧足联规则(红牌=3分),调整即可。

Q4:如何用爬虫自动获取最新数据?
A:可用requests+BeautifulSoup从FBref或WhoScored抓取,但需遵守robots协议,或直接使用football-data.org的免费API(需注册key)。

Q5:统计学中有更严谨的指标吗?
A:可计算“每90分钟吃牌率”,用总牌数除以总出场时间,消除比赛场次差异,例如df['rate'] = total / (match_count * 90)


通过Python的pandasmatplotlib,我们轻松完成了红黄牌统计与可视化,快速定位“激进”球队,但请记住,数据只是表象,结合比赛录像和战术图才能洞察本质。别忘了尝试修改权重、添加过滤条件(如只统计英超),让分析更贴合你的需求,下次看球时,你可以“偷偷”用这段代码预判哪队会吃牌了!

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