Blog

Postado em em 27 de abril de 2023

BigData com Python – Como Trabalhar com Bases Gigantes no Pandas

Como ler banco de dados gigantes, considerados BigData com Python? Vamos aprender 2 formas diferentes de fazer essa leitura hoje!

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:

Fala Impressionadores! Hoje eu quero falar sobre como trabalhar com bases gigantes no Pandas, ou o famoso BigData com Python!

Em alguns casos nós vamos ter que trabalhar com bases de dados muito grandes e isso pode ser um problema já na hora de ler as informações.

Como são muitas informações é possível que o seu sistema já nem consiga ler toda a base de dados, imagine processar tudo o que precisa com essas informações.

Por esse motivo eu quero te mostrar como trabalhar com BigData no Python para que você saiba o que fazer quando tiver uma base muito grande e o seu sistema não suportar.

É possível tentar ler a base de dados direta no Python, mas se isso consumir demais do seu computador ou do seu sistema, você pode ler base de dados em partes no Python.

Isso quer dizer que vamos criar um for (estrutura de repetição) para ler pedaços do código e executar uma tarefa só com essa parte. Depois vamos repetir para toda a base de dados.

Esse processo acaba demorando muito mais e fica um pouco mais complexo, mas não consome tanto do seu sistema!

Dito isso, vamos para a aula! – BigData com Python

O que consideramos efetivamente como Big Data?

Essencialmente é o volume de dados, o volume de informações que vai trazer essa diferença entre você fazer uma análise de dados normal ou começar a trabalhar com Big Data.

Então não existe uma categoria expressa em que alguém disse, a partir de tanto, começa a ser considerado Big Data.

Qual é o desafio?

Nesse exemplo que vamos fazer hoje, temos uma base de dados chamada large.csv que é uma base de 17 GB, esta base de dados está disponível no material didático desta aula.

Quando você começa a entrar nesse nível de GB de informações as suas bases de dados começam a ficar muito pesadas, você vai começar a encontrar alguns problemas.

Vamos primeiro importar essa base de dados para dentro do Python e exibi-la.

Normalmente vamos fazer isso importando o Pandas.

import pandas as pd

tabela = pd.read_csv("large.csv")

display(tabela)

Quando rodarmos este código ele até consegue ler a base de dados, mas devido ao tamanho da base isso vai demorar muito.

Outro ponto, é que o código está tentando ler toda a base de uma única vez, pode ser que o seu computador não tenha memória o suficiente para suportar essa leitura, então, vamos pausar a leitura e tratar de outra forma.

Obs. Para pausar você pode clicar no stop várias vezes sou clicar no Kernel e clicar em Restart & Clear Output.

1ª Forma de Ler o Código

Uma dica importante é que você pode construir a sua estrutura de código inteira, apenas com um pedaço da base de dados usando o nrows.

import pandas as Pd

tabela = pd.read_csv("large.csv, nrows=10000")

display(tabela)

Dessa forma ele vai ler a base de dados somente até a linha dez mil e ignorar o restante. Isso é bom porque dez mil é um valor grande o suficiente para que você faça uma análise, mas pequeno o bastante para não travar seu computador.

Após rodar o código você só precisa apagar o nrows=10000 e ler a base de dados inteira.

2ª Forma de Ler o Código

A segunda forma de ler a base de dados é por partes, separamos em partes e lemos uma de cada vez, vamos criar essa estrutura dentro do For e utilizar o chunksize, para dividir a cada dez mil linhas até finalizar a base.

Digamos que precisamos calcular o valor recebido e o valor pago de todas as moedas que temos na base de dados.

base de dados
base de dados

Como vamos fazer isso?

For chunk in pd.read_csv(“large.csv”, chunksize=10000)

        Colunas = [“Amount Received”, “Receiving Currency”, “Amount Paid”]

        Chunk_filtrado = chunk[colunas]

//Esta primeira parte do código nada mais é do que a tabela -> chunk somente com as 3 colunas que selecionamos -> Amount Received, Receiving Currency e Amount Paid

//Após reduzir a tabela, precisamos agrupar os valores das colunas por moeda, para isso vamos criar uma variável que vai receber o total de moedas e vamos usar o SUM para somar os valores numéricos.

resumo = chunk_filtrado.groupby(“Receiving Currency”).sum()

display(resumo)

break

//Como este código terá que rodar para toda a base, isso vai demorar, então podemos colocar um break para interromper na primeira leitura e assim observar o resultado, depois é só retirar o break.

Observe que o código está muito eficiente e rápido, e como parou na primeira leitura podemos aproveitar para ajustar a formatação:

pd.options.display.float_format = “{:,.2f}”.format

For chunk in pd.read_csv(“large.csv”, chunksize=10000)

        Colunas = [“Amount Received”, “Receiving Currency”, “Amount Paid”]

        Chunk_filtrado = chunk[colunas]

resumo = chunk_filtrado.groupby(“Receiving Currency”).sum()

display(resumo)

break
resultado com a formatação
resultado com a formatação

Agora que já temos os valores formatados, temos que observar mais uma questão que pode gerar um problema na análise do resultado.

Como estamos analisando por partes a cada dez mil linhas, no final, quando o código rodar por completo, teremos vários blocos de resultado.

Vários blocos como este impresso acima, então, se você quiser analisar o valor total da base de dados em Euro, por exemplo, terá que antes fazer um código para juntar esses resultados.

Como somar os resultados?

O primeiro passo é retirar o nome das moedas do índice, veja que no resultado os nomes das moedas estão como índice na primeira coluna, isso vai nos atrapalhar a juntar, vamos utilizar o as_index=False para impedir que as moedas se tornem índices.

pd.options.display.float_format = “{:,.2f}”.format

For chunk in pd.read_csv(“large.csv”, chunksize=10000)

        Colunas = [“Amount Received”, “Receiving Currency”, “Amount Paid”]

        Chunk_filtrado = chunk[colunas]

resumo = chunk_filtrado.groupby(“Receiving Currency”, as_index=False).sum()

display(resumo)

break
ajuste dos títulos
ajuste dos títulos

A segunda coisa que vamos fazer é criar uma tabela vazia, assim ao invés de exibir a tabela resumo vamos adicionar os resultados nesta tabela vazia.

pd.options.display.float_format = “{:,.2f}”.format

contador = 0

For chunk in pd.read_csv(“large.csv”, chunksize=10000)

        Colunas = [“Amount Received”, “Receiving Currency”, “Amount Paid”]

        Chunk_filtrado = chunk[colunas]

resumo = chunk_filtrado.groupby(“Receiving Currency”, as_index=False).sum()

tabela = pd.concat([tabela, resumo] )

contador += 1

if contador > 2:

break

display (tabela)

Feito isso todos os resultados estão sendo guardados na variável formando uma única tabela, porém, a cada vez que um resultado é gerado as moedas se repetem e vamos ter novamente que somar esses valores repetidos.

pd.options.display.float_format = “{:,.2f}”.format

contador = 0

For chunk in pd.read_csv(“large.csv”, chunksize=10000)

        Colunas = [“Amount Received”, “Receiving Currency”, “Amount Paid”]

        Chunk_filtrado = chunk[colunas]

resumo = chunk_filtrado.groupby(“Receiving Currency”, as_index=False).sum()

tabela = pd.concat([tabela, resumo] )

contador += 1

if contador > 2:

break

tabela = tabela.groupby(“Receiving Currency”, as_index=False).sum()

display (tabela)

Esta questão de ter que somar as moedas duas vezes deixa o código um pouco repetitivo, você pode se perguntar se vale a pena fazer isso, mas a questão é que podemos fazer com menos linhas de código como no primeiro exemplo, mas isso vai custar mais processamento do computador.

Na verdade, é mais uma questão de equilíbrio, você deve ajustar conforme as suas possibilidades.

Se rodarmos o código agora ele já vai mostrar os valores somados de cada moeda apenas uma vez.

Após conferir que o resultado está correto, podemos retirar do código o contador que colocamos, o if e o break, assim o código está pronto para rodar toda a base de dados.

pd.options.display.float_format = “{:,.2f}”.format

For chunk in pd.read_csv(“large.csv”, chunksize=10000)

        Colunas = [“Amount Received”, “Receiving Currency”, “Amount Paid”]

        Chunk_filtrado = chunk[colunas]

resumo = chunk_filtrado.groupby(“Receiving Currency”, as_index=False).sum()

tabela = pd.concat([tabela, resumo] )

tabela = tabela.groupby(“Receiving Currency”, as_index=False).sum()

display (tabela)

Conclusão – BigData com Python

Nesta aula mostrei duas formas de rodar uma base de dados considerada uma BigData, essas bases muito grandes geram um consumo alto da memória do computador, por isso precisamos saber modos diferentes de fazer essa leitura, adequando o código a realidade do nosso computador ou do computador da empresa.

A primeira forma de ler esta base é com um código mais curto que consegue ler a base de dados, porém, consumindo mais a memória do seu computador.

A segunda opção que eu trouxe é um código maior e mais complexo, mas que consegue partir o código em blocos menores e permite economizar a memória e poupar o seu computador.

Eu fico por aqui! Até a próxima! Um abraço,

Hashtag Treinamentos

Para acessar outras publicações de Python, clique aqui!


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