LoginSignup
2
3

More than 5 years have passed since last update.

Tips_01:時系列データ分析SARIMAモデル 「seasonal_orderの長さについて」【statsmodels】

Posted at

概要

  • SARIMAモデルを用いた、時系列データ分析におけるプログラミング中に起きたエラー
  • プログラム初心者の私に起きたので、同じ初心者の方の解決になれば…
  •  SARIMAモデルには、(p,d,q)(P,D,Q,S)といったハイパーパラメータを入れてあげなければならない。総当り法でp,d,q,P,D,Q(Sは24で固定)を求め、最もaicが低いパラメータを採用するプログラムを作った。

問題

len()使えないからだめだよ。長さないよ。って怒られました。

Error
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-997d8c7cdfa2> in <module>()
      5 SARIMAorder,SARIMAORDER = orderoptimize2(1)
      6 
----> 7 FitSARIMA = TrainSarimaRev2(S_ForecastDF,TrainStartDate,TrainEndDate,SARIMAorder,SARIMAORDER)
      8 ForecastSARIMA = pd.DataFrame(FitSARIMA.forecast(steps=PredictTerm))
      9 

C:\Users\***\Anaconda3\lib\site-packages\statsmodels\tsa\statespace\sarimax.py in __init__(self, endog, exog, order, seasonal_order, trend, measurement_error, time_varying_regression, mle_regression, simple_differencing, enforce_stationarity, enforce_invertibility, hamilton_representation, **kwargs)
    329         else:
    330             self.polynomial_seasonal_ar = np.r_[
--> 331                 1., [0] * self.seasonal_periods * len(seasonal_order[0])
    332             ]
    333             for i in range(len(seasonal_order[0])):

TypeError: object of type 'numpy.int32' has no len()

 使用したのは、予めこれを使って作った最も低いaicのハイパーパラメータをcsvに格納したものを呼び出して、SARIMAモデルに突っ込むだけの関数です。

Orderと学習
#SARIMA Order
def orderoptimize(cnt):
    paraDF = pd.read_csv(r'SARIMA_ParameterOptimize.csv',header=None,dtype ='int')
    order = list(paraDF.loc[cnt,0].values.flatten())   
    sorder = list(paraDF.loc[cnt,3:6].values.flatten())
    return order,sorder

#SARIMA Train
def TrainSarimaRev2(df,Start,End,Order,SOrder):
    TrainResultsSARIMA = sm.tsa.statespace.SARIMAX(df.loc[pd.to_datetime(Start):pd.to_datetime(End)],
                                                   enforce_stationarity=False,
                                                   enforce_invertibility=False,
                                                   order=Order,
                                                   seasonal_order=SOrder
                                                  ).fit()
    return TrainResultsSARIMA

リストで与えたらええんとちゃうんか。って思ったのに駄目でした。

解決策

改善案
def orderoptimize(cnt):
    paraDF = pd.read_csv(r'SARIMA_ParameterOptimizerev3.csv',header=None,dtype ='int')
    order = [int(paraDF.loc[cnt,0])]
    order.append(int(paraDF.loc[cnt,1]))
    order.append(int(paraDF.loc[cnt,2]))
    sorder = [int(paraDF.loc[cnt,3])]
    sorder.append(int(paraDF.loc[cnt,4]))
    sorder.append(int(paraDF.loc[cnt,5]))
    sorder.append(int(paraDF.loc[cnt,6]))
    return order,sorder

あきらめました。

まとめ

動くけどダサい。
Python使ってるのに、こんなにダサくしてしまった。ごめんよPython

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3