我Lifetimes
用来计算我的一些客户的 CLV。我有交易数据,并且通过summary_data_from_transaction_data
(可以在此处找到实现)我想计算每个客户的新近度、频率和时间间隔T。不幸的是,该方法似乎无法正确计算频率。
这是测试我的数据集的代码:
df_test = pd.read_csv('test_clv.csv', sep=',')
RFT_from_libray = summary_data_from_transaction_data(df_test,
'Customer',
'Transaction date',
observation_period_end='2020-02-12',
freq='D')
根据代码,结果是:
frequency recency T
Customer
1158624 18.0 389.0 401.0
1171970 67.0 396.0 406.0
1188564 12.0 105.0 401.0
问题是客户1188564
和客户1171970
分别进行了 69 次和 14 次交易,因此频率应该是 68 次和 13 次。打印每个客户的大小确认:
print(df_test.groupby('Customer').size())
Customer
1158624 19
1171970 69
1188564 14
我确实尝试过summary_data_from_transaction_data
像这样在本地使用底层代码:
RFT_native = df_test.groupby('Customer', sort=False)['Transaction date'].agg(["min", "max", "count"])
observation_period_end = (
pd.to_datetime('2020-02-12', format=None).to_period('D').to_timestamp()
)
# subtract 1 from count, as we ignore their first order.
RFT_native ["frequency"] = RFT_native ["count"] - 1
RFT_native ["T"] = (observation_period_end - RFT_native ["min"]) / np.timedelta64(1, 'D') / 1
RFT_native ["recency"] = (RFT_native ["max"] - RFT_native ["min"]) / np.timedelta64(1, 'D') / 1
如您所见,结果确实是正确的。
min max count frequency T recency
Customer
1171970 2019-01-02 15:45:39 2020-02-02 13:40:18 69 68 405.343299 395.912951
1188564 2019-01-07 18:10:55 2019-04-22 14:27:08 14 13 400.242419 104.844595
1158624 2019-01-07 10:52:33 2020-01-31 13:50:36 19 18 400.546840 389.123646
当然,我的数据集要大得多,而且我的频率和/或新近度的微小差异会极大地改变 BGF 模型的计算。
我错过了什么?使用该方法时有什么需要考虑的吗?