Spaces:
Running
Running
drguilhermeapolinario
commited on
Update data_cleaning.py
Browse files- data_cleaning.py +3 -47
data_cleaning.py
CHANGED
@@ -3,25 +3,16 @@ import pandas as pd
|
|
3 |
import regex
|
4 |
|
5 |
def iniciar(uploaded_file):
|
6 |
-
"""
|
7 |
-
A function that detects the encoding of a file and reads the file using the detected encoding.
|
8 |
-
"""
|
9 |
-
# Detectar a codificação do arquivo
|
10 |
raw_data = uploaded_file.read()
|
11 |
result = chardet.detect(raw_data)
|
12 |
encoding = result["encoding"]
|
13 |
print(f"Detected encoding: {encoding}")
|
14 |
|
15 |
-
|
16 |
-
uploaded_file.seek(0) # Reset file pointer to the beginning
|
17 |
csv_data = uploaded_file.read().decode(encoding)
|
18 |
return csv_data
|
19 |
|
20 |
def limpa_rci1(texto):
|
21 |
-
"""
|
22 |
-
Cleans up the given text by removing unwanted parts.
|
23 |
-
"""
|
24 |
-
# Remover partes indesejadas
|
25 |
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)|"
|
26 |
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)"
|
27 |
rx_marc = sub1 + "|" + sub2
|
@@ -33,11 +24,7 @@ def limpa_rci1(texto):
|
|
33 |
return texto
|
34 |
|
35 |
def limpa_rci2(texto):
|
36 |
-
"""
|
37 |
-
Cleans up the given text by removing unwanted parts.
|
38 |
-
"""
|
39 |
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)"
|
40 |
-
|
41 |
texto = regex.sub(sub2, "", texto, flags=regex.MULTILINE)
|
42 |
tira = r"(;;;)"
|
43 |
texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
|
@@ -50,10 +37,6 @@ def limpa_rci2(texto):
|
|
50 |
return texto
|
51 |
|
52 |
def separa_grupos(texto):
|
53 |
-
"""
|
54 |
-
A function that uses a regular expression to extract various groups from the input text.
|
55 |
-
"""
|
56 |
-
# Expressão regular ajustada para capturar vários grupos
|
57 |
grupos = r"""
|
58 |
(?P<Data>(Data;\d+/\d+/\d+))|
|
59 |
(?P<Head>(Equ.+;.+)|Profiss.+l;\w+|((Saíd.+;\d+)|(Cidadã.+;\d+)))|
|
@@ -65,14 +48,12 @@ def separa_grupos(texto):
|
|
65 |
(?P<Escola>(Desc.+o;Quant.+\nCre.+e;\d+|Pr.+;\d+|Classe.+;\d+|Ens.+;\d+|Sup.+r;\d+|Alf.+;\d+|Nenhu.+;\d+))|
|
66 |
(?P<transgen>(Homos.+\);\d+|Bisse.+l;\d+|Hom.+trans.+;\d+|Mul.+trans.+;\d+|Traves.+i;\d+|Transgê.+o;\d+|Não-B.+o;\d+))|
|
67 |
"""
|
68 |
-
|
69 |
-
# Compilar a expressão regular com as flags re.VERBOSE e re.MULTILINE para maior legibilidade
|
70 |
pattern = regex.compile(grupos, regex.VERBOSE | regex.MULTILINE)
|
71 |
|
72 |
matches = pattern.finditer(texto)
|
73 |
grupos_enc = {
|
74 |
"Data": [],
|
75 |
-
"Head": [],
|
76 |
"Idade": [],
|
77 |
"genero": [],
|
78 |
"cor": [],
|
@@ -90,9 +71,6 @@ def separa_grupos(texto):
|
|
90 |
return grupos_enc
|
91 |
|
92 |
def criar_dataframe(grupos_encontrados):
|
93 |
-
"""
|
94 |
-
Create dataframes based on the groups found in `grupos_encontrados`.
|
95 |
-
"""
|
96 |
dataframes = {}
|
97 |
for grupo, valores in grupos_encontrados.items():
|
98 |
if grupo == "Idade":
|
@@ -101,23 +79,18 @@ def criar_dataframe(grupos_encontrados):
|
|
101 |
df["Feminino"] = df["Descrição"].apply(lambda x: x.split(";")[2])
|
102 |
df["Descrição"] = df["Descrição"].apply(lambda x: x.split(";")[0])
|
103 |
else:
|
104 |
-
# Tratar casos onde os dados são separados por '\n'
|
105 |
novos_valores = []
|
106 |
for valor in valores:
|
107 |
partes = valor.split("\n")
|
108 |
novos_valores.extend(partes)
|
109 |
df = pd.DataFrame(novos_valores, columns=["Descrição"])
|
110 |
df["Valor"] = df["Descrição"].apply(lambda x: x.split(";")[-1])
|
111 |
-
df["Descrição"] = df["Descrição"].apply(
|
112 |
-
lambda x: ";".join(x.split(";")[:-1]))
|
113 |
df["Descrição"] = df["Descrição"].apply(lambda x: x.replace(";", ""))
|
114 |
dataframes[grupo] = df
|
115 |
return dataframes
|
116 |
|
117 |
def renomear_escola(df_escola):
|
118 |
-
"""
|
119 |
-
Renomeia as descrições da coluna 'Descrição' do DataFrame df_escola.
|
120 |
-
"""
|
121 |
renomeacoes = {
|
122 |
"Creche": "Creche",
|
123 |
"Pré-escola (exceto CA)": "Pré-escola",
|
@@ -134,39 +107,22 @@ def renomear_escola(df_escola):
|
|
134 |
"Alfabetização para adultos (Mobral, etc)": "Alfabetização Adultos",
|
135 |
"Nenhum": "Nenhum"
|
136 |
}
|
137 |
-
|
138 |
df_escola["Descrição"] = df_escola["Descrição"].map(renomeacoes)
|
139 |
return df_escola
|
140 |
|
141 |
def limpar_dfs(dataframes, regex_pattern, replacement):
|
142 |
-
"""
|
143 |
-
Aplica uma regex de limpeza em todos os DataFrames.
|
144 |
-
"""
|
145 |
for key, df in dataframes.items():
|
146 |
df["Descrição"] = df["Descrição"].astype(str).apply(lambda x: regex.sub(regex_pattern, replacement, x))
|
147 |
return dataframes
|
148 |
|
149 |
def processar_arquivo(uploaded_file):
|
150 |
-
"""
|
151 |
-
Processa o arquivo CSV e retorna os DataFrames.
|
152 |
-
"""
|
153 |
-
# Leitura e limpeza do arquivo CSV
|
154 |
csv_data = iniciar(uploaded_file)
|
155 |
csv_data_limpo = limpa_rci1(csv_data)
|
156 |
-
|
157 |
-
# Separação dos grupos
|
158 |
grupos_encontrados = separa_grupos(csv_data_limpo)
|
159 |
-
|
160 |
-
# Criação dos dataframes
|
161 |
dataframes = criar_dataframe(grupos_encontrados)
|
162 |
-
|
163 |
-
# Renomear descrições do DataFrame de escolaridade
|
164 |
if "Escola" in dataframes:
|
165 |
dataframes["Escola"] = renomear_escola(dataframes["Escola"])
|
166 |
-
|
167 |
-
# Aplicar limpeza final nos DataFrames
|
168 |
clean_final = r"(\sativ\w+)|(\sde\scid.+o)|(iciê.+ia)|((?<=rans)gên.+o|omem|ulher|ário|Homoss.+\(|\))|(\d{10}\s-\s)"
|
169 |
substituicao = ""
|
170 |
dataframes = limpar_dfs(dataframes, clean_final, substituicao)
|
171 |
-
|
172 |
return dataframes
|
|
|
3 |
import regex
|
4 |
|
5 |
def iniciar(uploaded_file):
|
|
|
|
|
|
|
|
|
6 |
raw_data = uploaded_file.read()
|
7 |
result = chardet.detect(raw_data)
|
8 |
encoding = result["encoding"]
|
9 |
print(f"Detected encoding: {encoding}")
|
10 |
|
11 |
+
uploaded_file.seek(0)
|
|
|
12 |
csv_data = uploaded_file.read().decode(encoding)
|
13 |
return csv_data
|
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
|
|
|
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)
|
|
|
37 |
return texto
|
38 |
|
39 |
def separa_grupos(texto):
|
|
|
|
|
|
|
|
|
40 |
grupos = r"""
|
41 |
(?P<Data>(Data;\d+/\d+/\d+))|
|
42 |
(?P<Head>(Equ.+;.+)|Profiss.+l;\w+|((Saíd.+;\d+)|(Cidadã.+;\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)
|
52 |
|
53 |
matches = pattern.finditer(texto)
|
54 |
grupos_enc = {
|
55 |
"Data": [],
|
56 |
+
"Head": [],
|
57 |
"Idade": [],
|
58 |
"genero": [],
|
59 |
"cor": [],
|
|
|
71 |
return grupos_enc
|
72 |
|
73 |
def criar_dataframe(grupos_encontrados):
|
|
|
|
|
|
|
74 |
dataframes = {}
|
75 |
for grupo, valores in grupos_encontrados.items():
|
76 |
if grupo == "Idade":
|
|
|
79 |
df["Feminino"] = df["Descrição"].apply(lambda x: x.split(";")[2])
|
80 |
df["Descrição"] = df["Descrição"].apply(lambda x: x.split(";")[0])
|
81 |
else:
|
|
|
82 |
novos_valores = []
|
83 |
for valor in valores:
|
84 |
partes = valor.split("\n")
|
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
|
92 |
|
93 |
def renomear_escola(df_escola):
|
|
|
|
|
|
|
94 |
renomeacoes = {
|
95 |
"Creche": "Creche",
|
96 |
"Pré-escola (exceto CA)": "Pré-escola",
|
|
|
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):
|
|
|
|
|
|
|
|
|
119 |
csv_data = iniciar(uploaded_file)
|
120 |
csv_data_limpo = limpa_rci1(csv_data)
|
|
|
|
|
121 |
grupos_encontrados = separa_grupos(csv_data_limpo)
|
|
|
|
|
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
|