使用dask计算移动平均值

时间:2020-01-15 21:04:34

标签: python pandas dask

我正在尝试计算非常大的数据集的移动平均值。行数约为30M。为了说明如何使用熊猫,如下所示

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())

在这里,我正在使用熊猫来计算移动平均值。使用上面的方法,大约需要20分钟来计算30M数据集。这里有没有办法利用DASK?

1 个答案:

答案 0 :(得分:3)

您可以使用Dask.delayed进行计算。在下面的示例中,使用@delayed装饰器将包含pandas移动平均命令的标准python函数转换为dask函数。

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