質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

465閲覧

あるサッカーの試合の一連の攻撃を分類するためのコードが知りたい

ryocg49

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2020/08/11 16:49

前提・実現したいこと

タイトルの通り、あるサッカーの試合における、一連の攻撃(攻撃開始時点から終了時点まで)ごとにリストを作成したいです。
あるサッカーの試合のトラッキングデータが与えられています。そのデータの中では、どちらのチームがその時点でボール保持しているか知るために、ホームチームのボール保持時は”1”、アウェーチームのボール保持時は”2”、という二つの値で表されています。この二つの値の切り替わりで、どちらが攻撃をしているか判別することが可能です。
ex)
" "選手名"    "攻撃アクション名"   "攻撃判別値(1,2)"
0    選手1       パス         1
1    選手2      トラップ        1
2 選手2       パス         1
3 選 手3    トラップ      1
・ ・          ・           ・
・ ・          ・           ・
・    ・          ・         ・
105  選手58   タックル     2
106   選手58      パス         2
107   選手59     トラップ        2

このように攻撃判別値によって、どちらのチームが攻撃をしているかを判別することができます。
この値を切り替わりを用いて、一連の攻撃の抽出をし、攻撃の時系列データを作りたいと考えています。一試合には攻撃の切り替わりが何度も存在します。攻撃が切り変わる度に一つの攻撃が生まれます。その一つずつを分けて抽出し、一つのリストにするためのプログラムを教えて頂きたいです。

トラッキングデータの説明
与えられているトラッキングデータは、データフレームで与えられています。
各列には、”どちらのチームが攻撃しているか”、”選手の背番号”、”攻撃アクション名”などあります。
行には、試合のフレーム毎の推移が表現されています。例えば、選手1が選手2にパスしたとすると、
0 選手1 パス
1 選手2 トラップ
のように書かれています。

python3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2020/08/11 23:20

どのような結果が欲しいのかがいまひとつ分かりませんので単純な入力・出力例をいくつか提示ください。
guest

回答1

0

攻撃の切り替わり、すなわち攻撃判別値の値が変わった行ごとにデータフレームを分割したいということでしょうか?
であれば以下のような流れでできそうです。

まずdf[~].ne(df[~].shift())にて値の切り替わったところがTrueになる列をつくり、それを.cumsumで累計します。
すると、攻撃ごとに連番を振ることができます。
次にgroupbyによって連番(=攻撃)ごとのレコードのインデックスを得ることができます。
あとは攻撃毎に元データフレームからレコードを抽出すればよいです。

Python

1import pandas as pd 2 3a = [1,2,2,1,1,1,2] 4df = pd.DataFrame({'no':[i+1 for i in range(len(a))],'attack':a}) 5 6df['ano'] = df['attack'].ne(df['attack'].shift()).cumsum() 7print(df) 8""" 9 no attack ano 100 1 1 1 111 2 2 2 122 3 2 2 133 4 1 3 144 5 1 3 155 6 1 3 166 7 2 4 17""" 18 19dfs = [] 20grp = df.groupby('ano') 21for ids in grp.groups.values(): 22 dfs.append(df.iloc[ids].drop(columns=['ano'])) 23 24for df in dfs: 25 print(df) 26""" 27 no attack 280 1 1 29 no attack 301 2 2 312 3 2 32 no attack 333 4 1 344 5 1 355 6 1 36 no attack 376 7 2 38"""

投稿2020/08/12 01:10

can110

総合スコア38278

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問