【问题标题】:What am I doing wrong when using seasonal decompose in Python?在 Python 中使用季节性分解时我做错了什么?
【发布时间】:2016-09-20 09:36:59
【问题描述】:

我有一个每月间隔的小时间序列。我想绘制它,然后分解为季节性、趋势、残差。我首先将 csv 导入 pandas,然后只绘制工作正常的时间序列。我遵循This 教程,我的代码是这样的:

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd

ali3 = pd.read_csv('C:\\Users\\ALI\\Desktop\\CSV\\index\\ZIAM\\ME\\ME_DATA_7_MONTH_AVG_PROFIT\\data.csv',
 names=['Date', 'Month','AverageProfit'],
 index_col=['Date'],
 parse_dates=True)

\* Delete month column which is a string */
del ali3['Month']


ali3
plt.plot(ali3)

Data Frame

在这个阶段,我尝试像这样进行季节性分解:

import statsmodels.api as sm 
res = sm.tsa.seasonal_decompose(ali3.AverageProfit)  
fig = res.plot() 

导致以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-41-afeab639d13b> in <module>()
      1 import statsmodels.api as sm
----> 2 res = sm.tsa.seasonal_decompose(ali3.AverageProfit)
      3 fig = res.plot()

C:\Users\D063375\AppData\Local\Continuum\Anaconda2\lib\site-packages\statsmodels\tsa\seasonal.py in seasonal_decompose(x, model, filt, freq)
     86             filt = np.repeat(1./freq, freq)
     87 
---> 88     trend = convolution_filter(x, filt)
     89 
     90     # nan pad for conformability - convolve doesn't do it

C:\Users\D063375\AppData\Local\Continuum\Anaconda2\lib\site-packages\statsmodels\tsa\filters\filtertools.py in convolution_filter(x, filt, nsides)
    287 
    288     if filt.ndim == 1 or min(filt.shape) == 1:
--> 289         result = signal.convolve(x, filt, mode='valid')
    290     elif filt.ndim == 2:
    291         nlags = filt.shape[0]

C:\Users\D063375\AppData\Local\Continuum\Anaconda2\lib\site-packages\scipy\signal\signaltools.py in convolve(in1, in2, mode)
    468         return correlate(volume, kernel[slice_obj].conj(), mode)
    469     else:
--> 470         return correlate(volume, kernel[slice_obj], mode)
    471 
    472 

C:\Users\D063375\AppData\Local\Continuum\Anaconda2\lib\site-packages\scipy\signal\signaltools.py in correlate(in1, in2, mode)
    158 
    159     if mode == 'valid':
--> 160         _check_valid_mode_shapes(in1.shape, in2.shape)
    161         # numpy is significantly faster for 1d
    162         if in1.ndim == 1 and in2.ndim == 1:

C:\Users\D063375\AppData\Local\Continuum\Anaconda2\lib\site-packages\scipy\signal\signaltools.py in _check_valid_mode_shapes(shape1, shape2)
     70         if not d1 >= d2:
     71             raise ValueError(
---> 72                 "in1 should have at least as many items as in2 in "
     73                 "every dimension for 'valid' mode.")
     74 

ValueError: in1 should have at least as many items as in2 in every dimension for 'valid' mode.

谁能阐明我做错了什么以及如何解决?非常感谢。

编辑:这就是数据框的样子

Date            AverageProfit

2015-06-01          29.990231
2015-07-01          26.080038
2015-08-01          25.640862
2015-09-01          25.346447
2015-10-01          27.386001
2015-11-01          26.357709
2015-12-01          25.260644

【问题讨论】:

  • 您能否将您的数据框作为文本包含在问题中,而不是作为屏幕截图?
  • 好的,我会编辑的。
  • 对不起,之前误解了你的问题。可能是您没有通过freq 值,即季节性时间尺度?

标签: python pandas jupyter


【解决方案1】:

您有 7 个数据点,这通常是执行平稳性分析的一个非常小的数字。

您没有足够的积分来使用季节性分解。要查看这一点,您可以连接您的数据以创建一个扩展的时间序列(只需在接下来的几个月重复您的数据)。让extendedData 成为这个扩展数据框,data 成为您的原始数据。

data.plot()

extendedData.plot()

res = sm.tsa.seasonal_decompose(extendedData.interpolate())
res.plot()

季节性估计的频率 (freq) 是根据数据自动估计的,并且可以手动指定。


您可以尝试第一个差异:生成一个新的时间序列,从前一个数据值中减去每个数据值。在您的情况下,它看起来像这样:

接下来可以应用平稳性测试,如 here 所述

【讨论】:

  • 谢谢你的回答,但我的数据集只包含七个月的数据。这是否意味着我不能分解它?
  • 我们谈论的是年度季节性(即 12 个月)吗?如果是这样,您将需要更多数据,至少需要 2 年,尽管这一切都取决于数据的随机性等。我之前发布的链接具有宝贵的见解!
  • 我是统计研究时间序列的新手。我有七个月的数据。我想看看时间序列是否静止。我认为分解为趋势、季节性和七个月的残差可能会使其更加明显。
  • 感谢您的全面回答。对此,我真的非常感激。这也让我意识到我需要更多地了解时间序列分析背后的理论。
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多