python - Pandas 通过匹配上一年的基线来计算月流失率
问题描述
我需要为数百万用户计算每个月的流失率。
月流失率=当月流失用户数/上年12月用户总数
如果用户存在于基线(2016 年 12 月)并且当月销售额小于 1,则该用户被视为该月的流失
我有一个简单的 YearMonth、User 和 Sales 数据框。
请注意,在这个简单的示例中,当月可能有新用户“D”,但由于“D”不在上一年的 12 月,因此在计算流失率的基线中不考虑它。
YearMonth User Sales Year Month
201612 A 2 2016 12
201612 B 2 2016 12
201612 C 2 2016 12
201701 A 3 2017 1
201701 B 0.5 2017 1
201701 C 1 2017 1
201701 D 1 2017 1
201702 A 2 2017 2
201702 B 3 2017 2
201702 C 2 2017 2
201702 D 0.5 2017 2
计算流失率最有效的方法是什么?
YearMonth User Sales Churn or Not? Churn Rate In Baseline?
201612 A 2 0 NA 1
201612 B 2 0 NA 1
201612 C 2 0 NA 1
201701 A 3 0 1/3 1
201701 B 0.5 1 1/3 1
201701 C 1 0 1/3 1
201701 D 1 0 1/3 0
201702 A 2 0 0/3 1
201702 B 3 0 0/3 1
201702 C 2 0 0/3 1
201702 D 0.5 0 0/3 0
所需数据帧输出
YearMonth Churn Rate
201612 NA
201701 1/3
201702 0
解决方案
IIUC
s=df.pivot(*['YearMonth','User','Sales'])
s=s.loc[:,s.iloc[0].notna()]
s.lt(1).sum(1).drop(201612).reindex(s.index)/s.shape[1]
YearMonth
201612 NaN
201701 0.333333
201702 0.000000
dtype: float64
推荐阅读
- mongodb - MongoDB 没有使用正确的索引
- d3.js - d3.scaleTime 仅呈现 NaN
- javascript - 将 Passport.js 与 pub/private 键一起使用时出现未经授权的响应
- r - 使用 npplregbw(部分线性半参数回归)选择带宽时出现错误
- javascript - 如何设置只读选项以显示禁用?
- macos - 如何强制解压缩列表使用 unicode UTF-8
- google-classroom - Google Classroom API Python 列表课程作业
- python - 执行任何 git 命令后的“输入错误”
- vue.js - 基于 vuex 状态的计算属性在状态更改时不会触发观察者
- amazon-web-services - 为什么我只有一些 SSH 连接的私钥,而我必须为其他 SSH 连接生成密钥对?