Применить тенденцию сезонной декомпозиции к каждому столбцу DataFrame dask, Python - PullRequest
1 голос
/ 28 мая 2020

Как сказано в заголовке, я не могу запустить этот код:

def simple_map(x):
    y = seasonal_decompose(x,model='additive',extrapolate_trend='freq',period=7,two_sided=False)
    return y.trend

b.map_partitions(simple_map,meta=b).compute()

, где b - это DataFrame dask с индексом datetime и некоторыми сериями float в качестве столбцов, а Season_decompose - это statsmodel.

Это то, что я получаю:

Index(...) must be called with a collection of some kind, 'seasonal' was passed

Если я это делаю:

b.apply(simple_map,axis=0)

Где b - это pandas DataFrame Я получаю то, что хочу.

Где я ошибаюсь?

#

Воспроизводимый пример:

import pandas as pd
from statsmodels.tsa.seasonal import seasonal_decompose

d = {'Val1': [3, 2,7,5], 'Val2': [2, 4,8,6]}
b=pd.DataFrame(data=d)
b=b.set_index(pd.to_datetime(['25/12/1991','26/12/1991','27/12/1991','28/12/1991']))

def simple_map(x):
    y =seasonal_decompose(x,model='additive',extrapolate_trend='freq',period=2,two_sided=False)
    return y.trend

b.apply(simple_map,axis=0)

            Val1    Val2
1991-12-25  0.70    0.9
1991-12-26  2.10    2.7
1991-12-27  3.50    4.5
1991-12-28  5.25    6.5

Это то, что я хочу сделать с dask, но не могу

Фактически:

import dask.dataframe as dd

c=dd.from_pandas(b, npartitions=1)
c.map_partitions(simple_map,meta=c).compute()

Произвести указанную выше ошибку.

1 Ответ

1 голос
/ 28 мая 2020

Спасибо за пример!

Из строки документации apply

Объекты, переданные в функцию, являются объектами Series, индекс которых является либо индексом DataFrame (axis=0)

Однако map_partitions будет работать для всего Dataframe. Я бы посоветовал немного переписать функцию:

 def simple_map_2(x):
     xVal1 = seasonal_decompose(x.Val1,model='additive',extrapolate_trend='freq',period=2,two_sided=False)
     xVal2 = seasonal_decompose(x.Val2,model='additive',extrapolate_trend='freq',period=2,two_sided=False)
     return pd.DataFrame({'Val1': xVal1.trend, 'Val2': xVal2.trend})

c.map_partitions(simple_map_2,meta=make_meta(c)).compute()

            Val1  Val2
1991-12-25  0.70   0.9
1991-12-26  2.10   2.7
1991-12-27  3.50   4.5
1991-12-28  5.25   6.5
...