Панды: катание окон с суммой произведений - PullRequest
0 голосов
/ 25 сентября 2018

Есть несколько ответов, каждый из которых дает мне часть моего желаемого результата, но мне непросто собрать их все вместе.Мой основной фрейм данных 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 голосов
/ 25 сентября 2018

Вызывая ваши фреймы данных (сверху вниз как 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

Хотя это ни в коем случае не комплексное решение, код призван обеспечить логику для «суммирования нескольких продуктов», как вы и просили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...