解析具有未知列数的 Pandas 数据框以在 statsmodels.api 中使用

Posted

技术标签:

【中文标题】解析具有未知列数的 Pandas 数据框以在 statsmodels.api 中使用【英文标题】:Parsing a Pandas dataframe with an unknown number of columns for use in statsmodels.api 【发布时间】:2016-08-12 23:47:36 【问题描述】:

我想创建一个通用脚本来对多个数据集执行线性回归。每个数据集将具有相同的 y 变量,称为“SM”和未知数量的 x 变量。如果我确切地知道哪些数据将用于回归,我就能够成功地做到这一点。例如:

import pandas
import statsmodels.api as sm
import statsmodels.formula.api as smf
from patsy import dmatrices

data = pandas.read_excel('test.xlsx')

然后,打印数据给出:

print data
             SM  Glass    mag
 SiO2    73.500  77.27   0.00
 TiO2     0.233   0.15   7.37
 Al2O3   11.230  11.49   0.00
 FeO*     4.240   2.85  92.46
 MnO      0.082   0.06   0.00
 MgO      0.040   0.00   0.00
 CaO      0.410   0.22   0.00
 Na2O     5.630   4.58   0.00
 K2O      4.620   3.38   0.00

然后我准备数据框并进行线性回归:

y, X = dmatrices('SM ~ Glass + mag', data=data, return_type='dataframe')
mod = sm.OLS(y, X)
res = mod.fit()
print res.summary()

这一切都很好。但是,我希望能够导入一个列数未知的 excel 文件,这样我就可以做到:

y, X = dmatrices('SM ~ X1 + X2 + X3 + ... Xn', data=data, return_type='dataframe')

我可以解析数据框并提取单个列,但我不知道如何将它们放入进行线性回归所需的公式中。任何建议表示赞赏!

【问题讨论】:

您希望获得什么信息。只是系数? R 方? T 统计数据? 现在,只有 res.summary()。我主要只是想要系数。 如果除'SM' 之外的所有其他列都是您的外生变量,并且您将只进行线性回归(即,它将始终是x1 + x2 + x3... 而永远不会是x1 * x2 + x3...),有一个更简单的方法:endog = df['SM']; exog=df.drop('SM', axis=0); mod = sm.OLS(endog, exog); res = mod.fit(); res.summary()... @Kartik 哦,我知道这是如何工作的。很有帮助,谢谢! 【参考方案1】:

看看这是否有效:

df = pd.DataFrame(np.arange(20).reshape(2, 10), columns=list('abcdefghij'))

formula = ' ~ '.format(df.columns[0], ' + '.join(df.columns[1:]))

formula

'a ~ b + c + d + e + f + g + h + i + j'

【讨论】:

以上是关于解析具有未知列数的 Pandas 数据框以在 statsmodels.api 中使用的主要内容,如果未能解决你的问题,请参考以下文章

pandas - 追加具有不同列数的新行

使用针对未知列数的自定义顺序对pandas中的列进行排序

Python Pandas - 连接两个具有不同行数和列数的数据框

如何将具有未知列数的 ResultSet 映射到 List 并将其显示在 HTML 表中?

当列数事先未知时如何访问 Pandas 数据框列

Pandas:使用多张工作表导入 xlsx,将列添加到每个 df 及其所属工作表的名称,将具有相同列数的 df 连接起来