Замена/модификация метода в pandas
Возникла проблема: уменьшение производительности при мультипроцессорной обработке малых данных.
Использую pandarallel (распараллеливание для pandas). Когда приходит много данных (>10к и более) все работает хорошо, когда приходит 60 строк, из-за накладных расходов на мультипроцессинг работа замедляется. Мне нужно при малых данных отключать мультипроцессинг. Установка в pandarallel одного ядра не сильно улучшает скорость, голый pandas на практике быстрее.
Идеально как-то заменять в коде data.parallel_apply() и data.rolling.parallel_apply() на data.apply() и data.rolling.apply()
Пробовал дублирование функций по условию от количества данных, но это неудобно, к тому же приходится изменения делать в двух местах одновременно, т.е. это потенциальные баги.
Вопрос: как подменить метод у pandas?
пробовал как здесь рекомендуют, но что-то не получилось https://stackoverflow.com/questions/43504068/create-my-own-method-for-dataframes-python
ругается, что у rolling нет parallel_apply и т.д.
UPD: Что пробовал.
import pandas as pd
import numpy as np
from pandarallel import pandarallel
pandarallel.initialize(nb_workers=4, progress_bar=False)
data = pd.DataFrame([1,2,3,4,5,6,7,8,9,10])
# мультипроцессинг
%%time
data.parallel_apply(np.sum)
data.rolling(5).parallel_apply(np.sum)
#CPU times: user 55 ms, sys: 46 ms, total: 101 ms
#Wall time: 483 ms
# просто apply
%%time
data.apply(np.sum)
data.rolling(5).apply(np.sum)
CPU times: user 2.34 ms, sys: 0 ns, total: 2.34 ms
Wall time: 2.28 ms
пробовал так:
from pandas.core.base import PandasObject
def parallel_apply(df, func):
return df.apply(func)
PandasObject.parallel_apply = parallel_apply
и так, как рекомендуют
class OneCore(pd.DataFrame):
def parallel_apply(self, f):
return self.apply(f)
new_data = OneCore(data)
new_data.parallel_apply(np.sum)
new_data.rolling(5).parallel_apply(np.sum)
пока что-то не выходит...