【问题标题】:Rolling Regression Estimation in Python dataframePython数据框中的滚动回归估计
【发布时间】:2021-09-10 22:17:48
【问题描述】:

我有一个这样的数据框:

           Date         Y         X1         X2          X3
22   2004-05-12  9.348158e-09  0.000081  0.000028     0.000036   
23   2004-05-13  9.285989e-09  0.000073  0.000081     0.000097   
24   2004-05-14  9.732308e-09  0.000085  0.000073     0.000096   
25   2004-05-17  2.235977e-08  0.000089  0.000085     0.000099   
26   2004-05-18  2.792661e-09  0.000034  0.000089     0.000150   
27   2004-05-19  9.745323e-09  0.000048  0.000034     0.000053 

......

1000   2004-05-20  1.835462e-09  0.000034  0.000048     0.000099   
1001   2004-05-21  3.529089e-09  0.000037  0.000034     0.000043   
1002   2004-05-24  3.453047e-09  0.000043  0.000037     0.000059   
1003   2004-05-25  2.963131e-09  0.000038  0.000043     0.000059   
1004   2004-05-26  1.390032e-09  0.000029  0.000038     0.000054   

我想运行一个滚动的 100 天窗口 OLS 回归估计,即:

首先对于第 101 行,我使用第 1 到第 100 行对 Y-X1、X2、X3 进行回归,并估计第 101 行的 Y;

然后对于第 102 行,我使用第 2 到第 101 行对 Y-X1、X2、X3 进行回归,并估计第 102 行的 Y;

然后对于第 103 行,我使用第 2 到第 101 行对 Y-X1、X2、X3 进行回归,并估计第 103 行的 Y;

......

直到最后一行。

怎么做?

【问题讨论】:

  • 哪个版本的熊猫?
  • 版本为:0.18.0

标签: python pandas dataframe


【解决方案1】:
model = pd.stats.ols.MovingOLS(y=df.Y, x=df[['X1', 'X2', 'X3']], 
                               window_type='rolling', window=100, intercept=True)
df['Y_hat'] = model.y_predict

【讨论】:

【解决方案2】:

我还需要做一些滚动回归,在pandas.ols中遇到了pandas depreciated功能的问题。 下面是我的解决方法

基本上,我首先使用创建一个空的 numpy 数组,然后使用 numpy polyfit 在 for 循环中生成回归值。然后我将 numpy 数组添加到 panda 数据框中。希望对社区有所帮助!

data = pd.DataFrame(x_data, y_data)

regression = np.zeros((len(data.index),2)) #set the regression numpy array empty first
for row in range(0, len(data.index), 1):
    y = data.y_data[row: row + 300]
    x = data.x_data[row: row + 300]
    regression[row] = np.polyfit(x, y, 1)

data['beta'] = regression[:,0]
data['alpha'] = regression[:,1]

【讨论】:

  • 不错的方法,但我认为存在问题。由于您要求返回 [row : row + 300] 内的数据,因此该行将超出范围。我认为在 for 循环中你需要迭代到len(data.index) - 300
【解决方案3】:

statsmodels 0.11.0 添加了 RollingOLS(2020 年 1 月)

from statsmodels.regression.rolling import RollingOLS

#add constant column to regress with intercept
df['const'] = 1

#fit
model = RollingOLS(endog =df['Y'].values , exog=df[['const','X1','X2','X3']],window=20)
rres = model.fit()
rres.params.tail() #look at last few intercept and coef

或者使用R风格的回归公式

model = RollingOLS.from_formula('Y ~ X1 + X2 + X3' , data = df, window=20)
rres = model.fit()
rres.params.tail()

【讨论】:

  • 有什么办法可以重叠窗口吗?
  • @guy 我认为它们是重叠的。
【解决方案4】:

我来这里是为了寻找一个简单的 pandas 解决方案,但没有找到我想要的东西。这是我的简单使用列表和 for 循环的解决方案,它可能不是最快的,但我发现它非常简单:

from scipy.stats import linregress
import numpy as np

measurement_index = [x for x in range(1,21)]
value = [x**2 for x in measurement_index]

for idx in range(0, len(value)):
    if idx > 3:
        window_value = (value[idx-3:idx])
        window_index = (measurement_index[idx-3:idx])
        slope = linregress(np.array(window_index),np.array(window_value)).slope
        print(slope)

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多