2015-01-14 19 views
6

Chúng tôi đang sử dụng gấu trúc Dataframe làm vùng chứa dữ liệu chính cho dữ liệu chuỗi thời gian của chúng tôi. Chúng tôi gói dataframe vào các đốm màu nhị phân thành một tài liệu mongoDB để lưu trữ cùng với các khóa cho dữ liệu meta về blob chuỗi thời gian.Vấn đề tương thích ngược với Pandas với dưa chuột 0.14.1 và 0.15.2

Chúng tôi gặp phải lỗi khi chúng tôi nâng cấp từ gấu trúc 0,14,1 lên 0,15,2.

Tạo blob nhị phân của gấu trúc Dataframe (0.14.1)

import lz4 
import cPickle 

bd = lz4.compress(cPickle.dumps(df,cPickle.HIGHEST_PROTOCOL)) 

Lỗi Trường hợp: Đọc lại từ MongoDB với gấu trúc 0.15.2

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')) 

Success Trường hợp: Đọc trở lại từ mongoDB với gấu trúc 0,14,1 không có lỗi.

này có vẻ là tương tự như một thread stack cũ Pandas compiled from source: default pickle behavior changed Với một bình luận hữu ích từ https://stackoverflow.com/users/644898/jeff

The error message you are seeing `TypeError: _reconstruct: First argument must be a sub-type of ndarray is that the python default unpickler makes sure that the class hierarchy that was pickled is exactly the same what it is recreating. Since Series has changed between versions this is no longer possible with the default unpickler, (this IMHO is a bug in the way pickle works). In any event, pandas will unpickle pre-0.13 pickles that have Series objects."

Bất kỳ ý tưởng về cách giải quyết hoặc giải pháp?

Để tái tạo lỗi:

Setup trong gấu trúc 0.14.1 env:

df = pd.DataFrame(np.random.randn(10,10)) 
cPickle.dump(df,open("cp0141.p","wb")) 
cPickle.load(open('cp0141.p','r')) # no error 

Tạo lỗi trong gấu trúc 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')) 

Trả lời

6

này được đề cập như explicity lớp Index giờ không còn là lớp con ndarray nhưng đối tượng gấu trúc, hãy xem here .

Bạn chỉ cần sử dụng pd.read_pickle để đọc dưa chua.

+0

+1 !, Điều quan trọng là: Tính năng này hoạt động ngay cả khi dưa không phải là một khung dữ liệu :)! Nó làm việc trong trường hợp của tôi ít nhất, và tôi đã lưu trữ một thư mục chứa các khóa chuỗi và Dataframes làm các giá trị. – ntg

Các vấn đề liên quan