Problema de compatibilidad con versiones anteriores de pandas con pickle 0.14.1 y 0.15.2

Estamos usando pandas Dataframe como nuestro contenedor de datos principal para nuestros datos de series de tiempo. Empaquetamos el marco de datos en blobs binarios en un documento mongoDB para el almacenamiento junto con claves para metadatos sobre el blob de series temporales.

Nos encontramos con un error cuando pasamos de pandas 0.14.1 a 0.15.2.

Crear blob binario de pandas Dataframe (0.14.1)

import lz4   
import cPickle

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

Caso de error: Lectura de mongoDB con pandas 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'))

Caso de éxito: Lea de nuevo desde mongoDB con pandas 0.14.1 sin error.

Esto parece ser similar a un viejo hilo de pilaPandas compilados desde la fuente: el comportamiento predeterminado de pickle cambió Con un comentario útil dehttps://stackoverflow.com/users/644898/jeff

El mensaje de error que está viendo `TypeError: _reconstruct: El primer argumento debe ser un subtipo de ndarray es que el desempañador predeterminado de python se asegura de que la jerarquía de clases que se haya seleccionado sea exactamente la misma que está recreando. Dado que la serie ha cambiado entre versiones, esto ya no es posible con el desempañador predeterminado (este IMHO es un error en la forma en que funciona el pickle). En cualquier caso, los pandas desenredarán encurtidos anteriores a 0.13 que tienen objetos de la Serie ".

¿Alguna idea sobre soluciones o soluciones?

Para recrear el error:

Configuración en 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

Crear error en 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'))

Respuestas a la pregunta(1)

Su respuesta a la pregunta