2016-09-20 8 views
1

私は毎月の間隔で小さな時系列を持っています。私はそれをプロットして、季節性、傾向、残差に分解したいと思っていました。私はcsvをpandasにインポートし、うまく動作する時系列だけをプロットすることから始めます。私はThisチュートリアルに従うと、私のコードは次のようになり、次のエラーが発生しPythonで季節的分解を使用すると、私は間違って何をしていますか?

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

:この段階で

%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

は、私はこのような季節が分解を行うにしてみてください。

--------------------------------------------------------------------------- 
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. 

誰かが私に何か光を当てることはできますか間違っていると私はそれを修正することができますか?とても感謝しております。

編集:ザッツデータフレームは、あなたが7つのデータポイントを持っている

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 
+0

を説明したように? – IanS

+0

さて、私はそれを編集します。 –

+0

申し訳ありません、前にあなたの質問に誤解されました。 'freq'の値を渡していない、つまり季節のタイムスケールですか? – AlvaroP

答えて

1

どのように見えるか、それは通常、定常解析を行うための非常に少ない数です。

季節分解を使用するためのポイントが不足しています。これを確認するには、データを連結して拡張された時系列を作成します(次の月のデータを繰り返すだけです)。 extendedDataをこの拡張データフレームとし、元のデータをdataとします。

data.plot() 

enter image description here

extendedData.plot() 

enter image description here

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

enter image description here

季節推定のための周波数(freq)は自動的にデータを形成すると推定され、手動で指定することができます。


最初の違いを取ってみることができます:以前のデータ値から各データ値を差し引いた新しい時系列を生成します。あなたのケースでは、次のようになります。

enter image description here

定常性テスト

は、次の適用可能な、ないスクリーンショットのように、あなたが問題のテキストとしてデータフレームを含めてくださいすることができ here

+0

ありがとうございましたが、私のデータセットは7ヶ月分のデータしか含んでいません。私はそれを分解できないという意味ですか? –

+0

私たちは毎年の季節性(つまり、12ヶ月間)について話していますか? データのランダム性にもよりますが、少なくとも2年以上のデータが必要です。以前に投稿したリンクには貴重な洞察があります。 – AlvaroP

+0

私は統計的に時系列を調べるのが新しいです。私は7ヶ月のデータを持っています。私は時系列が静止しているかどうかを見たいと思います。私はトレンド、季節性、残差に分解して7ヶ月間見えるようにするかもしれないと思った。 –

関連する問題