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
相关产品推荐
相关产品推荐

