分解趋势,季节和剩余时间序列元素

时间:2015-12-24 19:45:33

标签: python pandas machine-learning time-series statsmodels

我有DataFrame个时间序列:

         divida    movav12       var  varmovav12
Date                                            
2004-01       0        NaN       NaN         NaN
2004-02       0        NaN       NaN         NaN
2004-03       0        NaN       NaN         NaN
2004-04      34        NaN       inf         NaN
2004-05      30        NaN -0.117647         NaN
2004-06      44        NaN  0.466667         NaN
2004-07      35        NaN -0.204545         NaN
2004-08      31        NaN -0.114286         NaN
2004-09      30        NaN -0.032258         NaN
2004-10      24        NaN -0.200000         NaN
2004-11      41        NaN  0.708333         NaN
2004-12      29  24.833333 -0.292683         NaN
2005-01      31  27.416667  0.068966    0.104027
2005-02      28  29.750000 -0.096774    0.085106
2005-03      27  32.000000 -0.035714    0.075630
2005-04      30  31.666667  0.111111   -0.010417
2005-05      31  31.750000  0.033333    0.002632
2005-06      39  31.333333  0.258065   -0.013123
2005-07      36  31.416667 -0.076923    0.002660

我希望以一种可以将其趋势与其季节性和残余成分分开的方式分解第一个时间序列divida

我找到了答案here,并尝试使用以下代码:

import statsmodels.api as sm

s=sm.tsa.seasonal_decompose(divida.divida)

但是我一直收到这个错误:

Traceback (most recent call last):
File "/Users/Pred_UnBR_Mod2.py", line 78, in <module> s=sm.tsa.seasonal_decompose(divida.divida)
File "/Library/Python/2.7/site-packages/statsmodels/tsa/seasonal.py", line 58, in seasonal_decompose _pandas_wrapper, pfreq = _maybe_get_pandas_wrapper_freq(x)
File "/Library/Python/2.7/site-packages/statsmodels/tsa/filters/_utils.py", line 46, in _maybe_get_pandas_wrapper_freq
freq = index.inferred_freq
AttributeError: 'Index' object has no attribute 'inferred_freq'

有人可以对它发光吗?

5 个答案:

答案 0 :(得分:21)

index转换为DateTimeIndex

时,工作正常
df.reset_index(inplace=True)
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')
s=sm.tsa.seasonal_decompose(df.divida)

<statsmodels.tsa.seasonal.DecomposeResult object at 0x110ec3710>

通过以下方式访问组件:

s.resid
s.seasonal
s.trend

答案 1 :(得分:2)

仅当您提供频率时,Statsmodel才会分解序列。通常,所有时间序列索引都将包含频率,例如:日,工作日,周因此显示错误。您可以通过两种方法消除此错误:

  1. Stefan所做的就是将索引列提供给pandas DateTime函数。它使用内部函数infer_freq查找频率并返回带有频率的索引。
  2. 否则,您可以将索引列的频率设置为df.index.asfreq(freq='m')。这里m代表月份。如果您具有领域知识或通过d可以设置频率。

答案 2 :(得分:0)

简单点:

请遵循以下三个步骤: 1-如果未完成,则将列设置为yyyy-mm-dd或dd-mm-yyyy(使用excel)。 2-然后使用熊猫将其转换为日期格式,如下:

df ['Date'] = pd.to_datetime(df ['Date'])

3-使用:分解它

从statsmodels.tsa.seasonal导入season_decompose 分解= seasonal_decompose(ts_log)

最后:---- enter image description here

答案 3 :(得分:0)

这取决于索引格式。您可以具有DateTimeIndex或您可以具有PeriodIndex。 Stefan展示了DateTimeIndex的示例。这是我的PeriodIndex的示例。 我原来的DataFrame具有一个MultiIndex索引,其中第一级为年份,第二级为月份。这是我将其转换为PeriodIndex的方法:

df["date"] = pd.PeriodIndex (df.index.map(lambda x: "{0}{1:02d}".format(*x)),freq="M")
df = df.set_index("date")

现在它已准备好由Seasonal_decompose使用。

答案 4 :(得分:0)

尝试使用parse_dates解析日期列,稍后再提及索引列。

from statsmodels.tsa.seasonal import seasonal_decompose
data=pd.read_csv(airline,header=0,squeeze=True,index_col=[0],parse_dates=[0])
res=seasonal_decompose(data)