概要
- 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