Como extrair e transformar dados JSON com Pandas?
O JSON é o formato utilizado para transferência de dados por APIs. Por isso é muito comum se trabalhar com dados neste formato.
Recentemente estava fazendo o challenge BI da Alura e a proposta era desenvolver um dashboard do mercado de restaurantes da Índia.
O challenge é um programa da Alura para seus alunos, no qual ele te desafia a propor resoluções de problemas baseado em conhecimentos que você está estudando.
No meu caso ciência de dados.
A ferramenta de BI que utilizo com facilidade é o Power BI, entretanto quero conhecer outras e o Google Data Studio foi a escolhida para este momento.
Mas já de cara a primeira diferença:
O Data studio não permite você transformar e modelar os seus dados como com o Power query do Power BI.
Já que estou vendo novas formas, por que não utilizar o Pandas do Python para me ajudar nesse problema?
Nesse texto eu abordarei como fiz para extrair e transformar os dados e até mesmo como automatizar as etapas dentro de um pipeline.
Bora lá?!
Sumário:
Dados JSON
JSON_NORMALIZE
Funções de transformações
Conversão automática de moedas
Gerando CSV
Pipeline
Considerações finais
Dados JSON
Foram 5 arquivos de dados JSON.
Subi eles para o meu repositório no Github e importei para o notebook:
Abri o primeiro arquivo e …
Hum… era um JSON com outros JSONs dentro.
Confirmei ao acessar o primeiro arquivo:
Os demais tbm estavam assim:
JSON_NORMALIZE
Para resolver isso, o pandas tem uma solução:
No qual essa API transformará esse JSON semiestruturado em um DataFrame.
Bom… Selecionei apenas o que eu precisava e exclui os valores nulos:
Fiz um loop e armazenei cada DataFrame dentro de uma lista:
Depois só concatenei a própria lista:
Pronto!!
Bom… mas agora precisava fazer isso com todos os arquivos.
E mais outras transformações.
Funções de transformações
Para gerar apenas um DataFrame, criei a função:
O que eu fiz:
Como objeto eu criei uma lista com todos os arquivos dentro.
Então:
- Concatenei todos os JSONs de cada arquivo (já separando o que eu precisava e excluindo os valores nulos).
- Fiz o loop e armazenei na lista
- Concatenei todos eles.
Depois fiz outra pra escolher apenas as colunas que eu queria utilizar e excluir as linhas duplicadas:
E ele estava com várias localidades:
Então fiz outra para filtrar os dados:
A latitude e longitude estavam separadas, mas precisava unificá-las em um padrão.
Por isso, outra etapa:
O que eu fiz:
- Selecionei apenas a coluna de latitude e longitude e aramazenei em variáveis únicas.
- Depois armazenei elas em outra variável com o padrão separado por vírgula.
- Então usei o dataframe.insert para inserir ele dentro da coluna, na posição que eu queria.
- Por final excluí as colunas anteriores, para não ficarem sobrando.
E ao final a coluna foi gerada dentro do DataFrame:
Conversão automática de moedas
Para este desafio, poderíamos realizar o cálculo de conversão da moeda utilizada (rúpias indianas) para dólar americano, euro e real.
Dei uma pesquisada e encontrei esse site que fornece APIs gratuitas para conversão de moedas.
Mais uma etapa:
O que eu fiz:
- Importei os valores de conversão que a API fornece (com a ajuda da biblioteca Requests).
- Selecionei o valor específico da conversão, dentro do JSON que ela te dá.
- Transformei em formato float.
2. Criei variáveis com as colunas (series do pandas) multiplicando pelo valor da conversão.
- Arredondei os valores para duas casas decimais
3. Inseri os valores dentro das posições que eu queria.
E feito:
Gerando CSV
Transformações realizadas, mas agora precisaria gerar as tabelas em csv de acordo com a estrutura de relacionamentos que faria dentro do Data Studio.
Criei uma função que selecionasse as colunas além de criar uma nova tabela desnormalizada para os tipos de cozinhas.
Pois elas estavam desta forma:
Eu não conseguiria saber quais cozinhas por cada restaurante.
E depois de desnormalizada:
Pipeline
Todas as funções estão etapa por etapa certo?
E se conseguíssemos encadear elas para que você colocasse os dados de um lado e saísse pelo outro todas as tabelas?
Bom, o próprio pandas tem a resposta:
Com ele você pode criar um pipeline com todas as funções.
Criei uma função para então chamar o pipeline de transformação:
Caso queira passar outros dados deste mesmo “projeto”, toda a transformação já estaria pronta.
Considerações finais
Trouxe aqui algumas etapas para ilustrar e compartilhar as possibilidades que existem para se explorar.
Poderia melhorar muito todo esse projeto, caso fosse um caso real.
E até mesmo já criar uma nova etapa para subir esses dados dentro do banco de dados SQL direto do python.
Mas… isso fica para um próximo texto.
Caso você queira ser aluno da Alura confira meu cupom de desconto especial.
Agora me diga, você não conhecia algum dos métodos utilizados aqui? Ou conhece outros jeitos melhores? Compartilhe nos comentários e vamos trocar conhecimentos.
Se você chegou até aqui e curtiu, dê palmas, compartilhe e se inscreva para me acompanhar.
Ainda há muito a se explorar…