Pandas Abwärtskompatibilitätsproblem mit Pickle 0.14.1 und 0.15.2

Wir verwenden pandas Dataframe als primären Datencontainer für unsere Zeitreihendaten. Wir packen den Datenrahmen in binäre Blobs in ein MongoDB-Dokument zum Speichern zusammen mit Schlüsseln für Metadaten zum Zeitreihen-Blob.

Beim Upgrade von Pandas 0.14.1 auf 0.15.2 ist ein Fehler aufgetreten.

Binären Blob von Pandas Dataframe (0.14.1) erstellen

import lz4   
import cPickle

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

Error Case: Mit pandas 0.15.2 von mongoDB zurücklesen

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

Erfolgsfall: Mit Pandas 0.14.1 ohne Fehler aus MongoDB zurücklesen.

Dies scheint einem alten Stack-Thread zu ähnelnPandas aus der Quelle kompiliert: Standard-Pickle-Verhalten geändert Mit einem hilfreichen Kommentar vonhttps: //stackoverflow.com/users/644898/jef

Die Fehlermeldung, die Sie sehen: `TypeError: _reconstruct: Das erste Argument muss ein Untertyp von ndarray sein. Es besagt, dass der Python-Standard-Unpickler sicherstellt, dass die Klassenhierarchie, die ausgewählt wurde, genau der entspricht, die neu erstellt wird. Da die Serie zwischen den Versionen geändert wurde, ist dies mit dem Standard-Entpicker nicht mehr möglich (dies ist IMHO ein Fehler in der Funktionsweise von Pickle). In jedem Fall entfernen Pandas Pickel mit Serienobjekten vor 0.13. "

aben Sie Ideen zur Umgehung oder zu Lösunge

Um den Fehler wiederherzustellen:

Einrichtung in pandas 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

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage