No momento, estou importando um quadro de dados bastante grande CSV
toda vez que executo o script. Existe uma boa solução para manter esse dataframe constantemente disponível entre as execuções, para que eu não precise gastar todo esse tempo esperando a execução do script?
317
Respostas:
A maneira mais fácil é buscá- lo usando
to_pickle
:Em seguida, você pode carregá-lo novamente usando:
Nota: antes de 0.11.1
save
eload
era a única maneira de fazer isso (agora eles foram descontinuados em favorto_pickle
eread_pickle
respectivamente).Outra opção popular é usar o HDF5 ( pytables ), que oferece tempos de acesso muito rápidos para grandes conjuntos de dados:
Estratégias mais avançadas são discutidas no livro de receitas .
Desde a versão 0.13, há também o msgpack, que pode ser melhor para interoperabilidade, como uma alternativa mais rápida ao JSON, ou se você tiver dados de objetos / textos pesados em python (consulte esta pergunta ).
fonte
Embora já existam algumas respostas, encontrei uma boa comparação na qual eles tentaram várias maneiras de serializar os DataFrames do Pandas: Armazene eficientemente os DataFrames do Pandas .
Eles comparam:
Em seu experimento, eles serializam um DataFrame de 1.000.000 de linhas com as duas colunas testadas separadamente: uma com dados de texto e outra com números. O aviso deles diz:
O código fonte do teste ao qual eles se referem está disponível online . Como esse código não funcionou diretamente, fiz algumas pequenas alterações, que você pode obter aqui: serialize.py , obtive os seguintes resultados:
Eles também mencionam que, com a conversão de dados de texto em dados categóricos, a serialização é muito mais rápida. No teste, cerca de 10 vezes mais rápido (veja também o código do teste).
Editar : os tempos mais altos para picles que CSV podem ser explicados pelo formato de dados usado. Por padrão,
pickle
usa uma representação ASCII imprimível, que gera conjuntos de dados maiores. No entanto, como pode ser visto no gráfico, o pickle usando o formato de dados binários mais recente (versão 2pickle-p2
) tem tempos de carregamento muito menores.Algumas outras referências:
numpy.fromfile
é o mais rápido.fonte
.to_pickle()
(que usa armazenamento binário) contra.to_hdf()
(sem compactação). O objetivo era a velocidade, o tamanho do arquivo do HDF era 11x Pickle e o tempo para carregar foi 5x Pickle Meus dados foi ~ 5k arquivos de ~ 7k linhas x 6 cols cada um, na sua maioria numérica..Se bem entendi, você já está usando,
pandas.read_csv()
mas gostaria de acelerar o processo de desenvolvimento para não precisar carregar o arquivo toda vez que editar seu script, certo? Tenho algumas recomendações:você pode carregar apenas parte do arquivo CSV usando
pandas.read_csv(..., nrows=1000)
apenas para carregar o bit superior da tabela enquanto estiver desenvolvendouse o ipython para uma sessão interativa, de forma que você mantenha a tabela pandas na memória enquanto edita e recarrega seu script.
converter o csv em uma tabela HDF5
atualizados uso
DataFrame.to_feather()
epd.read_feather()
para armazenar dados no R-compatível pena formato binário que é super rápido (em minhas mãos, ligeiramente mais rápido do quepandas.to_pickle()
em dados numéricos e muito mais rápido em dados string).Você também pode estar interessado nesta resposta no stackoverflow.
fonte
to_feather
que funcionaria bem em dados de string? Eu aferidoto_pickle
eto_feature
no meu trama de dados numéricos e picles é de cerca de 3x mais rápido.Pickle funciona bem!
fonte
.pkl
conforme sugerido na resposta do @Andy Haydens.Você pode usar o arquivo de formato de penas. É extremamente rápido.
fonte
R
usando afeather
biblioteca.Os DataFrames do Pandas têm a
to_pickle
função que é útil para salvar um DataFrame:fonte
Como já mencionado, existem diferentes opções e formatos de arquivo ( HDF5 , JSON , CSV , parquet , SQL ) para armazenar um quadro de dados. No entanto,
pickle
não é um cidadão de primeira classe (dependendo da sua configuração), porque:pickle
é um risco potencial à segurança. Forme a documentação do Python para pickle :pickle
é lento. Encontre aqui e aqui referências.Dependendo da sua configuração / uso, ambas as limitações não se aplicam, mas eu não recomendaria
pickle
como a persistência padrão para os quadros de dados do pandas.fonte
Formatos de arquivo numpy são bastante rápidos para dados numéricos
Prefiro usar arquivos numpy, pois eles são rápidos e fáceis de trabalhar. Aqui está uma referência simples para salvar e carregar um quadro de dados com 1 coluna de 1 milhão de pontos.
usando a
%%timeit
função mágica do ipythona saída é
carregar os dados novamente em um dataframe
a saída é
NÃO É RUIM!
CONS
Existe um problema se você salvar o arquivo numpy usando o python 2 e tentar abrir usando o python 3 (ou vice-versa).
fonte
https://docs.python.org/3/library/pickle.html
Os formatos do protocolo pickle:
A versão 0 do protocolo é o protocolo “legível por humanos” original e é compatível com versões anteriores das versões anteriores do Python.
A versão 1 do protocolo é um formato binário antigo que também é compatível com versões anteriores do Python.
O protocolo versão 2 foi introduzido no Python 2.3. Ele fornece decapagem muito mais eficiente de novas classes de estilo. Consulte o PEP 307 para obter informações sobre melhorias trazidas pelo protocolo 2.
O protocolo versão 3 foi adicionado no Python 3.0. Ele possui suporte explícito para objetos de bytes e não pode ser desassociado pelo Python 2.x. Este é o protocolo padrão e o protocolo recomendado quando a compatibilidade com outras versões do Python 3 é necessária.
O protocolo versão 4 foi adicionado no Python 3.4. Ele adiciona suporte a objetos muito grandes, separando mais tipos de objetos e algumas otimizações de formato de dados. Consulte o PEP 3154 para obter informações sobre melhorias trazidas pelo protocolo 4.
fonte
compatibilidade pyarrow entre versões
O movimento geral foi o pyarrow / feather (avisos de reprovação de pandas / msgpack). No entanto, tenho um desafio com pyarrow com transiente na especificação. Dados serializados com pyarrow 0.15.1 não podem ser desserializados com 0.16.0 ARROW-7961 . Estou usando serialização para usar redis, então tenho que usar uma codificação binária.
Testei novamente várias opções (usando o notebook jupyter)
Com os seguintes resultados para meu quadro de dados (na
out
variável jupyter)plumas e parquet não funcionam para o meu quadro de dados. Vou continuar usando pyarrow. No entanto, vou suplementar com picles (sem compressão). Ao escrever no cache, armazene os formulários serializados de pyarrow e pickle. Ao ler do fallback do cache para pickle se a desserialização do pyarrow falhar.
fonte
O formato depende do seu caso de uso
Comparação dos formatos de arquivo pandas estão neste vídeo .
fonte