您将如何执行以下操作?
对于流失率为1的客户,请根据他们离开的月份得出最近3次购买的平均值。例如。 Churn_Month = 3,然后平均最近3次购买:3月,2月和1月(如果有)。有时会购买2或1。
对于流失率为0的客户,取其最近3次购买(如果有)的平均值,有时是2或1次购买。
并将其全部放入一个pandas Dataframe中。请参见预期的产量
可用信息
df1::您会在这里找到带有客户ID,日期,purchase1和Purchase2的交易。
ID DATE P1 P2
0 1 2003-04-01 449 55
1 4 2003-02-01 406 213
2 3 2003-11-01 332 372
3 1 2003-03-01 61 336
4 3 2003-10-01 428 247
5 3 2003-12-01 335 339
6 3 2003-09-01 367 41
7 2 2003-01-01 11 270
8 1 2003-01-01 55 102
9 2 2003-02-01 244 500
10 1 2003-02-01 456 272
11 5 2003-03-01 240 180
12 4 2002-12-01 156 152
13 5 2003-01-01 144 185
14 4 2003-01-01 246 428
15 1 2003-05-01 492 97
16 5 2003-02-01 371 66
17 5 2003-04-01 246 428
18 5 2003-05-01 406 213
df2::您会在这里找到客户ID,无论他们是否离开公司以及他们离开的月份(例如3.0 = 3月)
ID Churn Churn_Month
0 1 1 3.0
1 2 0 0.0
2 3 1 12.0
3 4 0 0.0
4 5 1 4.0
预期输出:
P1和P2的ID平均值,与df2信息合并。 ID将是新索引。
ID P1 P2 Churn Churn_Month
1 190.6 236.6 1 3.0
2 127.5 385 0 0.0
3 365 319.3 1 12.0
4 269.3 264.3 0 0.0
5 285.6 224.6 1 4.0
答案 0 :(得分:1)
此处需要一些其他详细信息。首先,当Churn == 1
假设客户离开时。使用df2
,您可以确定他们离开的月份,并删除之后发生的所有数据。从那里开始,在分组,聚合和过滤数据方面非常简单。
# merge
df3 = df1.merge(df2)
# convert DATE to datetime
df3.DATE = pd.to_datetime(df3.DATE)
# filter rows where month of (DATE is <= Churn_Month and Churn == 1)
# or Churn == 0
df3 = df3.loc[
((df3.Churn == 1) & (df3.DATE.dt.month <= df3.Churn_Month)) |
(df3.Churn == 0)
].copy()
# sort values ascending
df3.sort_values([
'ID',
'DATE',
'P1',
'P2',
'Churn',
'Churn_Month'
], inplace=True)
# groupby ID, Churn
# take last 3 DATEs
# merge with original to filter rows
# group on ID, Churn, and Churn_Month
# average P1 and P2
# reset_index to get columns back
# round results to 1 decimal at the end
df3.groupby([
'ID',
'Churn'
]).DATE.nth([
-1, -2, -3
]).reset_index().merge(df3).groupby([
'ID',
'Churn',
'Churn_Month'
])[[
'P1',
'P2'
]].mean().reset_index().round(1)
结果
ID Churn Churn_Month P1 P2
0 1 1 3.0 190.7 236.7
1 2 0 0.0 127.5 385.0
2 3 1 12.0 365.0 319.3
3 4 0 0.0 269.3 264.3
4 5 1 4.0 285.7 224.7