Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 前30天滚动分组计数_Python_Pandas - Fatal编程技术网

Python 前30天滚动分组计数

Python 前30天滚动分组计数,python,pandas,Python,Pandas,下面的数据显示了不同用户收到的电子邮件及其收到时间 我想通过customer\u id计算发送活动前30天内打开的活动数量,即num\u opens\u in\u last\u 30天。这取决于客户在过去30天内发送每个活动之前已打开的活动数量,不包括当前值(由打开的列指示) 示例数据帧如下所示: 客户识别码 活动编号 发送日期 开的 A. 1111 2021-02-10 真的 B 1111 2021-02-10 真的 C 1234 2021-02-10 真的 A. 2222 2021-02-2

下面的数据显示了不同用户收到的电子邮件及其收到时间

我想通过
customer\u id
计算发送活动前30天内打开的活动数量,即
num\u opens\u in\u last\u 30天
。这取决于客户在过去30天内发送每个活动之前已打开的活动数量,不包括当前值(由
打开的
列指示)

示例数据帧如下所示:

客户识别码 活动编号 发送日期 开的 A. 1111 2021-02-10 真的 B 1111 2021-02-10 真的 C 1234 2021-02-10 真的 A. 2222 2021-02-20 假的 B 2111 2021-02-20 假的 C 2333 2021-02-20 假的 A. 3333 2021-04-02 真的 B 3333 2021-04-02 真的 C 3333 2021-04-02 真的
我在这里做了一些假设,但也许这会帮助你朝着正确的方向前进

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

熊猫有一个很好的内置滚动平均计算器:

# Create rolling average
df_avg = df['column_of_interest'].ewm(span=7, min_periods=7).mean()
df_avg.dropna(inplace=True) # For first values where this won't apply
df_avg = df_avg.reset_index().rename(columns={'index': 'column'}) # To make a nicer presenation
X_avg = pd.DataFrame(df_avg.whatever_you_care_about)
r_avg = pd.DataFrame(df_avg.other_thing_you_care_about)

因此,在groupby列中使用此选项,它应该会起作用。

发送的日期似乎也用作打开的日期-正确吗?或者可能不是因为“a 1111”的打开日期为2/10,而不是发送日期为1/10。是的,请假设发送日期与打开日期相同。我认为客户b在2021-02-10 wrt活动2111的最后30天中打开的数量应该为0,因为上次打开电子邮件的时间是2021/01/10,这比之前的30天早。谢谢您的回答!在进行
转换(cn)
之前,我必须使用
df.sort\u索引(inplace=True)
对df进行排序。
# Create rolling average
df_avg = df['column_of_interest'].ewm(span=7, min_periods=7).mean()
df_avg.dropna(inplace=True) # For first values where this won't apply
df_avg = df_avg.reset_index().rename(columns={'index': 'column'}) # To make a nicer presenation
X_avg = pd.DataFrame(df_avg.whatever_you_care_about)
r_avg = pd.DataFrame(df_avg.other_thing_you_care_about)