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

Statsmodel Formula API中如何用变量替代列名构造回归公式

问题场景

你持有存储了目标数据表列名列表的变量cols,需要遍历列表内的不同列,对数据表批量执行回归分析。使用Statsmodel Formula API(Patsy)构造公式时,初始编写的代码如下:

model = smf.ols(formula="Annual_Sales ~ Q('cols')", data=df).fit()

这段代码运行报错的核心原因是公式中直接传入了字符串字面量cols,对应的数据表中不存在名为cols的字段。由于待分析列共150个,无法手动逐一输入列名,需要优先通过for循环实现批量回归逻辑。

可行实现方案

核心逻辑是遍历cols列表时,动态拼接每个列名生成符合Patsy解析规则的公式字符串,再逐个传入模型完成拟合。

  • 单变量批量一元回归
    如果你的需求是每个自变量单独和因变量Annual_Sales做一元线性回归,直接用f-string动态拼接公式即可。对包含空格、特殊符号、数字开头等不符合Python变量名规则的列名,用Q()包裹做转义,避免公式解析报错:
import statsmodels.formula.api as smf

# 存储所有拟合完成的模型,键为对应列名,值为模型拟合结果
model_dict = {}

for col in cols:
    # 动态拼接当前列对应的回归公式
    current_formula = f"Annual_Sales ~ Q('{col}')"
    fitted_model = smf.ols(formula=current_formula, data=df).fit()
    model_dict[col] = fitted_model

# 按需提取回归结果,比如遍历输出所有模型的摘要
for col_name, model_res in model_dict.items():
    print(f"===== 自变量【{col_name}】回归结果 =====")
    print(model_res.summary())
  • 全变量多元回归
    如果你的需求是把cols内的所有列同时作为自变量,拟合一个多元线性回归模型,不需要写循环,直接把所有列名拼接为公式右侧的字符串即可:
# 拼接所有自变量,用+连接,Q()处理特殊列名
formula_rhs = " + ".join([f"Q('{col}')" for col in cols])
full_formula = f"Annual_Sales ~ {formula_rhs}"
full_model = smf.ols(formula=full_formula, data=df).fit()
print(full_model.summary())

提示:如果你的列名全部是合法Python变量名(无空格、无特殊符号、非数字开头),可以省略Q()包裹逻辑,直接拼接列名即可,公式写法更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:36:20