Используйте dask для расчета скользящего среднего - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь вычислить скользящее среднее для очень большого набора данных. Количество рядов составляет около 30 млн. Для иллюстрации используйте pandas следующим образом

df = pd.DataFrame({'cust_id':['a', 'a', 'a', 'b', 'b'], 'sales': [100, 200, 300, 400, 500]})
df['mov_avg'] = df.groupby("cust_id")["sales"].apply(lambda x: x.ewm(alpha=0.5, adjust=False).mean())

Здесь я использую pandas для вычисления скользящей средней. При использовании выше это займет около 20 минут для расчета на набор данных 30M. Есть ли способ использовать DASK здесь?

1 Ответ

2 голосов
/ 16 января 2020

Вы можете использовать Dask.delayed для ваших расчетов. В приведенном ниже примере стандартная функция python, содержащая команду скользящего среднего pandas, превращается в функцию dask с помощью @delayed decorator.

import pandas as pd
from dask import delayed

@delayed
def mov_average(x):
    x['mov_avg'] = x.groupby("cust_id")["sales"].apply(
                            lambda x: x.ewm(alpha=0.5, adjust=False).mean())
    return x

df = pd.DataFrame({'cust_id':['a', 'a', 'a', 'b', 'b'],
                   'sales': [100, 200, 300, 400, 500]})

df['mov_avg'] = df.groupby("cust_id")["sales"].apply(
                            lambda x: x.ewm(alpha=0.5, adjust=False).mean())

df_1 = mov_average(df).compute()

Выход

df
Out[22]: 
  cust_id  sales  mov_avg
0       a    100    100.0
1       a    200    150.0
2       a    300    225.0
3       b    400    400.0
4       b    500    450.0

df_1
Out[23]: 
  cust_id  sales  mov_avg
0       a    100    100.0
1       a    200    150.0
2       a    300    225.0
3       b    400    400.0
4       b    500    450.0
...