Skip to main content

Nowcasting bayesiano para dados do SINAN — correção de atraso de notificação em tempo real

Project description

nowcasting-sus

CI PyPI version Python Versions License: MIT

Nowcasting bayesiano para dados do SINAN — correção de atraso de notificação em tempo real usando PyMC.

⚕️ Desenvolvido no Departamento de Vigilância em Saúde da Secretaria de Estado de Saúde do Acre Agora open source para qualquer equipe de vigilância do Brasil.


O Problema

Os dados do SINAN chegam atrasados. Não por falha do sistema — é da natureza da notificação epidemiológica:

  1. Um caso ocorre (data de início dos sintomas)
  2. Leva dias ou semanas até ser digitado no SINAN
  3. Se você olha o número bruto de hoje, está sempre subestimando a realidade

O nowcasting (ou "previsão do presente") resolve isso: modela o padrão histórico de atraso de notificação e estima quantos casos já ocorreram mas ainda não foram notificados.


Instalação

pip install nowcasting-sus

Requisitos: Python ≥ 3.10, PyMC ≥ 5.0


Uso Rápido

Python

from nowcasting_sus.data import load_sinan, prepare_matrix
from nowcasting_sus.models import NowcastingModel, NowcastingModelDOW
from nowcasting_sus.plot import plot_nowcasting, plot_panel

# 1. Carregar dados do SINAN (qualquer CSV com DT_SIN_PRI e DT_NOTIFIC)
df = load_sinan("dados_sinan.csv")

# 2. Preparar matriz onset × delay para o modelo
nmat, dates, obs_t, obs_d, counts = prepare_matrix(df)

# 3. Ajustar modelo nowcasting
modelo = NowcastingModel()
idata = modelo.fit(obs_t, obs_d, counts, T=nmat.shape[0], D=nmat.shape[1])

# 4. Obter estimativas corrigidas
median, low, high = modelo.get_nowcast_ci()
# median[t] = casos esperados no dia t (já corrigindo atraso)

# 5. Visualizar
fig = plot_nowcasting(nmat, median, low, high, dates)

Modelo com Efeito de Dia da Semana (DOW)

import pandas as pd

modelo_dow = NowcastingModelDOW()
dow = pd.to_datetime(dates).dayofweek.values  # 0=segunda .. 6=domingo
idata = modelo_dow.fit(obs_t, obs_d, counts, T=T, D=nmat.shape[1], dow=dow)

# Ver efeito de cada dia da semana
print(modelo_dow.get_dow_effect())
# Exemplo: {'Seg': 1.12, 'Dom': 0.65} → domingo tem 35% menos notificações

CLI — Relatório HTML

nowcasting-report dados_sinan.csv --agravo "Chikungunya" --uf "Bahia" -o boletim.html

Gera um boletim epidemiológico completo com:

  • Resumo executivo (observado × estimado × não notificados)
  • Tabela com estimativas dos últimos 14 dias
  • Interpretação automática dos resultados

Modelos

Modelo Descrição Quando usar
NowcastingModel Random Walk 1ª ordem + Negative Binomial Uso geral, padrão
NowcastingModelDOW RW1 + NB + efeito dia da semana (ZeroSumNormal) Quando há padrão claro de menor notificação em fins de semana

Parâmetros Ajustáveis

Parâmetro Default Descrição
sigma_rw 0.1 Suavidade da tendência temporal (menor = mais suave)
alpha_nb 10.0 Dispersão da NegativeBinomial (maior = menos dispersão)
alpha_scale 3.0 Escala do prior Dirichlet para distribuição de atraso
sigma_dow 0.3 (DOW) Magnitude do efeito dia da semana

Estrutura do Pacote

nowcasting-sus/
├── nowcasting_sus/
│   ├── __init__.py    # Exporta API pública
│   ├── data.py        # Carga e preparação de dados SINAN
│   ├── models.py      # Modelos PyMC (NowcastingModel, NowcastingModelDOW)
│   ├── plot.py        # Visualização (curva, painel, efeito DOW)
│   ├── report.py      # Geração de boletim HTML
│   └── cli.py         # Interface de linha de comando
├── tests/             # Suite de testes (65+ testes, pytest)
├── examples/          # Exemplos de uso
├── .github/workflows/ # CI/CD automatizado
└── pyproject.toml     # Configuração do pacote

Exemplo Completo

Veja examples/example_real.py para um pipeline completo que:

  1. Carrega dados do SINAN
  2. Ajusta modelo base e modelo DOW
  3. Gera gráfico de painel 2×3
  4. Exporta relatório HTML

API Detalhada

data.load_sinan(filepath, date_onset, date_notif, max_delay, min_year)

Carrega CSV do SINAN, valida colunas, converte datas, calcula delay e filtra registros inválidos.

data.prepare_matrix(df, max_delay)

Converte DataFrame em matriz T × D (dias de onset × dias de delay) para o modelo.

models.NowcastingModel.fit(obs_t, obs_d, counts, T, D, draws, tune, chains)

Ajusta o modelo MCMC via PyMC. Retorna arviz.InferenceData.

models.NowcastingModel.get_nowcast_ci(prob=0.95)

Retorna (mediana, inferior, superior) — estimativas nowcast na escala original (casos/dia).

plot.plot_nowcasting(...), plot.plot_panel(...), plot.plot_dow_effect(...)

Funções de visualização. Todas retornam matplotlib.figure.Figure.

report.generate_report(...)

Gera boletim epidemiológico em HTML. Aceita parâmetros personalizados (agravo, UF, CID).


Contribuindo

Contribuições são bem-vindas!

  1. Fork o repositório
  2. Crie uma branch: git checkout -b minha-feature
  3. Faça suas alterações
  4. Execute os testes: pytest tests/ -v
  5. Envie um PR

Licença

MIT — use, modifique e distribua livremente. Atribuição apreciada.


Contato

Marcos Malveiramvmlima@hotmail.com


Prefira dados corrigidos a dados atrasados. 🧬📈

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nowcasting_sus-1.1.0.tar.gz (28.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nowcasting_sus-1.1.0-py3-none-any.whl (22.4 kB view details)

Uploaded Python 3

File details

Details for the file nowcasting_sus-1.1.0.tar.gz.

File metadata

  • Download URL: nowcasting_sus-1.1.0.tar.gz
  • Upload date:
  • Size: 28.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nowcasting_sus-1.1.0.tar.gz
Algorithm Hash digest
SHA256 c7ca378dfdc9610bfb3071d88cae3cba931fe9786188f7cc2cb2d9dc78a508b1
MD5 7da41c3a9c9a23e7cc5108bd6d2d9695
BLAKE2b-256 9b72c71fd3040f7d1b4dfe77df3f2eab9a8474854702f78a99200f266ca1b72c

See more details on using hashes here.

Provenance

The following attestation bundles were made for nowcasting_sus-1.1.0.tar.gz:

Publisher: publish.yml on MVMLima/nowcasting-sus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nowcasting_sus-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: nowcasting_sus-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 22.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nowcasting_sus-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 55580162fae8e8e375328703bf0a0efc986e4066a5e2f6b0dc78b4dd80d401af
MD5 0e77b9ba553f5a62a6b61dcff69635c8
BLAKE2b-256 4e12878cacae3e86cb3c8ca1e1182eb31cb944a5fdc58c2284ba11d7ef9d346b

See more details on using hashes here.

Provenance

The following attestation bundles were made for nowcasting_sus-1.1.0-py3-none-any.whl:

Publisher: publish.yml on MVMLima/nowcasting-sus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page