python - 如何根据客户 ID / 电子邮件计算流失率?
问题描述
我正在尝试使用以下数据每月计算客户流失率。然而,不幸的是,当客户流失或不流失时,我没有一个布尔值,它取值为 1/True 或 0/False。您可以假设当客户在某个月份订购时,他/她没有流失,而当他/她在该月没有订购时,他/她就流失了。我明白这会导致流失率波动,但现在这并不重要。
日期 | 客户ID | 项目 |
---|---|---|
2017-11-07 19:06:43 | 00001 | 面包、牛奶 |
2017-11-07 20:06:43 | 00002 | 面团 |
2017-12-07 21:06:43 | 00003 | 苹果 |
2018-01-07 21:06:43 | 00002 | 萝卜 |
2018-01-07 21:06:43 | 00001 | 键盘, 豆浆机 |
2018-02-07 21:06:43 | 00003 | 馅饼 |
2018-03-07 21:06:43 | 00002 | 水 |
2018-03-07 21:06:43 | 00003 | 鸡 |
2018-04-07 21:06:43 | 00004 | 口香糖 |
我尝试使用按月重新采样它们
df_monthly = df.resample('M', on='date').count()
随后我有每个月的订单数量,但我不知道谁流失了。我希望有人可以帮助我解决这个问题。
非常感谢 :)
解决方案
IIUC,按月对每一行进行分组并将CustomerID
列转换为一组:
out = df.groupby(pd.Grouper(freq='M', key='date'))['CustomerID'].apply(set)
print(out)
# Output
date
2017-11-30 {00002, 00001}
2017-12-31 {00003}
2018-01-31 {00002, 00001}
2018-02-28 {00003}
2018-03-31 {00002, 00003}
2018-04-30 {00004}
Freq: M, Name: CustomerID, dtype: object
现在您必须找到两组之间的差异:
out = out.to_frame().assign(CustomerIDPrev=out.shift(fill_value=set())) \
.apply(lambda x: x.iloc[1].difference(x.iloc[0]), axis=1).tolist()
print(out)
# Output
date
2017-11-30 {}
2017-12-31 {00002, 00001}
2018-01-31 {00003}
2018-02-28 {00002, 00001}
2018-03-31 {}
2018-04-30 {00002, 00003}
Freq: M, dtype: object
推荐阅读
- c# - 如何在格式化的命名空间内移动 using 指令?
- spring-boot - Spring Boot Redis 根据 TimeToLive 每天或每小时刷新/重置
- arrays - Nest.js 数组 dto 验证和转换日期为字符串
- database - 多个 RDBMS 数据库的单个 Spring 引导
- html - 如何使用带有选择元素的 Isotope.js 对帖子进行排序?
- c# - 级联组合框不会显示更新的值
- python - 加载 Cheexpert 图像数据集时出错
- javascript - swiper 中 longSwipes 和 shortSwipes 配置有什么用?
- firebase - Firebase Flutter 身份验证登录环境
- automation - SikuliLibrary - 机器人框架不要通过远程桌面连接在文本框中输入文本或粘贴文本