将OLS回归摘要打印到文本文件

12

我正在使用 pandas.stats.api.ols 进行OLS回归,使用以下代码进行 groupby:

from pandas.stats.api import ols
df=pd.read_csv(r'F:\file.csv')

result=df.groupby(['FID']).apply(lambda d: ols(y=d.loc[:, 'MEAN'], x=d.loc[:, ['Accum_Prcp', 'Accum_HDD']]))
for i in result:
    x=pd.DataFrame({'FID':i.index, 'delete':i.values})
    frame = pd.concat([x,DataFrame(x['delete'].tolist())], axis=1, join='outer')
    del frame['delete']
    print frame

但是这会返回错误:
AttributeError: 'OLS' object has no attribute 'index'

我有大约2000个按组分类的项目,当我打印每一个时,它们看起来像这样:

-

------------------------Summary of Regression Analysis-------------------------

Formula: Y ~ <Accum_Prcp> + <Accum_HDD> + <intercept>

Number of Observations:         79
Number of Degrees of Freedom:   3

R-squared:         0.1242
Adj R-squared:     0.1012

Rmse:              0.1929

F-stat (2, 76):     5.3890, p-value:     0.0065

Degrees of Freedom: model 2, resid 76

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
    Accum_Prcp     0.0009     0.0003       3.28     0.0016     0.0004     0.0015
     Accum_HDD     0.0000     0.0000       1.98     0.0516     0.0000     0.0000
     intercept     0.4750     0.0811       5.86     0.0000     0.3161     0.6340
---------------------------------End of Summary---------------------------------

我希望能够将每个项目导出为csv文件,这样我就可以单独查看它们。


我认为 ols.summary() 实际上是以文本形式输出的,而不是作为 DataFrame。我通常会将其打印到一个或多个文本文件中进行存储。 - Stefan
当我尝试这样做:for i in result: i.to_csv(os.path.join(outpath, i +'.csv') 时,它会返回 AttributeError: 'OLS' object has no attribute 'to_csv' - Stefano Potter
你正在使用哪个OLS例程?是statsmodels吗? - Stefan
我应该澄清一下,我正在使用 pandas.stats.api - Stefano Potter
2个回答

11

statsmodels 0.9开始,Summary类支持将数据导出为多个格式,包括CSV和文本:

import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf

dat = sm.datasets.get_rdataset("Guerry", "HistData").data
results = smf.ols('Lottery ~ Literacy + np.log(Pop1831)', data=dat).fit()

with open('summary.txt', 'w') as fh:
    fh.write(results.summary().as_text())

with open('summary.csv', 'w') as fh:
    fh.write(results.summary().as_csv())
< p > as_csv() 的输出不能被机器读取。使用 repr()results 参数转储会更好。< /p >

4
为了输出pandas.stats.api.olsresult,可以使用文本文件来匹配输出格式,例如:
from pandas.stats.api import ols
grps = df.groupby(['FID'])
for fid, grp in grps:
    result = ols(y=grp.loc[:, 'MEAN'], x=grp.loc[:, ['Accum_Prcp', 'Accum_HDD']])

    text_file = open("Output {}.txt".format(fid), "w")
    text_file.write(result.summary)
    text_file.close()

文件“F:/python codes/OLS_regress.py”,第35行,在<module>中: text_file.write(result) 类型错误:期望字符串或其他字符缓冲区对象 - Stefano Potter
.summary() 添加到 result 中,该对象应该是一个具有该方法的 OLS 对象,该方法进而生成文本输出。请参阅 https://github.com/pydata/pandas/blob/master/pandas/stats/ols.py。 - Stefan
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Stefano Potter
这是一个属性,而不是方法,因此不需要使用 (),请参见更新。 - Stefan
7
对于 statsmodels 的版本 0.8.0,可以使用 result.summary().as_text() 方法。 - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接