ID別に購買サイクルを計算する
下記のようなID別に購買日を縦持ちで持っているデータに対して、ID別に購買間隔をPythonで計算する方法です。
コード
#ライブラリの読み込み
import pandas as pd
import numpy as np
#データの読み込み 文字コードはファイルに合わせて指定
df = pd.read_csv('id_date.csv',encoding='shift-jis',dtype={'ID':'str','DATE':'str'})
#並び替える(日付昇順)
df_arg = df.sort_values(['ID','DATE'],ascending=[True, True])
#購入日を日付型に変換(元々日付型であれば不要)
df_arg['DATE_dt'] = df_arg['DATE'].apply(lambda x : dt.strptime(x,'%Y%m%d'))
#日付の差分を計算する&一つ前のレコードの会員を取得する
df_arg['cycle'] = df_arg['DATE_dt'].diff()
df_arg['ID_diff'] = df_arg['ID'].shift()
#不要なレコードを消す(IDとID_diffが一致するレコードのみ取得)
df_diff = df_arg[df_arg['ID']==df_arg['ID_diff']]
#cycleを日付型から数値型に変換する
df_diff['cycle_int']=df_diff['cycle'].apply(lambda x : x.days)
#必要なカラムだけ残す
df_out = df_diff[['ID','cycle_int']]
#IDごとに購買サイクルを中央値で取得
df_cycle = df_out.groupby('ID',as_index=False).median()[['ID','cycle_int']]
解説
処理の流れとしては
①IDと日付でデータをソートする(日付昇順)
②日付はひとつ上の日付との差を取得(→cycle)
③IDはひとつ上のIDを取得(→ID_diff)
④IDが各レコードで一致しているもののみ取得(→各IDの先頭のレコードを削除する)