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

Python中对DataFrame所有列组合应用线性回归的更优实现方法

如何更简便地对DataFrame所有两两列组合应用线性回归?

你当前的代码确实能实现需求,但用exec动态创建变量的方式不仅可读性差,后续维护和查找结果也很麻烦,而且还存在潜在的安全风险。这里有几种更优雅、简便的实现思路,推荐给你:

推荐实现方式:用字典存储回归结果

我们可以用字典来存储每个回归的结果,键直接用列名的组合(比如('A','B')),这样后续查找和调用结果会非常直观,完全不需要依赖索引去对应模型。同时用itertools.combinations来生成所有两两列的组合,比np.tril_indices更易懂。

完整代码示例

import statsmodels.api as sm
import numpy as np
import pandas as pd
from itertools import combinations

# 生成示例DataFrame,设置随机种子保证结果可复现
np.random.seed(42)
df = pd.DataFrame(abs(np.random.randn(50, 4)*10), columns=list('ABCD'))

# 存储所有回归结果的字典
regression_results = {}

# 遍历所有两两列的组合(前一个是因变量,后一个是自变量)
for y_col, x_col in combinations(df.columns, 2):
    # 准备自变量(记得添加常数项)和因变量
    X = sm.add_constant(df[x_col])
    y = df[y_col]
    
    # 拟合模型并把结果存入字典
    model = sm.OLS(y, X).fit()
    regression_results[(y_col, x_col)] = model

# 查看某一组的回归结果,比如B对A的回归
print(regression_results[('B', 'A')].summary())

为什么这个方法更好?

  • 可读性强:用列名组合作为字典键,一眼就能知道对应的是哪两个列的回归,不用再去对应索引idx
  • 易于维护:后续要修改或扩展逻辑时,直接操作字典即可,不会出现动态变量混乱的问题
  • 避免安全风险:exec会执行任意字符串代码,若后续代码中引入外部输入,可能引发安全问题,而字典存储完全没有这个顾虑
  • 结果易复用:可以轻松遍历字典中的所有结果,比如批量提取关键统计量:
# 批量提取所有回归的R²值
r_squared = {pair: round(res.rsquared, 3) for pair, res in regression_results.items()}
print("所有回归的R²值:", r_squared)

补充说明

如果你坚持想用索引来生成组合(和原代码逻辑对齐),也可以把索引转换成列名后再处理,比如:

i, j = np.tril_indices(df.shape[1], -1)
for x_idx, y_idx in zip(i, j):
    x_col = df.columns[x_idx]
    y_col = df.columns[y_idx]
    # 后续回归逻辑和上面一致,结果存储到字典即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:23:32