pd.stats.ols.MovingOLS以及替代

方法 

model = pd.stats.ols.MovingOLS(y=df.y, x=df.x, window_type='rolling',window=1000, intercept=True)

在pandas2.x中去掉了

替换的代码如下:

window = 1000 
a = np.array([np.nan] * len(df)) 
b = [np.nan] * len(df) # If betas required.
 y_ = df.y.values 
x_ = df[['x']].assign(constant=1).values 
for n in range(window, len(df)): 
      y = y_[(n - window):n] 
      X = x_[(n - window):n] 
      # betas = Inverse(X'.X).X'.y 
      betas = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y) 
      y_hat = betas.dot(x_[n, :]) 
     a[n] = y_hat
     b[n] = betas.tolist() # If betas required.


或者:

df=df.dropna() #uncomment this line to drop nans
window = 5
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]


当然,也有人自己写了一个模型解决这个问题,如下:


# Rolling regressions 
from pyfinance.ols import OLS, RollingOLS, PandasRollingOLS 
y = data.usd 
x = data.drop('usd', axis=1) 
window = 12 # months 
model = PandasRollingOLS(y=y, x=x, window=window) 
print(model.beta.head())


参考:主要是stackoverflow里面的2个网址
/questions/44380068/pandas-rolling-regression-alternatives-to-looping
/questions/44707384/python-pandas-has-no-attribute-ols-error-rolling-ols
https://www.e-learn.cn/content/wangluowenzhang/754972
https://e-learn.cn/content/wangluowenzhang/192368

转自:http://blog.sina.com.cn/s/blog_751bd9440102ychv.html

猜你喜欢

转载自blog.csdn.net/u011331731/article/details/89298636
OLS