turicas / covid19-br

Dados diários mais recentes do coronavírus por município brasileiro
https://brasil.io/dataset/covid19
GNU Lesser General Public License v3.0
530 stars 128 forks source link

RS #6

Open turicas opened 4 years ago

turicas commented 4 years ago

Boletins:

Status da checagem (anteriores a 20/03):

Modo e responsável pela conversão:

paulabracco commented 4 years ago

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

lucasrcezimbra commented 4 years ago

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

lucasrcezimbra commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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

turicas commented 4 years ago

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

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

lucasrcezimbra commented 4 years ago

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

Vou dar uma olhada no camelot hoje.

lucasrcezimbra commented 4 years ago

Tive o mesmo problema com o cametot.

lucasrcezimbra commented 4 years ago

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/

lucasa commented 4 years ago

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}}]}}});

gelias commented 4 years ago

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

curtinaz commented 4 years ago

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?

turicas commented 4 years ago

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:

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.