Я пытаюсь получить доходность акций в день на n минут вперед, учитывая фрейм данных со строками, соответствующими доходности через определенные интервалы.
Я пробовал использовать dask и многопоточность скользящего расчета для каждой группы, но, похоже, это самый быстрый способ сделать это, что я могу понять. Однако для большого фрейма данных (миллионы строк) (252 дня и 1000 акций) на выполнение этого шага уходит до 40 минут.
ret_df.sort_values(['date','time','stock'], ascending=False, inplace=True)
gb = ret_df.groupby(['date','stock'])
forward_sum_df = gb.rolling(4, on='time', min_periods = 0)['interval_return'].sum().reset_index()
Это вернет сумму следующих 4 раз (по дате и запасу) для каждой строки в фрейме данных, как и ожидалось, но делает это довольно медленно. Спасибо за помощь!
РЕДАКТИРОВАТЬ: добавлен пример, чтобы прояснить
date stock time interval_ret
0 2017-01-03 10000001 09:30:00.000000 0.001418
1 2017-01-03 10000001 09:40:00.000000 0.000000
2 2017-01-03 10000001 09:50:00.000000 0.000000
3 2017-01-03 10000001 10:00:00.000000 -0.000474
4 2017-01-03 10000001 10:10:00.000000 -0.001417
5 2017-01-03 10000001 10:20:00.000000 -0.000944
6 2017-01-03 10000001 10:30:00.000000 0.000000
7 2017-01-03 10000001 10:40:00.000000 0.000000
8 2017-01-03 10000001 10:50:00.000000 0.000000
9 2017-01-03 10000001 11:00:00.000000 -0.000472
и так далее на складе 10000002 ... и дата 04.01.2017 ....
Например, если мой период удержания составляет 30 минут вместо 10 минут, я хотел бы суммировать 3 строки «interval_ret», сгруппированные по дате и запасу. Бывший:
date stock time interval_ret_30
0 2017-01-03 10000001 09:30:00.000000 0.001418
1 2017-01-03 10000001 09:40:00.000000 0.000000 - 0.000474
2 2017-01-03 10000001 09:50:00.000000 0.000000 - 0.000474 - 0.001417
3 2017-01-03 10000001 10:00:00.000000 -0.000474 - 0.001417 - 0.000944
4 2017-01-03 10000001 10:10:00.000000 -0.001417 - 0.000944
5 2017-01-03 10000001 10:20:00.000000 -0.000944
6 2017-01-03 10000001 10:30:00.000000 0.000000
7 2017-01-03 10000001 10:40:00.000000 -0.000472
8 2017-01-03 10000001 10:50:00.000000 -0.000472
9 2017-01-03 10000001 11:00:00.000000 -0.000472