python - 前 30 天滚动分组计数
问题描述
下面的数据显示了不同用户收到的电子邮件以及他们收到的时间。
我想通过customer_id
在发送活动之前 30 天内打开的活动数量来计算,即。num_opens_in_last_30_days
. 这取决于在过去 30 天内发送每个活动之前客户已打开的活动数量,不包括opened
列中指示的当前值。
示例数据框如下:
客户ID | 广告系列_id | 发送日期 | 打开 |
---|---|---|---|
一个 | 1111 | 2021-02-10 | 真的 |
b | 1111 | 2021-02-10 | 真的 |
C | 1234 | 2021-02-10 | 真的 |
一个 | 2222 | 2021-02-20 | 错误的 |
b | 2111 | 2021-02-20 | 错误的 |
C | 2333 | 2021-02-20 | 错误的 |
一个 | 3333 | 2021-04-02 | 真的 |
b | 3333 | 2021-04-02 | 真的 |
C | 3333 | 2021-04-02 | 真的 |
所需的输出是:
客户ID | 广告系列_id | 发送日期 | num_opens_in_last_30_days |
---|---|---|---|
一个 | 1111 | 2021-02-10 | 0 |
b | 1111 | 2021-02-10 | 0 |
C | 1234 | 2021-02-10 | 0 |
一个 | 2222 | 2021-02-20 | 1 |
b | 2111 | 2021-02-20 | 1 |
C | 2333 | 2021-02-20 | 1 |
一个 | 3333 | 2021-04-02 | 0 |
b | 3333 | 2021-04-02 | 0 |
C | 3333 | 2021-04-02 | 0 |
实际的数据框有几十万行数据。
例如,您可以看到,当客户“b”campaign_id
在 2021 年 2 月 20 日收到 2111 时,他们打开了 1 封电子邮件(即活动 1111),但是当客户“b”在 2021 年 4 月 2 日收到 cmpaign 时, number 是 0,因为他们在过去 30 天内没有打开任何电子邮件活动 3333 发送给他们。
如果数据框按date_sent
我将如何进行排序?我相信它将围绕窗口功能和分组展开,user_email
但无法弄清楚应用这些功能的顺序和方式。该date_sent
列不连续,因为不是每天都发送广告系列。
在此先感谢您的任何建议。
编辑:按照建议更正日期
解决方案
我在这里做了一些假设,但也许这会帮助你朝着正确的方向前进。
假设 #1:数据中的 2021-01-10 日期应该是 2021-02-10。
假设 #2:您描述中的日期 2021-03-01 应该是 2021-04-02。
所以这里是数据:
customer_id campaign_id date_sent opened
0 a 1111 2021-02-10 True
1 b 1111 2021-02-10 True
2 c 1234 2021-02-10 True
3 a 2222 2021-02-20 False
4 b 2111 2021-02-20 False
5 c 2333 2021-02-20 False
6 a 3333 2021-04-02 True
7 b 3333 2021-04-02 True
8 c 3333 2021-04-02 True
过去 30 天内打开的总和:
df.set_index('date_sent', inplace=True)
df.sort_index(inplace=True)
df['opened'] = df['opened'].astype('int64')
cn = lambda x: [0] + [(x[0:i] & ((x.index[i]-x.index[0:i]) \
<= pd.Timedelta('30 days'))).sum() \
for i in range(1, x.size)]
df['num_opens_in_last_30_days'] = \
df.groupby('customer_id')['opened'].transform(cn)
东风:
customer_id campaign_id opened num_opens_in_last_30_days
date_sent
2021-02-10 a 1111 1 0
2021-02-10 b 1111 1 0
2021-02-10 c 1234 1 0
2021-02-20 a 2222 0 1
2021-02-20 b 2111 0 1
2021-02-20 c 2333 0 1
2021-04-02 a 3333 1 0
2021-04-02 b 3333 1 0
2021-04-02 c 3333 1 0
推荐阅读
- keylistener - 我们正在实现全局键盘和鼠标侦听器,它们会被防病毒软件检测为键盘记录器吗?
- c# - 在自定义属性/注释 C# 中从请求标头传递值
- ios - 从 Swift 5 中的数组中删除重复的对象
- python - 对象的属性集与其命名空间有什么区别?
- c# - Vue.JS 检查用户是否来自我们的域
- solr - 在 Solr 中重新加载托管同义词
- java - 用于创建/更新和删除 AWS Workdocs 审批工作流程的 API
- mysql - 在Alpine下的VM上安装Mysql
- flutter - 在颤振中使用共享首选项将数据保存为对象
- powerbi - 部署后将新列从 ssas 添加到 Power BI