1. 程式人生 > >statsmodels.tsa.arima_model預測時報錯TypeError: int() argument must be a string, a bytes-like object or a number, not 'Timestamp'

statsmodels.tsa.arima_model預測時報錯TypeError: int() argument must be a string, a bytes-like object or a number, not 'Timestamp'

進行 時報 參數 csv 別人 間隔 get req ice

在 python 中用 statsmodels創建 ARIMA 模型進行預測時間序列:

import pandas as pd
import statsmodels.api as sm

df = pd.read_csv("data.csv", index_col=0, parse_dates=True)

mod = sm.tsa.statespace.SARIMAX(df['price'], enforce_stationarity=False, enforce_invertibility=False)

res = mod.fit()
res.get_prediction(start=pd.to_datetime('2018-1-1'))

運行後報錯:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'Timestamp'

這種情況的原因是,讀入的時間序列數據的時間沒有統一的間隔,例如打印mod._index的結果是

DatetimeIndex(['2016-01-01', '2016-01-08', '2016-01-15', '2016-01-22',
               '2016-01-30'],
              dtype='datetime64[ns]', name='date', freq=None)

其中2016-01-30是距離前一個時間8天,其它間隔為7天。可以看到這個 DatetimeIndex 的 freq 是 None 類型。
而如果將最後一天修改為2016-01-29,那麽mod._index的結果是:

DatetimeIndex(['2016-01-01', '2016-01-08', '2016-01-15', '2016-01-22',
               '2016-01-29'],
              dtype='datetime64[ns]', freq='W-FRI')

但是此時還會報錯

KeyError: 'The `start` argument could not be matched to a location related to the index of the data.'

這是由於get_prediction的 start 參數必須是在時間序列中出現過的時間。

debug 經驗++:使用庫時,因為層層調用,有時遇上問題光看報錯信息解決不了,而調用的代碼又沒寫錯,那麽很有可能就是數據的問題了。 雖然搜索引擎很好用,但是對於有些小問題來說,可能會變成盲目地在互聯網大海撈針。對於開源的庫,可以看看有沒有類似的別人提過的 issue ,有時候確實是庫的bug。自己定位問題還有個辦法是對比正確完整的例子,找不同點。

statsmodels.tsa.arima_model預測時報錯TypeError: int() argument must be a string, a bytes-like object or a number, not 'Timestamp'