2017-05-07 62 views
2

我有一個不規則間隔時間序列的項目成本數據框,我想嘗試應用statsmodel AR model against如何正確設置statsmodels.tsa.ar_model.AR.predict函數的開始/結束參數

這是數據的樣本在它的數據幀:

   cost 
date    
2015-07-16 35.98 
2015-08-11 25.00 
2015-08-11 43.94 
2015-08-13 26.25 
2015-08-18 15.38 
2015-08-24 77.72 
2015-09-09 40.00 
2015-09-09 20.00 
2015-09-09 65.00 
2015-09-23 70.50 
2015-09-29 59.00 
2015-11-03 19.25 
2015-11-04 19.97 
2015-11-10 26.25 
2015-11-12 19.97 
2015-11-12 23.97 
2015-11-12 21.88 
2015-11-23 23.50 
2015-11-23 33.75 
2015-11-23 22.70 
2015-11-23 33.75 
2015-11-24 27.95 
2015-11-24 27.95 
2015-11-24 27.95 
... 
2017-03-31 21.93 
2017-04-06 22.45 
2017-04-06 26.85 
2017-04-12 60.40 
2017-04-12 37.00 
2017-04-12 20.00 
2017-04-12 66.00 
2017-04-12 60.00 
2017-04-13 41.95 
2017-04-13 25.97 
2017-04-13 29.48 
2017-04-19 41.00 
2017-04-19 58.00 
2017-04-19 78.00 
2017-04-19 12.00 
2017-04-24 51.05 
2017-04-26 21.88 
2017-04-26 50.05 
2017-04-28 21.00 
2017-04-28 30.00 

我有一個很難理解如何在predict功能使用startend

根據the docs

start : int, str, or datetime Zero-indexed observation number at which to start forecasting, ie., the first > forecast is start. Can also be a date string to parse or a datetime type.

end : int, str, or datetime Zero-indexed observation number at which to end forecasting, ie., the first forecast is start. Can also be a date string to parse or a datetime type.

我創建具有一個空的日常時間序列數據幀,我的不規則間隔時間序列數據添加到它,然後嘗試應用模型。

data = pd.read_csv('data.csv', index_col=1, parse_dates=True) 
df = pd.DataFrame(index=pd.date_range(start=datetime(2015, 1, 1), end=datetime(2017, 12, 31), freq='d')) 
df = df.join(data) 
df.cost.interpolate(inplace=True) 
ar_model = sm.tsa.AR(df, missing='drop', freq='D') 
ar_res = ar_model.fit(maxlag=9, method='mle', disp=-1) 
pred = ar_res.predict(start='2016', end='2016') 

pandas.tslib.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 605-12-31 00:00:00

如果我嘗試使用更具體的日期錯誤的predict功能結果,我得到相同類型的錯誤:

pred = ar_res.predict(start='2016-01-01', end='2016-06-01')  

如果我嘗試使用整數,我得到一個不同的錯誤:

pred = ar_res.predict(start=0, end=len(data)) 
Wrong number of items passed 202, placement implies 197 

如果我實際上使用datetime,我收到一條錯誤消息,內容爲no rule for interpreting end

我在這裏很難打牆,我在想我一定會有一些我想念的東西。

最終,我想使用該模型來獲得樣本外預測(例如下一季度的預測)。

+1

ARMA採用間隔相等的標準時間序列數據。你的日期不是唯一的,並且沒有明確的頻率。一種可能性是在沒有時間索引的情況下工作(例如,只是一個numpy數組),忽略觀察的時間間隔,或者將它們聚合/平均到每日系列。 – user333700

+0

這個日期和日期時間處理已經在statsmodels master中進行了重構,我的猜測是它現在在這種不規則的情況下引發了一個明顯的異常。當你轉換爲納秒時,當嘗試創建一個覆蓋數年的納秒時間差時,這可能會在某處溢出。 – user333700

+0

「你的日期不是唯一的」 - 就是這樣 - 我需要一個groupby函數 – getglad

回答

0

所以我創建一個每天指數以考慮等間隔的時間序列的要求,但它仍然保持非唯一(評論@ user333700)。

我添加了一個groupby函數來將重複日期求和在一起,然後可以使用datetime對象(通過@ andy-hayden回答)運行predict函數。

df = df.groupby(pd.TimeGrouper(freq='D')).sum() 
... 
ar_res.predict(start=min(df.index), end=datetime(2018,12,31)) 

隨着predict函數提供的結果,我現在可以對結果進行分析和調整的PARAMS得到一些有用的東西。

0

這個作品,如果你傳遞一個datetime(而不是date):

from datetime import datetime 

... 
pred = ar_res.predict(start=datetime(2015, 1, 1), end=datetime(2017,12,31)) 

In [21]: pred.head(2) # my dummy numbers from data 
Out[21]: 
2015-01-01 35 
2015-01-02 23 
Freq: D, dtype: float64 

In [22]: pred.tail(2) 
Out[22]: 
2017-12-30 44 
2017-12-31 44 
Freq: D, dtype: float64 
+0

這給了我一個「年份超出範圍」的錯誤。如果我嘗試使用較小範圍的'ar_res.predict(start = datetime(2016,1,1),end = datetime(2016,6,1))',我仍然會得到'超出納秒時間戳的錯誤'錯誤。如果我還更新pd.date_range以使用'datetime'而不是'date',也會發生這種情況。將我的代碼更新爲 – getglad

+0

如果您提供'data',我們希望我們可以複製該數據。 –

+0

添加'data'的樣本,以及如何生成其'pd.dataframe' – getglad

相關問題