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)