You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:38:53