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

遍历DataFrame执行回归时遇TypeError: expected non-empty vector for x求助

问题解决思路

错误根源

  1. 切片逻辑错误:你写的df.iloc[i:i-n, 0]是反向切片,当i < n时,起始索引大于结束索引,会返回空数组,直接触发expected non-empty vector for x错误。而且你要的是当前行之前的n行,正确的切片范围应该是[i-n, i)(左闭右开,不包含当前行)。
  2. 列索引可能有误:你提到DataFrame只有xcolumn和ycolumn两列,但代码里用了0和2列索引,这显然不对——pandas的iloc是0-based索引,两列的话应该是0和1,这可能是你手动测试时数据结构不同导致的偏差。

修正方案

方案1:修正循环逻辑(适合新手理解)

import numpy as np
import pandas as pd

def regression(x,y):
    model = np.polyfit(x, y, 1)
    predict = np.poly1d(model)
    projectedx = 15
    result = predict(projectedx)
    return result

n = 20
# 先初始化结果列,避免赋值时出现KeyError
df['regression_result'] = np.nan

# 从第n行开始处理,保证有足够的前n行数据
for i in range(n, len(df)):
    # 取当前行之前的最后n行(i-n到i-1,iloc左闭右开)
    x2 = df.iloc[i-n:i, 0].values
    y2 = df.iloc[i-n:i, 1].values  # 根据实际列索引调整,这里假设ycolumn是第1列
    df.at[i, 'regression_result'] = regression(x2, y2)

# 处理前n行:数据不足n行时,用现有已有的行做回归(至少需要2行才能做一元线性回归)
for i in range(1, n):
    x2 = df.iloc[0:i, 0].values
    y2 = df.iloc[0:i, 1].values
    df.at[i, 'regression_result'] = regression(x2, y2)

方案2:用滚动窗口优化(适合大型DataFrame)

逐行循环在处理大型DataFrame时效率极低,推荐用pandas的rolling滚动窗口功能,实现向量化操作:

def rolling_regression(window):
    x = window.iloc[:, 0].values
    y = window.iloc[:, 1].values
    if len(x) < 2:  # 一元线性回归至少需要2个样本
        return np.nan
    model = np.polyfit(x, y, 1)
    predict = np.poly1d(model)
    return predict(15)

n = 20
# 滚动窗口大小为n,min_periods=2保证只有当窗口内至少有2行数据时才计算
df['regression_result'] = df.rolling(window=n, min_periods=2).apply(rolling_regression, raw=False)

注意事项

  • 确认你的列索引:根据DataFrame的实际列位置调整iloc的列参数,比如如果ycolumn是第三列(0-based索引为2),就保留2,否则改成对应索引。
  • 前n行的处理:如果不需要对数据不足n行的前n行做回归,可以直接跳过,保留NaN即可。

内容的提问来源于stack exchange,提问作者PythonNoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:25:22