對於我的評估,我想針對在this link(https://drive.google.com/drive/folders/0B2Iv8dfU4fTUMVFyYTEtWXlzYkk)中找到的數據集運行滾動,例如3窗口OLS regression estimation
,如以下格式所示。我的數據集中的第三列(Y)是我的真實值 - 這就是我想要預測的(估計)。OLS在Python中滾動迴歸錯誤 - IndexError:索引超出範圍
time X Y
0.000543 0 10
0.000575 0 10
0.041324 1 10
0.041331 2 10
0.041336 3 10
0.04134 4 10
...
9.987735 55 239
9.987739 56 239
9.987744 57 239
9.987749 58 239
9.987938 59 239
使用簡單OLS regression estimation
,我曾與下面的腳本試了一下。
# /usr/bin/python -tt
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv('estimated_pred.csv')
model = pd.stats.ols.MovingOLS(y=df.Y, x=df[['X']],
window_type='rolling', window=3, intercept=True)
df['Y_hat'] = model.y_predict
print(df['Y_hat'])
print (model.summary)
df.plot.scatter(x='X', y='Y', s=0.1)
然而,即使用statsmodels
或scikit-learn
似乎是超越了簡單的迴歸東西是不錯的選擇。我嘗試使用statsmodels
來製作以下腳本,但使用attached數據集的更高子集(例如對於1000行以上的數據集)返回IndexError: index out of bounds
。
# /usr/bin/python -tt
import pandas as pd
import numpy as np
import statsmodels.api as sm
df=pd.read_csv('estimated_pred.csv')
df=df.dropna() # to drop nans in case there are any
window = 3
#print(df.index) # to print index
df['a']=None #constant
df['b1']=None #beta1
df['b2']=None #beta2
for i in range(window,len(df)):
temp=df.iloc[i-window:i,:]
RollOLS=sm.OLS(temp.loc[:,'Y'],sm.add_constant(temp.loc[:,['time','X']])).fit()
df.iloc[i,df.columns.get_loc('a')]=RollOLS.params[0]
df.iloc[i,df.columns.get_loc('b1')]=RollOLS.params[1]
df.iloc[i,df.columns.get_loc('b2')]=RollOLS.params[2]
#The following line gives us predicted values in a row, given the PRIOR row's estimated parameters
df['predicted']=df['a'].shift(1)+df['b1'].shift(1)*df['time']+df['b2'].shift(1)*df['X']
print(df['predicted'])
#print(df['b2'])
#print(RollOLS.predict(sm.add_constant(predict_x)))
print(temp)
最後,我想要做的Y
預測(即預測根據X
前3個滾動值的Y
當前值。我們怎樣才能做到這一點使用或者statsmodels
或scikit-learn
爲pd.stats.ols.MovingOLS
在去除Pandas
版本0.20.0,因爲我無法找到任何參考
你能報告錯誤的完整痕跡嗎? – FLab
當然。以下是錯誤的完整描述。 'File'用於換行:'Traceback(最近一次調用最後一個): 文件「../Desktop/rolling_regression/rolling_regression2.py」,第26行,在中 df.iloc [i,df.columns.get_loc 'b2')] = RollOLS.params [2] 文件「../anaconda/lib/python3.5/site-packages/pandas/indexes/base.py」,行1986,在get_value 返回tslib.get_value_box( s,key) pandas.tslib.get_value_box(pandas/tslib.c:17017)中的文件「pandas/tslib.pyx」,第777行 pandas.tslib中的文件「pandas/tslib.pyx」,第793行。 get_value_box(pandas/tslib.c:16774) IndexError:index out of bounds' –
它看起來像sm.OLS調用成功。請檢查/顯示RollOls.params以確保它實際上有3個條目。 – FLab