熊猫:滚动窗口的总和

时间:2018-09-24 21:09:28

标签: python pandas

有很多答案,每个答案都为我提供了我期望的结果的一部分,但我面临将它们全部组合在一起的挑战。我的核心Pandas数据框架如下所示,我在其中估算volume_step_1

date        volume_step_0     volume_step_1
2018-01-01            100                 a
2018-01-02            101                 b
2018-01-03            105                 c
2018-01-04            123                 d
2018-01-05            121                 e

然后我有一个包含转化率的参考表,例如

step     conversion
0              0.60
1              0.81
2              0.18
3              0.99
4              0.75

我还有另一个表,其中包含泊松分布的点估计:

days_to_complete    step_no     pc_cases
0                         0         0.50
1                         0         0.40
2                         0         0.07

使用这些数据,我现在要估算

volume_step_1 = 
(volume_step_0(today) * days_to_complete(step0, day0) * conversion(step0)) + 
(volume_step_0(yesterday) * days_to_complete(step0,day1) * conversion(step0))

等等。

我该如何编写一些Python代码?

1 个答案:

答案 0 :(得分:3)

调用数据框(从上到下依次为df1df2df3

df1['volume_step_1'] = (
    (df1['volume_step_0']*
    df2.loc[(df2['days_to_complete'] == 0) & (df2['step_no'] == 0), 'pc_cases']* 
    df3.loc[df3['step'] == 0, 'conversion']) +
    df1['volume_step_0'].shift(1)*
    df2.loc[(df2['days_to_complete'] == 1) & (df2['step_no'] == 0), 'pc_cases']*
    df3.loc[df3['step'] == 0, 'conversion'])

编辑:

IIUC,您正在尝试获取volume_step_0列与特定pc_cases的{​​{1}}和conversion的乘积之间的某种“点积”。您可以step_no df2和df3匹配merge

steps

我猜您只是在使用df_merged = df_merged = df2.merge(df3, how = 'left', left_on = 'step', right_on = 'step_no') df_merged.head(3) step conversion days_to_complete step_no pc_cases 0 0.0 0.6 0.0 0.0 0.50 1 0.0 0.6 1.0 0.0 0.40 2 0.0 0.6 2.0 0.0 0.07 来获得stepk,并且您想在几天中迭代总和。以下代码为volume_step_k+1中可用的days_to_complete(step0, dayk)的所有值生成conversion(step0)k的向量,并找到它们的乘积:

days_to_complete

最后,对于滚动窗口,您想将df_fin = df_merged[df_merged['step'] == 0][['conversion', 'pc_cases']].product(axis = 1) 0 0.300 1 0.240 2 0.042 df_fin = df_fin[::-1].reset_index(drop = True) * days_to_complete向量的点积与conversion向量相乘(因为volume_step_0中存在许多值):

days_to_complete

输出:

vol_step_1 = pd.Series([df1['volume_step_0'][i:i+len(df3)].reset_index(drop = True).dot(df_fin) for i in range(0,len(df3))])
df1['volume_step_1'] = df1['volume_step_1'][::-1].reset_index(drop = True)

尽管这绝不是一个全面的解决方案,但是该代码旨在提供您所要求的“汇总多个产品”的逻辑。