【发布时间】:2015-01-14 19:35:35
【问题描述】:
我们使用 pandas Dataframe 作为我们的时间序列数据的主要数据容器。我们将数据帧打包成二进制 blob 到一个 mongoDB 文档中用于存储,以及有关时间序列 blob 的元数据的键。
我们从 pandas 0.14.1 升级到 0.15.2 时遇到了错误。
创建 pandas Dataframe (0.14.1) 的二进制 blob
import lz4
import cPickle
bd = lz4.compress(cPickle.dumps(df,cPickle.HIGHEST_PROTOCOL))
错误案例:使用 pandas 0.15.2 从 mongoDB 回读
cPickle.loads(lz4.decompress(bd))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-37-76f7b0b41426> in <module>()
----> 1 cPickle.loads(lz4.decompress(bd))
TypeError: ('_reconstruct: First argument must be a sub-type of ndarray', <built-in function _reconstruct>, (<class 'pandas.core.index.Index'>, (0,), 'b'))
成功案例:使用 pandas 0.14.1 从 mongoDB 回读,没有错误。
这似乎类似于旧堆栈线程Pandas compiled from source: default pickle behavior changed 来自https://stackoverflow.com/users/644898/jeff 的有用评论
您看到的错误消息 `TypeError: _reconstruct: First argument 必须是ndarray的子类型就是python默认的unpickler 确保被腌制的类层次结构正是 和它正在重建的一样。由于系列在版本之间发生了变化 这对于默认的 unpickler 不再可能,(恕我直言,这是 泡菜工作方式的错误)。无论如何,熊猫都会解开 具有 Series 对象的 pre-0.13 泡菜。”
关于变通方法或解决方案的任何想法?
重现错误:
pandas 0.14.1 环境中的设置:
df = pd.DataFrame(np.random.randn(10,10))
cPickle.dump(df,open("cp0141.p","wb"))
cPickle.load(open('cp0141.p','r')) # no error
在 pandas 0.15.2 env 中创建错误:
cPickle.load(open('cp0141.p','r'))
TypeError: ('_reconstruct: First argument must be a sub-type of ndarray', <built-in function_reconstruct>, (<class 'pandas.core.index.Int64Index'>, (0,), 'b'))
【问题讨论】:
标签: python mongodb pandas pickle