You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将statsmodels中的回归表导出至Word文档

如何将statsmodels中的回归表导出至Word文档

我太懂你这种要批量处理回归表导出的需求了——手动复制HTML到Word再调整格式,重复几十次真的会崩溃!下面给你几个可以完全自动化的方案,直接用代码把statsmodels的回归结果生成格式工整的Word表格,不用再手动改了。

方案一:结合Stargazer + python-docx(适配你已用的工具)

你已经熟悉Stargazer的自定义功能,那可以用它生成HTML表格,再通过python-docx直接把HTML表格插入到Word文档里,全程代码自动化,不用手动复制。

首先需要安装依赖包:

pip install stargazer python-docx beautifulsoup4

结合你提供的模型示例,具体代码如下:

import statsmodels.api as sm
import numpy as np
import pandas as pd
from stargazer.stargazer import Stargazer
from docx import Document
from bs4 import BeautifulSoup

# 你的数据和模型代码
np.random.seed(123)
data = pd.DataFrame({
    'X1': np.random.randn(100),
    'X2': np.random.randn(100),
    'Y': np.random.randint(0, 2, 100)
})

model = sm.Logit(data['Y'], sm.add_constant(data[['X1', 'X2']])).fit()

# 用Stargazer生成HTML格式的回归表
stargazer = Stargazer([model])
# 自定义表格样式:添加标题、调整显著性标记等
stargazer.title("Logistic Regression Results")
stargazer.significance_levels([0.01, 0.05, 0.1])  # 自定义显著性水平标记
html_table = stargazer.render_html()

# 解析HTML表格,插入到Word文档
doc = Document()
doc.add_heading("回归分析结果", level=1)

# 用BeautifulSoup解析HTML
soup = BeautifulSoup(html_table, 'html.parser')
table = soup.find('table')

# 将HTML表格转换为Word表格
word_table = doc.add_table(rows=0, cols=len(table.find_all('th')))
word_table.style = 'Table Grid'  # 给表格添加边框,更美观

# 添加表头
hdr_cells = word_table.add_row().cells
for i, th in enumerate(table.find_all('th')):
    hdr_cells[i].text = th.get_text(strip=True)

# 添加表格内容
for row in table.find_all('tr')[1:]:
    row_cells = word_table.add_row().cells
    for i, td in enumerate(row.find_all('td')):
        row_cells[i].text = td.get_text(strip=True)

# 保存Word文档
doc.save("回归结果表.docx")

这样生成的Word表格自带边框,格式和Stargazer生成的HTML完全一致,不用手动调整。如果有多个模型,直接把模型列表传给Stargazer就行(比如Stargazer([model1, model2, model3])),一次性导出多模型对比表。

方案二:直接用python-docx构建自定义表格(适合高度定制)

如果你不想依赖Stargazer,也可以直接从statsmodels的结果里提取系数、p值、对数似然值等指标,手动构建Word表格,完全掌控每一个细节。

示例代码:

import statsmodels.api as sm
import numpy as np
import pandas as pd
from docx import Document
from docx.shared import Pt
from docx.enum.table import WD_ALIGN_VERTICAL

# 你的数据和模型
np.random.seed(123)
data = pd.DataFrame({
    'X1': np.random.randn(100),
    'X2': np.random.randn(100),
    'Y': np.random.randint(0, 2, 100)
})

model = sm.Logit(data['Y'], sm.add_constant(data[['X1', 'X2']])).fit()

# 提取模型结果的关键指标
coef = model.params
se = model.bse
p_values = model.pvalues
odds_ratios = np.exp(coef)  # Logit模型的优势比
n_obs = model.nobs
llf = model.llf

# 创建Word文档
doc = Document()
doc.add_heading("Logistic Regression Custom Table", level=1)

# 创建表格:列名是变量、系数、标准误、P值、优势比
table = doc.add_table(rows=1, cols=5)
table.style = 'Table Grid'
hdr_cells = table.rows[0].cells
hdr_texts = ["变量", "系数", "标准误", "P值", "优势比"]
for i, text in enumerate(hdr_texts):
    hdr_cells[i].text = text
    # 设置表头格式:居中+加粗
    hdr_cells[i].paragraphs[0].alignment = WD_ALIGN_VERTICAL.CENTER
    hdr_cells[i].paragraphs[0].runs[0].font.bold = True

# 添加变量行
variables = ['常数项', 'X1', 'X2']
for var_name in variables:
    row_cells = table.add_row().cells
    row_cells[0].text = var_name
    row_cells[1].text = f"{coef[var_name]:.4f}"
    row_cells[2].text = f"{se[var_name]:.4f}"
    row_cells[3].text = f"{p_values[var_name]:.4f}"
    row_cells[4].text = f"{odds_ratios[var_name]:.4f}"

# 添加模型统计信息行
stats_row = table.add_row().cells
stats_row[0].text = "观测数"
stats_row[1].text = f"{int(n_obs)}"
stats_row[2].text = "对数似然值"
stats_row[3].text = f"{llf:.4f}"
# 合并单元格优化显示
stats_row[0].merge(stats_row[1])
stats_row[2].merge(stats_row[3])
stats_row[4].text = ""

# 设置表格字体大小
for row in table.rows:
    for cell in row.cells:
        for paragraph in cell.paragraphs:
            for run in paragraph.runs:
                run.font.size = Pt(10)

# 保存文档
doc.save("自定义回归结果表.docx")

这个方案适合你需要完全自定义表格结构、添加额外统计量的场景,格式完全由你控制。

方案三:用Pandas导出表格再导入Word(简单快捷)

如果你的需求没那么复杂,也可以把模型结果转换成Pandas DataFrame,导出为Excel后直接复制到Word,或者用python-docx导入Excel表格,胜在操作简单。

示例代码:

# 提取模型结果到DataFrame
results_df = pd.DataFrame({
    '系数': model.params,
    '标准误': model.bse,
    'P值': model.pvalues
})

# 导出为Excel
results_df.to_excel("回归结果.xlsx")

如果有大量模型要批量处理,只需要把模型放在一个列表里,循环执行上述代码即可,比如:

models = [model1, model2, model3]
for idx, mod in enumerate(models):
    # 生成对应表格并保存到同一个Word文档或者单独文档
    ...

备注:内容来源于stack exchange,提问作者EmilA

火山引擎 最新活动