使用 Python 和 Pandas 对具有不同列名的 statsmodels.formula 数据使用 predict()
Using predict() on statsmodels.formula data with different column names using Python and Pandas
我从 运行 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
)
如果您将 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])
您可以使用字典:
>>> 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])
我从 运行 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
)
如果您将 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])
您可以使用字典:
>>> 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])