如何快速对Pandas DataFrame每行执行多项式回归?
更快的逐行多项式回归实现方法(针对Pandas大DataFrame)
原始数据与需求
给定如下Pandas DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({0: [11, 12, 31], 1: [6, 14, 27], 2: [11, 24, 21], 3: [1, 24, 20]})
DataFrame内容:
0 1 2 3 0 11 6 11 1 1 12 14 24 24 2 31 27 21 20
需求为:对每行执行二次多项式回归,以列名作为X值,行内元素作为Y值。
已知使用iterrows的实现方式,但在处理大型DataFrame时耗时过长:
x = df.columns.to_numpy() for index, row in df.iterrows(): print(np.polyfit(x, row, 2))
输出结果:
[-1.25 1.25 9.75] [-0.5 6.1 11.1] [ 0.75 -6.15 31.35]
更高效的向量化实现
iterrows的低效源于Python层面的逐行循环,我们可以通过向量化线性代数运算一次性完成所有行的拟合,大幅提升速度。
实现步骤:
构造多项式回归的设计矩阵
对于二次多项式(degree=2),设计矩阵包含X的0次、1次、2次幂:x = df.columns.to_numpy() # 构造形状为(样本数, 多项式次数+1)的设计矩阵 X_design = np.vstack([x**i for i in range(3)]).T此时
X_design的内容为:[[1 0 0] [1 1 1] [1 2 4] [1 3 9]]批量求解所有行的回归系数
使用np.linalg.lstsq直接对整个DataFrame进行拟合,该函数支持二维输入,可一次性处理所有行的Y值:# 转置df是为了让Y的维度与设计矩阵匹配,最后再转置回原行顺序 coeffs = np.linalg.lstsq(X_design, df.T, rcond=None)[0].T验证结果
打印拟合得到的系数,与iterrows的结果完全一致:print(coeffs)输出:
[[-1.25 1.25 9.75] [-0.5 6.1 11.1 ] [ 0.75 -6.15 31.35]]
优势说明
这种向量化方法完全避免了Python循环,所有计算都在底层的C优化实现中完成,对于行数较多的大型DataFrame,速度提升可达数十倍甚至上百倍。如果需要拟合更高次的多项式,只需调整range(3)中的数字(比如三次多项式用range(4))即可。
内容的提问来源于stack exchange,提问作者younggotti
相关产品推荐
相关产品推荐

