histlearn commited on
Commit
e610184
·
verified ·
1 Parent(s): 352dca6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +10 -14
app.py CHANGED
@@ -3,7 +3,6 @@ import pandas as pd
3
  import re
4
  import os
5
  import matplotlib.pyplot as plt
6
- import pdfkit
7
  from datetime import timedelta
8
  from fpdf import FPDF
9
  from weasyprint import HTML
@@ -26,7 +25,7 @@ def format_timedelta(td):
26
  def normalize_html_to_csv(input_html_path, output_csv_path):
27
  html_data = pd.read_html(input_html_path)
28
  data = html_data[0]
29
- data.to_csv(output_csv_path, index=False)
30
 
31
  def normalize_multiple_excel_to_csv(input_directory, output_directory):
32
  input_excel_paths = [os.path.join(input_directory, f) for f in os.listdir(input_directory) if f.endswith('.xlsx')]
@@ -36,7 +35,7 @@ def normalize_multiple_excel_to_csv(input_directory, output_directory):
36
  unnecessary_columns = [col for col in excel_data.columns if 'Unnamed' in col]
37
  if unnecessary_columns:
38
  excel_data = excel_data.drop(columns=unnecessary_columns)
39
- excel_data.to_csv(output_csv_path, index=False)
40
 
41
  def extract_aluno_pattern(nome):
42
  if isinstance(nome, str):
@@ -46,8 +45,8 @@ def extract_aluno_pattern(nome):
46
 
47
  def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
48
  try:
49
- tarefas_df = pd.read_csv(tarefas_csv_path)
50
- alunos_df = pd.read_csv(alunos_csv_path)
51
  except pd.errors.EmptyDataError:
52
  print(f"Arquivo {tarefas_csv_path} ou {alunos_csv_path} está vazio. Pulando...")
53
  return
@@ -60,7 +59,7 @@ def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
60
  return
61
 
62
  try:
63
- contador_df = pd.read_csv(contador_csv_path)
64
  except FileNotFoundError:
65
  contador_df = pd.DataFrame(columns=['Nome do Aluno', 'Tarefas Completadas', 'Acertos Absolutos', 'Total Tempo'])
66
 
@@ -105,7 +104,7 @@ def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
105
  else:
106
  contador_df = pd.concat([contador_df, pd.DataFrame({'Nome do Aluno': [aluno], 'Tarefas Completadas': [1], 'Acertos Absolutos': [nota_total], 'Total Tempo': [str(tempo_total)]})], ignore_index=True)
107
 
108
- contador_df.to_csv(contador_csv_path, index=False)
109
 
110
  return result_df
111
 
@@ -123,7 +122,7 @@ def process_all_tarefas_in_directory(directory, alunos_csv_path, contador_csv_pa
123
  process_relatorios(contador_csv_path, relatorio_csv_path)
124
 
125
  def process_relatorios(contador_csv_path, relatorio_csv_path):
126
- contador_df = pd.read_csv(contador_csv_path)
127
  contador_df['Média de Acertos'] = ((contador_df['Acertos Absolutos'] / (contador_df['Tarefas Completadas'] * 2)) * 100).round(2).astype(str) + '%'
128
  contador_df['Total Tempo'] = pd.to_timedelta(contador_df['Total Tempo'])
129
  contador_df['Tempo Médio por Tarefa'] = contador_df['Total Tempo'] / contador_df['Tarefas Completadas']
@@ -137,7 +136,7 @@ def process_relatorios(contador_csv_path, relatorio_csv_path):
137
  media_tempo_medio_turma = tempo_medio_por_tarefa['Tempo Médio por Tarefa'].mean()
138
  media_tempo_medio_turma = format_timedelta(media_tempo_medio_turma)
139
 
140
- contador_df.to_csv(relatorio_csv_path, index=False)
141
  return contador_df, media_tempo_medio_turma
142
 
143
  def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pdf_path):
@@ -214,7 +213,7 @@ def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pd
214
  plt.ylabel('Tempo Total (segundos)')
215
  plt.title(f'Top 5 Alunos - Tempo Total (Tempo Médio da Turma: {media_tempo_medio_turma})')
216
  plt.xticks(rotation=45, ha='right')
217
- add_bar_labels(bars, top_time_students['Total Tempo'].dt.total_seconds().astype(int))
218
  plt.tight_layout()
219
  graph_path = 'top_5_tempo_total.png'
220
  plt.savefig(graph_path)
@@ -235,8 +234,6 @@ def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pd
235
  HTML(temp_html_path).write_pdf(temp_html_pdf)
236
 
237
  # Combinar os PDFs
238
- from PyPDF2 import PdfMerger
239
-
240
  merger = PdfMerger()
241
  merger.append(temp_html_pdf)
242
  merger.append(temp_graphics_pdf)
@@ -291,7 +288,6 @@ def processar_relatorio(html_file, tarefa_files):
291
 
292
  return df.to_html(index=False), html_output_path, pdf_output_path
293
 
294
-
295
  # Tema personalizado
296
  theme = gr.themes.Default(
297
  primary_hue="blue", # Cor principal (tons de azul)
@@ -322,4 +318,4 @@ with gr.Blocks(theme=theme) as interface:
322
 
323
  generate_btn.click(fn=wrapper, inputs=[html_file, excel_files], outputs=[output_html, download_html_btn, download_pdf_btn])
324
 
325
- interface.launch()
 
3
  import re
4
  import os
5
  import matplotlib.pyplot as plt
 
6
  from datetime import timedelta
7
  from fpdf import FPDF
8
  from weasyprint import HTML
 
25
  def normalize_html_to_csv(input_html_path, output_csv_path):
26
  html_data = pd.read_html(input_html_path)
27
  data = html_data[0]
28
+ data.to_csv(output_csv_path, index=False, encoding='utf-8')
29
 
30
  def normalize_multiple_excel_to_csv(input_directory, output_directory):
31
  input_excel_paths = [os.path.join(input_directory, f) for f in os.listdir(input_directory) if f.endswith('.xlsx')]
 
35
  unnecessary_columns = [col for col in excel_data.columns if 'Unnamed' in col]
36
  if unnecessary_columns:
37
  excel_data = excel_data.drop(columns=unnecessary_columns)
38
+ excel_data.to_csv(output_csv_path, index=False, encoding='utf-8')
39
 
40
  def extract_aluno_pattern(nome):
41
  if isinstance(nome, str):
 
45
 
46
  def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
47
  try:
48
+ tarefas_df = pd.read_csv(tarefas_csv_path, encoding='utf-8')
49
+ alunos_df = pd.read_csv(alunos_csv_path, encoding='utf-8')
50
  except pd.errors.EmptyDataError:
51
  print(f"Arquivo {tarefas_csv_path} ou {alunos_csv_path} está vazio. Pulando...")
52
  return
 
59
  return
60
 
61
  try:
62
+ contador_df = pd.read_csv(contador_csv_path, encoding='utf-8')
63
  except FileNotFoundError:
64
  contador_df = pd.DataFrame(columns=['Nome do Aluno', 'Tarefas Completadas', 'Acertos Absolutos', 'Total Tempo'])
65
 
 
104
  else:
105
  contador_df = pd.concat([contador_df, pd.DataFrame({'Nome do Aluno': [aluno], 'Tarefas Completadas': [1], 'Acertos Absolutos': [nota_total], 'Total Tempo': [str(tempo_total)]})], ignore_index=True)
106
 
107
+ contador_df.to_csv(contador_csv_path, index=False, encoding='utf-8')
108
 
109
  return result_df
110
 
 
122
  process_relatorios(contador_csv_path, relatorio_csv_path)
123
 
124
  def process_relatorios(contador_csv_path, relatorio_csv_path):
125
+ contador_df = pd.read_csv(contador_csv_path, encoding='utf-8')
126
  contador_df['Média de Acertos'] = ((contador_df['Acertos Absolutos'] / (contador_df['Tarefas Completadas'] * 2)) * 100).round(2).astype(str) + '%'
127
  contador_df['Total Tempo'] = pd.to_timedelta(contador_df['Total Tempo'])
128
  contador_df['Tempo Médio por Tarefa'] = contador_df['Total Tempo'] / contador_df['Tarefas Completadas']
 
136
  media_tempo_medio_turma = tempo_medio_por_tarefa['Tempo Médio por Tarefa'].mean()
137
  media_tempo_medio_turma = format_timedelta(media_tempo_medio_turma)
138
 
139
+ contador_df.to_csv(relatorio_csv_path, index=False, encoding='utf-8')
140
  return contador_df, media_tempo_medio_turma
141
 
142
  def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pdf_path):
 
213
  plt.ylabel('Tempo Total (segundos)')
214
  plt.title(f'Top 5 Alunos - Tempo Total (Tempo Médio da Turma: {media_tempo_medio_turma})')
215
  plt.xticks(rotation=45, ha='right')
216
+ add_bar_labels(bars, top_time_students['Total Tempo'].apply(format_timedelta))
217
  plt.tight_layout()
218
  graph_path = 'top_5_tempo_total.png'
219
  plt.savefig(graph_path)
 
234
  HTML(temp_html_path).write_pdf(temp_html_pdf)
235
 
236
  # Combinar os PDFs
 
 
237
  merger = PdfMerger()
238
  merger.append(temp_html_pdf)
239
  merger.append(temp_graphics_pdf)
 
288
 
289
  return df.to_html(index=False), html_output_path, pdf_output_path
290
 
 
291
  # Tema personalizado
292
  theme = gr.themes.Default(
293
  primary_hue="blue", # Cor principal (tons de azul)
 
318
 
319
  generate_btn.click(fn=wrapper, inputs=[html_file, excel_files], outputs=[output_html, download_html_btn, download_pdf_btn])
320
 
321
+ interface.launch()