篮球/足球"挑球过人"次数统计案例
我来给你一个完整的Python案例,统计比赛数据中"挑球过人"的次数并分析。

场景说明
假设我们有一份比赛事件日志(如足球比赛),每条记录包含球员、动作类型等,我们要统计挑球过人(chip/lob dribble)的次数,并判断"多不多"。
完整代码
import pandas as pd
from collections import Counter
# 1. 模拟一份比赛事件数据(也可以用 pd.read_csv 读取真实数据)
data = [
{"player": "梅西", "action": "挑球过人"},
{"player": "梅西", "action": "传球"},
{"player": "梅西", "action": "挑球过人"},
{"player": "内马尔", "action": "挑球过人"},
{"player": "内马尔", "action": "射门"},
{"player": "姆巴佩", "action": "传球"},
{"player": "姆巴佩", "action": "挑球过人"},
{"player": "姆巴佩", "action": "挑球过人"},
{"player": "姆巴佩", "action": "挑球过人"},
{"player": "迪马利亚", "action": "抢断"},
]
df = pd.DataFrame(data)
# 2. 定义"挑球过人"的识别关键词
CHIP_KEYWORDS = ["挑球过人", "挑球", "chip", "lob"]
def is_chip_dribble(action: str) -> bool:
return any(k in action.lower() for k in CHIP_KEYWORDS)
df["is_chip"] = df["action"].apply(is_chip_dribble)
# 3. 总体统计
total_actions = len(df)
chip_count = df["is_chip"].sum()
chip_ratio = chip_count / total_actions
print(f"总事件数:{total_actions}")
print(f"挑球过人次数:{chip_count}")
print(f"挑球过人占比:{chip_ratio:.2%}")
# 4. 按球员统计
player_chip = (
df[df["is_chip"]]
.groupby("player")
.size()
.sort_values(ascending=False)
)
print("\n各球员挑球过人次数:")
print(player_chip)
# 5. 判断"多不多"——设定阈值
THRESHOLD_COUNT = 3 # 单个球员超过3次算多
THRESHOLD_RATIO = 0.20 # 整体占比超过20%算多
print("\n--- 判定结果 ---")
if chip_ratio >= THRESHOLD_RATIO:
print(f"整体挑球过人偏多(占比 {chip_ratio:.2%} ≥ {THRESHOLD_RATIO:.0%})")
else:
print(f"整体挑球过人偏少(占比 {chip_ratio:.2%} < {THRESHOLD_RATIO:.0%})")
top_players = player_chip[player_chip >= THRESHOLD_COUNT]
if not top_players.empty:
print(f"挑球过人次数较多的球员(≥{THRESHOLD_COUNT}次):")
for p, c in top_players.items():
print(f" - {p}: {c} 次")
else:
print("没有球员挑球过人次数特别突出。")
运行结果
总事件数:10
挑球过人次数:6
挑球过人占比:60.00%
各球员挑球过人次数:
player
姆巴佩 3
梅西 2
内马尔 1
--- 判定结果 ---
整体挑球过人偏多(占比 60.00% ≥ 20%)
挑球过人次数较多的球员(≥3次):
- 姆巴佩: 3 次
关键设计点
| 要点 | 说明 |
|---|---|
| 关键词匹配 | 用 any(k in action for k in keywords) 兼容多种写法(中英文、简称) |
| 占比判断 | 只看次数不够,用 chip_count / total 判断"密度"更合理 |
| 分球员统计 | groupby + size 快速得出谁最突出 |
| 阈值判定 | 设两个阈值(绝对次数 + 相对占比),避免"次数多但总事件也多"的误判 |
| 可扩展 | 换成 pd.read_csv("events.csv") 即可接入真实数据 |
进阶:如果想更严谨
- 时间窗口:按半场/每15分钟统计,看是否集中爆发
- 成功率:如果数据里有"成功/失败"字段,统计挑球过人成功率
- 对比基准:跟联赛平均值比,而不是拍脑袋定阈值
- 可视化:
import matplotlib.pyplot as plt
player_chip.plot(kind="bar", title="各球员挑球过人次数")
plt.ylabel("次数")
plt.tight_layout()
plt.show()
需要我把它改成足球专项(带成功率) 还是篮球变向/背后运球的统计版本?告诉我你的数据字段,我可以直接适配。