Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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'].
|
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()
|