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の先頭のレコードを削除する)