有很多答案,每个答案都为我提供了我期望的结果的一部分,但我面临将它们全部组合在一起的挑战。我的核心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代码?
答案 0 :(得分:3)
调用数据框(从上到下依次为df1
,df2
和df3
)
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)
尽管这绝不是一个全面的解决方案,但是该代码旨在提供您所要求的“汇总多个产品”的逻辑。