从源代码编译的Pandas:默认的pickle行为发生了变化

Aco*_*rbe 12 python pickle 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'
Run Code Online (Sandbox Code Playgroud)

我有相当大的代码依赖于这个崩溃了.有没有快速的解决方法?如何再次获得默认的泡菜行为?

任何帮助赞赏


编辑:

我意识到我愿意解开的是一系列包括DataFrames每个都包括的几个.这就是大熊猫发挥作用的地方.

我通过@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
Run Code Online (Sandbox Code Playgroud)

Pandas版本的编码数据是(来自Canopy包管理器)

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

  md5: 7dd4385bed058e6ac15b0841b312ae35
Run Code Online (Sandbox Code Playgroud)

我不确定我能提供我试图取消的文件的最小示例.它们非常大(O(100MB))并且它们具有一些非平凡的依赖性.

Jef*_*eff 17

Master已经被这个问题更新了.

该文件只需通过以下方式阅读:

 result = pd.read_pickle('pickle_L1cor_s1.pic')
Run Code Online (Sandbox Code Playgroud)

被腌制的对象是pandas <= 0.12版本.这需要一个自定义的unpickler,0.13/master(即将发布)处理.0.13只见系列继承层次,其中系列不再是子类的重构ndarray,但现在NDFrame,同一个基类的DataFramePanel.这样做有很多原因,主要是为了提高代码的一致性.有关更完整的说明,请参见此处.

您看到的错误消息`TypeError: _reconstruct: First argument must be a sub-type of ndarray是python默认的unpickler确保被pickle的类层次结构与它重新创建的完全相同.由于系列版本在版本之间发生了变化,因此默认的unpickler不再可能这样做了(这个恕我直言是pickle工作方式的一个错误).无论如何,大熊猫会破坏具有Seri​​es对象的0.13之前的泡菜.