3

假设我有一个pandas数据框:

df = pd.DataFrame({'x1': [0, 1, 2, 3, 4], 
                   'x2': [10, 9, 8, 7, 6], 
                   'x3': [.1, .1, .2, 4, 8], 
                   'y': [17, 18, 19, 20, 21]})

现在我statsmodels使用公式(patsy在引擎盖下使用)拟合模型:

import statsmodels.formula.api as smf
fit = smf.ols(formula='y ~ x1:x2', data=df).fit()

我想要的是一个依赖列的列表dffit以便我可以fit.predict()在另一个数据集上使用。list(fit.params.index)例如,如果我尝试,我会得到:

['Intercept', 'x1:x2']

我已经尝试重新创建 patsy 设计矩阵并使用design_info,但我仍然只能得到x1:x2. 我想要的是:

['x1', 'x2']

甚至:

['Intercept', 'x1', 'x2']

我怎样才能从fit对象中得到这个?

4

3 回答 3

3

只需测试列名是否出现在公式的字符串表示中:

ols = smf.ols(formula='y ~ x1:x2', data=df)
fit = ols.fit()

print([c for c in df.columns if c in ols.formula])
['x1', 'x2', 'y']

还有另一种方法是重建 patsy 模型(更详细,但也更可靠),它不依赖于原始数据帧:

md = patsy.ModelDesc.from_formula(ols.formula)
termlist = md.rhs_termlist + md.lhs_termlist

factors = []
for term in termlist:
    for factor in term.factors:
        factors.append(factor.name())

print(factors)
['x1', 'x2', 'y']
于 2017-04-12T20:10:09.383 回答
0

predict采用相同结构的数据框或字典,调用 patsy 以兼容的方式对其进行转换。要复制这一点,您还可以检查statsmodels.base.model.Results.predict其核心中的代码

exog = dmatrix(self.model.data.design_info.builder,
                           exog, return_type="dataframe")

公式信息本身存储在 in 的描述termsdesign_info。变量名称本身summary()在返回的 pandas Series 中用作索引,例如在results.params.

于 2017-04-12T19:58:07.667 回答
0

ols.exog_names并且ols.endog_names应该这样做

于 2020-06-02T19:36:48.453 回答