🎉 SEMANA DO CONSUMIDOR

Últimos dias para comprar os cursos com 50% de desconto

Ver detalhes

Postado em em 15 de junho de 2024

Conheça os melhores formatos para salvar dados! Veja como exportar DataFrames em CSV, Pickle, Parquet e Feather.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo ou acesse o nosso canal do YouTube!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Melhores Formatos para Salvar Dados – Exportando DataFrames

Na aula de hoje, eu quero te mostrar os melhores formatos para salvar dados. Vou te ensinar alguns formatos diferentes do CSV, como o Pickle, o Parquet e o Feather.

Vou te explicar as vantagens que esses formatos possuem em relação ao CSV, quais são menores em termos de armazenamento e podem ser lidos e gravados de forma mais rápida e eficiente.

Isso é extremamente útil para trabalhar com bases muito grandes. Então faça o download do material disponível e vem comigo aprender a utilizar esses formatos com o Pandas no Python.

Visualizando a Base de Dados

Ao longo desta aula, utilizaremos uma base de dados que contém as transações comerciais de uma empresa.

Nela, temos informações como ID do cliente, data da transação, categoria do produto, idade, gênero, preço do produto e quantidade comprada.

Vamos gerar nosso DataFrame utilizando o Pandas e visualizar as informações da nossa base de dados. Para exibirmos apenas as 5 primeiras linhas do DataFrame, vamos usar o método head().

import pandas as pd

BASE = "./dados/dados_transacoes.csv"
df = pd.read_csv(BASE)
df.head()

Visualizando a base de dados

Essa é a mesma base que utilizamos na última aula para fazer as otimizações que reduziram o uso de memória e melhoraram o desempenho e a performance das operações sobre os dados.

Otimizações na Base de Dados

Antes de discutirmos as diferenças e vantagens de cada formato, eu vou aplicar nessa base de dados as otimizações criadas na última aula. Caso você queira entender a fundo cada um desses processos, não deixe de conferir essa aula.

Essas otimizações incluem:

  • Alterar a coluna data_transacao para o tipo data.
  • Definir as colunas categoria_produto e genero como tipo categórico.
  • Alterar os tipos de dados das colunas float64 e int64 para float32 e int8 respectivamente.
# otimizações
df["data_transacao"] = pd.to_datetime(df["data_transacao"], format="%d/%m/%Y")

df["categoria_produto"] = df["categoria_produto"].astype("category")
df["genero"] = df["genero"].astype("category")

colunas_float = df.select_dtypes(include="float64").columns
colunas_int = df.select_dtypes(include="int64").columns

df[colunas_float] = df[colunas_float].apply(pd.to_numeric, downcast="float")
df[colunas_int] = df[colunas_int].apply(pd.to_numeric, downcast="integer")

df.info()

Essas modificações reduzem o uso de memória pelo DataFrame e otimizam o tempo gasto para realizar operações sobre ele.

Base de dados otimizada

Exportação para CSV

Agora, vamos exportar esse DataFrame otimizado para um arquivo CSV e observar o que acontece.

Para podermos comparar o arquivo original, antes das modificações, com o arquivo salvo em CSV, utilizaremos um comando do sistema operacional para listar os arquivos na pasta dados.

!dir dados

Como eu estou utilizando o Jupyter Notebook, esse comando pode ser executado diretamente de uma célula. Executando o comando, teremos nosso arquivo inicial listado dentro da pasta.

arquivo inicial listado dentro da pasta

Observe que, dentro dessa pasta, temos um único arquivo, dados_transacoes.csv, que ocupa aproximadamente 80mb.

Agora, vamos exportar o nosso DataFrame otimizado para um arquivo CSV. Além disso, vamos utilizar a funcionalidade %timeit do Jupyter Notebook para cronometrar o tempo gasto para fazer essa exportação.

Para identificar que esse é o arquivo otimizado, vamos chamá-lo de dados_transacoes_otimizado.csv e passar o parâmetro index=False para não exportar o índice criado pelo próprio Pandas.

# exportando o dataframe otimizado
%timeit df.to_csv("./dados/dados_transacoes_otimizado.csv", index=False)

Exportação para CSV

Como utilizamos o comando %timeit, o processo leva um tempo a mais, pois ele é executado 7 vezes (7 runs)para poder extrair a média de tempo gasto para criação desse arquivo.

O tempo médio obtido foi de 1.78 segundos para um DataFrame de tamanho razoável, já que, apesar de ter 1 milhão de linhas, esse é um DataFrame com poucas colunas e que passou por um processo de otimização.

Esse é o primeiro ponto que eu queria te mostrar: a lentidão na escrita de um arquivo CSV em comparação com os próximos formatos que veremos nessa aula.

Agora, vamos executar novamente o comando !dir para verificar o arquivo salvo na pasta dados.

!dir dados

arquivo salvo na pasta dados

Repare que os dois arquivos possuem exatamente o mesmo tamanho. Isso acontece porque ao exportarmos um DataFrame para CSV, nós perdemos todas as otimizações feitas anteriormente.

Para finalizar a análise desse arquivo CSV, vamos criar um DataFrame a partir dele e constatar que as transformações e modificações feitas antes do processo de exportação foram perdidas.

# lendo o arquivo otimizado no formato csv
%timeit pd.read_csv("./dados/dados_transacoes_otimizado.csv")

df_csv = pd.read_csv("./dados/dados_transacoes_otimizado.csv")

df_csv.info()

Informações do arquivo CSV

Note que o tempo gasto para ler esse arquivo foi de 1.12 segundos, o que novamente é um tempo considerável. E que, os tipos das colunas, assim como o uso de memória, não correspondem com o DataFrame otimizado que havíamos criado.

Confira os dados do DataFrame otimizado para comparação:

dados do DataFrame otimizado

Com isso, podemos perceber que os arquivos CSV não são ideais para manter transformações mais complexas, como as que fizemos anteriormente.

Alterações mais simples, como exclusão de linhas e colunas, o arquivo CSV é capaz de manter, mas alterações como mudança dos tipos de coluna e tipos de dados, não.

Então, se você precisa manter as modificações feitas nos seus dados, é mais interessante utilizar um outro formato de exportação que não seja o CSV.

Os arquivos CSV são viáveis quando você precisa compartilhar os dados com outras equipes que não sejam da área de dados ou programação, com setores não técnicos, como finanças ou vendas, por ser um arquivo compatível com programas como o Excel.

Além disso, quando comparado com o formato nativo do Excel, os arquivos CSV ocupam menos espaço, sendo convenientes para o trabalho e análises dos demais setores e equipes que trabalharão com ele.

Formato Pickle – Leitura, Exportação e Otimizações

Quando buscamos manter as otimizações feitas, uma opção muito popular no passado para salvar DataFrames com transformações complexas era o formato Pickle.

Vamos pegar nosso DataFrame otimizado (df) e exportá-lo para o formato Pickle (pkl), cronometrando o tempo gasto.

# exportando o dataframe otimizado no formato pickle
%timeit df.to_pickle("./dados/dados_transacoes_otimizado.pkl")

Exportando Formato Pickle

O primeiro ponto que podemos notar, quando comparado ao CSV, é a velocidade em que o Pickle fez a exportação do DataFrame, gastando uma média de apenas 197 milissegundos.

Agora, vamos listar os arquivos no diretório para visualizar o tamanho do arquivo gerado.

!dir dados

arquivo Formato Pickle gerado

Repare que agora temos 3 arquivos dentro da nossa pasta: o arquivo original, o arquivo exportado para CSV e o arquivo exportado para Pickle. Note que o arquivo Pickle tem aproximadamente 55 MB.

Assim como fizemos com o arquivo CSV, vamos fazer a leitura desse arquivo Pickle para um DataFrame, cronometrando o tempo gasto e verificando as informações dele com o método info().

# lendo o arquivo otimizado no formato pickle
%timeit pd.read_pickle("./dados/dados_transacoes_otimizado.pkl")

df_pkl = pd.read_pickle("./dados/dados_transacoes_otimizado.pkl")

df_pkl.info()

Informações do Arquivo Formato Pickle

Veja que o arquivo Pickle gastou apenas 99.5 milissegundos para ser lido e manteve as transformações e otimizações feitas na nossa base de dados.

Apesar de ser melhor em todos os aspectos quando comparado ao arquivo CSV, a desvantagem do Pickle é que, ao compartilhar com outro setor da empresa ou um cliente, ele não conseguirá abrir esse formato no Excel ou no Google Planilhas.

Formato Parquet – Leitura, Exportação e Otimizações

Como mencionado, o Pickle foi um modelo de arquivo muito utilizado no passado. Recentemente, temos outros formatos de arquivos mais utilizados e eficientes do que ele, como é o caso do Parquet.

Para trabalhar com Parquet, você precisa instalar a biblioteca pyarrow ou fastparquet.

pip install pyarrow
pip install fastparquet

Você só precisará instalar uma dessas duas bibliotecas para poder trabalhar com arquivos Parquet no Pandas.

Eu recomendo o uso do pyarrow por conta da versatilidade e outras funcionalidades que ele oferece ao trabalhar com Pandas, mas qualquer uma das duas será suficiente para trabalhar com o formato Parquet.

Feita a instalação da biblioteca, vamos exportar nosso DataFrame otimizado para um arquivo parquet, cronometrando o tempo gasto.

# exportando o dataframe otimizado no formato parquet
%timeit df.to_parquet("./dados/dados_transacoes_otimizado.parquet")

Exportando Formato Parquet

Para exportar nosso DataFrame para o formato Parquet foram gastos 360 milissegundos em média, o que é mais do que o arquivo Pickle, mas muito menos quando comparado ao CSV.

Além disso, vamos listar os arquivos na pasta dados para que possamos ver o tamanho final desse arquivo gerado.

!dir dados

Verificando Arquivo Formato Parquet

Aqui podemos ver que o arquivo Parquet é o menor dos 3 formatos, ocupando aproximadamente 42 MB, quase metade do tamanho ocupado pelo arquivo CSV.

Vamos fazer a leitura desse arquivo agora e analisar as informações do DataFrame para verificar se as otimizações foram mantidas.

# lendo o arquivo otimizado no formato parquet
%timeit pd.read_parquet("./dados/dados_transacoes_otimizado.parquet")

df_parquet = pd.read_parquet("./dados/dados_transacoes_otimizado.parquet")

df_parquet.info()

Informações Arquivo Formato Parquet

Para a leitura, o arquivo Parquet gastou uma média de 327 milissegundos e manteve as transformações e otimizações feitas no DataFrame.

Em comparação ao Pickle, a vantagem do Parquet se dá pelo espaço ocupado em disco, que é menor, enquanto o Pickle realiza o processo de exportação e gravação de forma um pouco mais rápida.

Formato Feather – Leitura, Exportação e Otimizações

O último formato que eu quero te apresentar nessa aula é o formato Feather. Começaremos exportando nosso arquivo para esse formato e marcando o tempo gasto.

# exportando o dataframe otimizado no formato feather
%timeit df.to_feather("./dados/dados_transacoes_otimizado.feather")

Exportando arquivo Formato Feather

Com esse formato, tivemos um gasto de 104 milissegundos para exportar nosso DataFrame.

Agora, vamos verificar o tamanho dele dentro do diretório.

! dir dados

Verificando arquivo Formato Feather gerado

Perceba que o arquivo Feather tem aproximadamente 49 MB, um tamanho intermediário entre o Parquet e o Pickle, mas ainda é uma grande economia de espaço quando comparado ao CSV.

Por fim, vamos cronometrar a leitura e as informações de um DataFrame gerado a partir do arquivo Feather.

# lendo o arquivo otimizado no formato feather
%timeit pd.read_feather("./dados/dados_transacoes_otimizado.feather")

df_feather = pd.read_feather("./dados/dados_transacoes_otimizado.feather")

df_feather.info()

Informações Formato Feather

Assim como o Pickle e o Parquet, o Feather também manteve as alterações feitas, e seu tempo de leitura foi de 259 milissegundos.

O destaque desse tipo de arquivo está justamente nesse aspecto referente à leitura e escrita. Perceba que, para ambas as ações, ele teve um bom tempo, mantendo as otimizações e ocupando pouco espaço em disco.

Conclusão – Melhores Formatos para Salvar Dados – Exportando DataFrames

Nessa aula, você pôde conhecer melhor outros formatos de arquivo para salvar seus dados.

Você viu as vantagens e desvantagens de utilizar um arquivo CSV para armazenar seu DataFrame tratado e otimizado. E como os formatos Pickle, Parquet e Feather podem oferecer um melhor desempenho, além de manterem as otimizações feitas.

Conhecer os diferentes tipos de arquivos é importante para você saber qual formato utilizar de acordo com a sua necessidade.

Inclusive, o CSV, apesar de não ter o mesmo desempenho que os outros formatos, também é bastante útil por ser o mais amigável e de fácil acesso para compartilhar dados com pessoas de diversas áreas e setores. É muito importante consultar as documentações de cada um dos arquivos para saber qual irá se adequar melhor ao seu objetivo e como utilizá-los melhor.

Quer se aprofundar ainda mais em técnicas de manipulação de dados? Inscreva-se no nosso Curso de Ciência de Dados e domine as melhores práticas para análise e otimização de grandes volumes de informação!

Hashtag Treinamentos

Para acessar outras publicações de Ciência de Dados, clique aqui!


Quer aprender mais sobre Python com um minicurso básico gratuito?

Diego Monutti

Expert em conteúdos da Hashtag Treinamentos. Auxilia na criação de conteúdos de variados temas voltados para aqueles que acompanham nossos canais.