2015-01-14 16 views
6

ile geriye dönük uyumluluk sorunu Pandalar zaman serileri verisi için birincil veri kabımız olarak Dataframe kullanıyoruz. Veri dizisini, zaman bloğu blobuna ilişkin meta veriler için tuşlarla birlikte depolamak için bir mongoDB belgesine ikili bloklara alıyoruz.Turşu 0.14.1 ve 0.15.2

0.14.1'den 0.15.2'ye kadar pandalardan yükseltdiğimizde bir hatayla karşılaştık.

pandalar binary blob Dataframe (0.14.1)

import lz4 
import cPickle 

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

Hata Vaka oluşturun: pandalar 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')) 

Başarı Örneği ile mongodb geri Oku: Okuma hiçbir hata ile pandalar 0.14.1 ile mongoDB dan geri.

Bu 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."

çözüm veya çözümler üzerinde herhangi bir fikir gelen bir yardımcı açıklama ile eski yığın iplik Pandas compiled from source: default pickle behavior changed benzer gibi görünüyor?

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

pandalar içinde 0.15.2 env hatayı oluştur:

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

cevap

6

Bu explicity olarak bahsedildi 0.14.1 env pandalar içinde

Kurulumu:

hatayı yeniden oluşturun Index sınıfı artık artık ndarray alt sınıflarına değil, bir panda nesnesi, bkz. here .

Turşu okumak için pd.read_pickle kullanmanız yeterlidir.

+0

+1 !, Önemli olan: Turşu bir dataframe olmadığı zaman bile bu çalışır :)! En azından benim durumumda çalıştı ve dize anahtarları ve Datafram'ları içeren bir dizini değerler olarak sakladım. – ntg

İlgili konular