Замена/модификация метода в 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)

пока что-то не выходит...


Ответы (0 шт):