Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -54,7 +54,7 @@ def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
|
|
54 |
tarefas_df.columns = tarefas_df.columns.str.strip()
|
55 |
alunos_df.columns = alunos_df.columns.str.strip()
|
56 |
|
57 |
-
if 'Aluno' not in tarefas_df.columns
|
58 |
print(f"Colunas 'Aluno', 'Nota' ou 'Duração' não encontradas no arquivo {tarefas_csv_path}. Pulando este arquivo.")
|
59 |
return
|
60 |
|
@@ -136,10 +136,14 @@ def process_relatorios(contador_csv_path, relatorio_csv_path):
|
|
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-sig')
|
140 |
-
return contador_df, media_tempo_medio_turma
|
141 |
|
142 |
-
def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pdf_path):
|
143 |
class PDF(FPDF):
|
144 |
def header(self):
|
145 |
self.set_font('Arial', 'B', 12)
|
@@ -172,7 +176,7 @@ def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pd
|
|
172 |
bars = plt.bar(top_students['Nome do Aluno'], top_students['Acertos Absolutos'], color='blue')
|
173 |
plt.xlabel('Nome do Aluno')
|
174 |
plt.ylabel('Acertos Absolutos')
|
175 |
-
plt.title(
|
176 |
plt.xticks(rotation=45, ha='right')
|
177 |
add_bar_labels(bars, top_students['Acertos Absolutos'])
|
178 |
plt.tight_layout()
|
@@ -184,7 +188,7 @@ def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pd
|
|
184 |
bars = plt.bar(top_students['Nome do Aluno'], top_students['Média de Acertos'].str.rstrip('%').astype('float'), color='green')
|
185 |
plt.xlabel('Nome do Aluno')
|
186 |
plt.ylabel('Percentual de Acertos (%)')
|
187 |
-
plt.title(
|
188 |
plt.xticks(rotation=45, ha='right')
|
189 |
add_bar_labels(bars, top_students['Média de Acertos'].str.rstrip('%').astype('float'))
|
190 |
plt.tight_layout()
|
@@ -196,7 +200,7 @@ def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pd
|
|
196 |
bars = plt.bar(top_students['Nome do Aluno'], top_students['Tarefas Completadas'], color='red')
|
197 |
plt.xlabel('Nome do Aluno')
|
198 |
plt.ylabel('Tarefas Completadas')
|
199 |
-
plt.title(
|
200 |
plt.xticks(rotation=45, ha='right')
|
201 |
add_bar_labels(bars, top_students['Tarefas Completadas'])
|
202 |
plt.tight_layout()
|
@@ -211,7 +215,7 @@ def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pd
|
|
211 |
bars = plt.bar(top_time_students['Nome do Aluno'], top_time_students['Total Tempo'].dt.total_seconds(), color='purple')
|
212 |
plt.xlabel('Nome do Aluno')
|
213 |
plt.ylabel('Tempo Total (hh:mm:ss)')
|
214 |
-
plt.title(
|
215 |
plt.xticks(rotation=45, ha='right')
|
216 |
add_bar_labels(bars, top_time_students['Total Tempo'].apply(format_timedelta))
|
217 |
plt.tight_layout()
|
@@ -219,6 +223,27 @@ def generate_pdf_report(dataframe, media_tempo_medio_turma, html_path, output_pd
|
|
219 |
plt.savefig(graph_path)
|
220 |
pdf.add_image(graph_path)
|
221 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
222 |
# Salvar o PDF com os gráficos
|
223 |
temp_graphics_pdf = 'temp_graphics.pdf'
|
224 |
pdf.output(temp_graphics_pdf)
|
@@ -295,14 +320,14 @@ def processar_relatorio(html_file, tarefa_files):
|
|
295 |
contador_csv_path = os.path.join(output_directory, "contador_tarefas.csv")
|
296 |
relatorio_csv_path = os.path.join(output_directory, "relatorio_final.csv")
|
297 |
process_all_tarefas_in_directory(output_directory, alunos_csv_path, contador_csv_path, relatorio_csv_path)
|
298 |
-
df, media_tempo_medio_turma = process_relatorios(contador_csv_path, relatorio_csv_path)
|
299 |
|
300 |
# Salva o relatório em HTML e PDF
|
301 |
html_output_path = os.path.join(output_directory, "relatorio_final.html")
|
302 |
df.to_html(html_output_path, index=False, encoding='utf-8-sig')
|
303 |
|
304 |
pdf_output_path = os.path.join(output_directory, "relatorio_final.pdf")
|
305 |
-
generate_pdf_report(df, media_tempo_medio_turma, html_output_path, pdf_output_path)
|
306 |
|
307 |
return df.to_html(index=False), html_output_path, pdf_output_path
|
308 |
|
|
|
54 |
tarefas_df.columns = tarefas_df.columns.str.strip()
|
55 |
alunos_df.columns = alunos_df.columns.str.strip()
|
56 |
|
57 |
+
if 'Aluno' not in tarefas_df.columns ou 'Nota' not in tarefas_df.columns ou 'Duração' not in tarefas_df.columns:
|
58 |
print(f"Colunas 'Aluno', 'Nota' ou 'Duração' não encontradas no arquivo {tarefas_csv_path}. Pulando este arquivo.")
|
59 |
return
|
60 |
|
|
|
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 |
+
# Calcula médias gerais da turma
|
140 |
+
media_acertos_turma = (contador_df['Acertos Absolutos'] / (contador_df['Tarefas Completadas'] * 2)).mean() * 100
|
141 |
+
media_tarefas_turma = contador_df['Tarefas Completadas'].mean()
|
142 |
+
|
143 |
contador_df.to_csv(relatorio_csv_path, index=False, encoding='utf-8-sig')
|
144 |
+
return contador_df, media_tempo_medio_turma, media_acertos_turma, media_tarefas_turma
|
145 |
|
146 |
+
def generate_pdf_report(dataframe, media_tempo_medio_turma, media_acertos_turma, media_tarefas_turma, html_path, output_pdf_path):
|
147 |
class PDF(FPDF):
|
148 |
def header(self):
|
149 |
self.set_font('Arial', 'B', 12)
|
|
|
176 |
bars = plt.bar(top_students['Nome do Aluno'], top_students['Acertos Absolutos'], color='blue')
|
177 |
plt.xlabel('Nome do Aluno')
|
178 |
plt.ylabel('Acertos Absolutos')
|
179 |
+
plt.title('Top 5 Alunos - Acertos Absolutos')
|
180 |
plt.xticks(rotation=45, ha='right')
|
181 |
add_bar_labels(bars, top_students['Acertos Absolutos'])
|
182 |
plt.tight_layout()
|
|
|
188 |
bars = plt.bar(top_students['Nome do Aluno'], top_students['Média de Acertos'].str.rstrip('%').astype('float'), color='green')
|
189 |
plt.xlabel('Nome do Aluno')
|
190 |
plt.ylabel('Percentual de Acertos (%)')
|
191 |
+
plt.title('Top 5 Alunos - Percentual de Acertos')
|
192 |
plt.xticks(rotation=45, ha='right')
|
193 |
add_bar_labels(bars, top_students['Média de Acertos'].str.rstrip('%').astype('float'))
|
194 |
plt.tight_layout()
|
|
|
200 |
bars = plt.bar(top_students['Nome do Aluno'], top_students['Tarefas Completadas'], color='red')
|
201 |
plt.xlabel('Nome do Aluno')
|
202 |
plt.ylabel('Tarefas Completadas')
|
203 |
+
plt.title('Top 5 Alunos - Tarefas Completadas')
|
204 |
plt.xticks(rotation=45, ha='right')
|
205 |
add_bar_labels(bars, top_students['Tarefas Completadas'])
|
206 |
plt.tight_layout()
|
|
|
215 |
bars = plt.bar(top_time_students['Nome do Aluno'], top_time_students['Total Tempo'].dt.total_seconds(), color='purple')
|
216 |
plt.xlabel('Nome do Aluno')
|
217 |
plt.ylabel('Tempo Total (hh:mm:ss)')
|
218 |
+
plt.title('Top 5 Alunos - Tempo Total')
|
219 |
plt.xticks(rotation=45, ha='right')
|
220 |
add_bar_labels(bars, top_time_students['Total Tempo'].apply(format_timedelta))
|
221 |
plt.tight_layout()
|
|
|
223 |
plt.savefig(graph_path)
|
224 |
pdf.add_image(graph_path)
|
225 |
|
226 |
+
# Adiciona gráfico de resumo da turma
|
227 |
+
metrics = ['Tempo Médio (hh:mm:ss)', 'Média de Acertos (%)', 'Média de Tarefas']
|
228 |
+
values = [media_tempo_medio_turma, media_acertos_turma, media_tarefas_turma]
|
229 |
+
|
230 |
+
plt.figure(figsize=(10, 6))
|
231 |
+
bars = plt.bar(metrics, values, color=['blue', 'green', 'red'])
|
232 |
+
plt.xlabel('Métricas')
|
233 |
+
plt.ylabel('Valores')
|
234 |
+
plt.title('Resumo da Turma')
|
235 |
+
plt.xticks(rotation=45, ha='right')
|
236 |
+
for bar, value in zip(bars, values):
|
237 |
+
plt.annotate(f'{value:.2f}' if isinstance(value, float) else value,
|
238 |
+
xy=(bar.get_x() + bar.get_width() / 2, bar.get_height()),
|
239 |
+
xytext=(0, 3), # 3 points vertical offset
|
240 |
+
textcoords="offset points",
|
241 |
+
ha='center', va='bottom')
|
242 |
+
plt.tight_layout()
|
243 |
+
graph_path = 'resumo_turma.png'
|
244 |
+
plt.savefig(graph_path)
|
245 |
+
pdf.add_image(graph_path)
|
246 |
+
|
247 |
# Salvar o PDF com os gráficos
|
248 |
temp_graphics_pdf = 'temp_graphics.pdf'
|
249 |
pdf.output(temp_graphics_pdf)
|
|
|
320 |
contador_csv_path = os.path.join(output_directory, "contador_tarefas.csv")
|
321 |
relatorio_csv_path = os.path.join(output_directory, "relatorio_final.csv")
|
322 |
process_all_tarefas_in_directory(output_directory, alunos_csv_path, contador_csv_path, relatorio_csv_path)
|
323 |
+
df, media_tempo_medio_turma, media_acertos_turma, media_tarefas_turma = process_relatorios(contador_csv_path, relatorio_csv_path)
|
324 |
|
325 |
# Salva o relatório em HTML e PDF
|
326 |
html_output_path = os.path.join(output_directory, "relatorio_final.html")
|
327 |
df.to_html(html_output_path, index=False, encoding='utf-8-sig')
|
328 |
|
329 |
pdf_output_path = os.path.join(output_directory, "relatorio_final.pdf")
|
330 |
+
generate_pdf_report(df, media_tempo_medio_turma, media_acertos_turma, media_tarefas_turma, html_output_path, pdf_output_path)
|
331 |
|
332 |
return df.to_html(index=False), html_output_path, pdf_output_path
|
333 |
|