如何将多列迭代的OLS回归打印结果转换为Pandas DataFrame?
从OLS迭代输出创建Pandas DataFrame的方法
场景说明
你正在循环对DataFrame中的s1、s2列做基准OLS回归,每次打印回归的系数(params)、t值(tvalues)、p值(pvalues),现在需要把这些零散的输出整合到一个结构化的Pandas DataFrame中,方便后续分析。
最优解决方案:直接从回归结果收集数据(推荐)
不要先打印再转换,直接在循环中收集每个回归的结果,再生成DataFrame,这样更高效且不易出错:
import pandas as pd import statsmodels.api as sm from statsmodels import regression # 初始化空列表存储每个回归的结果 results_list = [] for i in range(2): target_col = f"s{i+1}" # 拟合OLS模型 model = regression.linear_model.OLS( df[[target_col]], sm.add_constant(df[["benchmark"]]) ).fit() # 将当前回归的关键指标整理为字典 result_row = { "目标列": target_col, "常数项系数": model.params["const"], "基准项系数": model.params["benchmark"], "常数项t值": model.tvalues["const"], "基准项t值": model.tvalues["benchmark"], "常数项p值": model.pvalues["const"], "基准项p值": model.pvalues["benchmark"] } results_list.append(result_row) # 转换为DataFrame final_df = pd.DataFrame(results_list) print(final_df)
运行后会得到如下结构化的DataFrame:
| 目标列 | 常数项系数 | 基准项系数 | 常数项t值 | 基准项t值 | 常数项p值 | 基准项p值 |
|---|---|---|---|---|---|---|
| s1 | 0.018959 | 0.770473 | 3.586451 | 8.573976 | 4.329e-04 | 4.732e-15 |
| s2 | 0.018192 | 0.778906 | 3.180102 | 8.009541 | 1.737e-03 | 1.451e-13 |
备选方案:从已打印的文本结果创建DataFrame
如果已经有了打印的文本输出,也可以通过文本解析生成DataFrame:
# 把你的打印结果复制到这个字符串中 output_text = """const 0.018959 benchmark 0.770473 dtype: float64 const 3.586451 benchmark 8.573976 dtype: float64 const 4.329121e-04 benchmark 4.732058e-15 dtype: float64 const 0.018192 benchmark 0.778906 dtype: float64 const 3.180102 benchmark 8.009541 dtype: float64 const 1.736846e-03 benchmark 1.450519e-13 dtype: float64""" # 清理文本:去掉dtype行,保留有效数据 clean_lines = [line.strip() for line in output_text.split("\n") if not line.startswith("dtype")] # 每6行对应一个回归的params、tvalues、pvalues(每组2行,共3组) parsed_data = [] for idx in range(0, len(clean_lines), 6): parsed_data.append({ "目标列": f"s{(idx//6)+1}", "常数项系数": float(clean_lines[idx].split()[-1]), "基准项系数": float(clean_lines[idx+1].split()[-1]), "常数项t值": float(clean_lines[idx+2].split()[-1]), "基准项t值": float(clean_lines[idx+3].split()[-1]), "常数项p值": float(clean_lines[idx+4].split()[-1]), "基准项p值": float(clean_lines[idx+5].split()[-1]) }) final_df = pd.DataFrame(parsed_data) print(final_df)
相关参考资料
- Pandas官方文档中
pd.DataFrame()的用法说明,涵盖从字典列表、Series等多种数据源创建DataFrame的方法 - Statsmodels官方文档中
RegressionResults对象的属性说明,包括params、tvalues、pvalues等回归结果属性的详细介绍
内容的提问来源于stack exchange,提问作者stvlam22
相关产品推荐
相关产品推荐

