基于含300列的Pandas DataFrame进行线性回归求β1系数
最优实现方案
1. 数据预处理:筛选目标温度区间
首先从DataFrame中提取外界温度在2到3.5之间的子集:
filtered_df = df[(df['temperature'] >= 2) & (df['temperature'] <= 3.5)].copy()
2. 高效计算单变量线性回归的ß₁系数
单变量线性回归中,斜率ß₁有直接解析公式,无需迭代拟合,能利用Pandas向量化操作一次性计算所有设备的系数,效率最高:
ß₁ = 协方差(x,y) / 方差(x) = [(x - x̄)(y - ȳ)的均值] / [(x - x̄)²的均值]
对应代码实现:
# 计算温度的均值与偏差 x = filtered_df['temperature'] x_mean = x.mean() x_dev = x - x_mean # 计算所有设备产热量的均值与偏差 y_cols = filtered_df.drop('temperature', axis=1) y_dev = y_cols - y_cols.mean() # 批量计算每台设备的ß₁ beta1 = (x_dev.values.reshape(-1, 1) * y_dev).mean() / (x_dev ** 2).mean()
最终beta1是一个Series,索引为设备名称,值对应每台设备的ß₁系数。
3. 备选:Scikit-learn批量处理(适合多变量扩展)
如果后续需要扩展到多变量回归,可使用Scikit-learn的线性回归模型结合apply操作,代码通用性更强:
from sklearn.linear_model import LinearRegression # 构造特征矩阵 X = filtered_df[['temperature']].values model = LinearRegression(fit_intercept=True) # 定义单设备系数计算函数 def calc_beta1(y): model.fit(X, y.values) return model.coef_[0] # 批量计算所有设备的ß₁ beta1_sklearn = y_cols.apply(calc_beta1)
方案对比
- 解析公式法:纯Pandas向量化运算,无循环,计算速度最快,代码简洁且无额外依赖,是单变量场景的最优选择。
- Scikit-learn法:代码更通用,支持后续多变量扩展,但因需循环拟合模型,效率略低于解析公式法。
内容的提问来源于stack exchange,提问作者ocram113
相关产品推荐
相关产品推荐

