Nowcasting bayesiano para dados do SINAN — correção de atraso de notificação em tempo real
Project description
nowcasting-sus
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:
- Um caso ocorre (data de início dos sintomas)
- Leva dias ou semanas até ser digitado no SINAN
- 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:
- Carrega dados do SINAN
- Ajusta modelo base e modelo DOW
- Gera gráfico de painel 2×3
- 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!
- Fork o repositório
- Crie uma branch:
git checkout -b minha-feature - Faça suas alterações
- Execute os testes:
pytest tests/ -v - Envie um PR
Licença
MIT — use, modifique e distribua livremente. Atribuição apreciada.
Contato
Marcos Malveira — mvmlima@hotmail.com
Prefira dados corrigidos a dados atrasados. 🧬📈
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7ca378dfdc9610bfb3071d88cae3cba931fe9786188f7cc2cb2d9dc78a508b1
|
|
| MD5 |
7da41c3a9c9a23e7cc5108bd6d2d9695
|
|
| BLAKE2b-256 |
9b72c71fd3040f7d1b4dfe77df3f2eab9a8474854702f78a99200f266ca1b72c
|
Provenance
The following attestation bundles were made for nowcasting_sus-1.1.0.tar.gz:
Publisher:
publish.yml on MVMLima/nowcasting-sus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nowcasting_sus-1.1.0.tar.gz -
Subject digest:
c7ca378dfdc9610bfb3071d88cae3cba931fe9786188f7cc2cb2d9dc78a508b1 - Sigstore transparency entry: 1733970032
- Sigstore integration time:
-
Permalink:
MVMLima/nowcasting-sus@389e2f1d59317d67c3557a0ef0af9e1ff96ae9c7 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/MVMLima
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@389e2f1d59317d67c3557a0ef0af9e1ff96ae9c7 -
Trigger Event:
release
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
55580162fae8e8e375328703bf0a0efc986e4066a5e2f6b0dc78b4dd80d401af
|
|
| MD5 |
0e77b9ba553f5a62a6b61dcff69635c8
|
|
| BLAKE2b-256 |
4e12878cacae3e86cb3c8ca1e1182eb31cb944a5fdc58c2284ba11d7ef9d346b
|
Provenance
The following attestation bundles were made for nowcasting_sus-1.1.0-py3-none-any.whl:
Publisher:
publish.yml on MVMLima/nowcasting-sus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nowcasting_sus-1.1.0-py3-none-any.whl -
Subject digest:
55580162fae8e8e375328703bf0a0efc986e4066a5e2f6b0dc78b4dd80d401af - Sigstore transparency entry: 1733970122
- Sigstore integration time:
-
Permalink:
MVMLima/nowcasting-sus@389e2f1d59317d67c3557a0ef0af9e1ff96ae9c7 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/MVMLima
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@389e2f1d59317d67c3557a0ef0af9e1ff96ae9c7 -
Trigger Event:
release
-
Statement type: