使用Python和Pandas对不同列名的statsmodels.formula数据使用predict()

时间:2015-03-12 20:58:34

标签: python numpy pandas statsmodels

我通过运行statsmodels.formula.api.ols获得了一些回归结果。这是一个玩具示例:

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf

example_df = pd.DataFrame(np.random.randn(10, 3))
example_df.columns = ["a", "b", "c"]
fit = smf.ols('a ~ b', example_df).fit()

我想将模型应用于c列,但是这样做的天真尝试并不起作用:

fit.predict(example_df["c"])

这是我得到的例外:

PatsyError: Error evaluating factor: NameError: name 'b' is not defined
    a ~ b
        ^

我可以做一些事情并创建一个新的临时DataFrame,我在其中重命名感兴趣的列:

example_df2 = pd.DataFrame(example_df["c"])
example_df2.columns = ["b"]
fit.predict(example_df2)

有更清洁的方法吗? (没有切换到statsmodels.api而不是statsmodels.formula.api

2 个答案:

答案 0 :(得分:3)

您可以使用字典:

>>> fit.predict({"b": example_df["c"]})
array([ 0.84770672, -0.35968269,  1.19592387, -0.77487812, -0.98805215,
        0.90584753, -0.15258093,  1.53721494, -0.26973941,  1.23996892])

或为预测创建一个numpy数组,尽管如果存在明确的解释变量则会更加复杂:

>>> fit.predict(sm.add_constant(example_df["c"].values), transform=False)
array([ 0.84770672, -0.35968269,  1.19592387, -0.77487812, -0.98805215,
        0.90584753, -0.15258093,  1.53721494, -0.26973941,  1.23996892])

答案 1 :(得分:1)

如果您用此行替换fit定义:

fit = smf.ols('example_df.a ~ example_df.b', example_df).fit()

它应该有用。

fit.predict(example_df["c"])

array([-0.52664491, -0.53174346, -0.52172484, -0.52819856, -0.5253607 ,
       -0.52391618, -0.52800043, -0.53350634, -0.52362988, -0.52520823])