<jupyter_start><jupyter_text>**ANÁLISE: Limpeza dos dados sobre a vacinação contra a COVID-19** **Aluno:** <NAME>  **Ferramentas Utilizadas*** Google Colab* Google Drive **Base de Dados*** 5Gb  **1 - Carregando a base de dados**  Devido a capacidade de SSD de 240Gb e Memória RAM de 4Gb do notebook e estes estarem abaixo do suficiente para download e carregamento das bases de dados respectivamente, utilizei o Google Colab por ser uma ferramenta online que possibilita a utilização de um ambiente de execução do projeto em nuvem da Google com recurso de máquina da mesma, o que contribuiu para a realização desta atividade. Tendo como recurso da nuvem do Google, Disco de 107.77 Gb e Memória RAM de 12.69Gb em Máquina Virtual e com Python 3 em ambiente de execução. Por estar em ambiente de nuvem e os arquivos serem grandes em espaço de armazenamento para upload, optei por utilizar a leitura da base de dados através do Google Drive com a biblioteca `from google.colab import drive` com o parâmetro `drive.mount('/content/drive')` em que este monta uma conexão com o Google Drive da conta a ser escolhida e fornece acesso aos arquivos desta conta que foi fornecida autorização.```python Tentativas de leitura das bases de dados de 7Gb, 10Gb e 23Gb. Mas não obtive muito sucesso. Dask import dask.dataframe as dd dados = dd.read_csv('/content/drive/MyDrive/ArquivosPA/Cópia de part-00000-faa9a037-82c0-44e2-b427-59becd57944f-c000.csv', sep=';', assume_missing=True) Pyarrow import pyarrow dados.to_parquet('vacina_covid_19_5Gb.parquet', engine = 'pyarrow', compression = 'gzip') dados = dados.read_parquet('/content/drive/MyDrive/ArquivosPA/vacina_covid_19_5Gb.parquet', engine = 'pyarrow')``` Com isso fiz uma cópia da base de dados de 5Gb para o Google Drive de utilização e realizei a conexão do ambiente junto a está pasta com o arquivo no Google Drive, evitando assim o download para logo após o upload no ambiente de desenvolvimento. - **Documentação:** [Google Drive para Google Colab](https://colab.research.google.com/notebooks/io.ipynb)- **Procurar por:** Google Drive -> Montar Google Drive localmente.<jupyter_code># Importando Bibliotecas
import pandas as pd
import numpy as np
import pickle

from google.colab import drive
drive.mount('/content/drive')<jupyter_output>Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).<jupyter_text>**1.1 - Seleção de colunas** Devido a dimensão do dataset (base de dados), realizei uma seleção de colunas, criando assim uma lista com nome das colunas a serem utilizadas no DataFrame e neste ambiente de execução.<jupyter_code># Lista com colunas a serem utilizadas.
colunas = ['document_id', 'paciente_id', 'paciente_dataNascimento', 
           'paciente_enumSexoBiologico', 'paciente_racaCor_codigo',
           'paciente_racaCor_valor', 'paciente_endereco_nmMunicipio',
           'paciente_endereco_uf', 'paciente_endereco_cep',
           'estabelecimento_valor', 'estabelecimento_municipio_nome',
           'estabelecimento_uf', 'vacina_grupoAtendimento_codigo',
           'vacina_grupoAtendimento_nome', 'vacina_categoria_codigo',
           'vacina_categoria_nome', 'vacina_lote',
           'vacina_fabricante_nome', 'vacina_fabricante_referencia',
           'vacina_dataAplicacao', 'vacina_descricao_dose', 
           'vacina_codigo', 'vacina_nome']

# Veirificando a quantidade de colunas.
print(len(colunas))
# Lendo os dados.
dados = pd.read_csv('/content/drive/MyDrive/ArquivosPA/Cópia de part-00000-faa9a037-82c0-44e2-b427-59becd57944f-c000.csv', engine = 'c', usecols=colunas)<jupyter_output><empty_output><jupyter_text>Utilizei os parâmetros `engine = 'c'`, onde foi possível trabalhar mais rápido com a biblioteca pandas e o `usecols=colunas` em que recebe as colunas a serem carregadas. Após estes foi possível carregar uma base de dados menor em questão de dimensionalidade, como também contribuiu para um carregamento mais rápido e preciso apenas do que foi utilizado nesta atividade.<jupyter_code># Verificando informações do dataset.
dados.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
RangeIndex: 9051193 entries, 0 to 9051192
Data columns (total 23 columns):
 #   Column                          Dtype  
---  ------                          -----  
 0   document_id                     object 
 1   paciente_id                     object 
 2   paciente_dataNascimento         object 
 3   paciente_enumSexoBiologico      object 
 4   paciente_racaCor_codigo         float64
 5   paciente_racaCor_valor          object 
 6   paciente_endereco_nmMunicipio   object 
 7   paciente_endereco_uf            object 
 8   paciente_endereco_cep           float64
 9   estabelecimento_valor           int64  
 10  estabelecimento_municipio_nome  object 
 11  estabelecimento_uf              object 
 12  vacina_grupoAtendimento_codigo  int64  
 13  vacina_grupoAtendimento_nome    object 
 14  vacina_categoria_codigo         float64
 15  vacina_categoria_nome           object 
 16  vacina_lote                     object 
 17  vacina_fabricante_nome     [...]<jupyter_text>**2 - Renomeando Colunas** Nesta etapa foi realizada a renomeação de colunas do dataset, montei uma nova lista com as colunas renomeadas e as demais não renomeadas.<jupyter_code># Lista com colunas renomeadas a serem utilizadas.
colunas_renomeadas = ['vacinacao', 'paciente', 'dataNascimento', 
           'sexoBiologico', 'rcID',
           'paciente_racaCor_valor', 'municipioResidencia',
           'ufResidencia', 'cepResidencia',
           'codigoEstabelecimento', 'municipioVacinacao',
           'ufVacinacao', 'subgrupoAtendimento',
           'vacina_grupoAtendimento_nome', 'vacina_categoria_codigo',
           'vacina_categoria_nome', 'loteVacina',
           'vacina_fabricante_nome', 'vacina_fabricante_referencia',
           'dataAplicacao', 'doseDeclarada', 
           'codigoVacina', 'vacina_nome']
# Alterando colunas 
dados.set_axis(colunas_renomeadas, axis='columns', inplace=True)
# Verificando colunas
dados.columns
# Criando uma base com as alterações até o momento.
dados.to_csv('vacina_covid_19_5Gb_renomeada.csv', index=False)<jupyter_output><empty_output><jupyter_text>**3 - Casting (Convertendo tipos de dados em colunas)** Nesta etapa será feita a conversão no tipo de dados em algumas colunas.* Float -> Int.* Object -> Datetime.* Object -> Int<jupyter_code># Convertendo para datetime.
dados['dataNascimento'] = pd.to_datetime(dados['dataNascimento'], format='%Y-%m-%d')
dados['dataAplicacao'] = pd.to_datetime(dados['dataAplicacao']).dt.tz_localize(None)
# Convertendo para Inteiro.
dados = dados.astype({'rcID': 'Int64', 
                      'cepResidencia': 'Int64',
                      'codigoEstabelecimento': 'Int64',
                      'subgrupoAtendimento': 'Int64',
                      'codigoVacina': 'Int64'})
# Verificando os valores unicos da coluna doseDeclara.
print(dados['doseDeclarada'].unique())<jupyter_output>['\xa0\xa0\xa0\xa01ª\xa0Dose' '\xa0\xa0\xa0\xa02ª\xa0Dose'
 '\xa0\xa0\xa0\xa0Dose\xa0' '\xa0\xa0\xa0\xa0Única\xa0']<jupyter_text>Com a informação dos valores únicos da coluna 'doseDeclarada', pode-se alterar o conteúdo conforme planejamento. Mas antes da alteração, pode-se verificar que os campos são representados com `\xa0\xa0\xa0\xa0` esse `\xa0`, é na verdade, um espaço sem quebra em Latin1 (ISO 8859-1). Outro ponto pode-se verificar que tem tipo de 'doseDeclarada' como 'Dose' e como 'Única', verificaremos quais são as vacinas com essas características.<jupyter_code># Verificando 'quais' são as doses doseDeclarada como 'Dose'.
dados.loc[dados['doseDeclarada'] == '\xa0\xa0\xa0\xa0Dose\xa0']<jupyter_output><empty_output><jupyter_text>Encontra-se que só tem uma vacina declarada com Dose, a 'Vacina covid-19 - Ad26.COV2.S - Janssen-Cilag'. Segundo a Anvisa por meio deste [documento](https://www.gov.br/anvisa/pt-br/assuntos/noticias-anvisa/2021/anvisa-aprova-uso-emergencial-da-vacina-da-janssen/VotodadiretorarelatoraJanssen.pdf) e informação disponibilizada pelo site da [PEBMED](https://pebmed.com.br/anvisa-aprova-uso-emergencial-da-vacina-contra-a-covid-19-da-janssen/), a vacina 'Vacina covid-19 - Ad26.COV2.S - Janssen-Cilag' é aplicada em dose única, ou seja, a vacina é administrada em dose única de 0,5mL apenas por injeção, sengundo informação da [Anvisa](https://www.gov.br/anvisa/pt-br/assuntos/noticias-anvisa/2021/anvisa-aprova-uso-emergencial-da-vacina-da-janssen/VotodadiretorarelatoraJanssen.pdf) e da [PEBMED](https://pebmed.com.br/anvisa-aprova-uso-emergencial-da-vacina-contra-a-covid-19-da-janssen/) por meio da Posologia proposta.<jupyter_code># Verificando 'quais' são as doses doseDeclarada como 'Única'.
dados.loc[dados['doseDeclarada'] == '\xa0\xa0\xa0\xa0Única\xa0']<jupyter_output><empty_output><jupyter_text>Encontra-se portanto só uma vacina declarada como 'Única' a vacina *'Covid-19-Coronavac-Sinovac/Butantan'*. De acordo com [documento](https://vacinacovid.butantan.gov.br/assets/arquivos/Bulas_Anvisa/Bula_PS_vacina%20adsorvida%20covid-19%20(inativada).pdf) do Instituo Butantan, laboratório responsável pela fabricação dessa vacina: *O esquema vacinal completo com duas doses é necessário para obter a resposta imune esperada para a prevenção de COVID-19. A proteção em indivíduos com esquemas incompletos não foi avaliada nos estudos clínicos.*  Partindo deste pressuposto, a informação declarada como 'Única' pode ter sido inserida erroneamente ou alguma aplicação realizada que declararam nessa característica. Para preservar a integridade dos dados fornecidos e não inserir susposições a determinadas informação de declaração de doses, não será alterada essa informação de dose 'Única'. Já a informação declarada como 'Dose' será considerada como 'Única' por caracterísitca particular da vacina da Janssen encontrada em documento fornecido pela Anvisa. A partir desse ponto então será alterado:* 1ª Dose -> 1* 2ª Dose -> 2* Dose -> 0* Única -> 0 Portanto, doseDeclarada como 'Dose' e como 'Única' seram consideradas como 'Única' -> 0 para efeito de estudos dessa base de dados.<jupyter_code># Convertendo declaração de doses.
dados['doseDeclarada'] = dados['doseDeclarada'].replace('\xa0\xa0\xa0\xa01ª\xa0Dose', '1').replace('\xa0\xa0\xa0\xa02ª\xa0Dose', '2').replace('\xa0\xa0\xa0\xa0Dose\xa0', '0').replace('\xa0\xa0\xa0\xa0Única\xa0', '0')
# Verificando os valores únicos da coluna 'doseDeclarada' depois da conversão de declaração.
print(dados['doseDeclarada'].unique())
# Alterando object para int da coluna 'doseDeclarada'.
# Convertendo para Inteiro.
dados['doseDeclarada'] = dados['doseDeclarada'].astype(str).astype(int)
# Verificando as colunas depois das conversões.
dados.info()
# Criando uma base com as alterações até o momento.
dados.to_csv('vacina_covid_19_5Gb_limpa.csv', index=False)<jupyter_output><empty_output><jupyter_text>**4 - Balizamento (Salvando dados em bases separadas)** Nesta etapa será realizado separação na base de dados (balizamento), para tornar o dataset (base de dados) mais organizada. Sendo aplicados em colunas que contenham variáveis em que podem ser representadas por códigos, tendo assim um arquivo com extensão `.csv` na qual servirá como dicionário de dados para as colunas que contenham códigos.<jupyter_code># Lendo os dados limpos.
dadosLimpos = pd.read_csv('/content/drive/MyDrive/ArquivosPA/vacina_covid_19_5Gb_limpa.csv', engine = 'c')
# Verificando informações do dataset.
dadosLimpos.info()
# Convertendo para datetime.
dadosLimpos['dataNascimento'] = pd.to_datetime(dadosLimpos['dataNascimento'], format='%Y-%m-%d')
dadosLimpos['dataAplicacao'] = pd.to_datetime(dadosLimpos['dataAplicacao']).dt.tz_localize(None)
# Verificando os valores únicos da coluna 'doseDeclarada' depois da conversão de declaração.
print(dadosLimpos['doseDeclarada'].unique())
# Convertendo para Inteiro.
dadosLimpos = dadosLimpos.astype({'rcID': 'Int64', 
                      'cepResidencia': 'Int64',
                      'codigoEstabelecimento': 'Int64',
                      'subgrupoAtendimento': 'Int64',
                      'codigoVacina': 'Int64',
                      'doseDeclarada': 'Int64',
                      'vacina_categoria_codigo': 'Int64'})
# Verificando as colunas depois das conversões.
dadosLimpos.info()
# Separando coluna paciente_racaCor_valor e criando dicionário desta.
pacienteRacaCor = dadosLimpos[['rcID', 'paciente_racaCor_valor']]

# Verificando códigos de acordo com nomenclatura e quantidade respectivamente.
pacienteRacaCor.value_counts()
# Separando e ciando dicionário com as colunas rcID e paciente_racaCor_valor.
pacienteRacaCor = pacienteRacaCor.groupby(by=['rcID', 'paciente_racaCor_valor']).count().reset_index()
pacienteRacaCor = pacienteRacaCor.rename(columns={'rcID': 'codigoRacaCor', 'paciente_racaCor_valor': 'raca_cor'})

# Salvando em arquivo .csv
pacienteRacaCor.to_csv('raca_cor_paciente.csv', index=False)
# Criando coluna idade na base de dados principal.
dadosLimpos['idade'] = (dadosLimpos['dataAplicacao'] - dadosLimpos['dataNascimento']).astype('<m8[Y]') 
dadosLimpos = dadosLimpos.astype({'idade': 'Int64'})
dadosLimpos['idade'].head()
# Verificando os dados.
dadosLimpos.head(2)
# Verificando as colunas.
dadosLimpos.info()
# Vericando a coluna vacina_categoria_codigo.
vacinaCategoriaCodigo2 = dadosLimpos.loc[dadosLimpos['vacina_categoria_codigo'] == 2]
vacinaCategoriaCodigo2.head(2)
# Vericando a coluna vacina_categoria_codigo.
vacinaCategoriaCodigo205 = dadosLimpos.loc[dadosLimpos['vacina_categoria_codigo'] == 205]
vacinaCategoriaCodigo205
# Separando e ciando dicionário com as colunas subgrupoAtendimento e vacina_grupoAtendimento_nome.
grupoAtendimento = dadosLimpos[['subgrupoAtendimento', 'vacina_grupoAtendimento_nome']]
grupoAtendimento = grupoAtendimento.groupby(by=['subgrupoAtendimento', 'vacina_grupoAtendimento_nome']).count().reset_index()
grupoAtendimento = grupoAtendimento.rename(columns={'subgrupoAtendimento': 'codigo', 'vacina_grupoAtendimento_nome': 'grupo'})

# Salvando em arquivo .csv
grupoAtendimento.to_csv('grupo_atendimento.csv', index=False)
# Separando e ciando dicionário com as colunas vacina_fabricante_referencia, vacina_fabricante_nome, codigoVacina e vacina_nome.
vacinaFabricante = dadosLimpos[['vacina_fabricante_nome', 'vacina_fabricante_referencia', 'codigoVacina', 'vacina_nome']]
vacinaFabricante = vacinaFabricante.groupby(by=['vacina_fabricante_nome', 'vacina_fabricante_referencia', 'codigoVacina', 'vacina_nome']).count().reset_index()
vacinaFabricante = vacinaFabricante.rename(columns={'vacina_fabricante_nome': 'fabricante', 'vacina_fabricante_referencia': 'codigo', 'codigoVacina': 'codigo', 'vacina_nome': 'nome'})

# Salvando em arquivo .csv
vacinaFabricante.to_csv('fabricante_vacina.csv', index=False)
# Separando base com pessoas menos de 18 e acima de 116 anos de idade.
idadeInconsistente = dadosLimpos.loc[(dadosLimpos['idade'] < 18) & (dadosLimpos['idade'] > 116)]
idadeInconsistente
# Separando base com pessoas maiores de 18 e menores de 116 anos de idade.
idadeCorreta = dadosLimpos.loc[(dadosLimpos['idade'] > 18) & (dadosLimpos['idade'] < 116)]
idadeCorreta.head(3)
# Separando base com pessoas que tomaram mais de 2 doses.
dadosLimpos['vacinacao'].value_counts()
# Separando e ciando dicionário com as colunas codigoVacina e vacina_nome.
vacinaNome = dadosLimpos[['codigoVacina', 'vacina_nome', 'loteVacina']]
vacinaNome = vacinaNome.groupby(by=['codigoVacina', 'vacina_nome', 'loteVacina']).count().reset_index()
vacinaNome = vacinaNome.rename(columns={'codigoVacina': 'codigo', 'vacina_nome': 'nome'})

# Salando em arquivo .csv
vacinaNome.to_csv('nome_vacina.csv', index=False)
# Retirando coluna já balizada.
dadosLimpos.drop(columns=['paciente_racaCor_valor', 'vacina_grupoAtendimento_nome',
                          'vacina_fabricante_nome', 'vacina_fabricante_referencia', 
                          'vacina_nome', 'loteVacina'], axis=1, inplace=True)
# Verificando colunas após balizamento.
dadosLimpos.columns<jupyter_output><empty_output><jupyter_text>A partir deste ponto, será salvo os registros em um arquivo pickle.<jupyter_code># Salando em arquivo .csv
dadosLimpos.to_csv('dados_limpos_covid19.csv')
# Lendo os dados limpos.
df = pd.read_csv('/content/drive/MyDrive/ArquivosPA/dados_limpos_covid19.csv', engine = 'c')
# Verificando os dados.
df.info()
# Salando em arquivo .pkl
df.to_pickle('dados_limpos_covid19.pkl')<jupyter_output><empty_output>
StarcoderdataJupyterStructuredCleanDedup