drguilhermeapolinario commited on
Commit
7107259
·
verified ·
1 Parent(s): 725b816

Update data_cleaning.py

Browse files
Files changed (1) hide show
  1. data_cleaning.py +55 -17
data_cleaning.py CHANGED
@@ -14,7 +14,8 @@ def iniciar(uploaded_file):
14
 
15
  def limpa_rci1(texto):
16
  sub1 = r"(^e-SUS.+\nMIN(.+\n+){2}.+)|(^CBO.+\n(.+\n+){2}.+)|(^Não\sinf.+\n+Identif.+\nDes.+\nDes.+\nDes.+\nRes.+\n+Iden.+$)|(^Não\sin.+\n+Ident.+Cor$)|(^Não\sin.+\n+Ident.+\nDesc.+\nBra.+\nNat(.+\n+){34}.+)|(^Inf.+\nDesc.+\nAdult.+\n(.+\n+){10}.+)|(^Inf.+\n(Des.+\n){3}.+$)|(^Inf.+\nDesc.+\n(Tem\salg.+\n){1}.+$)|(^Inf.+\nA\slist.+\nDes(.+\n+){8}.+$)|(^Desc.+\nÉ.+\nPossu(.+\n*)*)|(^Não\sinf.+;0.+$)|(;;;;;|;;;;|Ident.+(-|/)\s)|"
17
- sub2 = r"(^C.*(rin|card|resp).+\n.+\n.+[os]\s)|(;;;\nT.+\nT.+$)|(;Sim|(?<=[az];);|\ssabe;|\s.\sEnfisema)|(^Participa.+$|Poss.+de\s|(?<=privado.;\d\d\d);.+|Poss.+de\s|(?<=privado.;\d\d\d\d);.+)|((Desc.+\n){3}Resp.+$)|(Etnia.+\nD.+\nNã.+$)|(Nacio.+\nDesc.+\nB.+\nNat.+\nEst.+$)|(Infor.+\nDesc.+\nCôn(.+\n){31}Inf.+$)|Deseja\sinf.+$|(Infor.+\nDesc.+\nEmpreg(.+\n){10}.+$)|Intelec.+/\s|((Está\s(com\s)?))|(^Condiç.+\nD.+$)|((Faz\suso.+e\s)|PIC;.+|Tem\s|ou\steve\s|Teve\s|internação.+\nUsa\splant.+$|\s/\sderrame|diagnóst.+de\s)"
 
18
  rx_marc = sub1 + "|" + sub2
19
  texto = regex.sub(rx_marc, "", texto, flags=regex.MULTILINE)
20
  tira = r"(;;;)"
@@ -24,7 +25,7 @@ def limpa_rci1(texto):
24
  return texto
25
 
26
  def limpa_rci2(texto):
27
- sub2 = r"(^C.*(rin|card|resp).+\n.+\n.+[os]\s)|(;;;\nT.+\nT.+$)|(;Sim|(?<=[az];);|\ssabe;|\s.\sEnfisema)|(\d+{10}\s-\s)|(^Participa.+$|Poss.+de\s|(?<=privado.;\d\d\d);.+|Poss.+de\s|(?<=privado.;\d\d\d\d);.+)|((Desc.+\n){3}Resp.+$)|(Etnia.+\nD.+\nNã.+$)|(Nacio.+\nDesc.+\nB.+\nNat.+\nEst.+$)|(Infor.+\nDesc.+\nCôn(.+\n){31}Inf.+$)|Deseja\sinf.+$|(Infor.+\nDesc.+\nEmpreg(.+\n){10}.+$)|Intelec.+/\s|((Está\s(com\s)?))|(^Condiç.+\nD.+$)|((Faz\suso.+e\s)|PIC;.+|Tem\s|ou\steve\s|Teve\s|internação.+\nUsa\splant.+$|\s/\sderrame|diagnóst.+de\s)"
28
  texto = regex.sub(sub2, "", texto, flags=regex.MULTILINE)
29
  tira = r"(;;;)"
30
  texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
@@ -32,8 +33,6 @@ def limpa_rci2(texto):
32
  texto = regex.sub(tira, "; ", texto, flags=regex.MULTILINE)
33
  tira = r"(;$)"
34
  texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
35
- tira = r"(\s\d+{10}\s-\s)"
36
- texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
37
  return texto
38
 
39
  def separa_grupos(texto):
@@ -43,9 +42,9 @@ def separa_grupos(texto):
43
  (?P<Idade>(^Menos.+(?=;0)|^[0-9][0-9]\s\w).+(?=;0))|
44
  (?P<genero>(Masc.+;\d+|Fem.+;\d+))|
45
  (?P<cor>(^(Bra.+;\d+|Pret.+;\d+|Amar.+;\d+|Par.+;\d+|Indí.+;\d+)))|
46
- (?P<deficiencia>(^(Audi.+a;\d+|Fís.+a;\d+|Cogn.+a;\d+|Vis.+l;\d+|Out.+;\d+)))|
47
  (?P<doencas>(^(hipert.+al;\d+|diab.+s;\d+|gesta.+e;\d+|acam.+o;\d+|domici.+o;\d+|fuma.+e;\d+|saú.+e;\d+|Asm.+;\d+|DPO.+;\d+|Insufic.+ca;\d+|Insufic.+al;\d+)))|
48
- (?P<Escola>(Desc.+o;Quant.+\nCre.+e;\d+|Pr.+;\d+|Classe.+;\d+|Ens.+;\d+|Sup.+r;\d+|Alf.+;\d+|Nenhu.+;\d+))|
49
  (?P<transgen>(Homos.+\);\d+|Bisse.+l;\d+|Hom.+trans.+;\d+|Mul.+trans.+;\d+|Traves.+i;\d+|Transgê.+o;\d+|Não-B.+o;\d+))|
50
  """
51
  pattern = regex.compile(grupos, regex.VERBOSE | regex.MULTILINE)
@@ -60,7 +59,7 @@ def separa_grupos(texto):
60
  "deficiencia": [],
61
  "doencas": [],
62
  "Escola": [],
63
- "transgen": []
64
  }
65
 
66
  for match in matches:
@@ -85,7 +84,9 @@ def criar_dataframe(grupos_encontrados):
85
  novos_valores.extend(partes)
86
  df = pd.DataFrame(novos_valores, columns=["Descrição"])
87
  df["Valor"] = df["Descrição"].apply(lambda x: x.split(";")[-1])
88
- df["Descrição"] = df["Descrição"].apply(lambda x: ";".join(x.split(";")[:-1]))
 
 
89
  df["Descrição"] = df["Descrição"].apply(lambda x: x.replace(";", ""))
90
  dataframes[grupo] = df
91
  return dataframes
@@ -95,24 +96,57 @@ def renomear_escola(df_escola):
95
  "Creche": "Creche",
96
  "Pré-escola (exceto CA)": "Pré-escola",
97
  "Classe de alfabetização": "Alfabetização",
98
- "Ensino fundamental 1ª a 4ª séries": "Fundamental 1ª-4ª",
99
- "Ensino fundamental 5ª a 8ª séries": "Fundamental 5ª-8ª",
100
  "Ensino fundamental completo": "Fund. Completo",
101
  "Ensino fundamental especial": "Fund. Especial",
102
- "Ensino fundamental EJA - séries iniciais (supletivo 1ª a 4ª)": "Fund. EJA Iniciais",
103
- "Ensino fundamental EJA - séries finais (supletivo 5ª a 8ª)": "Fund. EJA Finais",
104
- "Ensino médio, médio 2º ciclo (científico, técnico e etc)": "Médio/Científico/Técnico",
105
  "Ensino médio especial": "Médio Especial",
106
  "Ensino médio EJA (supletivo)": "Médio EJA",
107
- "Alfabetização para adultos (Mobral, etc)": "Alfabetização Adultos",
108
- "Nenhum": "Nenhum"
109
  }
110
  df_escola["Descrição"] = df_escola["Descrição"].map(renomeacoes)
111
  return df_escola
112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  def limpar_dfs(dataframes, regex_pattern, replacement):
114
  for key, df in dataframes.items():
115
- df["Descrição"] = df["Descrição"].astype(str).apply(lambda x: regex.sub(regex_pattern, replacement, x))
 
 
 
 
116
  return dataframes
117
 
118
  def processar_arquivo(uploaded_file):
@@ -122,7 +156,11 @@ def processar_arquivo(uploaded_file):
122
  dataframes = criar_dataframe(grupos_encontrados)
123
  if "Escola" in dataframes:
124
  dataframes["Escola"] = renomear_escola(dataframes["Escola"])
125
- clean_final = r"(\sativ\w+)|(\sde\scid.+o)|(iciê.+ia)|((?<=rans)gên.+o|omem|ulher|ário|Homoss.+\(|\))|(\d{10}\s-\s)"
 
 
 
126
  substituicao = ""
127
  dataframes = limpar_dfs(dataframes, clean_final, substituicao)
 
128
  return dataframes
 
14
 
15
  def limpa_rci1(texto):
16
  sub1 = r"(^e-SUS.+\nMIN(.+\n+){2}.+)|(^CBO.+\n(.+\n+){2}.+)|(^Não\sinf.+\n+Identif.+\nDes.+\nDes.+\nDes.+\nRes.+\n+Iden.+$)|(^Não\sin.+\n+Ident.+Cor$)|(^Não\sin.+\n+Ident.+\nDesc.+\nBra.+\nNat(.+\n+){34}.+)|(^Inf.+\nDesc.+\nAdult.+\n(.+\n+){10}.+)|(^Inf.+\n(Des.+\n){3}.+$)|(^Inf.+\nDesc.+\n(Tem\salg.+\n){1}.+$)|(^Inf.+\nA\slist.+\nDes(.+\n+){8}.+$)|(^Desc.+\nÉ.+\nPossu(.+\n*)*)|(^Não\sinf.+;0.+$)|(;;;;;|;;;;|Ident.+(-|/)\s)|"
17
+ sub2 = r"(^C.*(rin|card|resp).+\n.+\n.+[os]\s)|(;;;\nT.+\nT.+$)|(;Sim|(?<=[az];);|\ssabe;|\s.\sEnfisema)|(^Participa.+$|Poss.+de\s|(?<=privado.;\d\d\d);.+|Poss.+de\s|(?<=privado.;\d\d\d\d);.+)|((Desc.+\n){3}Resp.+$)|(Etnia.+\nD.+\nNã.+$)|(Nacio.+\nDesc.+\nB.+\nNat.+\nEst.+$)|(Infor.+\nDesc.+\nCôn(.+\n){31}Inf.+$)|Deseja\sinf.+$|(Infor.+\nDesc.+\nEmpreg(.+\n){10}.+$)|Intelec.+/\s|((Está\s(com\s)?))|(^Condiç.+\nD.+$)|((Faz\suso.+e\s)|PIC;.+|Tem\s|ou\steve\s|Teve\s|internação.+\nUsa\splant.+$|\s/\sderrame|diagnóst.+de\s)|(\d+\s-\s)"
18
+
19
  rx_marc = sub1 + "|" + sub2
20
  texto = regex.sub(rx_marc, "", texto, flags=regex.MULTILINE)
21
  tira = r"(;;;)"
 
25
  return texto
26
 
27
  def limpa_rci2(texto):
28
+ sub2 = r"(^C.*(rin|card|resp).+\n.+\n.+[os]\s)|(;;;\nT.+\nT.+$)|(;Sim|(?<=[az];);|\ssabe;|\s.\sEnfisema)|(^Participa.+$|Poss.+de\s|(?<=privado.;\d\d\d);.+|Poss.+de\s|(?<=privado.;\d\d\d\d);.+)|((Desc.+\n){3}Resp.+$)|(Etnia.+\nD.+\nNã.+$)|(Nacio.+\nDesc.+\nB.+\nNat.+\nEst.+$)|(Infor.+\nDesc.+\nCôn(.+\n){31}Inf.+$)|Deseja\sinf.+$|(Infor.+\nDesc.+\nEmpreg(.+\n){10}.+$)|Intelec.+/\s|((Está\s(com\s)?))|(^Condiç.+\nD.+$)|((Faz\suso.+e\s)|PIC;.+|Tem\s|ou\steve\s|Teve\s|internação.+\nUsa\splant.+$|\s/\sderrame|diagnóst.+de\s)"
29
  texto = regex.sub(sub2, "", texto, flags=regex.MULTILINE)
30
  tira = r"(;;;)"
31
  texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
 
33
  texto = regex.sub(tira, "; ", texto, flags=regex.MULTILINE)
34
  tira = r"(;$)"
35
  texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
 
 
36
  return texto
37
 
38
  def separa_grupos(texto):
 
42
  (?P<Idade>(^Menos.+(?=;0)|^[0-9][0-9]\s\w).+(?=;0))|
43
  (?P<genero>(Masc.+;\d+|Fem.+;\d+))|
44
  (?P<cor>(^(Bra.+;\d+|Pret.+;\d+|Amar.+;\d+|Par.+;\d+|Indí.+;\d+)))|
45
+ (?P<deficiencia>(^(Audi.+a;\d+|Fís.+a;\d+|Cogn.+a;\d+|Vis.+l;\d+)))|
46
  (?P<doencas>(^(hipert.+al;\d+|diab.+s;\d+|gesta.+e;\d+|acam.+o;\d+|domici.+o;\d+|fuma.+e;\d+|saú.+e;\d+|Asm.+;\d+|DPO.+;\d+|Insufic.+ca;\d+|Insufic.+al;\d+)))|
47
+ (?P<Escola>(Cre.+e;\d+|Pr.+;\d+|Classe.+;\d+|Ens.+;\d+|Sup.+r;\d+|Alf.+;\d+|Nenhu.+;\d+))|
48
  (?P<transgen>(Homos.+\);\d+|Bisse.+l;\d+|Hom.+trans.+;\d+|Mul.+trans.+;\d+|Traves.+i;\d+|Transgê.+o;\d+|Não-B.+o;\d+))|
49
  """
50
  pattern = regex.compile(grupos, regex.VERBOSE | regex.MULTILINE)
 
59
  "deficiencia": [],
60
  "doencas": [],
61
  "Escola": [],
62
+ "transgen": [],
63
  }
64
 
65
  for match in matches:
 
84
  novos_valores.extend(partes)
85
  df = pd.DataFrame(novos_valores, columns=["Descrição"])
86
  df["Valor"] = df["Descrição"].apply(lambda x: x.split(";")[-1])
87
+ df["Descrição"] = df["Descrição"].apply(
88
+ lambda x: ";".join(x.split(";")[:-1])
89
+ )
90
  df["Descrição"] = df["Descrição"].apply(lambda x: x.replace(";", ""))
91
  dataframes[grupo] = df
92
  return dataframes
 
96
  "Creche": "Creche",
97
  "Pré-escola (exceto CA)": "Pré-escola",
98
  "Classe de alfabetização": "Alfabetização",
99
+ "Ensino fundamental 1ª a 4ª séries": "Fund. 1ª-4ª",
100
+ "Ensino fundamental 5ª a 8ª séries": "Fund. 5ª-8ª",
101
  "Ensino fundamental completo": "Fund. Completo",
102
  "Ensino fundamental especial": "Fund. Especial",
103
+ "Ensino fundamental EJA - séries iniciais (supletivo 1ª a 4ª)": "EJA 1ª-4ª",
104
+ "Ensino fundamental EJA - séries finais (supletivo 5ª a 8ª)": "EJA 5ª-8ª",
105
+ "Ensino médio, médio 2º ciclo (científico, técnico e etc)": "Ens. Médio",
106
  "Ensino médio especial": "Médio Especial",
107
  "Ensino médio EJA (supletivo)": "Médio EJA",
108
+ "Alfabetização para adultos (Mobral, etc)": "Alfab. Adultos",
109
+ "Nenhum": "Nenhum",
110
  }
111
  df_escola["Descrição"] = df_escola["Descrição"].map(renomeacoes)
112
  return df_escola
113
 
114
+ def renomear_doencas(df_doencas):
115
+ renomeacoes = {
116
+ "acamado": "Acamados",
117
+ "domiciliado": "Domiciliados",
118
+ "fumante": "Tabagistas",
119
+ "gestante": "Gestantes",
120
+ "diabetes": "Diabetes",
121
+ "hipertensão arterial": "HAS",
122
+ "saúde mental": "Saúde mental",
123
+ "asma": "Asma",
124
+ "dpoc": "DPOC",
125
+ "insuf cardíaca": "Insuf cardíaca",
126
+ "insuf renal": "Insuf renal",
127
+ }
128
+
129
+ # Normalize the "Descrição" column
130
+ df_doencas["Descrição"] = df_doencas["Descrição"].str.lower().str.strip()
131
+
132
+ # Check for unmapped values
133
+ valores_existentes = df_doencas["Descrição"].unique()
134
+ for valor in valores_existentes:
135
+ if valor not in renomeacoes:
136
+ print(f"Aviso: '{valor}' não encontrado nas renomeações. Nenhuma alteração será feita para este valor.")
137
+
138
+ # Apply the mapping
139
+ df_doencas["Descrição"] = df_doencas["Descrição"].map(renomeacoes).fillna(df_doencas["Descrição"])
140
+
141
+ return df_doencas
142
+
143
  def limpar_dfs(dataframes, regex_pattern, replacement):
144
  for key, df in dataframes.items():
145
+ df["Descrição"] = (
146
+ df["Descrição"]
147
+ .astype(str)
148
+ .apply(lambda x: regex.sub(regex_pattern, replacement, x))
149
+ )
150
  return dataframes
151
 
152
  def processar_arquivo(uploaded_file):
 
156
  dataframes = criar_dataframe(grupos_encontrados)
157
  if "Escola" in dataframes:
158
  dataframes["Escola"] = renomear_escola(dataframes["Escola"])
159
+ if "doencas" in dataframes:
160
+ dataframes["doencas"] = renomear_doencas(dataframes["doencas"])
161
+
162
+ clean_final = r"(\sativ\w+)|(\sde\scid.+o)|(iciê.+ia)|((?<=rans)gên.+o|omem|ulher|ário|Homoss.+\(|\))"
163
  substituicao = ""
164
  dataframes = limpar_dfs(dataframes, clean_final, substituicao)
165
+
166
  return dataframes