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

kuz*_*roo 5 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()
Run Code Online (Sandbox Code Playgroud)

我想将模型应用于 column c,但天真地尝试这样做是行不通的:

fit.predict(example_df["c"])
Run Code Online (Sandbox Code Playgroud)

这是我得到的例外:

PatsyError: Error evaluating factor: NameError: name 'b' is not defined
    a ~ b
        ^
Run Code Online (Sandbox Code Playgroud)

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

example_df2 = pd.DataFrame(example_df["c"])
example_df2.columns = ["b"]
fit.predict(example_df2)
Run Code Online (Sandbox Code Playgroud)

有没有更干净的方法来做到这一点?(短切换到statsmodels.api而不是statsmodels.formula.api

Jos*_*sef 4

您可以使用字典:

>>> 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])
Run Code Online (Sandbox Code Playgroud)

或者为预测创建一个 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])
Run Code Online (Sandbox Code Playgroud)