有什么方法可以跟踪 Python 中的序列?

Is there a way I can track sequences in Python?

数据框包含以进球告终的所有球队财产。每行代表一个球事件,详细说明涉及哪些球员、动作类型以及它在球场上发生的位置 x 和位置。

#sample df
pass_goal = pd.DataFrame({'match_id': [1107073,1107073,1107073,1409630,1409630,1409630,1509730,1509730,1509730,1509730], 
'possession_number': [2,2,2,40,40,40,100,100,100,100], 
'second': [10,15,20,250,260,270,300,310,320,330], 
'action_name': ['pass', 'pass', 'goal','pass','pass','goal','pass','pass','pass','goal'], 
'player_name': ['a','b','b','b','a','a','d','e','c','c',]})

所以我的问题是我想跟踪每次拥有时发生的不同 sequences/flows。我尝试但失败的一种方法是按 possession_id.

计算唯一玩家

例如possession 2 => 球员 a 传球给球员 b,球员 b 射门得分(我想将其定义为 ABG),另一个例子可能是球权 40 => 球员 b 传球给球员 a,球员 a 射门并得分(即使球员名字不同这也应该定义为与第一个相同的顺序)

显然有很多更复杂的组合,比如 ABCDAG 涉及多个玩家,但我让示例 df 尽可能简单

不确定是否有这么简单的方法,但如果可以实现,我的首选输出是

Sequence        Count
ABG               2
ABCG              1

这里有两个不同的问题:

  1. 将单回合的球员连接成一个唯一的字符串
  2. 转换这些字符串,使它们独立于玩家姓名

第一个问题可以用groupby解决:

val = pd.Series(pass_goal['player_name'])
val[pass_goal['action_name'] == 'goal'] = 'G'
tmp = val.groupby(pass_goal['possession_number']).apply(lambda x: ''.join(x.tolist()))

它给出:

possession_number
2       abG
40      baG
100    decG
Name: player_name, dtype: object

如果然后使用特定函数来转换这些字符串:

def trans(s):
    resul = []
    d = {}
    for i in s:
        if i == 'G':
            resul.append(i)
        else:
            if i not in d:
                d[i] = chr(ord('A') + len(d))
            resul.append(d[i])
    return ''.join(resul)

演示:

>>> trans('abG')
'ABG'
>>> trans('baG')
'ABG'

好的,让我们应用反式和计数:

tmp = tmp.apply(trans)
resul = tmp.groupby(tmp).count().rename('count').reset_index().rename(
         columns={'player_name': 'sequence'})

它给出了预期的结果:

  sequence  count
0     ABCG      1
1      ABG      2