Problema de compatibilidade com o Pandas com pickle 0.14.1 e 0.15.2

Estamos usando o pandas Dataframe como nosso principal contêiner de dados para nossos dados de séries temporais. Empacotamos o quadro de dados em blobs binários em um documento mongoDB para armazenamento, juntamente com chaves para metadados sobre o blob de séries temporais.

Ocorreu um erro quando atualizamos do pandas 0.14.1 para 0.15.2.

Criar blob binário de pandas Dataframe (0.14.1)

import lz4   
import cPickle

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

Caso de erro: Leia novamente no mongoDB with 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 Sucesso: Leia novamente no mongoDB com pandas 0.14.1 sem erro.

Parece ser semelhante a um encadeamento de pilha antigoPandas compilados a partir da fonte: comportamento padrão de pickle alterado Com um comentário útil dehttps://stackoverflow.com/users/644898/jeff

A mensagem de erro que você vê `TypeError: _reconstruct: First argumento deve ser um subtipo de ndarray é que o desempilhador padrão do python garante que a hierarquia de classes escolhida seja exatamente a mesma que está sendo recriada. Como a série mudou entre as versões, isso não é mais possível com o destilador padrão (este IMHO é um bug na maneira como o pickle funciona). De qualquer forma, os pandas descascam picles anteriores a 0,13 que possuem objetos da Série ".

Alguma idéia de solução alternativa ou soluções?

Para recriar o erro:

Configuração no 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

Crie erro no 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'))

questionAnswers(1)

yourAnswerToTheQuestion