投資のためのデータサイエンス

個人の投資活動に役立つデータ分析にまつわる話題を綴ります。

ログデータにおけるテキストデータ連続累積出現回数の算出

様々な活動を記録したログデータにおいて、あるパターンの文字列が何回連続して登場したかをカウントすることが必要になる場合があります。これは集計処理とは異なるため、コーディングは多少ややこしくなります。
ここでは例として、サッカーJリーグの歴代優勝チームのリストから、各年代毎に最多連覇のケースを求めます。

# ライブラリのインポート
import numpy as np
import pandas as pd

まず、Jリーグの歴代優勝チームを記録したデータファイルを読み込みます。

df1 = pd.read_excel('/content/drive/My Drive/Colab Notebooks/サッカーJリーグ.xlsx',sheet_name='winner')
df1.head()

f:id:nicjps230:20211027190938j:plain
次に、年代ごとに年間優勝チームの連続累積出現回数を求めます。
データフレームのあるカラムに対して、連続値の個数をカウントするには、値の変化点にフラグを立てて、cumsum()で階段状の累積和を求めます。 この累積和をグループ番号とすることで、ユニークなグループ化ができます。 あとはgroupbyのcumcount()で各グループの個数をカウントします。

df1.set_index('年代',inplace=True)
df1['win_cum'] = df1.groupby(level=0)['年間優勝'].transform(lambda y:y.groupby((y != y.shift()).cumsum()).cumcount()+1)
df1.head()

f:id:nicjps230:20211027191008j:plain
次に、年代毎に連続累積出現回数が最大の行を抽出します。 最大値タイが複数ケースある場合は複数行抽出されます。

df2 = df1.set_index('年度',append=True)
df3 = df2[df2.groupby(level=0)['win_cum'].apply(lambda x: x==x.max())]
df3

f:id:nicjps230:20211104102307j:plain

尚、2010年のJリーグ優勝チームは名古屋グランパスであり、年代で分けない場合でも鹿島アントラーズは三連覇で止まっています。
※2021年のJリーグ結果をふまえて更新しました。