[RESOLVIDO] Ler JSON do brasil.io com pandas

Edit:

Conseguir resolver alterando a penúltima linha do códígo para:

caso_full = pd.DataFrame(r.json()["results"])

Isso porque o que eu precisava estava dentro da coluna “results” e da forma anterior me retornava tudo.

Boa tarde, galera. Estou quebrando a cabeça aqui e resolvi pedir ajuda.

Como transformar o JSON em tabelas? Eu só consigo isso do print:

Meu código:

import pandas as pd
import requests

url = "https://brasil.io/api/dataset/covid19/caso/data/?city=Ribeir%C3%A3o+Preto&format=json"
headers = {"User-Agent": "python-urllib"}
r = requests.get(url, headers=headers)

caso_full = pd.read_json(r.content)
caso_full

@gustavomadmax, quando você pega os dados com r.json()["results"], eles já não estão mais em formato JSON e sim numa lista de dicionários em Python. Para importar num DataFrame do pandas você precisa, nesse caso, usar a função DataFrame.from_dict.
Criei um código baseado no seu, deixando a consulta mais flexível e fazendo as alterações necessárias - utilize o DataFrame casos_ribeirao_preto:

import pandas as pd
import requests

url = "https://brasil.io/api/dataset/covid19/caso/data/"
query_string = {"city": "Ribeirão Preto", "state": "SP", "format": "json"}
headers = {"User-Agent": "python-urllib"}
response = requests.get(url, params=query_string, headers=headers)
results = response.json()["results"]

casos_ribeirao_preto = pd.DataFrame.from_dict(results)

Atenção: a API do Brasil.IO em breve será autenticada, devido aos recentes abusos (acompanhe mais novidades em nosso Telegram). Por isso, sugiro baixar o arquivo completo de data.brasil.io e então fazer os filtros que necessita, ou então esperar o cadastro para alterar seu código para uma versão autenticada.

A versão que faz download do código completo é preferível, dado que onera menos nossos servidores - mas aumenta o tempo de download e processamento local. Exemplo de código:

import gzip
import io

import pandas as pd
import requests

url = "https://data.brasil.io/dataset/covid19/caso.csv.gz"
headers = {"User-Agent": "python-urllib"}
response = requests.get(url, params=query_string, headers=headers)

df = pd.read_csv(io.BytesIO(gzip.decompress(response.content)))
casos_ribeirao_preto = df[df["city"] == "Ribeirão Preto"]

Nota: você chama uma variável de caso_full, mas está buscando a tabela caso, que é diferente. Veja a documentação da API para entender a diferença entre elas.

4 Curtidas

Valeu, cara. Na minha máquina, eu estava fazendo o download, mas como ia colocar online, achei que seria melhor consultar a API. Por isso chamava “caso_full”, porque eu estava usando o dataset baixado e só fiz algumas alterações pontuais.

Está no meu site pessoal, então não tem muitos acessos, porém tenho acompanhado a discussão sobre a API no Github. Vou jogar pra versão que faz download.

Obrigado!

2 Curtidas