Giter Club home page Giter Club logo

covid19-br's Introduction

🇺🇸 English?

covid19-br

pytest@docker goodtables

Esse repositório centraliza links e dados sobre boletins de número de casos das Secretarias Estaduais de Saúde (SES) sobre os casos de covid19 no Brasil (por município por dia), além de outros dados relevantes para a análise, como óbitos registrados em cartório (por estado por dia).

Tabela de Conteúdos

  1. Licença e Citação
  2. Sobre os dados
  3. Guia de contribuição geral
  4. Guia de instalação / setup do projeto (ambiente de desenvolvimento)
  5. Guia de como executar os scrapers existentes
  6. Guia de como criar novos scrapers
  7. Guia de como atualizar os dados no Brasil.io (ambiente de produção)

Licença e Citação

A licença do código é LGPL3 e dos dados convertidos Creative Commons Attribution ShareAlike. Caso utilize os dados, cite a fonte original e quem tratou os dados e caso compartilhe os dados, utilize a mesma licença. Exemplos de como os dados podem ser citados:

  • Fonte: Secretarias de Saúde das Unidades Federativas, dados tratados por Álvaro Justen e equipe de voluntários Brasil.IO
  • Brasil.IO: boletins epidemiológicos da COVID-19 por município por dia, disponível em: https://brasil.io/dataset/covid19/ (última atualização pode ser conferida no site).

Dados

Depois de coletados e checados os dados ficam disponíveis de 3 formas no Brasil.IO:

Caso queira acessar os dados antes de serem publicados (ATENÇÃO: pode ser que não tenham sido checados), você pode acessar diretamente as planilhas em que estamos trabalhando.

Se esse programa e/ou os dados resultantes foram úteis a você ou à sua empresa, considere fazer uma doação ao projeto Brasil.IO, que é mantido voluntariamente.

FAQ SOBRE OS DADOS

Antes de entrar em contato conosco (estamos sobrecarregados) para tirar dúvidas sobre os dados, CONSULTE NOSSO FAQ.

Para mais detalhes veja a metodologia de coleta de dados.

Clipping

Quer saber quais projetos e notícias estão usando nossos dados? Veja o clipping.

Analisando os dados

Caso queira analisar os dados usando SQL, veja o script analysis.sh (ele baixa e converte os CSVs para um banco de dados SQLite e já cria índices e views que facilitam o trabalho) e os arquivos na pasta sql/.

Por padrão o script reutiliza os arquivos caso já tenha baixado; para sempre baixar a versão mais atual dos dados, execute ./analysis.sh --clean.

Leia também nossa análise dos microdados de vacinação disponíveis no OpenDataSUS.

Validando os dados

Os metadados estão descritos conforme os padrões Data Package e Table Schema do Frictionless Data. Isso significa que os dados podem ser validados automaticamente para detectar, por exemplo, se os valores de um campo estão em conformidade com a tipagem definida, se uma data é válida, se há colunas faltando ou se há linhas duplicadas.

Para fazer a verificação, ative o ambiente virtual Python e em seguida digite:

goodtables data/datapackage.json

O relatório da ferramenta Good Tables irá indicar se houver alguma inconsistência. A validação também pode ser feita online pelo site Goodtables.io.

Mais informações

Você pode ter interesse em ver também:

Contribuindo

Você pode contribuir de diversas formas:

  • Criando programas (crawlers/scrapers/spiders) para extrair os dados automaticamente (LEIA ESSE GUIA ANTES);
  • Coletando links para os boletins de seu estado;
  • Coletando dados sobre os casos por município por dia;
  • Entrando em contato com a secretaria estadual de seu estado, sugerindo as recomendações de liberação dos dados;
  • Evitando contato com humanos;
  • Lavando as mãos várias vezes ao dia;
  • Sendo solidário aos mais vulneráveis;

Para se voluntariar, siga estes passos.

Procure o seu estado nas issues desse repositório e vamos conversar por lá.

Instalando

Este projeto utiliza Python 3 (testado em 3.8.2) e Scrapy.

Você pode montar seu ambiente de desenvolvimento utilizando o setup padrão ou o setup com docker.

Setup Padrão

  1. Instale o Python 3.8.2
  2. Crie um virtualenv (você pode usar venv para isso).
  3. Instale as dependências: pip install -r requirements-development.txt

Setup com Docker

Se você preferir utilizar o Docker para executar, basta usar os comandos a seguir :

make docker-build       # para construir a imagem
make docker-run-spiders # para coletar os dados

Executando os scrapers

Uma vez que seu setup estiver terminado, você pode rodar todos os scrapers usando um dos seguintes comandos no seu terminal (a depender do tipo de setup que decidiu fazer):

python covid19br/run_spider.py  # caso tenha feito o setup padrão
make docker-run-spiders         # caso esteja usando o setup com docker

Os comandos acima irão rodar os scrapers de todos os estados que temos implementado buscando os dados sobre a data de hoje e salvarão o consolidado em .csv na pasta data deste diretório (por padrão são salvos em arquivos com o nome no padrão "data/{estado}/covid19-{estado}-{data}{extra_info}.csv").

Mas essa não é a única forma de usar esse comando, você pode optar por não salvar os consolidados em um .csv (apenas exibi-los na tela) ou então rodar apenas os scrapers de alguns estados específicos ou para outros dias específicos que não são necessariamente a data de hoje.

Para adaptar melhor o comando ao seu caso de uso você pode rodá-lo no terminal com as seguintes opções:

OBS: Se você estiver usando docker, basta acrescentar docker container run --rm --name covid19-br -v $(PWD)/data:/app/data covid19-br antes de qualquer um dos comandos a seguir.

# Exemplo de como raspar os dados de todos os estados em um intervalo de datas
python covid19br/run_spider.py --start-date 24/02/2021 --end-date 30/03/2021

# Caso você queira executar para datas específicas (coloque-as em lista separando-as por vírgulas):
python covid19br/run_spider.py --dates-list  15/01/2022,17/01/2022

# Para executar apenas spiders de estados específicos (coloque-os em lista e separados por vírgulas):
python covid19br/run_spider.py --states BA,PR

# Para ver quais são os estados com scrapers implementados:
python covid19br/run_spider.py --available-spiders

# Caso você não queira salvar os csv's, apenas mostrar na tela os resultados:
python covid19br/run_spider.py --print-results-only

# Você pode consultar essas e outras opções disponíveis usando:
python covid19br/run_spider.py -h

Criando novos scrapers

Estamos mudando a forma como subimos os dados para facilitar o trabalho dos voluntários e deixar o processo mais robusto e confiável e, com isso, será mais fácil que robôs possam subir também os dados; dessa forma, os scrapers ajudarão bastante no processo.

Porém, ao criar um scraper é importante que você siga algumas regras:

  • Necessário fazer o scraper usando o scrapy (confira aqui as docs);
  • Não usar pandas, BeautifulSoap, requests ou outras bibliotecas desnecessárias (a std lib do Python já tem muita biblioteca útil, o scrapy com XPath já dá conta de boa parte das raspagens e rows já é uma dependência desse repositório);

Para padronizar a forma que os scrapers recebem parâmetros e retornam os dados, criamos um Spider Base, que nada mais é que um spider básico do scrapy com lógica a mais para:

  • Identificar para quais datas o spider deve procurar dados (essa informação é recebida como parâmetro e é guardada na classe no atributo self.requested_dates, que é um generator de valores do tipo datetime.date com as datas que precisamos raspar os dados, e deve ser usada pelo seu spider para buscar os dados como solicitado).
  • Guardar os dados raspados de uma forma que sejam retornados para o sistema que chamou o scraper de forma padronizada.

Para padronizar os dados que são retornados pelos spiders, criamos a classe FullReport que representa um "relatório completo" e armazena todos os dados coletados para um determinado estado em uma data específica. Esse relatório completo é composto por vários boletins, (um para cada cidade do estado + um para casos importados/indefinidos) com o número de casos confirmados e número de mortes daquele dia.

O seu script não precisa se preocupar com a criação do objeto FullReport que será retornado, isso é responsabilidade do Spider Base, o que seu spider deve criar são os boletins com os dados que ele coletar e salvar esses boletins no relatório através do método add_new_bulletin_to_report disponibilizado pelo Spider Base.

Em resumo, ao criar um spider de um novo estado tenha em mente:

  • É desejável que você crie seu spider extendendo a classe Spider Base (você pode conferir alguns exemplos de como outros spiders são implementados na pasta /covid19br/spiders).
  • Um spider completo é capaz de coletar os dados:
    • De número de casos confirmados e número de mortes por cidade do estado;
    • De número de casos confirmados e número de mortes importados/indefinidos;
    • De números de casos confirmados e números de mortes totais do estado (esse valor normalmente é computado automaticamente conforme os casos acimas são obtidos, mas em casos onde a scretaria disponibiliza o valor total, nós optamos por usá-lo como "fonte da verdade").
    • Para diferentes datas (desde o início da pandemia até hoje).

    OBS: Como não há uma padronização na forma em que as secretarias disponibilizam os dados, nem sempre é possível obter todas essas informações como desejamos. Obter parte dessas informações de forma automatizada já pode ser um bom começo e uma contribuição válida! :)

  • Os dados coletados devem ser salvos em boletins e adicionados no retorno do spider através do método add_new_bulletin_to_report.

Ao finalizar a implementação do seu spider, adicione-o na lista de spiders do script run_spider.py e execute-o (mais informações sobre como fazer isso na seção anterior). Se tudo correu como previsto, é esperado que seja criado um .csv na pasta /data/... com os dados raspados pelo seu spider :)

Nesse momento não temos muito tempo disponível para revisão, então por favor, só crie um pull request com código de um novo scraper caso você possa cumprir os requisitos acima.

Atualização dos Dados no Brasil.IO

Crie um arquivo .env com os valores corretos para as seguintes variáveis de ambiente:

BRASILIO_SSH_USER
BRASILIO_SSH_SERVER
BRASILIO_DATA_PATH
BRASILIO_UPDATE_COMMAND
BULLETIN_SPREADSHEET_ID

Execute o script:

./deploy.sh full

Ele irá coletar os dados das planilhas (que estão linkadas em data/boletim_url.csv e data/caso_url.csv), adicionar os dados ao repositório, compactá-los, enviá-los ao servidor e executar o comando de atualização de dataset.

Nota: o script que baixa e converte os dados automaticamente deve ser executado separadamente, com o comando python covid19br/run_spider.py.

covid19-br's People

Contributors

albertoleoncio avatar alisonjs avatar arielcavalcante avatar augusto-herrmann avatar berinhard avatar bessavagner avatar bmenani avatar bonifacio2 avatar capyvara avatar danielfsbarreto avatar davidmaciel avatar di3gocs avatar endersonmaia avatar endoedgar avatar filipesaraiva avatar flaviovdf avatar gabrielcesar avatar gustavo-utpott avatar hugomn avatar leonardokume avatar lorenzoridolfi avatar lucasrla avatar momenezes avatar ramongss avatar rhenanbartels avatar thiagodiasv avatar turicas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

covid19-br's Issues

Implementar script de coleta para AL

Temos microdados :

http://www.dados.al.gov.br/dataset/painel-covid19-alagoas

Segue link do CSV : http://www.dados.al.gov.br/dataset/painel-covid19-alagoas/resource/0371d543-3b57-4177-aea3-394d1f009bfd

--

A apuração para Alagoas está bem irregular em relação aos sites que disponibilizam os dados.

É possível encontrá-los em 3 endereços :

neste link existe uma seção Boletins, as vezes desatualizada com as notícias

neste link aparece junto com as notícias do site

aqui é o mais estruturado, contém uma lista de links para os boletins em PDF a partir do boletim de número 16

Segue o link de um PDF para tomar como referência : http://www.saude.al.gov.br/wp-content/uploads/2020/04/Informe-COVID-19-nº-27-02-DE-ABRIL-02_04_2020.pdf.pdf.pdf

Falta de repetição nos dados

Estou trabalhando em um web mapa para representação espaço-temporal dos dados, porém percebi a diminuição de dados do dia 27/03/2020 para o dia 28/03/2020. Filtrando os dados por dia, no dia 27/03 retorna 311 registros e no dia 28/03 retorna 270, deveria aumentar, certo?
Fiz o download do csv com todos os dados e notei que para cidade de Iracemápolis há dados até dia 27/03. Os dados deveriam repetir mesmo que não tivesse atualizações?

Link direto para download dos dados

Olá! Parabéns pelo trabalho de agrupar as informações municipais e estaduais sobre o covid! Tem algum link para que eu possa importar diretamente no RStudio os dados?

Dataset temporal dos casos

Olá, seria possível disponibilizar no Brasil.io um dataset temporal do casos? Ou seja, cada linha do dataset seria um caso.

Acredito que o dado organizado dessa maneira seja mais versátil.

Entendo que não seria 100% verídico pois nem todo caso tem a data que foi confirmado, mas é a maneira mais próxima de ter uma linha do tempo

Verificar dados do MS para acompanhar evolução da apuração

Contexto

Considerando que os dados deste projeto são atualizados de forma manual por voluntários, e a atualização acontece após a liberação dos boletins pelas Secretarias de Saúde Estaduais. Existem várias situações em que os dados podem estar diferentes entres os divulgados pela secretaria e os divulgados pelo Ministério da Saúde.

Proposta

Implementar no script report.py, um comparativo entre os valores compilados até aquele momento, e os dados que estão disponíveis no portal do Ministério da Saúde.

Assim poderíamos comparar o andamento da apuração, e a diferença já seria indicativo que há apurações a serem feitas, e dá informação para os voluntários cobrarem os boletins junto às secretarias.

Citacao em artigo científico.

Olá,

Estou usando o dado de vocês e do Wesley Cota em um manuscrito e gostaria de cita-los adequadamente no artigo. Vocês tem um .bib? O Wesley me passou um doi para o kaggle, talvez o dados de vcs já esteja por lá eu nao encontrei.

O dele: https://doi.org/10.34740/KAGGLE/DSV/1042812

Se vcs tiverem um tb seria ótimo.

Obrigado

Criar tabela com dados consolidados por município por dia

Nem todos os municípios possuem dados todos os dias, mas muitas vezes para desenvolver interfaces e análises é importante ter filtros por dia/por município. Para isso precisamos de uma tabela nova, com uma linha por município por dia, contendo os valores mais atuais para aquele município naquele dia (0 caso não existam casos ou o valor do dia anterior caso não tenha sido publicado boletim naquele dia).

Validação contínua dos dados usando Goodtables e Data Packages

Vejo que os dados estão em planilhas do Google Drive e os CSVs que estão no repositório apenas apontam para as URLs das planilhas no Drive.

Nesse caso, faria sentido documentar o dataset seguindo o padrão Data Package do Frictionless Data, para automatizar a validação dos dados? Assim os dados seriam validados automaticamente toda vez que alguma ação é realizada (ex.: push para o repositório no Github, criação de um pull request, etc.).

Pense nisto como uma integração contínua para dados, da mesma forma como normalmente se faz integração contínua para software.

Evidenciar dias de atraso no relatório de atualziações

O relatório de atualizações que está sendo enviado no https://chat.brasil.io, que mostra a situação por estado, mostra a data da última atualização do estado.

Com o objetivo de ficar mais explicito o atraso, sugiro informar a quantidade de dias em atraso, ao lado da data, em negrito.

Ex.: considerando script executando no dia 29/03


DADOS ATUALIZADOS:

  • 594 boletins capturados
  • 3985 casos confirmados (estado)
  • 3804 casos confirmados (municípios)
  • 116 mortes (estado)
  • 100 mortes (municípios)

DESATUALIZADOS:

  • AC (2020-03-28)
  • AL (2020-03-28)
  • AP (2020-03-28)
  • CE (2020-03-28)
  • DF (2020-03-27) +2 dias em atraso
    ...

Melhorias de UX

Alguns questionamentos em relação aos Filtros dos Dados que vou colocar aqui para conseguirmos melhorar a experiência de usuário.

  1. Existe uma divisão de campos de busca que são obrigatórios?
  2. Existe um campo que se preenchido deveria desabilitar outro campo de busca?
  3. Qual o uso do campo tipo de local?
  4. Qual o uso do campo Código IBGE?
  5. Qual o uso do campo É a última atualização?
  6. Qual o uso do campo Ordenação para esse local?

Gerar documentação dos códigos python

Contexto

Em minhas tentativas de contribuir com o projeto, notei uma dificuldade de entendimento das implementações. Creio que isso pode ajudar outros programadores a resolver as issues.

Proposta

Gerar, através dos comentários e docstrings, páginas de documentação com o auxílio do pacote pycco.

Implementar delay no `./bot/url_spider.py`quando site não estiver respondendo

Contexto

Sabendo que o ./bot/url_spider.py não verifica os links de todos os estados, pois a planilha Brasil.IO - COVID19 - Links por UF separa em duas colunas, uma onde o script verifica e outra onde o script não verifica.

No caso de AL, estava retornando muito erro de timeout, mas quando funciona, ele de fato consegue alertar que há novas notícias.

Proposta

Implementar algum tipo de delay, caso o site não esteja respondendo, adiar a próxima checagem, se ainda assim continuar não respondendo, adiar mais duas execuções, e zeraria no dia seguinte.

Isso pode evitar o flood no canal, com checagens desnecessárias.

Nome da cidade embranco Estado MG.

Boa Tarde, o nome de uma cidade do estado de Minas Gerais se encontra embranco, como mostra a imagem abaixo.

DATASET: Covid-19
Página (Paginação): 3
Navegador: Firefox 74.0
S.O.: OpenBSD-6.6

image

Dados I Metadados - visualização

Atualmente, dá a entender que o DADOS é referente à coluna de busca da esquerda e METADADOS é referente à coluna de busca da direita. Não é visualmente lógico que são duas tabs diferentes e não dá a entender que são clicáveis.

Elaborar documentação para 'onboarding' de novos voluntários

Para facilitar a entrada de novos voluntários e habilitá-los para colaboração da forma mais rápida e prática, se faz necessária uma documentação mais objetiva sobre o processo de colaboração e quais são todas as ferramentas disponíveis para os voluntários.

Alguns tópicos para nortear a documentação :

  • Fornecer dados para cadastro do voluntário
  • Orientar sobre acesso às planilhas e documentos existentes
  • Visão geral da metodologia
  • Canais no https://chat.brasil.io
  • Links importantes do projeto

remover menções a all feitas pelo bot

Sempre que o nosso bot manda mensagens ele começa com "@ALL", o que dispara uma notificação pra todo mundo no canal. Como agora tempos voluntários por estados e o monitoramento do bot também é por estado, acho que podemos reduzir as notificações fazendo esse ajuste fino para que o bot mencione apenas as pessoas que estão monitorando um determinado estado específico. O que acham?

Identificador Único

Pessoal, não tenho certeza como estão planejando evoluir os dados, mas tem algum plano para um identificador único?

Tentei gerar um a partir da composição da Data+Código IBGE, mas não tenho certeza se é confiável, pois poderia haver dois boletins no mesmo dia certo?

Seria muito util na hora de sincronizar outro banco com os dados desse

Configurar CI para rodar testes

Pode ser um workflow do GitHub. Exemplo (tem que alterar e testar): arquivo .github/workflows/pythonpackage.yml:

name: Python package

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.8]

    steps:
    - uses: actions/checkout@v1
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v1
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Lint with flake8
      run: |
        pip install flake8
        # stop the build if there are Python syntax errors or undefined names
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
        # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
    - name: Test with pytest
      run: |
        pip install -r requirements-development.txt
        pytest tests/
      env:
        SECRET_KEY: "a"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.