drguilhermeapolinario commited on
Commit
1cf69d5
·
verified ·
1 Parent(s): cbacdee

Update data_cleaning.py

Browse files
Files changed (1) hide show
  1. 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
- # Ler o arquivo com a codificação detectada
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