Pandas скомпилировано из источника: поведение по умолчанию по умолчанию изменено

Я только что скомпилировал и установил pandas из источника (клонированный github repo, >>> setup.py install).

Случилось так, что поведение по умолчанию модуля pickle для сериализации/десериализации объектов изменилось, вероятно, частично переопределено внутренними модулями pandas.

У меня есть несколько классов данных, сериализованных через "стандартный" pickle, который, по-видимому, я больше не могу десериализовать; в частности, когда я пытаюсь десериализовать файл класса (безусловно, работает), я получаю эту ошибку

In [1]: import pickle

In [2]: pickle.load(open('pickle_L1cor_s1.pic','rb'))
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-2-88719f8f9506> in <module>()
----> 1 pickle.load(open('pickle_L1cor_s1.pic','rb'))

/home/acorbe/Canopy/appdata/canopy-1.1.0.1371.rh5-x86_64/lib/python2.7/pickle.pyc in load(file)
   1376
   1377 def load(file):
-> 1378     return Unpickler(file).load()
   1379
   1380 def loads(str):

/home/acorbe/Canopy/appdata/canopy-1.1.0.1371.rh5-x86_64/lib/python2.7/pickle.pyc in load(self)
    856             while 1:
    857                 key = read(1)
--> 858                 dispatch[key](self)
    859         except _Stop, stopinst:
    860             return stopinst.value

/home/acorbe/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas-0.12.0_1090_g46008ec-py2.7-linux-x86_64.egg/pandas/compat/pickle_compat.pyc in load_reduce(self)
     28
     29         # try to reencode the arguments
---> 30         if self.encoding is not None:
     31             args = tuple([ arg.encode(self.encoding) if isinstance(arg, string_types)     else arg for arg in args ])
     32             try:

AttributeError: Unpickler instance has no attribute 'encoding'

У меня есть довольно большой код, основанный на этом, который сломался. Есть ли быстрое решение? Как я могу снова получить поведение по умолчанию по умолчанию?

любая помощь оценена


EDIT:

Я понял, что то, что я готов раскрыть, - это список dicts, который включает пару DataFrames каждый. Это где pandas вступает в игру.

Я применил патч @Jeff github.com/pydata/pandas/pull/5661. Появилась другая ошибка (возможно, связанная с этим).

In [4]: pickle.load(open('pickle_L1cor_s1.pic','rb'))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-88719f8f9506> in <module>()
----> 1 pickle.load(open('pickle_L1cor_s1.pic','rb'))

/home/acorbe/Canopy/appdata/canopy-1.1.0.1371.rh5-x86_64/lib/python2.7/pickle.pyc in load(file)
   1376
   1377 def load(file):
-> 1378     return Unpickler(file).load()
   1379
   1380 def loads(str):

/home/acorbe/Canopy/appdata/canopy-1.1.0.1371.rh5-x86_64/lib/python2.7/pickle.pyc in load(self)
    856             while 1:
    857                 key = read(1)
--> 858                 dispatch[key](self)
    859         except _Stop, stopinst:
    860             return stopinst.value

/home/acorbe/Canopy/appdata/canopy-1.1.0.1371.rh5-x86_64/lib/python2.7/pickle.pyc in             load_reduce(self)
   1131         args = stack.pop()
   1132         func = stack[-1]
-> 1133         value = func(*args)
   1134         stack[-1] = value
   1135     dispatch[REDUCE] = load_reduce

TypeError: _reconstruct: First argument must be a sub-type of ndarray

Pandas версия закодированных данных (из диспетчера пакетов Canopy)

Size: 7.32 MB
Version: 0.12.0
Build: 2
Dependencies:
 numpy 1.7.1
 python_dateutil
 pytz 2011n

  md5: 7dd4385bed058e6ac15b0841b312ae35

Я не уверен, что могу предоставить минимальный пример файлов, которые я пытаюсь раскрыть. Они довольно большие (O (100MB)), и у них есть некоторые нетривиальные зависимости.

Ответ 1

Мастер только что был обновлен этой проблемой.

Этот файл можно прочитать просто:

 result = pd.read_pickle('pickle_L1cor_s1.pic')

Объекты, которые маринуются, pandas <= 0.12 версии. Для этого нужен пользовательский неуправляемый, который ручка 0.13/master (короткое замыкание). 0.13 видел рефактор иерархии наследования серии, где Series больше не является подклассом ndarray, а теперь NDFrame, тем же базовым классом DataFrame и Panel. Это было сделано по многим причинам, главным образом для обеспечения согласованности кода. Подробнее см. здесь.

Сообщение об ошибке, которое вы видите `TypeError: _reconstruct: First argument must be a sub-type of ndarray, состоит в том, что pickon default unpickler гарантирует, что иерархия классов, которая была маринована, точно такая же, как и для воссоздания. Поскольку серия изменилась между версиями, это становится невозможным с неиспользуемым по умолчанию (этот IMHO является ошибкой в ​​том, как работает рассол). В любом случае pandas будет рассыпать до 0.13 соленья, у которых есть объекты серии.