File size: 7,388 Bytes
bb7de2f
 
 
 
72dc442
 
bb7de2f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72dc442
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bb7de2f
7e6f00d
bb7de2f
 
 
 
 
 
 
 
 
 
 
72dc442
bb7de2f
 
 
 
 
72dc442
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import pandas as pd
import os
import json
import zipfile
import io

# Função para carregar anotações específicas (discursivas ou práticas)
def carregar_anotacoes(tipo, pasta="anotacoes"):
    anotacoes = {}
    if os.path.exists(pasta):
        for arquivo in os.listdir(pasta):
            if arquivo.endswith(f"_{tipo}.json"):
                usuario = arquivo.split("_")[0]
                with open(os.path.join(pasta, arquivo), "r", encoding="utf-8") as f:
                    anotacoes[usuario] = json.load(f)
    return anotacoes

# Função para calcular os totais de anotações
def calcular_totais(anotacoes_discursivas, anotacoes_praticas, df_discursivas, df_praticas):
    resultados = []

    total_questoes_discursivas = len(df_discursivas)
    total_criterios_discursivos = sum(len(q["formated_criteria"]) for _, q in df_discursivas.iterrows())
    total_provas_praticas = len(df_praticas)
    total_criterios_praticos = sum(len(q["formated_criteria"]) for _, q in df_praticas.iterrows())

    usuarios = set(anotacoes_discursivas.keys()).union(set(anotacoes_praticas.keys()))

    for usuario in usuarios:
        questoes_discursivas_completas = 0
        criterios_discursivos_anotados = 0
        provas_praticas_completas = 0
        criterios_praticos_anotados = 0

        if usuario in anotacoes_discursivas:
            for questao_id, criterios in anotacoes_discursivas[usuario].items():
                if questao_id in df_discursivas["id"].astype(str).values:
                    criterios_totais = len(df_discursivas[df_discursivas["id"] == int(questao_id)].iloc[0]["formated_criteria"])
                    criterios_anotados = len([k for k, v in criterios.items() if v in ["Sim", "Não"]])
                    if criterios_anotados == criterios_totais:
                        questoes_discursivas_completas += 1
                    criterios_discursivos_anotados += criterios_anotados

        if usuario in anotacoes_praticas:
            for questao_id, criterios in anotacoes_praticas[usuario].items():
                if questao_id in df_praticas["id"].astype(str).values:
                    criterios_totais = len(df_praticas[df_praticas["id"] == int(questao_id)].iloc[0]["formated_criteria"])
                    criterios_anotados = len([k for k, v in criterios.items() if v in ["Sim", "Não"]])
                    if criterios_anotados == criterios_totais:
                        provas_praticas_completas += 1
                    criterios_praticos_anotados += criterios_anotados

        resultados.append({
            "usuario": usuario,
            "questoes_discursivas_anotadas": f"{questoes_discursivas_completas}/{total_questoes_discursivas}",
            "total_criterios_discursivos_anotados": f"{criterios_discursivos_anotados}/{total_criterios_discursivos}",
            "provas_praticas_anotadas": f"{provas_praticas_completas}/{total_provas_praticas}",
            "criterios_praticos_anotados": f"{criterios_praticos_anotados}/{total_criterios_praticos}"
        })

    return resultados

# Função para calcular itens incompletos por usuário
def calcular_itens_incompletos(anotacoes_discursivas, anotacoes_praticas, df_discursivas, df_praticas):
    resultados_incompletos = []

    usuarios = set(anotacoes_discursivas.keys()).union(set(anotacoes_praticas.keys()))

    for usuario in usuarios:
        # Verificar discursivas
        if usuario in anotacoes_discursivas:
            for questao_id, criterios in anotacoes_discursivas[usuario].items():
                if questao_id in df_discursivas["id"].astype(str).values:
                    criterios_totais = df_discursivas[df_discursivas["id"] == int(questao_id)].iloc[0]["formated_criteria"]
                    criterios_anotados = [k for k, v in criterios.items() if v in ["Sim", "Não"]]
                    if len(criterios_anotados) < len(criterios_totais):
                        for criterio in criterios_totais:
                            if criterio not in criterios_anotados:
                                resultados_incompletos.append({
                                    "usuario": usuario,
                                    "item_pendente": f"D {questao_id} {criterio['letra']}-{criterio['parte']}"
                                })

        # Verificar práticas
        if usuario in anotacoes_praticas:
            for questao_id, criterios in anotacoes_praticas[usuario].items():
                if questao_id in df_praticas["id"].astype(str).values:
                    criterios_totais = df_praticas[df_praticas["id"] == int(questao_id)].iloc[0]["formated_criteria"]
                    criterios_anotados = [k for k, v in criterios.items() if v in ["Sim", "Não"]]
                    if len(criterios_anotados) < len(criterios_totais):
                        for criterio in criterios_totais:
                            if criterio not in criterios_anotados:
                                resultados_incompletos.append({
                                    "usuario": usuario,
                                    "item_pendente": f"P {questao_id} {criterio['numero']}-{criterio['parte']}"
                                })

    return resultados_incompletos

# Função principal do Streamlit
def run():
    #st.set_page_config(layout="wide")
    st.title("Dashboard de Anotações - Benchmark Jurídico OAB")

    # Carregar os DataFrames
    with st.spinner("Carregando arquivos..."):
        df_discursivas = pd.read_pickle("df_evaluated_discursive.pkl")
        df_praticas = pd.read_pickle("df_evaluated.pkl")
        anotacoes_discursivas = carregar_anotacoes("anotacoes_discursivas")
        anotacoes_praticas = carregar_anotacoes("anotacoes_praticas")

    # Calcular os totais
    resultados = calcular_totais(anotacoes_discursivas, anotacoes_praticas, df_discursivas, df_praticas)
    df_resultados = pd.DataFrame(resultados)

    # Exibir os dados em uma tabela
    st.markdown("### Resumo das Anotações")
    st.dataframe(df_resultados, use_container_width=True)

    # Calcular itens incompletos
    itens_incompletos = calcular_itens_incompletos(anotacoes_discursivas, anotacoes_praticas, df_discursivas, df_praticas)
    df_incompletos = pd.DataFrame(itens_incompletos)

    # Permitir filtragem por usuário
    usuarios_disponiveis = df_incompletos["usuario"].unique().tolist()
    usuario_selecionado = st.selectbox("Selecione um usuário:", options=["Todos"] + usuarios_disponiveis)

    if usuario_selecionado != "Todos":
        df_incompletos = df_incompletos[df_incompletos["usuario"] == usuario_selecionado]

    # Exibir os itens incompletos
    st.markdown("### Itens Incompletos por Usuário")
    st.dataframe(df_incompletos, use_container_width=True)

    # Criar um ZIP com os arquivos JSON
    folder_path = "anotacoes"
    zip_buffer = io.BytesIO()

    with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zip_file:
        for file_name in os.listdir(folder_path):
            if file_name.endswith(".json"):
                file_path = os.path.join(folder_path, file_name)
                zip_file.write(file_path, arcname=file_name)

    zip_buffer.seek(0)

    # Criar botão de download
    st.download_button(
        label="📥 Baixar Todos os JSONs",
        data=zip_buffer,
        file_name="anotacoes.zip",
        mime="application/zip"
    )