gpt4 book ai didi

python - 从源代码 : default pickle behavior changed 编译的 Pandas

转载 作者:太空狗 更新时间:2023-10-29 17:44:06 25 4
gpt4 key购买 nike

我刚刚从源代码(克隆的 github 存储库,>>> setup.py install)编译并安装了 pandas。

碰巧模块 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'

我有相当大的代码依赖于它崩溃了。有什么快速解决方法吗?我怎样才能再次获得默认的 pickle 行为?

感谢任何帮助


编辑:

我意识到我愿意解开的是一个字典列表,每个字典包含几个 DataFrames。这就是 Pandas 发挥作用的地方。

我应用了@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)),并且有一些重要的依赖关系。

最佳答案

大师刚刚被这个issue更新了.

此文件仅供以下人员阅读:

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

被 pickle 的对象是 pandas <= 0.12 版本。这需要一个自定义的 unpickler,它0.13/master(即将发布)句柄。 0.13 看到了 Series 继承层次结构的重构,其中 Series 不再是 ndarray 的子类,而是 NDFrame 的子类,与 DataFrame< 的基类相同面板。这样做有很多原因,主要是为了促进代码的一致性。参见 here以获得更完整的描述。

您看到的错误消息 `TypeError: _reconstruct: First argument must be a sub-type of ndarray 是 python 默认 unpickler 确保被 pickle 的类层次结构完全相同它正在重建什么。由于系列在版本之间发生了变化,这不再可能使用默认的 unpickler,(恕我直言,这是 pickle 工作方式中的一个错误)。在任何情况下,pandas 都会解开具有 Series 对象的 pre-0.13 pickle。

关于python - 从源代码 : default pickle behavior changed 编译的 Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20444593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com