ūü©ļ Como obter e tratar Dados do Datasus

Obrigado pela resposta @cuducos! Neste caso tenho que modificar o meu dockerfile, adicionando esse código: RUN apt install gcc ?

Ol√° pessoal, sou estudante de Engenharia de Dados e atualmente estou avaliando temas para meu TCC.

Pesquisando sobre dados abertos, encontrei a base do datasus, e os respectivos formatos .dbc e .dbf, além do trabalho da Daniela Petruzalek com a lib read.dbc citada nesse post.

Minha ideia inicial é criar uma lib de conversão direta de .dbc para .parquet (a escolha do parquet é por ser um formato binário e colunar que venho estudando, entendo que outros formatos podem ser mais interessante).

Não tenho ideia de como os usuários desses dados os usam em sua rotina. Alguém sabe me dizer se existe valor em uma lib que faz esse tipo de conversão direta para o formato parquet ?

Olá, @allan-silva, seja bem vindo ao fórum!

Sei que uma lib como essa lib j√° existe, no Python. A classe FTP_Downloader da biblioteca PySUS, mencionada na postagem original, faz o download dos dados do DataSUS e j√° os salva no formato Parquet.

Por exemplo,

In [1]: from pysus.online_data.sinasc import download

In [2]: download('SE',2015)
Out[2]: '/home/user/pysus/DNSE2015.parquet'

Se você for neste local, vai ver que o arquivo foi salvo no formato Parquet.

Ocorre que essa lib √© espec√≠fica para trabalhar com arquivos do DataSUS. Se voc√™ quiser converter arquivos .dbc ‚Äúgen√©ricos‚ÄĚ para arquivos Parquet, voc√™ pode usar as mesmas libs que o PySUS usa: elas se chamam pyreaddbc e dbfread para ler os arquivos .dbc e .dbf, al√©m do Pandas e do PyArrow, para escrever no formato Parquet. O c√≥digo de convers√£o est√° aqui.

Já no R, que presumo que você esteja usando, já que mencionou o read.dbc, eu não sei se existe uma lib pronta para isso e nem como fazer, pois estou mais habituado é com o Python.

Oi @herrmann, obrigado pela resposta! A ideia do trabalho que pretendo desenvolver, é a conversão direta para o formato parquet, sem passar pelo pandas ou pelo formato arrow, também é uma lib para JVM.
Entendo que existe utilidade para o formato parquet, mas j√° existe uma lib estabelecida que faz a mesma coisa. Se eu for seguir com esse tema, posso adicionar o link depois, se for de interesse.

1 curtida

Saiu a vers√£o 0.10.0 do PySUS! Para conhecer as novidades dessa vers√£o, veja a p√°gina do release:

Ol√°! Estou refazendo um trabalho acad√™mico sobre interna√ß√Ķes por doen√ßas do aparelho respirat√≥rio em SE, vou retirar as informa√ß√Ķes daqui: TabNet Win32 3.2: Morbidade Hospitalar do SUS - por local de resid√™ncia - Sergipe
da √ļltima vez que fiz isso foi tudo na munheca, copiando e colando‚Ķ Tem como baixar usando esses c√≥digos que mandaram? Porque precisa preencher alguns campos, por exemplo o print abaixo e ainda tem faixa et√°ria e sexo. Algu√©m pode me dar uma luz?

Bem vinda, @cynthia.

Eu não entendo bem sobre o assunto desses dados, mas acredito que tenha jeito de baixar os dados, sim, usando códigos bem semelhantes aos que estão neste tópico.

O primeiro passo seria descobrir em qual sistema do DataSUS estariam os dados procurados. A lista dos sistemas é a seguinte:

  1. SINAN
  2. SINASC
  3. SIM
  4. SIH
  5. SIA

O que parece fazer mais sentido no contexto e que encontrei ap√≥s fazer uma busca √© o Sistema de Informa√ß√Ķes Hospitalares ‚Äď SIH, o qual possui informa√ß√Ķes sobre morbidade.

Tentei o código seguinte no ipython e ele baixou alguns dados:

In [1]: from pysus.online_data.SIH import download

In [2]: from pysus.online_data import parquets_to_dataframe

In [3]: dfse = parquets_to_dataframe(download('SE',2022,12)) # para dezembro/2022

In [4]: dfse.head()

Out[4]: 
    UF_ZI ANO_CMPT MES_CMPT ESPEC  ... TPDISEC6 TPDISEC7 TPDISEC8 TPDISEC9
0  280000     2022       12    01  ...        0        0        0        0
1  280000     2022       12    01  ...        0        0        0        0
2  280000     2022       12    01  ...        0        0        0        0
3  280000     2022       12    01  ...        0        0        0        0
4  280000     2022       12    01  ...        0        0        0        0

[5 rows x 113 columns]

O dataframe tem 113 colunas. Ent√£o √© preciso ver na documenta√ß√£o dos dados quais dessas colunas ser√£o √ļteis para a an√°lise pretendida. O link est√° na postagem inicial deste t√≥pico:

Ap√≥s baixar o arquivo .zip, descompactar e procurar na pasta /Docs/ o documento chamado IT_SIHSUS_1603.pdf, encontrar√° a Tabela 1 com a descri√ß√£o de cada coluna. No m√≠nimo, as seguintes colunas devem ser √ļteis:

SEQ NOME DO CAMPO TIPO E TAM Descri√ß√£o/Observa√ß√Ķes
8 CEP char(8) CEP do paciente.
9 MUNIC_RES char(6) Município de Residência do Paciente
62 CID_NOTIF char(4) CID de Notificação.

Daí, para selecionar essas colunas no dataframe, faça

In [5]: dfse.loc[:,["CID_NOTIF", "CEP", "MUNIC_RES"]]
Out[5]: 
     CID_NOTIF       CEP MUNIC_RES
0               49503102    280290
1               49007024    280030
2               49160000    280480
3               49065059    280030
4               49160000    280480
...        ...       ...       ...
8640            49500000    280290
8641            49500000    280290
8642            49550000    280140
8643            49511899    280290
8644            48580000    292420

[8645 rows x 3 columns]

Na p√°gina que voc√™ enviou h√° um link intitulado ‚ÄúNotas T√©cnicas‚ÄĚ onde √© poss√≠vel consultar a lista de c√≥digos CID utilizados. A partir da p√°g. 10 tem a seguinte tabela com os c√≥digos CID:

Capítulo Código Descrição Códigos da CID-10
X 165-179 Doenças do aparelho respiratório J00-J99

Então bastaria filtrar pelo código do CID desejado:

In [6]: dfse.loc[:,["CID_NOTIF", "CEP", "MUNIC_RES"]][dfse.CID_NOTIF == "J00"]
Out[6]: 
Empty DataFrame
Columns: [CID_NOTIF, CEP, MUNIC_RES]
Index: []

o que retorna vazio pois n√£o existe esse valor ‚ÄúJ00‚ÄĚ na coluna ‚ÄúCID_NOTIF‚ÄĚ. De fato, a maioria dos valores para esse m√™s (dezembro/2022) est√° n√£o preenchido para essa coluna, e apenas 214 linhas possuem o valor ‚ÄúZ302‚ÄĚ.

In [7]: dfse.CID_NOTIF.value_counts()
Out[7]: 
        8431
Z302     214
Name: CID_NOTIF, dtype: Int64

Talvez outra coluna seja mais √ļtil para a an√°lise. Mas esse √© um ponto de partida, acredito que voc√™ consiga seguir a partir da√≠.

Olá a todos. Prazer em poder participar do Fórum.

Aproveitando a oportunidade. Alguém saberia dizer onde estão os dados de Febre Amarela mais recentes? Apesar de ser notificável, não encontram-se no SINAN (procurei no FTP, site, PySUS e etc).

No site do MS achamos alguns fragmentos de informação, especialmente entre o período de 2001 a 2006. Contudo, não consigo achar nada mais recente. Estou procurando no lugar errado? Alguém saberia onde achar esses dados mais recentes?

Obrigado!

Bem vindo, @brunoMT!

Realmente. Segundo a documentação do PySUS sobre o SINAN, a febre amarela estaria presente nos dados, sim.

In[1]: from pysus.online_data import SINAN

In [2]: SINAN.list_diseases()
Out[2]: 
['Animais Peçonhentos',
 'Botulismo',
 'Cancer',
 'Chagas',
 'Chikungunya',
 'Colera',
 'Coqueluche',
 'Contact Communicable Disease',
 'Acidentes de Trabalho',
 'Dengue',
 'Difteria',
 'Esquistossomose',
 'Febre Amarela',
 'Febre Maculosa',
 'Febre Tifoide',
 'Hanseniase',
 'Hantavirose',
 'Hepatites Virais',
 'Intoxicação Exógena',
 'Leishmaniose Visceral',
 'Leptospirose',
 'Leishmaniose Tegumentar',
 'Malaria',
 'Meningite',
 'Peste',
 'Poliomielite',
 'Raiva Humana',
 'Sífilis Adquirida',
 'Sífilis Congênita',
 'Sífilis em Gestante',
 'Tétano Acidental',
 'Tétano Neonatal',
 'Tuberculose',
 'Violência Domestica',
 'Zika']

Porém, ao pesquisar os anos disponíveis, vem uma lista vazia:

In [3]: SINAN.get_available_years("Febre Amarela")
Out[3]: []

Isso não acontece com algumas outras doenças, por exemplo, a dengue:

In [4]: SINAN.get_available_years("Dengue")
Out[4]: 
['2000',
 '2001',
 '2002',
 '2003',
 '2004',
 '2005',
 '2006',
 '2007',
 '2008',
 '2009',
 '2010',
 '2011',
 '2012',
 '2013',
 '2014',
 '2015',
 '2016',
 '2017',
 '2018',
 '2019',
 '2020',
 '2021',
 '2022',
 '2023']

Ao olhar na página de download de dados do DataSUS (link na postagem original do tópico), de fato está faltando a febre amarela no SINAN:

Talvez valha a pena questionar o DataSUS a falta destes dados pelo ‚Äúfale conosco‚ÄĚ ou fazer um pedido via Lei de Acesso √† Informa√ß√£o.

Ol√°, quando listamos a estrutura de dados p√ļblicos pelo FTP, aparentemente existem mais dados que a UI do site disponibiliza. Algu√©m sabe se existe alguma documenta√ß√£o que descreve cada uma dessas pastas ?

image

De fato aparentemente alguns arquivos n√£o possuem documenta√ß√£o, at√© onde sei. Algumas pastas tamb√©m est√£o vazias. Em outras, √© poss√≠vel encontrar uma subpasta com o nome Doc contendo um documento PDF ‚Äď aparentemente esse documento √© a documenta√ß√£o daquela pasta.

1 curtida