我正在尝试使用OLS实现的predict()
功能statsmodels.formula.api
.当我将新数据帧传递给函数以获取样本外数据集的预测值时,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
Josef.. 14
据我所知,pandas DataFrame的pickling和unpickling不会保存和恢复用户附加的属性.
由于公式信息当前与原始设计矩阵的DataFrame一起存储,因此在取消对结果和模型实例的取消后,此信息将丢失.
如果不使用分类变量和转换,则可以使用patsy.dmatrix构建正确的designmatrix.我认为以下内容应该有效
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
.
据我所知,pandas DataFrame的pickling和unpickling不会保存和恢复用户附加的属性.
由于公式信息当前与原始设计矩阵的DataFrame一起存储,因此在取消对结果和模型实例的取消后,此信息将丢失.
如果不使用分类变量和转换,则可以使用patsy.dmatrix构建正确的designmatrix.我认为以下内容应该有效
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
.