Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -4,8 +4,6 @@ import re
|
|
4 |
import os
|
5 |
from datetime import timedelta
|
6 |
|
7 |
-
# --- Funções auxiliares ---
|
8 |
-
|
9 |
def parse_duration(duration_str):
|
10 |
try:
|
11 |
h, m, s = map(int, duration_str.split(':'))
|
@@ -37,7 +35,7 @@ def normalize_multiple_excel_to_csv(input_directory, output_directory):
|
|
37 |
|
38 |
def extract_aluno_pattern(nome):
|
39 |
if isinstance(nome, str):
|
40 |
-
match = re.search(r"(\d{8,9}-\w{2})", nome.lower())
|
41 |
return match.group(1) if match else None
|
42 |
return None
|
43 |
|
@@ -80,27 +78,25 @@ def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
|
|
80 |
|
81 |
matched_alunos = alunos_df[alunos_df['Aluno_Pattern'].isin(tarefas_df['Aluno_Pattern'])]
|
82 |
|
83 |
-
|
84 |
-
todos_alunos = pd.DataFrame({'Nome do Aluno': alunos_df['Nome do Aluno'], 'Aluno_Pattern': alunos_df['Aluno_Pattern']})
|
85 |
-
todos_alunos = todos_alunos.drop_duplicates()
|
86 |
|
87 |
-
for aluno in
|
88 |
-
aluno_pattern =
|
89 |
aluno_tarefas = tarefas_df[tarefas_df['Aluno_Pattern'] == aluno_pattern]
|
90 |
-
nota_total = aluno_tarefas['Nota'].sum()
|
91 |
-
tempo_total = aluno_tarefas['Duração'].sum()
|
92 |
|
93 |
if aluno in contador_df['Nome do Aluno'].values:
|
94 |
-
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Tarefas Completadas'] +=
|
95 |
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Acertos Absolutos'] += nota_total
|
96 |
current_total_tempo = pd.to_timedelta(contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Total Tempo'].values[0])
|
97 |
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Total Tempo'] = str(current_total_tempo + tempo_total)
|
98 |
else:
|
99 |
-
contador_df = pd.concat([contador_df, pd.DataFrame({'Nome do Aluno': [aluno], 'Tarefas Completadas': [
|
100 |
|
101 |
contador_df.to_csv(contador_csv_path, index=False)
|
102 |
-
|
103 |
-
return
|
104 |
|
105 |
def process_all_tarefas_in_directory(directory, alunos_csv_path, contador_csv_path, relatorio_csv_path):
|
106 |
tarefas_files = [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.csv') and f not in ['alunos_fim.csv', 'contador_tarefas.csv']]
|
@@ -116,11 +112,7 @@ def process_relatorios(contador_csv_path, relatorio_csv_path):
|
|
116 |
contador_df = pd.read_csv(contador_csv_path)
|
117 |
contador_df['Média de Acertos'] = ((contador_df['Acertos Absolutos'] / (contador_df['Tarefas Completadas'] * 2)) * 100).round(2).astype(str) + '%'
|
118 |
contador_df['Total Tempo'] = pd.to_timedelta(contador_df['Total Tempo'])
|
119 |
-
|
120 |
-
# Evitar divisão por zero para calcular 'Tempo Médio por Tarefa'
|
121 |
-
contador_df['Tempo Médio por Tarefa'] = contador_df.apply(
|
122 |
-
lambda row: format_timedelta(row['Total Tempo'] / row['Tarefas Completadas']) if row['Tarefas Completadas'] > 0 else '00:00:00', axis=1
|
123 |
-
)
|
124 |
contador_df['Total Tempo'] = contador_df['Total Tempo'].apply(format_timedelta)
|
125 |
contador_df = contador_df.sort_values(by='Tarefas Completadas', ascending=False)
|
126 |
contador_df.to_csv(relatorio_csv_path, index=False)
|
|
|
4 |
import os
|
5 |
from datetime import timedelta
|
6 |
|
|
|
|
|
7 |
def parse_duration(duration_str):
|
8 |
try:
|
9 |
h, m, s = map(int, duration_str.split(':'))
|
|
|
35 |
|
36 |
def extract_aluno_pattern(nome):
|
37 |
if isinstance(nome, str):
|
38 |
+
match = re.search(r"(\d{8,9}-\w{2})", nome.lower())
|
39 |
return match.group(1) if match else None
|
40 |
return None
|
41 |
|
|
|
78 |
|
79 |
matched_alunos = alunos_df[alunos_df['Aluno_Pattern'].isin(tarefas_df['Aluno_Pattern'])]
|
80 |
|
81 |
+
result_df = matched_alunos[['Nome do Aluno']].drop_duplicates()
|
|
|
|
|
82 |
|
83 |
+
for aluno in result_df['Nome do Aluno']:
|
84 |
+
aluno_pattern = alunos_df.loc[alunos_df['Nome do Aluno'] == aluno, 'Aluno_Pattern'].values[0]
|
85 |
aluno_tarefas = tarefas_df[tarefas_df['Aluno_Pattern'] == aluno_pattern]
|
86 |
+
nota_total = aluno_tarefas['Nota'].sum()
|
87 |
+
tempo_total = aluno_tarefas['Duração'].sum()
|
88 |
|
89 |
if aluno in contador_df['Nome do Aluno'].values:
|
90 |
+
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Tarefas Completadas'] += 1
|
91 |
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Acertos Absolutos'] += nota_total
|
92 |
current_total_tempo = pd.to_timedelta(contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Total Tempo'].values[0])
|
93 |
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Total Tempo'] = str(current_total_tempo + tempo_total)
|
94 |
else:
|
95 |
+
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)
|
96 |
|
97 |
contador_df.to_csv(contador_csv_path, index=False)
|
98 |
+
|
99 |
+
return result_df
|
100 |
|
101 |
def process_all_tarefas_in_directory(directory, alunos_csv_path, contador_csv_path, relatorio_csv_path):
|
102 |
tarefas_files = [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.csv') and f not in ['alunos_fim.csv', 'contador_tarefas.csv']]
|
|
|
112 |
contador_df = pd.read_csv(contador_csv_path)
|
113 |
contador_df['Média de Acertos'] = ((contador_df['Acertos Absolutos'] / (contador_df['Tarefas Completadas'] * 2)) * 100).round(2).astype(str) + '%'
|
114 |
contador_df['Total Tempo'] = pd.to_timedelta(contador_df['Total Tempo'])
|
115 |
+
contador_df['Tempo Médio por Tarefa'] = (contador_df['Total Tempo'] / contador_df['Tarefas Completadas']).apply(format_timedelta)
|
|
|
|
|
|
|
|
|
116 |
contador_df['Total Tempo'] = contador_df['Total Tempo'].apply(format_timedelta)
|
117 |
contador_df = contador_df.sort_values(by='Tarefas Completadas', ascending=False)
|
118 |
contador_df.to_csv(relatorio_csv_path, index=False)
|