python - 使用 Python 计算滚动保留
问题描述
我在计算滚动保留时遇到问题。
我试图弄清楚如何使 groupby 起作用,但它似乎只适用于计算经典留存率。
滚动保留 - 每个组中在确切月份或更晚登录的用户数量。
data = {'id':[1, 1, 1, 2, 2, 2, 2, 3, 3],
'group_month': ['2013-05', '2013-05', '2013-05', '2013-06', '2013-06', '2013-06', '2013-06', '2013-06', '2013-06'],
'login_month': ['2013-05', '2013-06', '2013-07', '2013-06', '2013-07', '2013-09', '2013-10', '2013-09', '2013-10']}
转换数据:
data = pd.DataFrame(data)
pd.to_datetime(data['group_month'], format='%Y-%m', errors='coerce')
pd.to_datetime(data['login_month'], format='%Y-%m', errors='coerce')
为了计算经典留存率(计算每个群组中在确切月份登录的用户,我使用了以下代码:
classic_ret = pd.DataFrame(data[(data['login_month'] >= data['group_month'])].groupby(['group_month', 'login_month'])['id'].count())
classic_ret.unstack()
滚动保持应具有以下输出:
+-------------+---------+---------+---------+---------+---------+---------+
| group_month | 2013-05 | 2013-06 | 2013-07 | 2013-08 | 2013-09 | 2013-10 |
+-------------+---------+---------+---------+---------+---------+---------+
| 2013-05 | 1 | 1 | 1 | 1 | 1 | 1 |
| 2013-06 | 0 | 1 | 1 | 1 | 2 | 2 |
+-------------+---------+---------+---------+---------+---------+---------+
解决方案
使用交叉表,我只能管理下表。
a = data.set_index('login_month').groupby('id').resample('M').last().ffill().drop('id', axis=1).reset_index()
pd.crosstab(a.group_month, a.login_month)
输出
login_month 2013-05-31 2013-06-30 2013-07-31 2013-08-31 2013-09-30 2013-10-31
group_month
2013-05-01 1 1 1 0 0 0
2013-06-01 0 1 1 1 2 2
但是,我们可以得到您需要的值,如下所示。
a = data.set_index('login_month').groupby('id').resample('M').last().ffill().drop('id', axis=1).reset_index()
pd.DataFrame(a[(a['login_month'] >= a['group_month'])].groupby(['group_month', 'login_month'])['id'].count()).unstack().fillna(method='ffill',axis=1).fillna(value=0)
输出
login_month 2013-05-31 2013-06-30 2013-07-31 2013-08-31 2013-09-30 2013-10-31
group_month
2013-05-01 1.0 1.0 1.0 1.0 1.0 1.0
2013-06-01 0.0 1.0 1.0 1.0 2.0 2.0
推荐阅读
- python - 如何在opencv中使用自适应阈值将阈值设为零?
- python-3.x - 在 Tensorflow 中导入 Autograph 的问题
- java - 在android中编写BLE特性
- java - 在 switch 语句中调用忽略大小写
- json - 如何将 json 字符串传递给对象?
- git - 无法使用 git 将我的本地项目共享到 bitbucket
- javascript - 单击时编辑 div 类名称
- .net - “HtmlTextArea”对象的另存为对话框错误没有属性“ExportText”
- python - 赋值前引用的局部变量 df (Bokeh Interactive Visualization)
- javascript - 使用 for 循环连续播放音频文件