Spaces:
Running
Running
drguilhermeapolinario
commited on
Update data_cleaning.py
Browse files- 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)|(
|
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
|
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>(
|
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(
|
|
|
|
|
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": "
|
99 |
-
"Ensino fundamental 5ª a 8ª séries": "
|
100 |
"Ensino fundamental completo": "Fund. Completo",
|
101 |
"Ensino fundamental especial": "Fund. Especial",
|
102 |
-
"Ensino fundamental EJA - séries iniciais (supletivo 1ª a 4ª)": "
|
103 |
-
"Ensino fundamental EJA - séries finais (supletivo 5ª a 8ª)": "
|
104 |
-
"Ensino médio, médio 2º ciclo (científico, técnico e etc)": "Médio
|
105 |
"Ensino médio especial": "Médio Especial",
|
106 |
"Ensino médio EJA (supletivo)": "Médio EJA",
|
107 |
-
"Alfabetização para adultos (Mobral, etc)": "
|
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"] =
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
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
|