File size: 7,893 Bytes
fa9ba45
 
 
 
7b77e4c
 
 
 
 
 
1cf69d5
7b77e4c
 
 
 
 
7107259
 
7b77e4c
 
 
 
 
 
 
 
 
7107259
7b77e4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7107259
7b77e4c
7107259
7b77e4c
 
 
 
 
 
 
1cf69d5
7b77e4c
 
 
 
 
 
7107259
7b77e4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7107259
 
 
7b77e4c
 
 
fa9ba45
7b77e4c
 
 
 
 
7107259
 
7b77e4c
 
7107259
 
 
7b77e4c
 
7107259
 
7b77e4c
 
 
 
7107259
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7b77e4c
 
7107259
 
 
 
 
7b77e4c
 
 
fa9ba45
 
 
 
9d00020
 
7107259
 
 
 
fa9ba45
 
7107259
fa9ba45
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
import chardet
import pandas as pd
import regex

def iniciar(uploaded_file):
    raw_data = uploaded_file.read()
    result = chardet.detect(raw_data)
    encoding = result["encoding"]
    print(f"Detected encoding: {encoding}")

    uploaded_file.seek(0)
    csv_data = uploaded_file.read().decode(encoding)
    return csv_data

def limpa_rci1(texto):
    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)|"
    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)"

    rx_marc = sub1 + "|" + sub2
    texto = regex.sub(rx_marc, "", texto, flags=regex.MULTILINE)
    tira = r"(;;;)"
    texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
    tira = r"(;;)"
    texto = regex.sub(tira, ";", texto, flags=regex.MULTILINE)
    return texto

def limpa_rci2(texto):
    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)"
    texto = regex.sub(sub2, "", texto, flags=regex.MULTILINE)
    tira = r"(;;;)"
    texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
    tira = r"(;;)"
    texto = regex.sub(tira, "; ", texto, flags=regex.MULTILINE)
    tira = r"(;$)"
    texto = regex.sub(tira, "", texto, flags=regex.MULTILINE)
    return texto

def separa_grupos(texto):
    grupos = r"""
        (?P<Data>(Data;\d+/\d+/\d+))|
        (?P<Head>(Equ.+;.+)|Profiss.+l;\w+|((Saíd.+;\d+)|(Cidadã.+;\d+)))|
        (?P<Idade>(^Menos.+(?=;0)|^[0-9][0-9]\s\w).+(?=;0))|
        (?P<genero>(Masc.+;\d+|Fem.+;\d+))|
        (?P<cor>(^(Bra.+;\d+|Pret.+;\d+|Amar.+;\d+|Par.+;\d+|Indí.+;\d+)))|
        (?P<deficiencia>(^(Audi.+a;\d+|Fís.+a;\d+|Cogn.+a;\d+|Vis.+l;\d+)))|
        (?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+)))|
        (?P<Escola>(Cre.+e;\d+|Pr.+;\d+|Classe.+;\d+|Ens.+;\d+|Sup.+r;\d+|Alf.+;\d+|Nenhu.+;\d+))|
        (?P<transgen>(Homos.+\);\d+|Bisse.+l;\d+|Hom.+trans.+;\d+|Mul.+trans.+;\d+|Traves.+i;\d+|Transgê.+o;\d+|Não-B.+o;\d+))|
    """
    pattern = regex.compile(grupos, regex.VERBOSE | regex.MULTILINE)

    matches = pattern.finditer(texto)
    grupos_enc = {
        "Data": [],
        "Head": [],
        "Idade": [],
        "genero": [],
        "cor": [],
        "deficiencia": [],
        "doencas": [],
        "Escola": [],
        "transgen": [],
    }

    for match in matches:
        for group_name, group_value in match.groupdict().items():
            if group_value and group_name in grupos_enc:
                grupos_enc[group_name].append(group_value)

    return grupos_enc

def criar_dataframe(grupos_encontrados):
    dataframes = {}
    for grupo, valores in grupos_encontrados.items():
        if grupo == "Idade":
            df = pd.DataFrame(valores, columns=["Descrição"])
            df["Masculino"] = df["Descrição"].apply(lambda x: x.split(";")[1])
            df["Feminino"] = df["Descrição"].apply(lambda x: x.split(";")[2])
            df["Descrição"] = df["Descrição"].apply(lambda x: x.split(";")[0])
        else:
            novos_valores = []
            for valor in valores:
                partes = valor.split("\n")
                novos_valores.extend(partes)
            df = pd.DataFrame(novos_valores, columns=["Descrição"])
            df["Valor"] = df["Descrição"].apply(lambda x: x.split(";")[-1])
            df["Descrição"] = df["Descrição"].apply(
                lambda x: ";".join(x.split(";")[:-1])
            )
            df["Descrição"] = df["Descrição"].apply(lambda x: x.replace(";", ""))
        dataframes[grupo] = df
    return dataframes

def renomear_escola(df_escola):
    renomeacoes = {
        "Creche": "Creche",
        "Pré-escola (exceto CA)": "Pré-escola",
        "Classe de alfabetização": "Alfabetização",
        "Ensino fundamental 1ª a 4ª séries": "Fund. 1ª-4ª",
        "Ensino fundamental 5ª a 8ª séries": "Fund. 5ª-8ª",
        "Ensino fundamental completo": "Fund. Completo",
        "Ensino fundamental especial": "Fund. Especial",
        "Ensino fundamental EJA - séries iniciais (supletivo 1ª a 4ª)": "EJA 1ª-4ª",
        "Ensino fundamental EJA - séries finais (supletivo 5ª a 8ª)": "EJA 5ª-8ª",
        "Ensino médio, médio 2º ciclo (científico, técnico e etc)": "Ens. Médio",
        "Ensino médio especial": "Médio Especial",
        "Ensino médio EJA (supletivo)": "Médio EJA",
        "Alfabetização para adultos (Mobral, etc)": "Alfab. Adultos",
        "Nenhum": "Nenhum",
    }
    df_escola["Descrição"] = df_escola["Descrição"].map(renomeacoes)
    return df_escola

def renomear_doencas(df_doencas):
    renomeacoes = {
        "acamado": "Acamados",
        "domiciliado": "Domiciliados",
        "fumante": "Tabagistas",
        "gestante": "Gestantes",
        "diabetes": "Diabetes",
        "hipertensão arterial": "HAS",
        "saúde mental": "Saúde mental",
        "asma": "Asma",
        "dpoc": "DPOC",
        "insuf cardíaca": "Insuf cardíaca",
        "insuf renal": "Insuf renal",
    }

    # Normalize the "Descrição" column
    df_doencas["Descrição"] = df_doencas["Descrição"].str.lower().str.strip()

    # Check for unmapped values
    valores_existentes = df_doencas["Descrição"].unique()
    for valor in valores_existentes:
        if valor not in renomeacoes:
            print(f"Aviso: '{valor}' não encontrado nas renomeações. Nenhuma alteração será feita para este valor.")

    # Apply the mapping
    df_doencas["Descrição"] = df_doencas["Descrição"].map(renomeacoes).fillna(df_doencas["Descrição"])
    
    return df_doencas

def limpar_dfs(dataframes, regex_pattern, replacement):
    for key, df in dataframes.items():
        df["Descrição"] = (
            df["Descrição"]
            .astype(str)
            .apply(lambda x: regex.sub(regex_pattern, replacement, x))
        )
    return dataframes

def processar_arquivo(uploaded_file):
    csv_data = iniciar(uploaded_file)
    csv_data_limpo = limpa_rci1(csv_data)
    grupos_encontrados = separa_grupos(csv_data_limpo)
    dataframes = criar_dataframe(grupos_encontrados)
    if "Escola" in dataframes:
        dataframes["Escola"] = renomear_escola(dataframes["Escola"])
    if "doencas" in dataframes:
        dataframes["doencas"] = renomear_doencas(dataframes["doencas"])
    
    clean_final = r"(\sativ\w+)|(\sde\scid.+o)|(iciê.+ia)|((?<=rans)gên.+o|omem|ulher|ário|Homoss.+\(|\))"
    substituicao = ""
    dataframes = limpar_dfs(dataframes, clean_final, substituicao)
    
    return dataframes