2013-12-22 8 views
9

Я пытаюсь использовать функцию predict() реализации OLS statsmodels.formula.api. Когда я передаю новый фрейм данных функции для получения прогнозируемых значений для набора данных вне выборки result.predict(newdf), возвращается следующая ошибка: 'DataFrame' object has no attribute 'design_info'. Что это значит и как я могу это исправить? Полный отслеживающий является:Pandas Dataframe AttributeError: объект DataFrame не имеет атрибута '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' 

EDIT: Вот воспроизводимый пример. Ошибка появляется происходит, когда я замариновать, а затем 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

+0

Я добавил полный трафик. Я могу попытаться добавить воспроизводимый пример, если никто не знает, почему эта ошибка обычно возникает. – Michael

+0

Я думаю, нам нужен воспроизводимый пример. Я не вижу причины, почему информация о формуле 'design_info' не существует, но я не полностью понимаю путь кода для этого с взаимодействием с patsy. Вы также можете открыть проблему с помощью statsmodels на github. Это может быть не очень надежным, чтобы поддерживать формулу, связанную с исходным фреймворком данных. – user333700

ответ

14

травления и unpickling из панда в DataFrame не сохранять и восстанавливать атрибуты, которые были насколько я знаю.

Поскольку информация о формуле в настоящее время хранится вместе с DataFrame исходной матрицы проектирования, эта информация теряется после рассыпания экземпляра 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 независимо от dataframe orig_exog.

+0

Я открыл проблему с помощью statsmodels https://github.com/statsmodels/statsmodels/issues/1263 – user333700

+0

Решение 1 создает ту же ошибку в примере кода. Решение 2 дает 'ValueError: матрицы не выравниваются 'снова с образцом кода. – Michael

+0

Я исправил оба примера, в первом забыл добавить 'transform = False', чтобы избежать вызова patsy, во втором примере я просто забыл добавить константу, которую patsy добавляет автоматически. – user333700

Смежные вопросы