Вызывая ваши фреймы данных (сверху вниз как 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
и conversion
для определенного step_no
.Вы можете merge
df2 и df3 соответствовать 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)
Вывод:
df1
date volume_step_0 volume_step_1
0 2018-01-01 100 NaN
1 2018-01-02 101 NaN
2 2018-01-03 105 70.230
3 2018-01-04 123 66.342
4 2018-01-05 121 59.940
Хотя это ни в коем случае не комплексное решение, код призван обеспечить логику для «суммирования нескольких продуктов», как вы и просили.