python案例统计转身过人次数谁多?

wen python案例 4

篮球转身过人次数统计案例

下面用一个完整的Python案例演示如何统计多名球员的转身过人次数,并找出谁最多。

python案例统计转身过人次数谁多?

场景说明

假设我们有一段比赛事件数据(模拟),每个事件包含:球员、动作类型,我们需要统计每位球员的 "转身过人"(spin move)次数,并排序找出最多的人。

完整代码

from collections import Counter
import pandas as pd
# ========== 1. 模拟比赛事件数据 ==========
# 实际中这些数据可来自视频标注、追踪系统或API
events = [
    {"player": "詹姆斯", "action": "转身过人"},
    {"player": "詹姆斯", "action": "转身过人"},
    {"player": "詹姆斯", "action": "投篮"},
    {"player": "库里",   "action": "转身过人"},
    {"player": "库里",   "action": "三分"},
    {"player": "东契奇", "action": "转身过人"},
    {"player": "东契奇", "action": "转身过人"},
    {"player": "东契奇", "action": "转身过人"},
    {"player": "东契奇", "action": "传球"},
    {"player": "欧文",   "action": "转身过人"},
    {"player": "欧文",   "action": "转身过人"},
    {"player": "字母哥", "action": "扣篮"},
    {"player": "字母哥", "action": "转身过人"},
]
# ========== 2. 方法一:使用 Counter(最简洁) ==========
spin_counts = Counter(
    e["player"] for e in events if e["action"] == "转身过人"
)
print("=== 各球员转身过人次数 ===")
for player, cnt in spin_counts.most_common():
    print(f"{player}: {cnt} 次")
# 找出最多的人(可能有并列)
max_cnt = max(spin_counts.values())
top_players = [p for p, c in spin_counts.items() if c == max_cnt]
print(f"\n转身过人最多:{'、'.join(top_players)},共 {max_cnt} 次")
# ========== 3. 方法二:使用 pandas(适合大数据) ==========
df = pd.DataFrame(events)
spin_df = df[df["action"] == "转身过人"]
result = (
    spin_df.groupby("player")
           .size()
           .reset_index(name="转身过人次数")
           .sort_values("转身过人次数", ascending=False)
           .reset_index(drop=True)
)
print("\n=== pandas 统计结果 ===")
print(result)
# 取第一行即最多的球员
top = result.iloc[0]
print(f"\n最多球员:{top['player']},{top['转身过人次数']} 次")
# ========== 4. 可视化(可选) ==========
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 中文显示
plt.rcParams["axes.unicode_minus"] = False
result.plot(x="player", y="转身过人次数", kind="bar", color="steelblue", legend=False)"球员转身过人次数统计")
plt.ylabel("次数")
plt.tight_layout()
plt.show()

运行结果

=== 各球员转身过人次数 ===
东契奇: 3 次
詹姆斯: 2 次
欧文: 2 次
库里: 1 次
字母哥: 1 次
转身过人最多:东契奇,共 3 次
=== pandas 统计结果 ===
   player  转身过人次数
0    东契奇       3
1    詹姆斯       2
2     欧文       2
3     库里       1
4    字母哥       1
最多球员:东契奇,3 次

关键点解析

步骤 说明
数据源 事件列表/CSV/数据库/视频标注结果
筛选 action == "转身过人" 过滤出目标动作
计数 Counter(轻量)或 groupby().size()(大数据、可扩展)
取最大值 max() + 列表推导处理并列最多的情况
可视化 柱状图直观对比

扩展思路

  • 按动作别名统计:如果数据里有 "spin"、"转身"、"转身突破" 等多种写法,先做标准化映射:
    alias = {"spin": "转身过人", "转身突破": "转身过人", "转身": "转身过人"}
    action = alias.get(e["action"], e["action"])
  • 按时间段/节次统计:给事件加 quarter 字段,用 groupby(["player","quarter"]) 分析关键时刻。
  • 真实数据接入:NBA 可接 nba_api,或用 CV(YOLO + 姿态估计)从比赛视频自动识别转身动作。

如果你有真实数据格式(CSV 列名、字段),可以贴出来,我帮你改造成能直接跑的版本。

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