LoginSignup
2
5

More than 3 years have passed since last update.

【Python】購買データから購買サイクルを計算する

Posted at

ID別に購買サイクルを計算する

下記のようなID別に購買日を縦持ちで持っているデータに対して、ID別に購買間隔をPythonで計算する方法です。

データ(id_date.csvとする)
Untitled.png

コード

#ライブラリの読み込み
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の先頭のレコードを削除する)

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5