Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -121,40 +121,35 @@ class StudentAnalyzer:
|
|
121 |
"""Calcula métricas de desempenho dos alunos, eliminando duplicatas e normalizando valores."""
|
122 |
try:
|
123 |
metrics_df = pd.DataFrame()
|
124 |
-
|
125 |
-
# Agrupar por
|
126 |
-
grouped_tasks = self.tarefas_df.groupby(['Aluno_Pattern']).agg({
|
127 |
-
'
|
128 |
-
'
|
129 |
-
'Nota': 'sum', # Soma total dos acertos
|
130 |
}).reset_index()
|
131 |
-
|
132 |
-
# Contar número de tarefas por aluno
|
133 |
-
task_counts = self.tarefas_df.groupby('Aluno_Pattern').size().reset_index(name='total_tarefas')
|
134 |
-
grouped_tasks = grouped_tasks.merge(task_counts, on='Aluno_Pattern', how='left')
|
135 |
-
|
136 |
-
|
|
|
137 |
aluno_pattern = aluno['Aluno_Pattern']
|
138 |
aluno_data = grouped_tasks[grouped_tasks['Aluno_Pattern'] == aluno_pattern]
|
139 |
-
|
140 |
if not aluno_data.empty:
|
141 |
-
# Calcular métricas por aluno
|
142 |
-
total_tarefas = aluno_data['total_tarefas'].iloc[0]
|
143 |
-
total_acertos = aluno_data['Nota'].iloc[0]
|
144 |
-
duracao_total = aluno_data['Duração'].iloc[0]
|
145 |
-
|
146 |
metrics = {
|
147 |
'Nome do Aluno': aluno['Nome do Aluno'],
|
148 |
-
'Tarefas Completadas': total_tarefas,
|
149 |
-
'Acertos Absolutos':
|
150 |
-
'Total Tempo': str(
|
151 |
-
'Tempo Médio por Tarefa': str(
|
|
|
152 |
}
|
153 |
metrics_df = pd.concat([metrics_df, pd.DataFrame([metrics])], ignore_index=True)
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
except Exception as e:
|
159 |
logging.error(f"Erro ao calcular métricas: {str(e)}")
|
160 |
raise
|
@@ -407,12 +402,12 @@ class ReportGenerator:
|
|
407 |
pdf.set_fill_color(240, 240, 240)
|
408 |
|
409 |
# Calcular estatísticas do nível
|
410 |
-
|
411 |
|
412 |
media_acertos = alunos_nivel['Acertos Absolutos'].mean()
|
413 |
media_tarefas = alunos_nivel['Tarefas Completadas'].mean()
|
414 |
-
|
415 |
-
taxa_media = (media_acertos /
|
416 |
|
417 |
# Cabeçalho da seção
|
418 |
pdf.cell(0, 10, f'Detalhamento - Nível {nivel}', 0, 1, 'L', True)
|
@@ -441,13 +436,14 @@ class ReportGenerator:
|
|
441 |
# Dados dos alunos
|
442 |
pdf.set_font('Arial', '', 10)
|
443 |
for i, (_, row) in enumerate(alunos_nivel.iterrows()):
|
|
|
444 |
# Alternar cores das linhas
|
445 |
fill_color = (248, 248, 248) if i % 2 == 0 else (255, 255, 255)
|
446 |
pdf.set_fill_color(*fill_color)
|
447 |
|
448 |
-
# Calcular taxa de aproveitamento normalizada
|
449 |
-
|
450 |
-
taxa_aproveitamento = (row['Acertos Absolutos'] /
|
451 |
taxa_aproveitamento = min(taxa_aproveitamento, 100) # Limitar a 100%
|
452 |
|
453 |
# Formatar tempo
|
|
|
121 |
"""Calcula métricas de desempenho dos alunos, eliminando duplicatas e normalizando valores."""
|
122 |
try:
|
123 |
metrics_df = pd.DataFrame()
|
124 |
+
|
125 |
+
# Agrupar por Aluno_Pattern e Nome do Aluno para eliminar duplicatas completamente
|
126 |
+
grouped_tasks = self.tarefas_df.groupby(['Aluno_Pattern', 'Nome do Aluno']).agg({
|
127 |
+
'Duração': 'sum',
|
128 |
+
'Nota': 'sum'
|
|
|
129 |
}).reset_index()
|
130 |
+
|
131 |
+
# Contar número de tarefas únicas por aluno
|
132 |
+
task_counts = self.tarefas_df.groupby(['Aluno_Pattern', 'Nome do Aluno']).size().reset_index(name='total_tarefas')
|
133 |
+
grouped_tasks = grouped_tasks.merge(task_counts, on=['Aluno_Pattern', 'Nome do Aluno'], how='left')
|
134 |
+
|
135 |
+
# Processar cada aluno uma única vez
|
136 |
+
for _, aluno in self.alunos_df.drop_duplicates(subset=['Aluno_Pattern', 'Nome do Aluno']).iterrows():
|
137 |
aluno_pattern = aluno['Aluno_Pattern']
|
138 |
aluno_data = grouped_tasks[grouped_tasks['Aluno_Pattern'] == aluno_pattern]
|
139 |
+
|
140 |
if not aluno_data.empty:
|
|
|
|
|
|
|
|
|
|
|
141 |
metrics = {
|
142 |
'Nome do Aluno': aluno['Nome do Aluno'],
|
143 |
+
'Tarefas Completadas': aluno_data['total_tarefas'].iloc[0],
|
144 |
+
'Acertos Absolutos': aluno_data['Nota'].iloc[0],
|
145 |
+
'Total Tempo': str(aluno_data['Duração'].iloc[0]),
|
146 |
+
'Tempo Médio por Tarefa': str(aluno_data['Duração'].iloc[0] / aluno_data['total_tarefas'].iloc[0]
|
147 |
+
if aluno_data['total_tarefas'].iloc[0] > 0 else timedelta(0))
|
148 |
}
|
149 |
metrics_df = pd.concat([metrics_df, pd.DataFrame([metrics])], ignore_index=True)
|
150 |
+
|
151 |
+
return metrics_df.sort_values('Acertos Absolutos', ascending=False).drop_duplicates(subset=['Nome do Aluno']).reset_index(drop=True)
|
152 |
+
|
|
|
153 |
except Exception as e:
|
154 |
logging.error(f"Erro ao calcular métricas: {str(e)}")
|
155 |
raise
|
|
|
402 |
pdf.set_fill_color(240, 240, 240)
|
403 |
|
404 |
# Calcular estatísticas do nível
|
405 |
+
questoes_por_tarefa = 10 # Número máximo de questões por tarefa
|
406 |
|
407 |
media_acertos = alunos_nivel['Acertos Absolutos'].mean()
|
408 |
media_tarefas = alunos_nivel['Tarefas Completadas'].mean()
|
409 |
+
total_questoes_possiveis = media_tarefas * questoes_por_tarefa
|
410 |
+
taxa_media = (media_acertos / total_questoes_possiveis * 100) if total_questoes_possiveis > 0 else 0
|
411 |
|
412 |
# Cabeçalho da seção
|
413 |
pdf.cell(0, 10, f'Detalhamento - Nível {nivel}', 0, 1, 'L', True)
|
|
|
436 |
# Dados dos alunos
|
437 |
pdf.set_font('Arial', '', 10)
|
438 |
for i, (_, row) in enumerate(alunos_nivel.iterrows()):
|
439 |
+
|
440 |
# Alternar cores das linhas
|
441 |
fill_color = (248, 248, 248) if i % 2 == 0 else (255, 255, 255)
|
442 |
pdf.set_fill_color(*fill_color)
|
443 |
|
444 |
+
# Calcular taxa de aproveitamento normalizada corretamente
|
445 |
+
total_questoes = row['Tarefas Completadas'] * questoes_por_tarefa
|
446 |
+
taxa_aproveitamento = (row['Acertos Absolutos'] / total_questoes * 100) if total_questoes > 0 else 0
|
447 |
taxa_aproveitamento = min(taxa_aproveitamento, 100) # Limitar a 100%
|
448 |
|
449 |
# Formatar tempo
|