Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -39,20 +39,35 @@ def extract_aluno_pattern(nome):
|
|
39 |
return match.group(1) if match else None
|
40 |
return None
|
41 |
|
42 |
-
def match_alunos(tarefas_csv_path, alunos_csv_path,
|
43 |
try:
|
44 |
tarefas_df = pd.read_csv(tarefas_csv_path)
|
45 |
alunos_df = pd.read_csv(alunos_csv_path)
|
46 |
except pd.errors.EmptyDataError:
|
47 |
print(f"Arquivo {tarefas_csv_path} ou {alunos_csv_path} está vazio. Pulando...")
|
48 |
-
return
|
|
|
|
|
|
|
49 |
|
50 |
tarefas_df.columns = tarefas_df.columns.str.strip()
|
51 |
alunos_df.columns = alunos_df.columns.str.strip()
|
52 |
|
53 |
if 'Aluno' not in tarefas_df.columns or 'Nota' not in tarefas_df.columns or 'Duração' not in tarefas_df.columns:
|
54 |
print(f"Colunas 'Aluno', 'Nota' ou 'Duração' não encontradas no arquivo {tarefas_csv_path}. Pulando este arquivo.")
|
55 |
-
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
|
57 |
def generate_aluno_pattern(ra, dig_ra):
|
58 |
ra_str = str(ra).zfill(9)
|
@@ -61,11 +76,23 @@ def match_alunos(tarefas_csv_path, alunos_csv_path, contador_df):
|
|
61 |
|
62 |
alunos_df['Aluno_Pattern'] = alunos_df.apply(lambda row: generate_aluno_pattern(row['RA'], row['Dig. RA']), axis=1)
|
63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
tarefas_df['Aluno_Pattern'] = tarefas_df['Aluno'].apply(extract_aluno_pattern)
|
65 |
tarefas_df['Duração'] = tarefas_df['Duração'].apply(parse_duration)
|
66 |
|
|
|
|
|
67 |
matched_alunos = alunos_df[alunos_df['Aluno_Pattern'].isin(tarefas_df['Aluno_Pattern'])]
|
68 |
|
|
|
|
|
69 |
result_df = matched_alunos[['Nome do Aluno']].drop_duplicates()
|
70 |
|
71 |
for aluno in result_df['Nome do Aluno']:
|
@@ -75,35 +102,27 @@ def match_alunos(tarefas_csv_path, alunos_csv_path, contador_df):
|
|
75 |
tempo_total = aluno_tarefas['Duração'].sum()
|
76 |
|
77 |
if aluno in contador_df['Nome do Aluno'].values:
|
78 |
-
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Tarefas Completadas'] +=
|
79 |
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Acertos Absolutos'] += nota_total
|
80 |
current_total_tempo = pd.to_timedelta(contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Total Tempo'].values[0])
|
81 |
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Total Tempo'] = str(current_total_tempo + tempo_total)
|
82 |
else:
|
83 |
-
contador_df = pd.concat([contador_df, pd.DataFrame({'Nome do Aluno': [aluno], 'Tarefas Completadas': [
|
84 |
|
85 |
-
|
86 |
|
87 |
-
|
88 |
-
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', 'relatorio_final.csv']]
|
89 |
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
|
95 |
for i, tarefas_file in enumerate(tarefas_files):
|
96 |
print(f"Processando arquivo {i+1}/{len(tarefas_files)}: {tarefas_file}")
|
97 |
-
|
98 |
print(f"Arquivo {tarefas_file} processado.")
|
99 |
|
100 |
-
# Recontar as tarefas completadas para garantir a contagem correta
|
101 |
-
aluno_counts = tarefas_df['Aluno_Pattern'].value_counts()
|
102 |
-
for aluno_pattern, count in aluno_counts.items():
|
103 |
-
if aluno_pattern in contador_df['Nome do Aluno'].values:
|
104 |
-
contador_df.loc[contador_df['Nome do Aluno'] == aluno_pattern, 'Tarefas Completadas'] = count
|
105 |
-
|
106 |
-
contador_df.to_csv(contador_csv_path, index=False)
|
107 |
process_relatorios(contador_csv_path, relatorio_csv_path)
|
108 |
|
109 |
def process_relatorios(contador_csv_path, relatorio_csv_path):
|
|
|
39 |
return match.group(1) if match else None
|
40 |
return None
|
41 |
|
42 |
+
def match_alunos(tarefas_csv_path, alunos_csv_path, contador_csv_path):
|
43 |
try:
|
44 |
tarefas_df = pd.read_csv(tarefas_csv_path)
|
45 |
alunos_df = pd.read_csv(alunos_csv_path)
|
46 |
except pd.errors.EmptyDataError:
|
47 |
print(f"Arquivo {tarefas_csv_path} ou {alunos_csv_path} está vazio. Pulando...")
|
48 |
+
return
|
49 |
+
|
50 |
+
print(f"Tarefas DataFrame (antes da normalização):\n{tarefas_df.head()}")
|
51 |
+
print(f"Alunos DataFrame (antes da normalização):\n{alunos_df.head()}")
|
52 |
|
53 |
tarefas_df.columns = tarefas_df.columns.str.strip()
|
54 |
alunos_df.columns = alunos_df.columns.str.strip()
|
55 |
|
56 |
if 'Aluno' not in tarefas_df.columns or 'Nota' not in tarefas_df.columns or 'Duração' not in tarefas_df.columns:
|
57 |
print(f"Colunas 'Aluno', 'Nota' ou 'Duração' não encontradas no arquivo {tarefas_csv_path}. Pulando este arquivo.")
|
58 |
+
return
|
59 |
+
|
60 |
+
try:
|
61 |
+
contador_df = pd.read_csv(contador_csv_path)
|
62 |
+
except FileNotFoundError:
|
63 |
+
contador_df = pd.DataFrame(columns=['Nome do Aluno', 'Tarefas Completadas', 'Acertos Absolutos', 'Total Tempo'])
|
64 |
+
|
65 |
+
if 'Tarefas Completadas' not in contador_df.columns:
|
66 |
+
contador_df['Tarefas Completadas'] = 0
|
67 |
+
if 'Acertos Absolutos' not in contador_df.columns:
|
68 |
+
contador_df['Acertos Absolutos'] = 0
|
69 |
+
if 'Total Tempo' not in contador_df.columns:
|
70 |
+
contador_df['Total Tempo'] = '00:00:00'
|
71 |
|
72 |
def generate_aluno_pattern(ra, dig_ra):
|
73 |
ra_str = str(ra).zfill(9)
|
|
|
76 |
|
77 |
alunos_df['Aluno_Pattern'] = alunos_df.apply(lambda row: generate_aluno_pattern(row['RA'], row['Dig. RA']), axis=1)
|
78 |
|
79 |
+
print(f"Alunos DataFrame (com padrão):\n{alunos_df.head()}")
|
80 |
+
|
81 |
+
def extract_aluno_pattern(nome):
|
82 |
+
if isinstance(nome, str):
|
83 |
+
match = re.search(r'\d+.*', nome.lower())
|
84 |
+
return match.group(0) if match else None
|
85 |
+
return None
|
86 |
+
|
87 |
tarefas_df['Aluno_Pattern'] = tarefas_df['Aluno'].apply(extract_aluno_pattern)
|
88 |
tarefas_df['Duração'] = tarefas_df['Duração'].apply(parse_duration)
|
89 |
|
90 |
+
print(f"Tarefas DataFrame (com padrão):\n{tarefas_df.head()}")
|
91 |
+
|
92 |
matched_alunos = alunos_df[alunos_df['Aluno_Pattern'].isin(tarefas_df['Aluno_Pattern'])]
|
93 |
|
94 |
+
print(f"Matched Alunos DataFrame:\n{matched_alunos.head()}")
|
95 |
+
|
96 |
result_df = matched_alunos[['Nome do Aluno']].drop_duplicates()
|
97 |
|
98 |
for aluno in result_df['Nome do Aluno']:
|
|
|
102 |
tempo_total = aluno_tarefas['Duração'].sum()
|
103 |
|
104 |
if aluno in contador_df['Nome do Aluno'].values:
|
105 |
+
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Tarefas Completadas'] += 1
|
106 |
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Acertos Absolutos'] += nota_total
|
107 |
current_total_tempo = pd.to_timedelta(contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Total Tempo'].values[0])
|
108 |
contador_df.loc[contador_df['Nome do Aluno'] == aluno, 'Total Tempo'] = str(current_total_tempo + tempo_total)
|
109 |
else:
|
110 |
+
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)
|
111 |
|
112 |
+
print(f"Contador DataFrame (atualizado):\n{contador_df.head()}")
|
113 |
|
114 |
+
contador_df.to_csv(contador_csv_path, index=False)
|
|
|
115 |
|
116 |
+
return result_df
|
117 |
+
|
118 |
+
def process_all_tarefas_in_directory(directory, alunos_csv_path, contador_csv_path, relatorio_csv_path):
|
119 |
+
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']]
|
120 |
|
121 |
for i, tarefas_file in enumerate(tarefas_files):
|
122 |
print(f"Processando arquivo {i+1}/{len(tarefas_files)}: {tarefas_file}")
|
123 |
+
match_alunos(tarefas_file, alunos_csv_path, contador_csv_path)
|
124 |
print(f"Arquivo {tarefas_file} processado.")
|
125 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
126 |
process_relatorios(contador_csv_path, relatorio_csv_path)
|
127 |
|
128 |
def process_relatorios(contador_csv_path, relatorio_csv_path):
|