求基于Pandas DataFrame的滚动线性回归曲线实现代码
滚动窗口线性回归实现方案
没问题,我来帮你把全局线性回归改成滚动窗口版本!你的现有代码已经实现了全数据集的斜率和截距计算,只需要调整一下,结合Pandas的rolling()方法就能实现滚动窗口的回归曲线计算。
方法一:基于你原有函数改造
首先,我们把你的斜率截距计算函数适配成能处理每个滚动窗口的版本,再结合rolling.apply()逐窗口计算。这里默认用**前N个数据点(包括当前点)**来生成每个点对应的回归预测值:
import numpy as np import pandas as pd # 先把DataFrame的index转为单独列,方便在滚动窗口中获取x轴值 df_with_x = df1.reset_index().rename(columns={'index': 'x', 'Close': 'y'}) def rolling_reg_prediction(window): x = np.array(window['x']) y = np.array(window['y']) mean_x = np.mean(x) mean_y = np.mean(y) denominator = (mean_x ** 2) - np.mean(x ** 2) # 避免分母为0的异常情况(比如窗口内x值完全相同) if denominator == 0: return np.nan # 沿用你原有逻辑计算斜率m和截距b m = (mean_x * mean_y - np.mean(x * y)) / denominator m = round(m, 2) b = mean_y - mean_x * m b = round(b, 2) # 返回当前窗口最后一个点的回归预测值 return m * window['x'].iloc[-1] + b # 设置滚动窗口大小(比如取20个数据点) window_size = 20 # 应用滚动计算到原DataFrame df1['rolling_reg_line'] = df_with_x.rolling(window=window_size).apply(rolling_reg_prediction, raw=False)
方法二:用Statsmodels简化计算(更健壮)
如果想让计算更严谨(自动处理异常、共线性等情况),可以用statsmodels的OLS模型实现滚动回归,代码会更简洁:
import statsmodels.api as sm def rolling_ols_prediction(window): x = window['x'].values y = window['y'].values # 给x添加截距项,适配OLS模型要求 X = sm.add_constant(x) # 拟合线性回归模型 model = sm.OLS(y, X).fit() # 提取斜率和截距并保留两位小数 m = round(model.params[1], 2) b = round(model.params[0], 2) # 返回当前点的回归预测值 return m * window['x'].iloc[-1] + b # 应用滚动窗口计算 df1['rolling_reg_line'] = df_with_x.rolling(window=window_size).apply(rolling_ols_prediction, raw=False)
关键说明
raw=False:确保传递给函数的是窗口内的完整DataFrame,而非原始数组,这样我们能同时获取x(index)和y(Close)的值。- 前
window_size-1个数据点会显示NaN,因为没有足够的历史数据形成完整窗口。 - 如果需要让回归曲线覆盖窗口内所有点(而非仅当前点),可以修改函数返回窗口内所有点的预测值,结合
result_type='expand'参数,但这种场景在时间序列分析中相对少见。
内容的提问来源于stack exchange,提问作者Ele
相关产品推荐
相关产品推荐

