Kerangka data berisi semua kepemilikan tim yang berakhir dengan gol. Setiap baris mewakili acara bola yang merinci pemain apa yang terlibat, jenis tindakan dan pos x dan pos y yang terjadi di lapangan.

#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',]})

Jadi masalah saya adalah saya ingin melacak urutan/aliran berbeda yang terjadi untuk setiap kepemilikan. Salah satu pendekatan yang saya coba tetapi gagal adalah menghitung pemain unik dengan kepemilikan_id.

Untuk misalnya kepemilikan 2 => pemain a mengoper ke pemain b, pemain b menembak dan skor (saya ingin mendefinisikan ini sebagai ABG), contoh lain bisa jadi kepemilikan 40 => pemain b mengoper ke pemain a, pemain a menembak dan skor (meskipun nama pemain berbeda ini juga harus didefinisikan sebagai urutan yang sama dengan yang pertama)

Jelas ada banyak kombinasi yang lebih rumit seperti banyak pemain ABCDAG yang terlibat, tetapi saya menyimpan sampel df sesederhana mungkin

Tidak yakin ada pendekatan yang mudah untuk ini, tetapi output pilihan saya jika dapat dicapai adalah

Sequence        Count
ABG               2
ABCG              1

0
Ciaran Sheelan 27 Maret 2020, 17:53

1 menjawab

Jawaban Terbaik

Ada dua masalah berbeda di sini:

  1. menggabungkan pemain dari kepemilikan tunggal menjadi string yang unik
  2. ubah string itu sehingga tidak tergantung pada nama pemain

Masalah pertama dapat diselesaikan dengan grup dengan:

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()))

Memberikan:

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

Jika kemudian akan menggunakan fungsi tertentu untuk mengubah string tersebut:

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)

Demo:

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

Ok, mari kita terapkan trans dan hitung:

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

Ini memberi seperti yang diharapkan:

  sequence  count
0     ABCG      1
1      ABG      2
0
Serge Ballesta 27 Maret 2020, 15:29