Есть ли способ отслеживать последовательности в Python? - PullRequest
0 голосов
/ 27 марта 2020

Фрейм данных содержит все командное имущество, которое заканчивается целью. Каждая строка представляет событие мяча, в котором подробно описывается, какой игрок принимал участие, тип действия, а также позиция 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',]})

Поэтому моя проблема заключается в том, что я хочу отслеживать различные последовательности / потоки. которые происходят для каждого владения. Один из подходов, который я испробовал, но потерпел неудачу, заключался в подсчете уникальных игроков с помощьюion-идентификатора владения.

Например, обладание 2 => игрок a передает пас игроку b, игрок b стреляет и забивает (я хочу определить это как ABG), другой Примером может быть владение 40 => игрок b передает игроку a, игрок a стреляет и забивает (даже если имена игроков разные, это также должно быть определено как та же последовательность, что и у первого)

Очевидно, что есть было задействовано много более сложных комбинаций, таких как несколько игроков ABCDAG, но я держал образец df как можно более простым

Не уверен, что есть такой простой подход к этому, но мой предпочтительный результат, если достижимо, будет

Sequence        Count
ABG               2
ABCG              1

1 Ответ

0 голосов
/ 27 марта 2020

Здесь есть две разные проблемы:

  1. объединяет игроков из одного владения в уникальную строку
  2. преобразует эти строки так, чтобы они не зависели от имен игроков

Первая проблема может быть решена с помощью группировки:

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

Если бы затем использовать специфическую c функцию для преобразования этих строки:

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'

Хорошо, давайте применим trans и count:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...