susflow 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- susflow-0.1.1/.gitignore +27 -0
- susflow-0.1.1/PKG-INFO +195 -0
- susflow-0.1.1/README.md +183 -0
- susflow-0.1.1/docs/cnes.md +160 -0
- susflow-0.1.1/docs/pni.md +76 -0
- susflow-0.1.1/docs/siasus.md +159 -0
- susflow-0.1.1/docs/sihsus.md +149 -0
- susflow-0.1.1/docs/sim.md +186 -0
- susflow-0.1.1/docs/sinan.md +195 -0
- susflow-0.1.1/docs/sinasc.md +149 -0
- susflow-0.1.1/docs/sumario.md +161 -0
- susflow-0.1.1/notbooks/teste.ipynb +1101 -0
- susflow-0.1.1/pyproject.toml +19 -0
- susflow-0.1.1/susflow/__init__.py +3 -0
- susflow-0.1.1/susflow/cache.py +26 -0
- susflow-0.1.1/susflow/config.py +358 -0
- susflow-0.1.1/susflow/ftp.py +111 -0
- susflow-0.1.1/susflow/reader.py +97 -0
- susflow-0.1.1/susflow/requirements.txt +3 -0
- susflow-0.1.1/susflow/systems/__init__.py +3 -0
- susflow-0.1.1/susflow/systems/cnes.py +127 -0
- susflow-0.1.1/susflow/systems/pni.py +91 -0
- susflow-0.1.1/susflow/systems/siasus.py +128 -0
- susflow-0.1.1/susflow/systems/sihsus.py +166 -0
- susflow-0.1.1/susflow/systems/sim.py +190 -0
- susflow-0.1.1/susflow/systems/sinan.py +132 -0
- susflow-0.1.1/susflow/systems/sinasc.py +150 -0
- susflow-0.1.1/tools/mapear_ftp.py +132 -0
susflow-0.1.1/.gitignore
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
*.egg-info/
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
|
|
11
|
+
# Cache local da biblioteca
|
|
12
|
+
.susflow/
|
|
13
|
+
|
|
14
|
+
# IDEs
|
|
15
|
+
.vscode/
|
|
16
|
+
.idea/
|
|
17
|
+
*.swp
|
|
18
|
+
*.swo
|
|
19
|
+
|
|
20
|
+
# Testes
|
|
21
|
+
.pytest_cache/
|
|
22
|
+
.coverage
|
|
23
|
+
htmlcov/
|
|
24
|
+
|
|
25
|
+
# Mapas FTP gerados
|
|
26
|
+
tools/mapas/mapa_ftp_*.txt
|
|
27
|
+
NEXT.md
|
susflow-0.1.1/PKG-INFO
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: susflow
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Acesso programático aos dados do DATASUS
|
|
5
|
+
Project-URL: Homepage, https://github.com/OncoAtlas/susflow
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Requires-Dist: dbfread
|
|
9
|
+
Requires-Dist: pandas
|
|
10
|
+
Requires-Dist: pyreaddbc
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
|
|
13
|
+
# SUSFlow
|
|
14
|
+
|
|
15
|
+
[](https://www.python.org/)
|
|
16
|
+
[](https://opensource.org/licenses/MIT)
|
|
17
|
+
[](https://github.com/psf/black)
|
|
18
|
+
[](#)
|
|
19
|
+
|
|
20
|
+
Biblioteca Python moderna para automação, download e engenharia de dados dos sistemas de informação do DATASUS. O susflow abstrai de forma transparente o protocolo FTP governamental, gerencia cache local, lida com a descompressão de arquivos proprietários .dbc e entrega dados limpos diretamente em estruturas do Pandas.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Sumário de Documentação Técnica
|
|
25
|
+
|
|
26
|
+
Os guias detalhados sobre layouts de arquivos, variáveis específicas e regras de cada sistema de informação estão localizados na pasta /docs. Navegue diretamente por aqui:
|
|
27
|
+
|
|
28
|
+
- [**CNES** — Cadastro Nacional de Estabelecimentos de Saúde](./docs/cnes.md)
|
|
29
|
+
- [**PNI** — Programa Nacional de Imunizações](./docs/pni.md)
|
|
30
|
+
- [**SIM** — Sistema de Informações sobre Mortalidade](./docs/sim.md)
|
|
31
|
+
- [**SINAN** — Sistema de Informação de Agravos de Notificação](./docs/sinan.md)
|
|
32
|
+
- [**SINASC** — Sistema de Informações sobre Nascidos Vivos](./docs/sinasc.md)
|
|
33
|
+
- [**SIASUS** — Sistema de Informações Ambulatoriais do SUS](./docs/siasus.md) (Em breve)
|
|
34
|
+
- [**SIHSUS** — Sistema de Informações Hospitalares do SUS](./docs/sihsus.md) (Em breve)
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Instalação
|
|
39
|
+
|
|
40
|
+
Como o projeto está em desenvolvimento ativo, instale em modo editável (-e):
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
git clone [https://github.com/seu-usuario/susflow.git](https://github.com/seu-usuario/susflow.git)
|
|
44
|
+
cd susflow
|
|
45
|
+
pip install -e .
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Requisitos Base
|
|
50
|
+
|
|
51
|
+
- pandas (Manipulação de dados)
|
|
52
|
+
- pyreaddbc (Motor de descompressão do algoritmo BLAST)
|
|
53
|
+
- dbfread (Leitor nativo de estruturas DBF)
|
|
54
|
+
- pyarrow / fastparquet (Opcional, altamente recomendado para cache de alta performance)
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Como Usar (Exemplos Rápidos)
|
|
59
|
+
|
|
60
|
+
### 1. SINASC — Nascidos Vivos
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from susflow.systems import sinasc
|
|
64
|
+
|
|
65
|
+
# Listar arquivos disponíveis no servidor FTP
|
|
66
|
+
sinasc.listar(uf="PB")
|
|
67
|
+
|
|
68
|
+
# Baixar e carregar diretamente em um DataFrame pronto para análise
|
|
69
|
+
df_sinasc = sinasc.ler(uf="SP", ano=2022)
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 2. PNI — Imunizações (Formato DBF Puro)
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
from susflow.systems import pni
|
|
77
|
+
|
|
78
|
+
# Cobertura histórica anual por UF (1994 a 2019)
|
|
79
|
+
df_pni = pni.ler(uf="RJ", ano=2015)
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 3. CNES — Estabelecimentos de Saúde (Granularidade Mensal)
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
from susflow.systems import cnes
|
|
87
|
+
|
|
88
|
+
# Leitura mensal parametrizada por tipo de tabela (ex: "ST" = Estabelecimentos)
|
|
89
|
+
df_cnes = cnes.ler(uf="MG", ano=2022, mes=5, tipo="ST")
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Gerenciamento de Cache Inteligente
|
|
96
|
+
|
|
97
|
+
Para evitar sobrecarregar o servidor do DATASUS e acelerar seus scripts, o susflow implementa um cache local persistente em ~/.susflow/cache/, espelhando fielmente a árvore de diretórios do FTP original:
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
~/.susflow/cache/
|
|
101
|
+
└── dissemin/publicos/
|
|
102
|
+
├── SINASC/NOV/DNRES/DNSP2022.dbc
|
|
103
|
+
├── PNI/DADOS/DPNISP15.DBF
|
|
104
|
+
└── CNES/200508_/Dados/ST/STPB2201.dbc
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- **Validação:** Se o arquivo solicitado já existir no diretório local, a biblioteca pula o download e faz a leitura imediata.
|
|
109
|
+
- **Sobrescrita:** Para atualizar dados preliminares ou forçar uma nova cópia do servidor, utilize o parâmetro forcar=True:
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
df = sinasc.ler(uf="BA", ano=2023, forcar=True)
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Dicas de Desempenho e Memória
|
|
119
|
+
|
|
120
|
+
Bases de dados de saúde pública do Brasil podem ser massivas, frequentemente congelando ou travando o Jupyter Notebook se não tratadas corretamente. Siga as boas práticas abaixo:
|
|
121
|
+
|
|
122
|
+
1. **Otimização de Tipos (Downcasting):** Converta colunas de strings altamente repetitivas (como códigos de UF, Sexo ou Municípios) para o tipo category do Pandas. Reduza tipos de inteiros int64 genéricos para int16 ou int8 no seu pipeline. Isso pode reduzir o consumo de RAM em até 80%.
|
|
123
|
+
2. **Transição de Formato de Longo Prazo:** Arquivos .DBF e .DBC são extremamente lentos para leitura analítica. Após efetuar o primeiro pni.ler() ou cnes.ler(), salve o DataFrame resultante em formato Parquet:
|
|
124
|
+
|
|
125
|
+
```python
|
|
126
|
+
df.to_parquet("meus_dados.parquet", compression="snappy")
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
3. **Ajuste do Jupyter IOPub:** Se o seu Jupyter travar ao exibir ou processar DataFrames massivos, inicialize-o via terminal expandindo os limites de taxa de dados:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
jupyter notebook --NotebookApp.iopub_data_rate_limit=1.0e10
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Escopo e Mapeamento dos Sistemas
|
|
140
|
+
|
|
141
|
+
### v1 — Matriz de Implementação Atual
|
|
142
|
+
|
|
143
|
+
| Sistema | Sigla | Granularidade | Formato | Status |
|
|
144
|
+
| --------------------------------------------------- | ---------- | ---------------- | ------- | --------- |
|
|
145
|
+
| Sistema de Informações sobre Nascidos Vivos | **SINASC** | Anual / Por UF | .dbc | Concluído |
|
|
146
|
+
| Sistema de Informações sobre Mortalidade (Geral) | **SIM** | Anual / Por UF | .dbc | Concluído |
|
|
147
|
+
| Sistema de Informações sobre Mortalidade (Especial) | **SIM** | Anual / Nacional | .dbc | Concluído |
|
|
148
|
+
| Sistema de Informação de Agravos de Notificação | **SINAN** | Anual / Nacional | .dbc | Concluído |
|
|
149
|
+
| Cadastro Nacional de Estabelecimentos de Saúde | **CNES** | Mensal / Por UF | .dbc | Concluído |
|
|
150
|
+
| Programa Nacional de Imunizações | **PNI** | Anual / Por UF | .dbf | Concluído |
|
|
151
|
+
| Sistema de Informações Hospitalares | **SIHSUS** | Mensal / Por UF | .dbc | Planejado |
|
|
152
|
+
| Sistema de Informações Ambulatoriais | **SIASUS** | Mensal / Por UF | .dbc | Planejado |
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Engenharia Reversa do Fluxo de Dados
|
|
157
|
+
|
|
158
|
+
```text
|
|
159
|
+
┌───────────────────────┐
|
|
160
|
+
│ FTP DATASUS (.dbc) │ <- Arquivo compactado no servidor público
|
|
161
|
+
└──────────┬────────────┘
|
|
162
|
+
│ (Susflow faz o download & valida cache)
|
|
163
|
+
▼
|
|
164
|
+
┌───────────────────────┐
|
|
165
|
+
│ Descompressão BLAST │ <- Traduz .dbc para .dbf estruturado em Python puro
|
|
166
|
+
└──────────┬────────────┘
|
|
167
|
+
│ (Motor de parsing do reader)
|
|
168
|
+
▼
|
|
169
|
+
┌───────────────────────┐
|
|
170
|
+
│ Pandas DataFrame │ <- Pronto para análise, gráficos e ML
|
|
171
|
+
└───────────────────────┘
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Ferramentas de Mapeamento (Diretório tools/)
|
|
178
|
+
|
|
179
|
+
O DATASUS frequentemente altera de forma silenciosa os caminhos ou padrões de nomenclatura de arquivos no FTP. A pasta tools/ contém scripts utilitários robustos para varredura e auditoria desses diretórios:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# Mapear e atualizar de forma automática os caminhos base da v1
|
|
183
|
+
python tools/mapear_ftp.py
|
|
184
|
+
|
|
185
|
+
# Executar mapeamento silencioso salvando o log estruturado em json/csv
|
|
186
|
+
python tools/mapear_ftp.py --salvar --quiet
|
|
187
|
+
|
|
188
|
+
# Auditar uma árvore de diretórios específica no FTP profundo
|
|
189
|
+
python tools/mapear_ftp.py --alvo /dissemin/publicos/SINAN/DADOS --profundo
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
Desenvolvido para simplificar a pesquisa epidemiológica e a ciência de dados em saúde no Brasil. Contribuições e pull requests são bem-vindos!
|
susflow-0.1.1/README.md
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# SUSFlow
|
|
2
|
+
|
|
3
|
+
[](https://www.python.org/)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://github.com/psf/black)
|
|
6
|
+
[](#)
|
|
7
|
+
|
|
8
|
+
Biblioteca Python moderna para automação, download e engenharia de dados dos sistemas de informação do DATASUS. O susflow abstrai de forma transparente o protocolo FTP governamental, gerencia cache local, lida com a descompressão de arquivos proprietários .dbc e entrega dados limpos diretamente em estruturas do Pandas.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Sumário de Documentação Técnica
|
|
13
|
+
|
|
14
|
+
Os guias detalhados sobre layouts de arquivos, variáveis específicas e regras de cada sistema de informação estão localizados na pasta /docs. Navegue diretamente por aqui:
|
|
15
|
+
|
|
16
|
+
- [**CNES** — Cadastro Nacional de Estabelecimentos de Saúde](./docs/cnes.md)
|
|
17
|
+
- [**PNI** — Programa Nacional de Imunizações](./docs/pni.md)
|
|
18
|
+
- [**SIM** — Sistema de Informações sobre Mortalidade](./docs/sim.md)
|
|
19
|
+
- [**SINAN** — Sistema de Informação de Agravos de Notificação](./docs/sinan.md)
|
|
20
|
+
- [**SINASC** — Sistema de Informações sobre Nascidos Vivos](./docs/sinasc.md)
|
|
21
|
+
- [**SIASUS** — Sistema de Informações Ambulatoriais do SUS](./docs/siasus.md) (Em breve)
|
|
22
|
+
- [**SIHSUS** — Sistema de Informações Hospitalares do SUS](./docs/sihsus.md) (Em breve)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Instalação
|
|
27
|
+
|
|
28
|
+
Como o projeto está em desenvolvimento ativo, instale em modo editável (-e):
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
git clone [https://github.com/seu-usuario/susflow.git](https://github.com/seu-usuario/susflow.git)
|
|
32
|
+
cd susflow
|
|
33
|
+
pip install -e .
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Requisitos Base
|
|
38
|
+
|
|
39
|
+
- pandas (Manipulação de dados)
|
|
40
|
+
- pyreaddbc (Motor de descompressão do algoritmo BLAST)
|
|
41
|
+
- dbfread (Leitor nativo de estruturas DBF)
|
|
42
|
+
- pyarrow / fastparquet (Opcional, altamente recomendado para cache de alta performance)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Como Usar (Exemplos Rápidos)
|
|
47
|
+
|
|
48
|
+
### 1. SINASC — Nascidos Vivos
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
from susflow.systems import sinasc
|
|
52
|
+
|
|
53
|
+
# Listar arquivos disponíveis no servidor FTP
|
|
54
|
+
sinasc.listar(uf="PB")
|
|
55
|
+
|
|
56
|
+
# Baixar e carregar diretamente em um DataFrame pronto para análise
|
|
57
|
+
df_sinasc = sinasc.ler(uf="SP", ano=2022)
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 2. PNI — Imunizações (Formato DBF Puro)
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
from susflow.systems import pni
|
|
65
|
+
|
|
66
|
+
# Cobertura histórica anual por UF (1994 a 2019)
|
|
67
|
+
df_pni = pni.ler(uf="RJ", ano=2015)
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 3. CNES — Estabelecimentos de Saúde (Granularidade Mensal)
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
from susflow.systems import cnes
|
|
75
|
+
|
|
76
|
+
# Leitura mensal parametrizada por tipo de tabela (ex: "ST" = Estabelecimentos)
|
|
77
|
+
df_cnes = cnes.ler(uf="MG", ano=2022, mes=5, tipo="ST")
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Gerenciamento de Cache Inteligente
|
|
84
|
+
|
|
85
|
+
Para evitar sobrecarregar o servidor do DATASUS e acelerar seus scripts, o susflow implementa um cache local persistente em ~/.susflow/cache/, espelhando fielmente a árvore de diretórios do FTP original:
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
~/.susflow/cache/
|
|
89
|
+
└── dissemin/publicos/
|
|
90
|
+
├── SINASC/NOV/DNRES/DNSP2022.dbc
|
|
91
|
+
├── PNI/DADOS/DPNISP15.DBF
|
|
92
|
+
└── CNES/200508_/Dados/ST/STPB2201.dbc
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
- **Validação:** Se o arquivo solicitado já existir no diretório local, a biblioteca pula o download e faz a leitura imediata.
|
|
97
|
+
- **Sobrescrita:** Para atualizar dados preliminares ou forçar uma nova cópia do servidor, utilize o parâmetro forcar=True:
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
df = sinasc.ler(uf="BA", ano=2023, forcar=True)
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Dicas de Desempenho e Memória
|
|
107
|
+
|
|
108
|
+
Bases de dados de saúde pública do Brasil podem ser massivas, frequentemente congelando ou travando o Jupyter Notebook se não tratadas corretamente. Siga as boas práticas abaixo:
|
|
109
|
+
|
|
110
|
+
1. **Otimização de Tipos (Downcasting):** Converta colunas de strings altamente repetitivas (como códigos de UF, Sexo ou Municípios) para o tipo category do Pandas. Reduza tipos de inteiros int64 genéricos para int16 ou int8 no seu pipeline. Isso pode reduzir o consumo de RAM em até 80%.
|
|
111
|
+
2. **Transição de Formato de Longo Prazo:** Arquivos .DBF e .DBC são extremamente lentos para leitura analítica. Após efetuar o primeiro pni.ler() ou cnes.ler(), salve o DataFrame resultante em formato Parquet:
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
df.to_parquet("meus_dados.parquet", compression="snappy")
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
3. **Ajuste do Jupyter IOPub:** Se o seu Jupyter travar ao exibir ou processar DataFrames massivos, inicialize-o via terminal expandindo os limites de taxa de dados:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
jupyter notebook --NotebookApp.iopub_data_rate_limit=1.0e10
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Escopo e Mapeamento dos Sistemas
|
|
128
|
+
|
|
129
|
+
### v1 — Matriz de Implementação Atual
|
|
130
|
+
|
|
131
|
+
| Sistema | Sigla | Granularidade | Formato | Status |
|
|
132
|
+
| --------------------------------------------------- | ---------- | ---------------- | ------- | --------- |
|
|
133
|
+
| Sistema de Informações sobre Nascidos Vivos | **SINASC** | Anual / Por UF | .dbc | Concluído |
|
|
134
|
+
| Sistema de Informações sobre Mortalidade (Geral) | **SIM** | Anual / Por UF | .dbc | Concluído |
|
|
135
|
+
| Sistema de Informações sobre Mortalidade (Especial) | **SIM** | Anual / Nacional | .dbc | Concluído |
|
|
136
|
+
| Sistema de Informação de Agravos de Notificação | **SINAN** | Anual / Nacional | .dbc | Concluído |
|
|
137
|
+
| Cadastro Nacional de Estabelecimentos de Saúde | **CNES** | Mensal / Por UF | .dbc | Concluído |
|
|
138
|
+
| Programa Nacional de Imunizações | **PNI** | Anual / Por UF | .dbf | Concluído |
|
|
139
|
+
| Sistema de Informações Hospitalares | **SIHSUS** | Mensal / Por UF | .dbc | Planejado |
|
|
140
|
+
| Sistema de Informações Ambulatoriais | **SIASUS** | Mensal / Por UF | .dbc | Planejado |
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Engenharia Reversa do Fluxo de Dados
|
|
145
|
+
|
|
146
|
+
```text
|
|
147
|
+
┌───────────────────────┐
|
|
148
|
+
│ FTP DATASUS (.dbc) │ <- Arquivo compactado no servidor público
|
|
149
|
+
└──────────┬────────────┘
|
|
150
|
+
│ (Susflow faz o download & valida cache)
|
|
151
|
+
▼
|
|
152
|
+
┌───────────────────────┐
|
|
153
|
+
│ Descompressão BLAST │ <- Traduz .dbc para .dbf estruturado em Python puro
|
|
154
|
+
└──────────┬────────────┘
|
|
155
|
+
│ (Motor de parsing do reader)
|
|
156
|
+
▼
|
|
157
|
+
┌───────────────────────┐
|
|
158
|
+
│ Pandas DataFrame │ <- Pronto para análise, gráficos e ML
|
|
159
|
+
└───────────────────────┘
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Ferramentas de Mapeamento (Diretório tools/)
|
|
166
|
+
|
|
167
|
+
O DATASUS frequentemente altera de forma silenciosa os caminhos ou padrões de nomenclatura de arquivos no FTP. A pasta tools/ contém scripts utilitários robustos para varredura e auditoria desses diretórios:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# Mapear e atualizar de forma automática os caminhos base da v1
|
|
171
|
+
python tools/mapear_ftp.py
|
|
172
|
+
|
|
173
|
+
# Executar mapeamento silencioso salvando o log estruturado em json/csv
|
|
174
|
+
python tools/mapear_ftp.py --salvar --quiet
|
|
175
|
+
|
|
176
|
+
# Auditar uma árvore de diretórios específica no FTP profundo
|
|
177
|
+
python tools/mapear_ftp.py --alvo /dissemin/publicos/SINAN/DADOS --profundo
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
Desenvolvido para simplificar a pesquisa epidemiológica e a ciência de dados em saúde no Brasil. Contribuições e pull requests são bem-vindos!
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# CNES — Cadastro Nacional de Estabelecimentos de Saúde
|
|
2
|
+
|
|
3
|
+
Base FTP: `ftp.datasus.gov.br/dissemin/publicos/CNES/200508_/Dados/`
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Tipos de dados disponíveis
|
|
8
|
+
|
|
9
|
+
| Tipo | Função | Retorno | Descrição |
|
|
10
|
+
|------|--------|---------|-----------|
|
|
11
|
+
| Por UF | `ler(uf, ano, mes)` | `DataFrame` | Dados cadastrais de um subtipo para uma UF |
|
|
12
|
+
| Por UF | `baixar(uf, ano, mes)` | `Path` | Arquivo `.dbc` bruto |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Subtipos disponíveis
|
|
17
|
+
|
|
18
|
+
**Padrão de arquivo:** `{TYPE}/{TYPE}{UF}{YY}{MM}.dbc`
|
|
19
|
+
**Granularidade:** mensal / por UF
|
|
20
|
+
|
|
21
|
+
> O arquivo fica dentro de um subdiretório com o mesmo nome do subtipo:
|
|
22
|
+
> ex: `ST/STSP2501.dbc` → estabelecimentos de SP, janeiro de 2025.
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
from susflow.systems import cnes
|
|
26
|
+
|
|
27
|
+
# ver todos os subtipos disponíveis
|
|
28
|
+
print(cnes.subtipos())
|
|
29
|
+
|
|
30
|
+
# Estabelecimentos — subtipo padrão
|
|
31
|
+
df = cnes.ler(uf="SP", ano=2025, mes=1)
|
|
32
|
+
df = cnes.ler(uf="SP", ano=2025, mes=1, tipo="ST")
|
|
33
|
+
|
|
34
|
+
# outros subtipos
|
|
35
|
+
df = cnes.ler(uf="SP", ano=2025, mes=1, tipo="PF") # profissionais
|
|
36
|
+
df = cnes.ler(uf="RJ", ano=2024, mes=6, tipo="LT") # leitos
|
|
37
|
+
df = cnes.ler(uf="MG", ano=2023, mes=3, tipo="EQ") # equipamentos
|
|
38
|
+
|
|
39
|
+
# só baixar
|
|
40
|
+
path = cnes.baixar(uf="SP", ano=2025, mes=1)
|
|
41
|
+
path = cnes.baixar(uf="SP", ano=2025, mes=1, tipo="PF")
|
|
42
|
+
|
|
43
|
+
# listar arquivos disponíveis
|
|
44
|
+
cnes.listar() # todos os ST
|
|
45
|
+
cnes.listar(uf="SP") # ST de SP
|
|
46
|
+
cnes.listar(uf="SP", tipo="PF") # profissionais de SP
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Subtipos ativos
|
|
50
|
+
|
|
51
|
+
| Tipo | Arquivo exemplo | Conteúdo | Cobertura |
|
|
52
|
+
|------|----------------|----------|-----------|
|
|
53
|
+
| `ST` | `STSP2501.dbc` | **Estabelecimentos** — identificação, localização, tipo | 2005–2026 |
|
|
54
|
+
| `PF` | `PFSP2501.dbc` | **Profissionais de saúde** — vínculos e CBO | 2005–2026 |
|
|
55
|
+
| `DC` | `DCSP2501.dbc` | Dados complementares do estabelecimento | 2005–2026 |
|
|
56
|
+
| `EQ` | `EQSP2501.dbc` | Equipamentos disponíveis | 2005–2026 |
|
|
57
|
+
| `SR` | `SRSP2501.dbc` | Serviços especializados ofertados | 2005–2026 |
|
|
58
|
+
| `LT` | `LTSP0510.dbc` | Leitos (SUS e não-SUS) | 2005–2026 |
|
|
59
|
+
| `HB` | `HBSP0703.dbc` | Habilitações e certificações | 2007–2026 |
|
|
60
|
+
| `EF` | `EFSP0703.dbc` | Centros cirúrgicos e obstétricos | 2007–2026 |
|
|
61
|
+
| `EP` | `EPSP0704.dbc` | Equipes de saúde (eSF, eAP, etc.) | 2007–2026 |
|
|
62
|
+
| `RC` | `RCSP0703.dbc` | Regras contratuais | 2007–2026 |
|
|
63
|
+
| `IN` | `INSP0711.dbc` | Incentivos financeiros | 2007–2026 |
|
|
64
|
+
| `GM` | `GMSP1407.dbc` | Gestão e metas | 2014–2026 |
|
|
65
|
+
|
|
66
|
+
### Subtipos encerrados (ainda disponíveis no FTP)
|
|
67
|
+
|
|
68
|
+
| Tipo | Arquivo exemplo | Conteúdo | Cobertura | Observação |
|
|
69
|
+
|------|----------------|----------|-----------|------------|
|
|
70
|
+
| `EE` | `EESP0703.dbc` | Equipamentos e produções | 2007–2019 | Encerrado em dez/2019 |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Principais variáveis por subtipo
|
|
75
|
+
|
|
76
|
+
### ST — Estabelecimentos
|
|
77
|
+
|
|
78
|
+
| Variável | Tipo | Descrição |
|
|
79
|
+
|----------|------|-----------|
|
|
80
|
+
| `CNES` | str | Código CNES (identificador único) |
|
|
81
|
+
| `CODUFMUN` | str | Código IBGE do município |
|
|
82
|
+
| `REGSAUDE` | str | Região de saúde |
|
|
83
|
+
| `MICR_REG` | str | Microrregião de saúde |
|
|
84
|
+
| `DISTRSAN` | str | Distrito sanitário |
|
|
85
|
+
| `DISTRADM` | str | Distrito administrativo |
|
|
86
|
+
| `TPGESTAO` | str | Tipo de gestão (M=municipal, E=estadual, D=dupla) |
|
|
87
|
+
| `PF_PJ` | str | Pessoa física ou jurídica |
|
|
88
|
+
| `CPF_CNPJ` | str | CPF ou CNPJ |
|
|
89
|
+
| `NIV_DEP` | str | Nível de dependência |
|
|
90
|
+
| `CNPJ_MAN` | str | CNPJ da mantenedora |
|
|
91
|
+
| `ESFERA_A` | str | Esfera administrativa |
|
|
92
|
+
| `ATIVIDAD` | str | Atividade de ensino/pesquisa |
|
|
93
|
+
| `RETENCAO` | str | Tipo de retenção |
|
|
94
|
+
| `NATUREZA` | str | Natureza jurídica |
|
|
95
|
+
| `CLIENTEL` | str | Clientela atendida |
|
|
96
|
+
| `TP_UNID` | str | Tipo de unidade |
|
|
97
|
+
| `TURNO_AT` | str | Turno de atendimento |
|
|
98
|
+
| `NIV_HIER` | str | Nível hierárquico |
|
|
99
|
+
| `TERCEIRO` | str | Indicador de terceirização |
|
|
100
|
+
| `COMPETEN` | str | Competência (AAAAMM) |
|
|
101
|
+
|
|
102
|
+
### PF — Profissionais
|
|
103
|
+
|
|
104
|
+
| Variável | Tipo | Descrição |
|
|
105
|
+
|----------|------|-----------|
|
|
106
|
+
| `CNES` | str | Código CNES do estabelecimento |
|
|
107
|
+
| `CBO` | str | Código CBO da ocupação |
|
|
108
|
+
| `NOMEPROF` | str | Nome do profissional |
|
|
109
|
+
| `CNS_PROF` | str | CNS do profissional |
|
|
110
|
+
| `CONSELHO` | str | Conselho profissional |
|
|
111
|
+
| `REGISTRO` | str | Número de registro no conselho |
|
|
112
|
+
| `VINCULAC` | str | Tipo de vínculo |
|
|
113
|
+
| `SUBVINCUL` | str | Subtipo de vínculo |
|
|
114
|
+
| `TP_SUS` | str | Atende pelo SUS |
|
|
115
|
+
| `COMPETEN` | str | Competência (AAAAMM) |
|
|
116
|
+
|
|
117
|
+
### LT — Leitos
|
|
118
|
+
|
|
119
|
+
| Variável | Tipo | Descrição |
|
|
120
|
+
|----------|------|-----------|
|
|
121
|
+
| `CNES` | str | Código CNES do estabelecimento |
|
|
122
|
+
| `TP_LEITO` | str | Tipo de leito |
|
|
123
|
+
| `CODLEITO` | str | Código do leito |
|
|
124
|
+
| `QT_EXIST` | str | Quantidade existente |
|
|
125
|
+
| `QT_CONTR` | str | Quantidade contratada (SUS) |
|
|
126
|
+
| `QT_SUS` | str | Quantidade SUS |
|
|
127
|
+
| `COMPETEN` | str | Competência (AAAAMM) |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Fluxo recomendado
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
1. Explorar o que existe
|
|
135
|
+
print(cnes.subtipos()) ← todos os subtipos e descrições
|
|
136
|
+
cnes.listar(uf="SP") ← arquivos ST de SP disponíveis
|
|
137
|
+
cnes.listar(uf="SP", tipo="PF") ← profissionais de SP
|
|
138
|
+
|
|
139
|
+
2. Baixar os dados
|
|
140
|
+
df = cnes.ler(uf="SP", ano=2025, mes=1) ← estabelecimentos
|
|
141
|
+
df = cnes.ler(uf="SP", ano=2025, mes=1, tipo="PF") ← profissionais
|
|
142
|
+
df = cnes.ler(uf="SP", ano=2025, mes=1, tipo="LT") ← leitos
|
|
143
|
+
|
|
144
|
+
3. Combinar meses em série histórica
|
|
145
|
+
import pandas as pd
|
|
146
|
+
dfs = [cnes.ler(uf="SP", ano=2024, mes=m) for m in range(1, 13)]
|
|
147
|
+
df_ano = pd.concat(dfs, ignore_index=True)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Notas
|
|
153
|
+
|
|
154
|
+
- Arquivos `.dbc` são DBF comprimidos com o algoritmo proprietário **blast** (PKWARE). A biblioteca descomprime automaticamente via `pyreaddbc`.
|
|
155
|
+
- O ano usa **2 dígitos** e o mês **2 dígitos com zero à esquerda**: `STSP2501.dbc` = SP, janeiro de 2025.
|
|
156
|
+
- O arquivo fica dentro de um subdiretório com o mesmo nome do subtipo — isso é tratado automaticamente pela biblioteca.
|
|
157
|
+
- Cada subtipo tem sua própria cobertura temporal. Tentar baixar `EE` para 2022 levanta erro com a cobertura correta (2007–2019).
|
|
158
|
+
- `ST` e `PF` são os subtipos mais usados: `ST` para análises de distribuição de estabelecimentos, `PF` para análises de força de trabalho em saúde.
|
|
159
|
+
- O campo `CNES` é a chave de cruzamento entre todos os subtipos — use-o para enriquecer `ST` com dados de `LT`, `EQ`, `PF`, etc.
|
|
160
|
+
- Para cruzar municípios com nomes, use `CADMUN.DBF` disponível no SIM (`sim.baixar_tabelas("CADMUN.DBF")`).
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# PNI — Programa Nacional de Imunizações
|
|
2
|
+
|
|
3
|
+
Base FTP: `/dissemin/publicos/PNI/DADOS/`
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Tipos de dados disponíveis
|
|
8
|
+
|
|
9
|
+
| Tipo | Função | Retorno | Descrição |
|
|
10
|
+
| ------ | ----------------- | ----------- | ---------------------------------------------- |
|
|
11
|
+
| Por UF | `ler(uf, ano)` | `DataFrame` | Dados de imunização registrados na UF, por ano |
|
|
12
|
+
| Por UF | `baixar(uf, ano)` | `Path` | Arquivo `.DBF` bruto da UF |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Dados por UF e Ano — `DADOS/`
|
|
17
|
+
|
|
18
|
+
**Padrão de arquivo:** `DPNI{UF}{YY}.DBF` (Sufixo do ano com 2 dígitos)
|
|
19
|
+
|
|
20
|
+
**Cobertura:** 1994–2019, todas as 27 UFs
|
|
21
|
+
|
|
22
|
+
**Granularidade:** anual / por UF
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
from susflow.systems import pni
|
|
26
|
+
|
|
27
|
+
# Baixa (se necessário) e carrega os dados em um DataFrame
|
|
28
|
+
df = pni.ler(uf="SP", ano=2015)
|
|
29
|
+
|
|
30
|
+
# Apenas realiza o download do arquivo bruto
|
|
31
|
+
path = pni.baixar(uf="RJ", ano=2010)
|
|
32
|
+
|
|
33
|
+
# Lista os arquivos filtrando por uma UF específica
|
|
34
|
+
arquivos = pni.listar(uf="PB")
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Principais variáveis do DataFrame
|
|
39
|
+
|
|
40
|
+
> **Nota de Variabilidade:** Como a cobertura do PNI é extensa (1994–2019), a estrutura de colunas dos arquivos `.DBF` pode variar significativamente dependendo do período e das atualizações do sistema de informação do Ministério da Saúde. Abaixo estão listadas as variáveis base mais comuns encontradas nas séries históricas de coberturas vacinais e doses aplicadas:
|
|
41
|
+
|
|
42
|
+
| Variável | Tipo | Descrição |
|
|
43
|
+
| ---------------------- | ----------- | --------------------------------------------------------------------- |
|
|
44
|
+
| `CODMUNRES` / `MUNCOD` | str | Código IBGE do município (geralmente 6 dígitos) |
|
|
45
|
+
| `CODVAC` / `VACCOD` | str | Código da vacina (ex: BCG, Poliomielite, Tríplice Viral) |
|
|
46
|
+
| `DOSE` | str | Tipo/Número da dose (1ª dose, 2ª dose, reforço, dose única) |
|
|
47
|
+
| `FXETARIA` / `FAIXA` | str | Código identificador da faixa etária do vacinado |
|
|
48
|
+
| `QTDE` / `NUM_DOSES` | int / float | Quantidade de doses aplicadas registradas |
|
|
49
|
+
| `COBER` / `COBERTURA` | float | Taxa de cobertura vacinal calculada para a região (quando disponível) |
|
|
50
|
+
| `POPULACAO` | int / float | População alvo estimada para o cálculo da cobertura |
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Fluxo recomendado
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
1. Explorar o que existe no FTP
|
|
58
|
+
pni.listar(uf="PB") ← lista todos os anos da Paraíba
|
|
59
|
+
|
|
60
|
+
2. Baixar e processar os dados
|
|
61
|
+
df = pni.ler(uf="SP", ano=2015) ← dados de imunização de SP em 2015
|
|
62
|
+
|
|
63
|
+
3. Persistir localmente de forma otimizada
|
|
64
|
+
# Recomendado converter para Parquet após a leitura para melhorar a performance
|
|
65
|
+
df.to_parquet("pni_sp_2015.parquet", index=False)
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Notas
|
|
72
|
+
|
|
73
|
+
- **Formato dos Arquivos:** Diferente de outros sistemas do DATASUS (como o SINASC), os arquivos do PNI nesta pasta estão em formato **.DBF puro** (sem compressão proprietária _blast_). Eles são lidos diretamente pela biblioteca utilizando o `dbfread` interno do módulo `reader.py`.
|
|
74
|
+
- **Regra de Sufixo do Ano:** O arquivo utiliza o ano com 2 dígitos (`YY`). Anos de 1994 a 1999 usam `94` a `99`, enquanto anos de 2000 a 2009 utilizam `00` a `09`. A normalização é feita de forma transparente pela biblioteca utilizando o operador `ano % 100`.
|
|
75
|
+
- **Limites da Série Histórica:** A cobertura de dados deste diretório FTP encerra-se estritamente em **2019**. Não existem dados preliminares ou anos posteriores a este período mapeados neste módulo (`year_range: 1994–2019`). Tentativas de passar anos fora deste escopo resultarão em um `ValueError`.
|
|
76
|
+
- **Códigos de Municípios:** Assim como no SINASC, os municípios são identificados por seus códigos IBGE. Caso precise realizar o cruzamento com o nome das localidades ou regionalizações de saúde, recomenda-se correlacionar com as tabelas auxiliares (`CADMUN`).
|