如何将多列对固定列的循环回归结果存储到新DataFrame?
我看你已经搞定了多列和固定列的循环OLS回归,现在就差把每次的关键结果存下来不被覆盖对吧?你的核心思路没问题,但字典的写法有点小问题,导致没法正确存储结果。我给你修正一下代码,顺便说清楚关键点:
修正后的代码实现
首先,我们要把每次回归的结果用键值对字典的形式明确存储,再逐个追加到结果列表里,这样就不会被下一次迭代覆盖:
import pandas as pd import statsmodels.api as sm # 初始化空列表用于存储所有回归结果 WTI_results = [] # 遍历前13列(索引0到12) for i in range(13): # 提取当前列作为因变量,WTI_price作为自变量 y = df_opec.iloc[0:39, i] X = df_opec['WTI_price'] # 注意:如果需要给回归加截距项,把X改成下面这行 # X = sm.add_constant(df_opec['WTI_price']) # 拟合OLS模型 OLSWTI = sm.OLS(y, X).fit() # 构造清晰的结果字典:用明确的键名对应每个指标 result_dict = { '变量名称': df_opec.columns[i], '回归系数': OLSWTI.params.iloc[0], # 加截距后需调整索引为0或1 'R²值': OLSWTI.rsquared, 'P值': OLSWTI.pvalues.iloc[0] } # 将当前结果追加到列表中,避免被下一次循环覆盖 WTI_results.append(result_dict) # 可选:把结果转成DataFrame,方便查看/筛选/导出 results_df = pd.DataFrame(WTI_results) print(results_df)
关键说明
- 字典格式修正:你之前的字典写法
{[df_opec.columns[i]],[OLSWTI.params], ...}是错误的,必须用键: 值的键值对形式,这样每个结果的含义清晰,后续提取也方便。 - 结果持久化:每次循环用
append()把字典加入列表,相当于把每一次的回归结果“存档”,不会被下一次迭代覆盖。 - 截距项处理:如果你的回归需要包含截距,记得用
sm.add_constant()处理自变量,此时params和pvalues会有两个值(截距和系数),你可以根据需求提取对应索引的值。
更灵活的优化方案
如果你的列数不是固定的13,或者想自动排除WTI_price列避免重复回归,可以改成遍历列名的方式:
WTI_results = [] # 遍历除WTI_price外的所有列 for col in df_opec.columns.drop('WTI_price'): y = df_opec.loc[0:38, col] # iloc[0:39]对应行索引0到38,loc写法要匹配 X = df_opec['WTI_price'] OLSWTI = sm.OLS(y, X).fit() result_dict = { '变量名称': col, '回归系数': OLSWTI.params.iloc[0], 'R²值': OLSWTI.rsquared, 'P值': OLSWTI.pvalues.iloc[0] } WTI_results.append(result_dict)
这样就不用硬编码列数,适配更多场景。
内容的提问来源于stack exchange,提问作者fairbear29
相关产品推荐
相关产品推荐

