如何将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




