python案例如何分析球员之间的默契程度?

wen python案例 4

本文目录导读:

python案例如何分析球员之间的默契程度?

  1. 数据准备
  2. 核心分析维度与代码实现
  3. 构建综合默契评分模型
  4. 可视化展示
  5. 进阶优化:图神经网络(GNN)
  6. 总结与注意事项

分析球员之间的默契程度,不能只看单场比赛的得分或助攻,而需要从传球网络、跑位联动、攻防转换等多个维度进行量化。

下面是一个系统性的Python分析案例框架,从数据准备、特征工程、算法模型到可视化,逐步给出可执行的代码思路。


数据准备

假设我们有一份包含时间戳、球员ID、动作类型(传球、接球、射门、抢断等)和坐标的逐秒事件流数据,数据结构通常如下:

import pandas as pd
# 示例数据结构
data = {
    'timestamp': [10.0, 10.5, 11.0, 11.2, 12.0, 12.5],
    'player_id': [1, 1, 2, 3, 2, 1],  # 1号传球给2号,2号传球给3号...
    'action': ['pass', 'receive', 'pass', 'receive', 'shoot', 'run'],
    'x': [20.0, 22.0, 25.0, 30.0, 35.0, 40.0],
    'y': [10.0, 12.0, 15.0, 18.0, 20.0, 25.0]
}
df = pd.DataFrame(data)

核心分析维度与代码实现

传球网络分析(量化连线的紧密程度)

这是最直接的默契指标,统计每对球员之间的成功传球次数,并构建传球矩阵。

import numpy as np
# 假设df中有'pass'和'receive'成对出现
# 通过时间戳对齐找出传球者和接球者
def build_pass_matrix(df):
    passes = df[df['action'] == 'pass']
    receives = df[df['action'] == 'receive']
    players = sorted(set(df['player_id'].unique()))
    matrix = pd.DataFrame(0, index=players, columns=players)
    # 简化逻辑:根据时间戳最近匹配
    for _, pass_row in passes.iterrows():
        # 寻找紧随其后的接球事件
        next_receive = receives[receives['timestamp'] > pass_row['timestamp']].iloc[0]
        passer = pass_row['player_id']
        receiver = next_receive['player_id']
        if passer != receiver:
            matrix.loc[passer, receiver] += 1
    return matrix
pass_matrix = build_pass_matrix(df)

空间联动指数(分析跑位同步性)

默契不仅仅在于传球,更在于无球跑动的契合,利用皮尔逊相关系数分析两名球员移动轨迹的同步性。

from scipy.stats import pearsonr
# 提取两名球员的轨迹
def calculate_movement_sync(player_a, player_b):
    # 按时间戳插值对齐轨迹
    traces = df[df['player_id'].isin([player_a, player_b])]
    pivot = traces.pivot_table(index='timestamp', columns='player_id', values=['x', 'y'], aggfunc='first')
    pivot = pivot.fillna(method='ffill')
    # 计算X和Y方向的相关性
    corr_x, _ = pearsonr(pivot[('x', player_a)], pivot[('x', player_b)])
    corr_y, _ = pearsonr(pivot[('y', player_a)], pivot[('y', player_b)])
    # 综合得分(取平均值并归一化到0-1)
    sync_score = (corr_x + corr_y) / 2
    return max(0, sync_score)

特定战术配合(如“二过一”/“挡拆”)

通过模式识别检测连续触球序列(A→B→A),这是极强默契的表现。

def detect_wall_pass(events, players):
    """检测A传给B,B立刻回传A的模式"""
    patterns = []
    for i in range(len(events) - 2):
        e1, e2, e3 = events[i], events[i+1], events[i+2]
        if (e1['action'] == 'pass' and e3['action'] == 'pass' and 
            e1['player_id'] == e3['player_id'] and 
            e2['player_id'] != e1['player_id']):
            # 时间窗口小于阈值(如3秒内)
            if e3['timestamp'] - e1['timestamp'] < 3.0:
                patterns.append((e1['player_id'], e2['player_id']))
    return patterns
# 统计该组合出现的频率
pattern_count = Counter(patterns)

构建综合默契评分模型

将多个维度的数据标准化后加权求和,生成0-100的综合评分。

from sklearn.preprocessing import MinMaxScaler
def comprehensive_sync_score(pass_freq, movement_sync, pattern_freq, weights):
    """
    weights: 一个字典,如 {'pass':0.4, 'movement':0.3, 'pattern':0.3}
    """
    # 标准化到0-1
    scaler = MinMaxScaler()
    pass_norm = scaler.fit_transform(np.array(pass_freq).reshape(-1, 1))
    move_norm = scaler.fit_transform(np.array(movement_sync).reshape(-1, 1))
    pattern_norm = scaler.fit_transform(np.array(pattern_freq).reshape(-1, 1))
    total = (pass_norm * weights['pass'] + 
             move_norm * weights['movement'] + 
             pattern_norm * weights['pattern'])
    return total * 100  # 映射到0-100

可视化展示

使用squarifynetworkx绘制动态传球网络图,节点大小代表触球次数,边的粗细代表传球频率。

import networkx as nx
import matplotlib.pyplot as plt
def visualize_pass_network(matrix):
    G = nx.from_pandas_adjacency(matrix)
    # 计算边权重
    edge_weights = [matrix.loc[u, v] for u, v in G.edges()]
    plt.figure(figsize=(10, 8))
    pos = nx.spring_layout(G)
    nx.draw(G, pos, with_labels=True, 
            node_size=1200, node_color='lightblue',
            width=[w/2 for w in edge_weights],  # 线粗代表传球多
            edge_color='gray')
    plt.title('球员传球默契网络图')
    plt.show()

进阶优化:图神经网络(GNN)

如果数据量很大,可以借鉴Graph Neural Network(GNN),将球员看作节点,传球网看作边,用PyTorch Geometric建模型,通过节点嵌入学习,自动发现“高默契组合”(即嵌入向量余弦相似度高的球员对)。

# 伪代码(需要pyg库)
# model = GCN(输入特征=球员的位置/技术统计, 邻接矩阵=传球矩阵)
# 输出每个球员的Embedding向量
# 默契度 = Cosine_Similarity(embedding[a], embedding[b])

总结与注意事项

  1. 数据质量是核心,如果没有精确的空间坐标,只能依赖传球序列数据。
  2. 对手强度会影响传球成功率,建议在分析时加入对手防守强度作为控制变量(如使用“预期助攻 xA”等高级指标)。
  3. 样本量要求:如果只统计一场比赛,偶然性较大,建议收集多场、多对手的数据进行平均。

通过以上步骤,你可以从结果(传球数)、过程(跑位同步性)、战术(特定配合频次)三个层面,相对科学地量化“默契”这个抽象概念。

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