histlearn commited on
Commit
a2c6ed7
·
verified ·
1 Parent(s): d8775d7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -32
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 aluno para eliminar duplicatas
126
- grouped_tasks = self.tarefas_df.groupby(['Aluno_Pattern']).agg({
127
- 'Aluno': 'first', # Mantém o primeiro nome encontrado
128
- 'Duração': 'sum', # Soma total do tempo
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
- for _, aluno in self.alunos_df.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
- # 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': total_acertos,
150
- 'Total Tempo': str(duracao_total),
151
- 'Tempo Médio por Tarefa': str(duracao_total / total_tarefas if total_tarefas > 0 else timedelta(0))
 
152
  }
153
  metrics_df = pd.concat([metrics_df, pd.DataFrame([metrics])], ignore_index=True)
154
-
155
- # Ordenar por acertos e resetar índice
156
- return metrics_df.sort_values('Acertos Absolutos', ascending=False).reset_index(drop=True)
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
- total_questoes_por_tarefa = 10 # Número máximo de questões por tarefa
411
 
412
  media_acertos = alunos_nivel['Acertos Absolutos'].mean()
413
  media_tarefas = alunos_nivel['Tarefas Completadas'].mean()
414
- pontos_possiveis = media_tarefas * total_questoes_por_tarefa
415
- taxa_media = (media_acertos / pontos_possiveis * 100) if pontos_possiveis > 0 else 0
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
- pontos_possiveis = row['Tarefas Completadas'] * total_questoes_por_tarefa
450
- taxa_aproveitamento = (row['Acertos Absolutos'] / pontos_possiveis * 100) if pontos_possiveis > 0 else 0
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