我刚从源代码编译并安装了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'
我有相当大的代码依赖于这个崩溃了。有没有快速的解决方法?如何再次获得默认的泡菜行为?
任何帮助表示赞赏
修改
我意识到我愿意解开的是一个包含两个DataFrames
的词组列表。这就是大熊猫发挥作用的地方。
我通过@Jeff github.com/pydata/pandas/pull/5661应用了补丁。 另一个错误(可能与this相关)显示出来。
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))并且它们具有一些非平凡的依赖性。
答案 0 :(得分:17)
Master刚刚更新了issue。
此文件只需通过以下方式阅读:
result = pd.read_pickle('pickle_L1cor_s1.pic')
被腌制的对象是pandas&lt; = 0.12版本。这需要一个自定义的unpickler,其中
0.13 / master(即将发布)句柄。 0.13看到了Series继承层次结构的重构,其中Series不再是ndarray
的子类,而是NDFrame
的子类,DataFrame
和Panel
的基类。这样做有很多原因,主要是为了提高代码的一致性。有关更完整的说明,请参阅here。
您看到的错误消息`TypeError: _reconstruct: First argument must be a sub-type of ndarray
是python默认的unpickler确保被pickle的类层次结构与它重新创建的完全相同。由于系列版本在版本之间发生了变化,因此默认的unpickler不再可能这样做了(这个恕我直言是pickle工作方式的一个错误)。无论如何,大熊猫会破坏具有Series对象的0.13之前的泡菜。