【问题标题】:Pandas Dataframe AttributeError: 'DataFrame' object has no attribute 'design_info'Pandas Dataframe AttributeError:“DataFrame”对象没有属性“design_info”
【发布时间】:2014-01-10 13:44:55
【问题描述】:

我正在尝试使用statsmodels.formula.api OLS 实现的predict() 函数。当我将新数据框传递给函数以获取样本外数据集result.predict(newdf) 的预测值时,返回以下错误:'DataFrame' object has no attribute 'design_info'。这是什么意思,我该如何解决?完整的回溯是:

    p = result.predict(newdf)
  File "C:\Python27\lib\site-packages\statsmodels\base\model.py", line 878, in predict
    exog = dmatrix(self.model.data.orig_exog.design_info.builder,
  File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 2088, in __getattr__
    (type(self).__name__, name))
AttributeError: 'DataFrame' object has no attribute 'design_info'

编辑:这是一个可重现的例子。当我腌制然后取消腌制结果对象时似乎会发生错误(我需要在我的实际项目中这样做):

import cPickle
import pandas as pd
import numpy as np
import statsmodels.formula.api as sm

df = pd.DataFrame({"A": [10,20,30,324,2353], "B": [20, 30, 10, 1, 2332], "C": [0, -30, 120, 11, 2]})

result = sm.ols(formula="A ~ B + C", data=df).fit()
print result.summary()

test1 = result.predict(df) #works

f_myfile = open('resultobject', "wb")
cPickle.dump(result, f_myfile, 2)
f_myfile.close()
print("Result Object Saved")


f_myfile = open('resultobject', "rb")
model = cPickle.load(f_myfile)

test2 = model.predict(df) #produces error

【问题讨论】:

  • 请编辑您的问题并包含一些示例代码以及完整的堆栈跟踪。
  • 我已经添加了完整的回溯。如果没有人知道为什么通常会发生此错误,我可以尝试添加一个可重现的示例。
  • 我认为我们需要一个可重现的例子。我看不出公式信息design_info 不存在的原因,但我不完全理解与 patsy 交互的代码路径。你也可以在 github 上打开一个关于 statsmodels 的问题。将公式信息附加到原始数据帧可能不是很可靠。
  • 添加了一个可重现的示例,似乎与对象的酸洗和脱酸有关。
  • 是的,我正在考虑将其作为可能的候选人。如果我们只想在 unpickling 之后进行预测,也可以在 pickling 之前删除数据,这也会导致同样的问题。我的猜测是,当使用公式时,statsmodels 没有任何用于酸洗的单元测试。

标签: python pandas scipy pickle statsmodels


【解决方案1】:

据我所知,pandas DataFrame 的腌制和取消腌制不会保存和恢复用户附加的属性。

由于公式信息当前与原始设计矩阵的 DataFrame 一起存储,因此在 unpickling Results 和 Model 实例后,此信息会丢失。

如果您不使用分类变量和转换,则可以使用 patsy.dmatrix 构建正确的设计矩阵。我认为以下应该有效

x = patsy.dmatrix("B + C", data=df)  # df is data for prediction
test2 = model.predict(x, transform=False)

或者直接为预测构建设计矩阵也应该有效注意,我们需要显式添加一个公式默认添加的常数。

from statsmodels.api import add_constant
test2 = model.predict(add_constant(df[["B", "C"]]), transform=False)

如果公式和设计矩阵包含(有状态的)变换和分类变量,那么没有原始公式信息就无法方便地构造设计矩阵。在这种情况下,手动构建它并明确地进行所有计算是很困难的,并且失去了使用公式的所有优势。

唯一真正的解决方案是独立于数据框orig_exog 腌制公式信息design_info

【讨论】:

  • 我打开了一个关于 statsmodels github.com/statsmodels/statsmodels/issues/1263的问题
  • 解决方案 1 在示例代码中产生相同的错误。解决方案 2 再次使用示例代码提供 ValueError: matrices are not aligned
  • 我修复了这两个示例,在第一个示例中我忘记添加 transform=False 以避免调用 patsy,在第二个示例中我只是忘记添加 patsy 自动添加的常量。
猜你喜欢
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2013-10-23
  • 2017-01-24
  • 2018-10-10
  • 2019-08-18
  • 2021-01-20
相关资源
最近更新 更多