有什么方法可以跟踪 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
这里有两个不同的问题:
- 将单回合的球员连接成一个唯一的字符串
- 转换这些字符串,使它们独立于玩家姓名
第一个问题可以用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
数据框包含以进球告终的所有球队财产。每行代表一个球事件,详细说明涉及哪些球员、动作类型以及它在球场上发生的位置 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
这里有两个不同的问题:
- 将单回合的球员连接成一个唯一的字符串
- 转换这些字符串,使它们独立于玩家姓名
第一个问题可以用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