covid19-br icon indicating copy to clipboard operation
covid19-br copied to clipboard

RS

Open turicas opened this issue 4 years ago • 13 comments

Boletins:

Status da checagem (anteriores a 20/03):

  • [ ] Boletins
  • [ ] Casos

Modo e responsável pela conversão:

  • Boletins: manualmente por @paulabracco
  • Casos: manualmente por ?

turicas avatar Mar 20 '20 15:03 turicas

Data Link

27-Feb https://saude.rs.gov.br/upload/arquivos/202002/27193954-informe-epidemiologico-rs-2019-ncov-27-02-2020.pdf

28-Feb

29-Feb

1-Mar

2-Mar https://saude.rs.gov.br/upload/arquivos/202003/03104226-informe-epidemiologico-rs-2019-ncov-02-03-2020-2.pdf

3-Mar https://saude.rs.gov.br/upload/arquivos/202003/03225612-informe-epidemiologico-rs-2019-ncov-03-03-2020.pdf

4-Mar https://saude.rs.gov.br/upload/arquivos/202003/04172316-informe-epidemiologico-rs-2019-ncov-04-03-2020.pdf

5-Mar https://saude-admin.rs.gov.br/upload/arquivos/202003/05162837-informe-epidemiologico-rs-2019-ncov-05-03-2020.pdf

6-Mar 7-Mar 8-Mar

9-Mar https://saude-admin.rs.gov.br/upload/arquivos/202003/09182605-informe-epidemiologico-rs-2019-ncov-09-03-2020.pdf

10-Mar https://saude.rs.gov.br/upload/arquivos/202003/10165428-informe-epidemiologico-rs-2019-ncov-10-03-2020.pdf

11-Mar https://saude.rs.gov.br/upload/arquivos/202003/11185859-informe-epidemiologico-rs-2019-ncov-11-03-2020.pdf

12-Mar https://saude.rs.gov.br/upload/arquivos/202003/12171359-informe-epidemiologico-rs-2019-ncov-12-03-2020.pdf

13-Mar https://saude.rs.gov.br/upload/arquivos/202003/13180958-informe-epidemiologico-rs-2019-ncov-13-03-2020.pdf

14-Mar

15-Mar

16-Mar https://saude.rs.gov.br/upload/arquivos/202003/16185550-informe-epidemiologico-rs-2019-ncov-16-03-2020.pdf

17-Mar https://estado.rs.gov.br/upload/arquivos//informe-epidemiologico-rs-2019-ncov-18-03-2020.pdf (data 18, mas dados de 17)

18-Mar

19-Mar https://saude.rs.gov.br/upload/arquivos/202003/20081553-informe-epidemiologico-rs-2019-ncov-19-03-2020.pdf

20-Mar https://saude.rs.gov.br/upload/arquivos/202003/20205403-informe-epidemiologico-rs-2019-ncov-20-03-2020.pdf

21-Mar

paulabracco avatar Mar 21 '20 17:03 paulabracco

Posso trabalhar na extração das tabelas dos boletins para criar o CSV de casos. Já tem alguém fazendo isso?

lucasrcezimbra avatar Mar 21 '20 21:03 lucasrcezimbra

Estou com problema para importar a tabela de casos, acredito que seja por causa das colunas mescladas Classificação do caso

table = rows.import_from_pdf(
    filename, starts_after='Município Residência', ends_before='Outros Países')

PDF:

image

Resultado importado pelo rows:

image

Tentei de diversas formas, mas não consegui nenhum resultado satisfatório. O mais próximo que consegui foi utilizando a primeira linha como starts_after, só q não funcionou para as outras páginas, ficou assim:

image

@turicas alguma ideia de como poderia contornar isso?

lucasrcezimbra avatar Mar 22 '20 01:03 lucasrcezimbra

Saiu mais um boletim:

21/03 - https://saude.rs.gov.br/upload/arquivos/202003/21214556-informe-epidemiologico-rs-2019-ncov-21-03-2020.pdf

lucasrcezimbra avatar Mar 22 '20 02:03 lucasrcezimbra

Mandei um e-mail com o texto de exemplo para secretária de saúde do RS.

lucasrcezimbra avatar Mar 22 '20 02:03 lucasrcezimbra

@Lrcezimbra tenta passar starts_after="Município Residência".

Tem também uma biblioteca chamada camelot que talvez funcione melhor nesse caso.

turicas avatar Mar 22 '20 17:03 turicas

Já tinha tentado com o starts_after="Município Residência" e não rolou.

Vou dar uma olhada no camelot hoje.

lucasrcezimbra avatar Mar 22 '20 18:03 lucasrcezimbra

Tive o mesmo problema com o cametot.

lucasrcezimbra avatar Mar 26 '20 00:03 lucasrcezimbra

Mas hoje a Secretária do RS lançou essa página bem legal q parece ser bem mais fácil de extrair os dados: http://ti.saude.rs.gov.br/covid19/

lucasrcezimbra avatar Mar 26 '20 00:03 lucasrcezimbra

Infelizmente a página nova de boletins tem os gráficos em canvas, dificultando scrapping do html. Todavia testei um processo semi manual que consiste em copiar os arrays de dados diretamente do código javascript da página. Com um pouco mais de esforço acredito que dê para raspar os dados de forma automática com scrapping do próprio código fonte.

Exemplo de trecho da página: var myChart = new Chart(ctx, {type: 'horizontalBar',data: {labels: [" Porto Alegre", " Bagé", " Canoas", " Caxias do Sul", " Torres", " Lajeado", " Sant'Ana do Livramento", " Ivoti", " Erechim", " São Leopoldo", " Serafina Corrêa", " Capão da Canoa", " Pelotas", " Anta Gorda", " Estância Velha", " Santa Maria", " Rio Grande", " Bento Gonçalves", " Campo Bom", " Alvorada", " Marau", " Paraí", " Dom Pedrito", " Osório", " Passo Fundo", " Rolante", " Cachoeira do Sul", " Canguçu", " Santa Rosa", " Nova Palma", " Piratini", " Garibaldi", " Gravataí", " Dois Irmãos", " Charqueadas", " Estrela", " Carlos Barbosa", " Viamão", " Santo Antônio da Patrulha", " Taquara", " Cerro Grande do Sul", " Eldorado do Sul", " Cruzeiro do Sul", " Santiago", " Sapiranga", " Farroupilha"],datasets: [{data: [107,9,7,6,6,5,4,3,3,3,3,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],backgroundColor: 'rgba(166, 58, 58, 0.8)',borderColor: 'rgba(0,0,0,0.8)',borderWidth: 1}]}, options: { "hover": {"animationDuration": 0},"animation": { "duration": 1,"onComplete": function () { var chartInstance = this.chart, ctx = chartInstance.ctx; ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize-1, Chart.defaults.global.defaultFontStyle, Chart.defaults.global.defaultFontFamily); ctx.textAlign = 'center'; ctx.textBaseline = 'bottom'; this.data.datasets.forEach(function (dataset, i) { var meta = chartInstance.controller.getDatasetMeta(i); meta.data.forEach(function (bar, index) { var data = dataset.data[index]; ctx.fillText(data, bar._model.x + 10, bar._model.y + 7); });});}}, maintainAspectRatio: false,legend: {display: false}, title: {display: true,text: ["Município de Residência","Total de Municípios: 46"]},scales: {yAxes: [{ticks: {beginAtZero: true}}]}}});

lucasa avatar Mar 29 '20 01:03 lucasa

Galera, acredito que tenha conseguido um solução inicial para consumir o dataset de casos confirmados do site http://ti.saude.rs.gov.br/covid19. Segue:

var declaredCountyDatasetAsString = document.scripts[11].innerText.split("\n")[2];
var jsonCountyAsText = declaredCountyDatasetAsString.replace("var myChart = new Chart(ctx, {type: 'horizontalBar',data: ","").replace(",backgroundColor: 'rgba(166, 58, 58, 0.8)',borderColor: 'rgba(0,0,0,0.8)',borderWidth: 1","").replace("},","}").replace("{labels:","{\"labels\":").replace(",datasets:",", \"datasets\":").replace("data:","\"data\":");
var countyDataset = JSON.parse(jsonCountyAsText);
console.log(countyDataset.labels[0] + ' : ' + countyDataset.datasets[0].data[0]);
"Porto Alegre : 133"

var declaredTotalCasesDataSet = document.scripts[11].innerText.split("\n")[15];
var jsonAsTextTotalCases = declaredTotalCasesDataSet.replace("var myBarChart = new Chart(ctxB, {type: 'bar',data: {	","{").replace(",	backgroundColor: 'rgba(166, 58, 58, 0.8)',	borderColor: 'rgba(0,0,0,1)',	borderWidth: 1	","").replace(",options: {","").replace("'total'","\"total\"");
var jsonTotalCases = JSON.parse(jsonAsTextTotalCases.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": '));
console.log(jsonTotalCases.labels[0] + ' : ' + jsonTotalCases.datasets[0].data[0]);
"29/02 : 1"

var prepareText = document.scripts[11].innerText.split("\n")[12].split(";")[1];
var sexDatasetAsString = prepareText.replace("var myPieChart = new Chart(ctxP, {type: 'pie',data: ","").replace(",backgroundColor: [\"#538B21\", \"#F73A30\", \"#ffffff\",],hoverBackgroundColor: [\"#79D826\", \"#FB847D\", \"#ffffff\"]","").replace(",options: {maintainAspectRatio: false,title: {display: true,text: 'Sexo'},responsive: true}})","");
var jsonSexDataSet = JSON.parse(sexDatasetAsString.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": '));
console.log(jsonSexDataSet.labels[0] + ' : ' + jsonSexDataSet.datasets[0].data[0]);
"Masculino : 140"

var prepareTextAgeDataSet = document.scripts[11].innerText.split("\n")[14].split(";")[1];
var jsonAsTextAgeDataSet = prepareTextAgeDataSet.replace("var myChart = new Chart(ctx, {type: 'horizontalBar',data: ","").replace(",backgroundColor: 'rgba(78, 170, 28, 0.8)',borderColor: 'rgba(0,0,0,1)',borderWidth: 1}]},options: {","}]}");
var jsonAgeDataSet = JSON.parse(jsonAsTextAgeDataSet.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": '));
console.log(jsonAgeDataSet.labels[0] + ' : ' + jsonAgeDataSet.datasets[0].data[0]);
"05-09 : 1"

Com certeza dá para fazer melhor! Como posso contribuir? Incluimos na rotina de coletagem? cc/ @turicas

gelias avatar Mar 29 '20 16:03 gelias

Antes de tudo, gostaria de agradecer pelo trabalho excelente que estão fazendo. Não entendo como funciona a coleta de dados mas uma cidade específica, Gravataí-RS, de código 4309209 no IBGE, está simplesmente fora da API. Poderiam adicionar?

curtinaz avatar Apr 23 '20 22:04 curtinaz

Antes de tudo, gostaria de agradecer pelo trabalho excelente que estão fazendo. Não entendo como funciona a coleta de dados mas uma cidade específica, Gravataí-RS, de código 4309209 no IBGE, está simplesmente fora da API. Poderiam adicionar?

Você está fazendo as requisições de maneira incorreta. Você pode filtrar tanto pelo código IBGE quanto pelo nome da cidade:

  • https://brasil.io/api/dataset/covid19/caso/data/?city_ibge_code=4309209
  • http://brasil.io/api/dataset/covid19/caso/data?city=Gravata%C3%AD&state=RS

Leia a documentação da API em: https://github.com/turicas/covid19-br/blob/master/api.md

Essa issue não é focada em suporte sobre os dados e por isso vou esconder seu comentário e esse meu.

turicas avatar Apr 24 '20 00:04 turicas