使用 summary_out 时将回归结果导出为 csv 文件
Export regression results as a csv file when using summary_out
我 运行 使用来自 Yahoo! 的财务数据进行多元回归来自 http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/Data_Library/f-f_factors.html
的金融和 Fama-French 因素
单因素回归:
CAPM = sm.ols( formula = 'Exret ~ MKT', data=m).fit(cov_type='HAC',cov_kwds={'maxlags':1})
三因素回归:
FF3 = sm.ols( formula = 'Exret ~ MKT + SMB + HML',
data=m).fit(cov_type='HAC',cov_kwds={'maxlags':1})
然后我利用 summary_col
创建一个 table 具有显着性的星星:
dfoutput = summary_col([CAPM,FF3],stars=True,float_format='%0.4f',
model_names=['GOOG','GOOG'],info_dict={'N':lambda x: "{0:d}".format(int(x.nobs)),'Adjusted R2':lambda x: "{:.2f}".format(x.rsquared_adj)}, regressor_order = ['Intercept', 'MKT', 'SMB', 'HML'])
输出
dfoutput
Out[311]:
<class 'statsmodels.iolib.summary2.Summary'>
"""
=================================
GOOG I GOOG II
---------------------------------
Intercept -0.0009*** -0.0010***
(0.0003) (0.0003)
MKT 0.0098*** 0.0107***
(0.0003) (0.0003)
SMB -0.0033***
(0.0006)
HML -0.0063***
(0.0006)
N 1930 1930
Adjusted R2 0.37 0.42
=================================
Standard errors in parentheses.
* p<.1, ** p<.05, ***p<.01
我有以下两个问题:
是否可以将括号中的标准误差更改为 t-stats?
是否可以将 summary_col
函数的结果作为 csv
文件导出到 Excel?
可以将括号中的标准误差更改为 t 统计量,但前提是您修改 statsmodel
库中的文件 summary2.py
。
您只需将该文件中的函数 _col_params()
替换为以下版本:
def _col_params(result, float_format='%.4f', stars=True):
'''Stack coefficients and standard errors in single column
'''
# Extract parameters
res = summary_params(result)
# Format float
for col in res.columns[:3]:
res[col] = res[col].apply(lambda x: float_format % x)
# Std.Errors in parentheses
res.ix[:, 2] = '(' + res.ix[:, 2] + ')'
# Significance stars
if stars:
idx = res.ix[:, 3] < .1
res.ix[idx, 0] = res.ix[idx, 0] + '*'
idx = res.ix[:, 3] < .05
res.ix[idx, 0] = res.ix[idx, 0] + '*'
idx = res.ix[:, 3] < .01
res.ix[idx, 0] = res.ix[idx, 0] + '*'
# Stack Coefs and Std.Errors
res = res.ix[:, [0,2]]
res = res.stack()
res = pd.DataFrame(res)
res.columns = [str(result.model.endog_names)]
return res
最好注释掉原始函数(而不是删除它),以便能够根据需要来回切换。
然后您可以按照以下几行进行操作:
import pandas as pd
import statsmodels.api as sm
from statsmodels.iolib.summary2 import summary_col
df = pd.read_stata('http://www.stata-press.com/data/r14/auto.dta')
df['cons'] = 1
Y = df['mpg']
X1 = df[['weight', 'cons']]
X2 = df[['weight', 'price', 'cons']]
X3 = df[['weight', 'price', 'length', 'cons']]
X4 = df[['weight', 'price', 'length', 'displacement', 'cons']]
reg1 = sm.OLS(Y, X1).fit()
reg2 = sm.OLS(Y, X2).fit()
reg3 = sm.OLS(Y, X3).fit()
reg4 = sm.OLS(Y, X4).fit()
results = summary_col([reg1, reg2, reg3, reg4],stars=True,float_format='%0.2f',
model_names=['Model\n(1)', 'Model\n(2)', 'Model\n(3)', 'Model\n(4)'],
info_dict={'N':lambda x: "{0:d}".format(int(x.nobs)),
'R2':lambda x: "{:.2f}".format(x.rsquared)})
显然,结果现在包括 t 统计量而不是标准误差:
print(results)
================================================
Model Model Model Model
(1) (2) (3) (4)
------------------------------------------------
cons 39.44*** 39.44*** 49.68*** 50.02***
(24.44) (24.32) (7.85) (7.80)
displacement 0.00
(0.44)
length -0.10* -0.09
(-1.67) (-1.63)
price -0.00 -0.00 -0.00
(-0.57) (-1.03) (-1.03)
weight -0.01*** -0.01*** -0.00* -0.00*
(-11.60) (-9.42) (-1.72) (-1.67)
N 74 74 74 74
R2 0.65 0.65 0.67 0.67
================================================
Standard errors in parentheses.
* p<.1, ** p<.05, ***p<.01
请注意,您必须手动更改 table 下方的文本以反映更改,除非您准备对源代码进行进一步更改。
完成此步骤后,您可以简单地使用 as_text()
方法获取字符串中的所有内容,并使用 csv
库将其导出到文本文件:
results_text = results.as_text()
import csv
resultFile = open("table.csv",'w')
resultFile.write(results_text)
resultFile.close()
我 运行 使用来自 Yahoo! 的财务数据进行多元回归来自 http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/Data_Library/f-f_factors.html
的金融和 Fama-French 因素单因素回归:
CAPM = sm.ols( formula = 'Exret ~ MKT', data=m).fit(cov_type='HAC',cov_kwds={'maxlags':1})
三因素回归:
FF3 = sm.ols( formula = 'Exret ~ MKT + SMB + HML',
data=m).fit(cov_type='HAC',cov_kwds={'maxlags':1})
然后我利用 summary_col
创建一个 table 具有显着性的星星:
dfoutput = summary_col([CAPM,FF3],stars=True,float_format='%0.4f',
model_names=['GOOG','GOOG'],info_dict={'N':lambda x: "{0:d}".format(int(x.nobs)),'Adjusted R2':lambda x: "{:.2f}".format(x.rsquared_adj)}, regressor_order = ['Intercept', 'MKT', 'SMB', 'HML'])
输出
dfoutput
Out[311]:
<class 'statsmodels.iolib.summary2.Summary'>
"""
=================================
GOOG I GOOG II
---------------------------------
Intercept -0.0009*** -0.0010***
(0.0003) (0.0003)
MKT 0.0098*** 0.0107***
(0.0003) (0.0003)
SMB -0.0033***
(0.0006)
HML -0.0063***
(0.0006)
N 1930 1930
Adjusted R2 0.37 0.42
=================================
Standard errors in parentheses.
* p<.1, ** p<.05, ***p<.01
我有以下两个问题:
是否可以将括号中的标准误差更改为 t-stats?
是否可以将
summary_col
函数的结果作为csv
文件导出到 Excel?
可以将括号中的标准误差更改为 t 统计量,但前提是您修改 statsmodel
库中的文件 summary2.py
。
您只需将该文件中的函数 _col_params()
替换为以下版本:
def _col_params(result, float_format='%.4f', stars=True):
'''Stack coefficients and standard errors in single column
'''
# Extract parameters
res = summary_params(result)
# Format float
for col in res.columns[:3]:
res[col] = res[col].apply(lambda x: float_format % x)
# Std.Errors in parentheses
res.ix[:, 2] = '(' + res.ix[:, 2] + ')'
# Significance stars
if stars:
idx = res.ix[:, 3] < .1
res.ix[idx, 0] = res.ix[idx, 0] + '*'
idx = res.ix[:, 3] < .05
res.ix[idx, 0] = res.ix[idx, 0] + '*'
idx = res.ix[:, 3] < .01
res.ix[idx, 0] = res.ix[idx, 0] + '*'
# Stack Coefs and Std.Errors
res = res.ix[:, [0,2]]
res = res.stack()
res = pd.DataFrame(res)
res.columns = [str(result.model.endog_names)]
return res
最好注释掉原始函数(而不是删除它),以便能够根据需要来回切换。
然后您可以按照以下几行进行操作:
import pandas as pd
import statsmodels.api as sm
from statsmodels.iolib.summary2 import summary_col
df = pd.read_stata('http://www.stata-press.com/data/r14/auto.dta')
df['cons'] = 1
Y = df['mpg']
X1 = df[['weight', 'cons']]
X2 = df[['weight', 'price', 'cons']]
X3 = df[['weight', 'price', 'length', 'cons']]
X4 = df[['weight', 'price', 'length', 'displacement', 'cons']]
reg1 = sm.OLS(Y, X1).fit()
reg2 = sm.OLS(Y, X2).fit()
reg3 = sm.OLS(Y, X3).fit()
reg4 = sm.OLS(Y, X4).fit()
results = summary_col([reg1, reg2, reg3, reg4],stars=True,float_format='%0.2f',
model_names=['Model\n(1)', 'Model\n(2)', 'Model\n(3)', 'Model\n(4)'],
info_dict={'N':lambda x: "{0:d}".format(int(x.nobs)),
'R2':lambda x: "{:.2f}".format(x.rsquared)})
显然,结果现在包括 t 统计量而不是标准误差:
print(results)
================================================
Model Model Model Model
(1) (2) (3) (4)
------------------------------------------------
cons 39.44*** 39.44*** 49.68*** 50.02***
(24.44) (24.32) (7.85) (7.80)
displacement 0.00
(0.44)
length -0.10* -0.09
(-1.67) (-1.63)
price -0.00 -0.00 -0.00
(-0.57) (-1.03) (-1.03)
weight -0.01*** -0.01*** -0.00* -0.00*
(-11.60) (-9.42) (-1.72) (-1.67)
N 74 74 74 74
R2 0.65 0.65 0.67 0.67
================================================
Standard errors in parentheses.
* p<.1, ** p<.05, ***p<.01
请注意,您必须手动更改 table 下方的文本以反映更改,除非您准备对源代码进行进一步更改。
完成此步骤后,您可以简单地使用 as_text()
方法获取字符串中的所有内容,并使用 csv
库将其导出到文本文件:
results_text = results.as_text()
import csv
resultFile = open("table.csv",'w')
resultFile.write(results_text)
resultFile.close()