Any Python Library Produces Publication Style Regression Tables Any Python Library Produces Publication Style Regression Tables python python

Any Python Library Produces Publication Style Regression Tables


Well, there is summary_col in statsmodels; it doesn't have all the bells and whistles of estout, but it does have the basic functionality you are looking for (including export to LaTeX):

import statsmodels.api as smfrom statsmodels.iolib.summary2 import summary_colp['const'] = 1reg0 = sm.OLS(p['p0'],p[['const','exmkt','smb','hml']]).fit()reg1 = sm.OLS(p['p2'],p[['const','exmkt','smb','hml']]).fit()reg2 = sm.OLS(p['p4'],p[['const','exmkt','smb','hml']]).fit()print summary_col([reg0,reg1,reg2],stars=True,float_format='%0.2f')===============================         p0       p2      p4   -------------------------------const -1.03*** -0.01   0.62***       (0.11)   (0.04)  (0.07)  exmkt 1.28***  0.97*** 0.98***        (0.02)   (0.01)  (0.01)  smb   0.37***  0.28*** -0.14***      (0.03)   (0.01)  (0.02)  hml   0.77***  0.46*** 0.69***       (0.04)   (0.01)  (0.02)  ===============================Standard errors in parentheses.* p<.1, ** p<.05, ***p<.01

Or here is a version where I add R-Squared and the number of observations:

print summary_col([reg0,reg1,reg2],stars=True,float_format='%0.2f',                  info_dict={'N':lambda x: "{0:d}".format(int(x.nobs)),                             'R2':lambda x: "{:.2f}".format(x.rsquared)})===============================         p0       p2      p4   -------------------------------const -1.03*** -0.01   0.62***       (0.11)   (0.04)  (0.07)  exmkt 1.28***  0.97*** 0.98***       (0.02)   (0.01)  (0.01)  smb   0.37***  0.28*** -0.14***      (0.03)   (0.01)  (0.02)  hml   0.77***  0.46*** 0.69***       (0.04)   (0.01)  (0.02)  R2    0.86     0.95    0.88    N     1044     1044    1044    ===============================Standard errors in parentheses.* p<.1, ** p<.05, ***p<.01

Another example, this time showing the use of the model_names option and regressions where the independent variables vary:

reg3 = sm.OLS(p['p4'],p[['const','exmkt']]).fit()reg4 = sm.OLS(p['p4'],p[['const','exmkt','smb','hml']]).fit()reg5 = sm.OLS(p['p4'],p[['const','exmkt','smb','hml','umd']]).fit()print summary_col([reg3,reg4,reg5],stars=True,float_format='%0.2f',                  model_names=['p4\n(0)','p4\n(1)','p4\n(2)'],                  info_dict={'N':lambda x: "{0:d}".format(int(x.nobs)),                             'R2':lambda x: "{:.2f}".format(x.rsquared)})==============================         p4      p4       p4          (0)     (1)      (2)  ------------------------------const 0.66*** 0.62***  0.15***      (0.10)  (0.07)   (0.04) exmkt 1.10*** 0.98***  1.08***      (0.02)  (0.01)   (0.01) hml           0.69***  0.72***              (0.02)   (0.01) smb           -0.14*** 0.07***              (0.02)   (0.01) umd                    0.46***                       (0.01) R2    0.78    0.88     0.96   N     1044    1044     1044   ==============================Standard errors inparentheses.* p<.1, ** p<.05, ***p<.01

To export to LaTeX use the as_latex method.

I could be wrong but I don't think an option for t-stats instead of standard errors (like in your example) is implemented.


One alternative is Stargazer. To get started quickly, refer to the set of demo tables that Stargazer can produce.

Related posts include: post1 and post2.