首页 > 解决方案 > 前 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列不连续,因为不是每天都发送广告系列。

在此先感谢您的任何建议。

编辑:按照建议更正日期

标签: pythonpandas

解决方案


我在这里做了一些假设,但也许这会帮助你朝着正确的方向前进。

假设 #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

推荐阅读