遍历DataFrame执行回归时遇TypeError: expected non-empty vector for x求助
问题解决思路
错误根源
- 切片逻辑错误:你写的
df.iloc[i:i-n, 0]是反向切片,当i < n时,起始索引大于结束索引,会返回空数组,直接触发expected non-empty vector for x错误。而且你要的是当前行之前的n行,正确的切片范围应该是[i-n, i)(左闭右开,不包含当前行)。 - 列索引可能有误:你提到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
相关产品推荐
相关产品推荐

