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"
)
|