欧洲超级杯巴黎 2-1 维拉,K77 克瓦拉茨赫利亚和杜埃先后破门,登贝莱替补登场送出助攻。这条新闻标题在球迷眼里是比赛结果,在开发者眼里却是一个典型的数据建模场景:比分、进球者、助攻者、替补登场,四个信息分别对应不同的数据字段和事件类型。文章以这场比赛为案例,不讨论战术和判罚,只讲一件事:如何用 Python 把一场比赛从一句话标题整理成结构化数据,并完成进球贡献统计、替补效应量化和比赛时间线可视化。下面给出完整代码、数据文件和分析脚本,读者可以在本地环境直接跑通,再替换成自己关注的比赛数据。
这篇文章适合两类读者。一类是刚接触数据分析、想用真实场景练手的开发者,另一类是足球内容创作者或数据爱好者,希望把比赛报道改造成可复用的数据模板。阅读前只需要有 Python 基础,了解变量、函数和 JSON 即可。整条技术主线是:先确定比赛数据的字段和数据模型,再准备环境,然后用 dataclass 建模,接着把巴黎 2-1 维拉写入 JSON 并加载,最后完成统计与可视化,并补齐常见坑和扩展方向。
1. 先想清楚:一场比赛的数据要从哪些维度描述
1.1 新闻标题是人读的,统计系统需要字段和事件
“欧洲超级杯,巴黎 2-1 维拉,K77 杜埃破门,登贝莱替补送助”这句话里面,至少包含四层信息:
- 比赛名称:欧洲超级杯。
- 对阵与比分:巴黎 2-1 维拉。
- 进球球员:K77、杜埃。
- 替补与助攻:登贝莱替补登场并送出助攻。
如果直接把这串文字存到数据库里,检索时只能做模糊匹配,无法回答“登贝莱的替补登场是否直接改变了比赛结果”“杜埃的进球发生在第几分钟”这类问题。所以第一步是把信息拆成字段,再根据字段之间的关系设计数据结构。
| 信息 | 标题中的表述 | 对应字段 | 是否需要单独事件 |
|---|---|---|---|
| 比赛名称 | 欧洲超级杯 | name | 否 |
| 对阵双方 | 巴黎 / 维拉 | home_team / away_team | 否 |
| 比分 | 2-1 | home_score / away_score | 否,但需要进球事件支撑 |
| 进球者 | K77、杜埃 | goal 事件的 player 字段 | 是 |
| 替补登场 | 登贝莱替补 | substitution 事件的 player 字段 | 是 |
| 助攻 | 登贝莱送助 | goal 事件的 related_player 字段 | 由 goal 事件承担 |
比赛名称、对阵和比分是比赛级别的属性,只保存一次即可。进球者和替补登场必须用事件来描述,因为同一名球员可以在多个事件里出现,而且事件自带“第几分钟发生”这个时间维度。
1.2 事件数据:进球、替补、助攻如何组织
足球比赛本质上是按时间排序的事件流。本文只需要三类事件,但实际项目中至少要知道它们各自的组织方式:
- goal 事件:记录进球方、进球者、分钟、助攻者、当时比分。
- substitution 事件:记录登场球员、被换下球员、分钟。
- assist 信息:建议合并进 goal 事件,用 related_player 字段表示,不需要单独建事件。
助攻之所以不建议拆成独立事件,是因为助攻和进球在业务上是一对一关联。拆成两个事件后,统计“某球员的参与进球数”时还要做一次关联查询,徒增复杂度。合并进 goal 事件后,一次循环就能同时统计进球和助攻。
| 事件类型 | 必填字段 | 典型取值 | 说明 |
|---|---|---|---|
| goal | event_type, team, minute, player | "goal", "home", 23, "克瓦拉茨赫利亚(K77)" | player 是进球者,related_player 可存助攻者 |
| substitution | event_type, team, minute, player, related_player | "substitution", "home", 46, "登贝莱", "被换下球员" | player 是登场球员,related_player 是离场球员 |
1.3 本文的最小技术闭环
从这场比赛出发,代码要完成五个动作:加载 JSON、校验比分、统计进球和助攻、计算替补登场时间、画时间线和贡献图。数据规模小,用 Python 自带的 dataclass 加 pandas、matplotlib 就足够,不需要引入 Spark、Flink 之类的大数据组件。
2. 环境准备:Python 版本与依赖库
2.1 版本和依赖
本文代码使用 Python 3.10 及以上版本,主要因为 dataclass 和类型注解在 3.10 上已经非常成熟。依赖库只有三个,安装成本很低。
| 依赖 | 用途 | 建议版本 |
|---|---|---|
| Python | 运行环境 | 3.10+ |
| pandas | 表格统计与聚合 | 2.x |
| matplotlib | 图表绘制 | 3.8+ |
| numpy | 数值计算,pandas 依赖 | 1.26+ |
在项目目录下创建 requirements.txt:
pandas>=2.0 matplotlib>=3.8 numpy>=1.26pandas 不是必须的,只做单场比赛统计时用纯 Python 字典也够。但文章后面会把“多场比赛、多名球员”的聚合作为扩展方向,pandas 的 groupby 能力在数据量变大后会显著减少代码量,所以这里直接引入。
2.2 创建虚拟环境并安装
建议先建虚拟环境,避免污染系统 Python:
mkdir match_analysis cd match_analysis python -m venv .venv # Windows .venv\Scripts\activate # macOS / Linux source .venv/bin/activate pip install -r requirements.txt安装完成后验证版本:
python -c "import pandas, matplotlib; print(pandas.__