Pandas数据框架AttributeError: 'DataFrame'对象没有'design_info'属性。

10

我试图使用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'

编辑: 这里有一个可重现的示例。看起来错误是发生在我对结果对象进行pickle(腌制)和unpickle(解腌)的时候(这是我在实际项目中需要做的):

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

3
请编辑您的问题,并包括一些示例代码以及完整的堆栈跟踪。 - MattDMo
我已经添加了完整的回溯信息。如果没有人知道为什么通常会出现这个错误,我可以尝试添加一个可重现的示例。 - Michael
我认为我们需要一个可重现的例子。我不明白为什么公式信息“design_info”不在那里,但我不完全理解与patsy交互的代码路径。您也可以在GitHub上向statsmodels提出问题。将公式信息附加到原始数据框可能不是非常健壮的方法。 - Josef
添加了一个可重现的例子,似乎与对象的序列化和反序列化有关。 - Michael
有没有其他替代方案来使用公式,或者在反序列化后将公式输入的方法? - Michael
显示剩余4条评论
1个回答

14

据我所知,将pandas DataFrame进行Pickling和unpickling并不能保存和恢复用户附加的属性。

由于公式信息当前存储在原始设计矩阵的DataFrame中,因此在取消pickle化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)
如果公式和设计矩阵包含(有状态的)转换和分类变量,则不可能方便地构建设计矩阵而不需要原始公式信息。在这种情况下,手动构建并明确进行所有计算很困难,并且失去使用公式的所有优势。
唯一真正的解决方法是将公式信息“design_info”独立于数据框“orig_exog”之外存储为pickle文件。

我在statsmodels的GitHub页面上开了一个问题 https://github.com/statsmodels/statsmodels/issues/1263 - Josef
解决方案1在示例代码中产生了相同的错误。解决方案2再次在示例代码中出现“ValueError: matrices are not aligned”。 - Michael
我修复了这两个例子。第一个例子中,我忘记添加transform=False以避免调用patsy。在第二个例子中,我只是忘记添加patsy自动添加的常数。 - Josef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接