histlearn commited on
Commit
57a0292
·
verified ·
1 Parent(s): cbf8ae9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -19
app.py CHANGED
@@ -410,17 +410,28 @@ class ReportGenerator:
410
  try:
411
  pdf.set_font('Arial', 'B', 14)
412
  pdf.set_fill_color(240, 240, 240)
 
 
 
 
 
 
413
  pdf.cell(0, 10, f'Detalhamento - Nível {nivel}', 0, 1, 'L', True)
414
- pdf.ln(5)
 
 
 
 
415
 
416
  # Configuração da tabela
417
  colunas = [
418
- ('Nome do Aluno', 80),
419
- ('Acertos', 25),
420
- ('Tarefas', 25),
 
421
  ('Tempo Total', 35)
422
  ]
423
-
424
  # Cabeçalho
425
  pdf.set_font('Arial', 'B', 10)
426
  pdf.set_fill_color(230, 230, 230)
@@ -431,22 +442,60 @@ class ReportGenerator:
431
  # Dados com cores alternadas
432
  pdf.set_font('Arial', '', 10)
433
  for i, (_, row) in enumerate(alunos_nivel.iterrows()):
434
- # Cor de fundo alternada
435
- fill_color = (245, 245, 245) if i % 2 == 0 else (255, 255, 255)
436
  pdf.set_fill_color(*fill_color)
437
 
438
  tempo = pd.to_timedelta(row['Total Tempo'])
439
  tempo_str = f"{int(tempo.total_seconds() // 60)}min {int(tempo.total_seconds() % 60)}s"
440
-
441
- pdf.cell(80, 7, str(row['Nome do Aluno'])[:40], 1, 0, 'L', True)
442
- pdf.cell(25, 7, f"{row['Acertos Absolutos']:.0f}", 1, 0, 'R', True)
443
- pdf.cell(25, 7, str(row['Tarefas Completadas']), 1, 0, 'R', True)
 
 
444
  pdf.cell(35, 7, tempo_str, 1, 0, 'R', True)
445
  pdf.ln()
 
446
  except Exception as e:
447
  logging.error(f"Erro ao gerar seção de tabela: {str(e)}")
448
  raise
449
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
450
  def generate_pdf(self, output_path: str, graphs: List[plt.Figure]) -> None:
451
  """Gera relatório em PDF com análise detalhada."""
452
  try:
@@ -456,32 +505,39 @@ class ReportGenerator:
456
  self.set_font('Arial', 'B', 15)
457
  self.set_fill_color(240, 240, 240)
458
  self.cell(0, 15, 'Relatório de Desempenho - Análise Detalhada', 0, 1, 'C', True)
 
 
 
459
  self.ln(10)
460
 
461
  pdf = PDF('L', 'mm', 'A4')
462
-
463
  # Introdução
464
  pdf.add_page()
465
  self._add_introduction_section(pdf)
466
-
467
  # Visão Geral
468
  pdf.add_page()
469
  self._add_overview_section(pdf)
470
-
 
 
 
 
471
  # Destaques
472
  self._add_highlights_section(pdf)
473
-
474
  # Gráficos e Análises
475
  self._add_graphs_section(pdf, graphs)
476
-
477
  # Detalhamento por Nível
478
  self._add_detailed_sections(pdf)
479
-
480
  # Recomendações Finais
481
  self._add_recommendations_section(pdf)
482
-
483
  pdf.output(output_path)
484
-
485
  except Exception as e:
486
  logging.error(f"Erro ao gerar PDF: {str(e)}")
487
  raise
 
410
  try:
411
  pdf.set_font('Arial', 'B', 14)
412
  pdf.set_fill_color(240, 240, 240)
413
+
414
+ # Adicionar cabeçalho com estatísticas do nível
415
+ media_acertos = alunos_nivel['Acertos Absolutos'].mean()
416
+ media_tarefas = alunos_nivel['Tarefas Completadas'].mean()
417
+ taxa_media = media_acertos / media_tarefas if media_tarefas > 0 else 0
418
+
419
  pdf.cell(0, 10, f'Detalhamento - Nível {nivel}', 0, 1, 'L', True)
420
+ pdf.set_font('Arial', '', 10)
421
+ pdf.cell(0, 6, f'Média de Acertos: {media_acertos:.1f} | ' +
422
+ f'Média de Tarefas: {media_tarefas:.1f} | ' +
423
+ f'Taxa Média de Aproveitamento: {taxa_media:.1%}', 0, 1)
424
+ pdf.ln(2)
425
 
426
  # Configuração da tabela
427
  colunas = [
428
+ ('Nome do Aluno', 70),
429
+ ('Acertos', 20),
430
+ ('Tarefas', 20),
431
+ ('Taxa', 20),
432
  ('Tempo Total', 35)
433
  ]
434
+
435
  # Cabeçalho
436
  pdf.set_font('Arial', 'B', 10)
437
  pdf.set_fill_color(230, 230, 230)
 
442
  # Dados com cores alternadas
443
  pdf.set_font('Arial', '', 10)
444
  for i, (_, row) in enumerate(alunos_nivel.iterrows()):
445
+ # Cor de fundo alternada mais suave
446
+ fill_color = (248, 248, 248) if i % 2 == 0 else (255, 255, 255)
447
  pdf.set_fill_color(*fill_color)
448
 
449
  tempo = pd.to_timedelta(row['Total Tempo'])
450
  tempo_str = f"{int(tempo.total_seconds() // 60)}min {int(tempo.total_seconds() % 60)}s"
451
+ taxa_aproveitamento = row['Acertos Absolutos'] / row['Tarefas Completadas']
452
+
453
+ pdf.cell(70, 7, str(row['Nome do Aluno'])[:35], 1, 0, 'L', True)
454
+ pdf.cell(20, 7, f"{row['Acertos Absolutos']:.0f}", 1, 0, 'R', True)
455
+ pdf.cell(20, 7, str(row['Tarefas Completadas']), 1, 0, 'R', True)
456
+ pdf.cell(20, 7, f"{taxa_aproveitamento:.1%}", 1, 0, 'R', True)
457
  pdf.cell(35, 7, tempo_str, 1, 0, 'R', True)
458
  pdf.ln()
459
+
460
  except Exception as e:
461
  logging.error(f"Erro ao gerar seção de tabela: {str(e)}")
462
  raise
463
 
464
+ def _add_insights_section(self, pdf: FPDF) -> None:
465
+ """Adiciona uma nova seção de insights principais."""
466
+ pdf.set_font('Arial', 'B', 14)
467
+ pdf.set_fill_color(240, 240, 240)
468
+ pdf.cell(0, 10, 'Insights Principais', 0, 1, 'L', True)
469
+ pdf.ln(5)
470
+
471
+ pdf.set_font('Arial', '', 11)
472
+
473
+ # Calcular métricas avançadas
474
+ taxa_aproveitamento = self.data['Acertos Absolutos'].sum() / self.data['Tarefas Completadas'].sum()
475
+ alunos_eficientes = self.data[
476
+ (self.data['Acertos Absolutos'] / self.data['Tarefas Completadas'] > taxa_aproveitamento) &
477
+ (pd.to_timedelta(self.data['Total Tempo']).dt.total_seconds() <
478
+ pd.to_timedelta(self.data['Total Tempo']).dt.total_seconds().mean())
479
+ ]
480
+
481
+ insights_text = f"""
482
+ Análise de Eficiência:
483
+ - Taxa média de aproveitamento da turma: {taxa_aproveitamento:.1%}
484
+ - {len(alunos_eficientes)} alunos demonstram alta eficiência (acertos acima da média e tempo abaixo da média)
485
+ - {len(self.data[self.data['Acertos Absolutos'] == 0])} alunos não registraram acertos
486
+
487
+ Padrões Identificados:
488
+ - Alunos que completaram mais tarefas tendem a ter melhor desempenho
489
+ - Tempo dedicado não mostra correlação forte com número de acertos
490
+ - {(len(self.data[self.data['Tarefas Completadas'] < 5]) / len(self.data) * 100):.1f}% dos alunos completaram menos de 5 tarefas
491
+
492
+ Recomendações Baseadas em Dados:
493
+ - Focar em aumentar o número de tarefas completadas
494
+ - Identificar motivos para baixa participação em alguns alunos
495
+ - Avaliar qualidade do tempo dedicado vs. quantidade
496
+ """
497
+ pdf.multi_cell(0, 7, insights_text)
498
+
499
  def generate_pdf(self, output_path: str, graphs: List[plt.Figure]) -> None:
500
  """Gera relatório em PDF com análise detalhada."""
501
  try:
 
505
  self.set_font('Arial', 'B', 15)
506
  self.set_fill_color(240, 240, 240)
507
  self.cell(0, 15, 'Relatório de Desempenho - Análise Detalhada', 0, 1, 'C', True)
508
+ # Adicionar número de página
509
+ self.set_font('Arial', 'I', 8)
510
+ self.cell(0, 10, f'Página {self.page_no()}', 0, 0, 'R')
511
  self.ln(10)
512
 
513
  pdf = PDF('L', 'mm', 'A4')
514
+
515
  # Introdução
516
  pdf.add_page()
517
  self._add_introduction_section(pdf)
518
+
519
  # Visão Geral
520
  pdf.add_page()
521
  self._add_overview_section(pdf)
522
+
523
+ # Nova seção de Insights
524
+ pdf.add_page()
525
+ self._add_insights_section(pdf)
526
+
527
  # Destaques
528
  self._add_highlights_section(pdf)
529
+
530
  # Gráficos e Análises
531
  self._add_graphs_section(pdf, graphs)
532
+
533
  # Detalhamento por Nível
534
  self._add_detailed_sections(pdf)
535
+
536
  # Recomendações Finais
537
  self._add_recommendations_section(pdf)
538
+
539
  pdf.output(output_path)
540
+
541
  except Exception as e:
542
  logging.error(f"Erro ao gerar PDF: {str(e)}")
543
  raise