Я рассчитываю VWAP (средневзвешенную цену) инструмента следующим образом:
def vwap(df):
df = df[['Price', 'Volume']].dropna()
denominator = (df.Price * df.Volume).sum()
numerator = df.Volume.sum()
if denominator == 0:
return np.nan
return denominator/numerator
df.resample('10T', label='right').apply(vwap)
Это занимает около 5 минут для минутных данных, охватывающих несколько лет.Я изучал Dask и Swifter, но ни один из них не обеспечивает параллелизации для 'DatetimeIndexResampler'
объектов, поскольку, как я полагаю, методы должны заранее знать, как разбивать данные.
Есть ли у кого-нибудь интуиция каккак ускорить этот процесс?
Обратите внимание, что исходный df
содержит отдельные данные в зависимости от того, когда была совершена сделка, поэтому некоторые 10-минутные интервалы могут не содержать никаких данных, а другие могут содержать несколько строк.
Итак,если я сделаю это: undl.resample('10T', label='right').swifter.apply(last_vwap)
Я получу
<ipython-input-162-c879f56543fb> in <module>
----> 1 undl.resample('10T', label='right').swifter.apply(last_vwap)
> ~/.local/lib/python3.6/site-packages/pandas/core/resample.py in __getattr__(self, attr)
95 return self[attr]
96
---> 97 return object.__getattribute__(self, attr)
98
99 @property
> AttributeError: 'DatetimeIndexResampler' object has no attribute 'swifter'
Но если я использую dask для преобразования его в фрейм данных, я не знаю, сколько разделов использовать, начиная с числатиков за 10-минутный интервал не соответствует.