Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -9,7 +9,6 @@ import tempfile
|
|
9 |
import os
|
10 |
import matplotlib
|
11 |
import shutil
|
12 |
-
import colorsys
|
13 |
matplotlib.use('Agg')
|
14 |
|
15 |
def extrair_tabelas_pdf(pdf_path):
|
@@ -43,14 +42,19 @@ def extrair_tabelas_pdf(pdf_path):
|
|
43 |
|
44 |
def converter_nota(valor):
|
45 |
"""Converte valor de nota para float, tratando casos especiais."""
|
46 |
-
if pd.isna(valor) or valor == '-' or valor == 'N':
|
47 |
return 0
|
48 |
try:
|
49 |
if isinstance(valor, str):
|
50 |
# Remover possíveis espaços e substituir vírgula por ponto
|
51 |
valor_limpo = valor.strip().replace(',', '.')
|
|
|
|
|
|
|
52 |
return float(valor_limpo)
|
53 |
-
|
|
|
|
|
54 |
except:
|
55 |
return 0
|
56 |
|
@@ -60,17 +64,26 @@ def obter_disciplinas_validas(df):
|
|
60 |
colunas_notas = ['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']
|
61 |
colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
|
62 |
|
63 |
-
# Converter notas para numérico
|
64 |
for col in colunas_notas:
|
65 |
if col in df.columns:
|
66 |
-
df[col] = df[col].apply(converter_nota)
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
|
68 |
# Identificar disciplinas que têm pelo menos uma nota ou frequência
|
69 |
disciplinas_validas = []
|
70 |
for _, row in df.iterrows():
|
71 |
disciplina = row['Disciplina']
|
72 |
-
|
73 |
-
|
|
|
|
|
|
|
74 |
|
75 |
if (notas > 0).any() or (freq > 0).any():
|
76 |
disciplinas_validas.append(disciplina)
|
@@ -100,6 +113,9 @@ def plotar_evolucao_bimestres(df_filtrado, temp_dir):
|
|
100 |
disciplinas_validas = obter_disciplinas_validas(df_filtrado)
|
101 |
n_disciplinas = len(disciplinas_validas)
|
102 |
|
|
|
|
|
|
|
103 |
# Calcular tamanho da figura baseado no número de disciplinas
|
104 |
altura_figura = max(6, n_disciplinas * 0.4)
|
105 |
plt.figure(figsize=(14, altura_figura))
|
@@ -117,11 +133,11 @@ def plotar_evolucao_bimestres(df_filtrado, temp_dir):
|
|
117 |
dados_disciplina = df_filtrado[df_filtrado['Disciplina'] == disciplina]
|
118 |
if not dados_disciplina.empty:
|
119 |
notas = dados_disciplina[colunas_notas].values[0]
|
120 |
-
notas_validas = notas > 0
|
121 |
|
122 |
if any(notas_validas):
|
123 |
bimestres = np.arange(1, len(colunas_notas) + 1)[notas_validas]
|
124 |
-
notas_filtradas = notas[notas_validas]
|
125 |
|
126 |
plt.plot(bimestres, notas_filtradas,
|
127 |
color=cores[idx % len(cores)],
|
@@ -162,6 +178,10 @@ def plotar_graficos_destacados(df_boletim_clean, temp_dir):
|
|
162 |
"""Plota gráficos de médias e frequências com destaques."""
|
163 |
# Obter disciplinas válidas
|
164 |
disciplinas_validas = obter_disciplinas_validas(df_boletim_clean)
|
|
|
|
|
|
|
|
|
165 |
n_disciplinas = len(disciplinas_validas)
|
166 |
|
167 |
# Calcular tamanho da figura baseado no número de disciplinas
|
@@ -171,12 +191,16 @@ def plotar_graficos_destacados(df_boletim_clean, temp_dir):
|
|
171 |
df_filtrado = df_boletim_clean[df_boletim_clean['Disciplina'].isin(disciplinas_validas)]
|
172 |
disciplinas = df_filtrado['Disciplina'].astype(str)
|
173 |
|
174 |
-
# Processar frequências
|
175 |
colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
|
176 |
freq_data = df_filtrado[colunas_freq].replace('%', '', regex=True)
|
177 |
-
|
|
|
178 |
|
179 |
-
|
|
|
|
|
|
|
180 |
|
181 |
cores_notas = ['red' if media < 5 else 'blue' for media in medias_notas]
|
182 |
cores_frequencias = ['red' if media < 75 else 'green' for media in medias_frequencia]
|
@@ -250,12 +274,15 @@ def gerar_relatorio_pdf(df, grafico1_path, grafico2_path):
|
|
250 |
df_filtrado = df[df['Disciplina'].isin(disciplinas_validas)]
|
251 |
|
252 |
# Calcular médias
|
253 |
-
|
|
|
|
|
254 |
|
255 |
# Processar frequências
|
256 |
colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
|
257 |
freq_data = df_filtrado[colunas_freq].replace('%', '', regex=True)
|
258 |
-
|
|
|
259 |
|
260 |
# Adicionar média global
|
261 |
media_global = medias_notas.mean()
|
@@ -327,7 +354,8 @@ def processar_boletim(file):
|
|
327 |
# Processar notas
|
328 |
colunas_notas = ['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']
|
329 |
for col in colunas_notas:
|
330 |
-
|
|
|
331 |
print("Notas processadas")
|
332 |
|
333 |
# Gerar gráficos
|
|
|
9 |
import os
|
10 |
import matplotlib
|
11 |
import shutil
|
|
|
12 |
matplotlib.use('Agg')
|
13 |
|
14 |
def extrair_tabelas_pdf(pdf_path):
|
|
|
42 |
|
43 |
def converter_nota(valor):
|
44 |
"""Converte valor de nota para float, tratando casos especiais."""
|
45 |
+
if pd.isna(valor) or valor == '-' or valor == 'N' or valor == '' or valor == 'None':
|
46 |
return 0
|
47 |
try:
|
48 |
if isinstance(valor, str):
|
49 |
# Remover possíveis espaços e substituir vírgula por ponto
|
50 |
valor_limpo = valor.strip().replace(',', '.')
|
51 |
+
# Se depois de limpar ainda estiver vazio, retorna 0
|
52 |
+
if not valor_limpo:
|
53 |
+
return 0
|
54 |
return float(valor_limpo)
|
55 |
+
elif isinstance(valor, (int, float)):
|
56 |
+
return float(valor)
|
57 |
+
return 0
|
58 |
except:
|
59 |
return 0
|
60 |
|
|
|
64 |
colunas_notas = ['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']
|
65 |
colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
|
66 |
|
67 |
+
# Converter notas para numérico, tratando valores inválidos
|
68 |
for col in colunas_notas:
|
69 |
if col in df.columns:
|
70 |
+
df[col] = df[col].apply(lambda x: converter_nota(x))
|
71 |
+
|
72 |
+
# Converter frequências, tratando valores inválidos
|
73 |
+
for col in colunas_freq:
|
74 |
+
if col in df.columns:
|
75 |
+
df[col] = df[col].replace('%', '', regex=True)
|
76 |
+
df[col] = df[col].apply(lambda x: converter_nota(x) if pd.notna(x) else 0)
|
77 |
|
78 |
# Identificar disciplinas que têm pelo menos uma nota ou frequência
|
79 |
disciplinas_validas = []
|
80 |
for _, row in df.iterrows():
|
81 |
disciplina = row['Disciplina']
|
82 |
+
if pd.isna(disciplina) or disciplina == '':
|
83 |
+
continue
|
84 |
+
|
85 |
+
notas = pd.to_numeric(row[colunas_notas], errors='coerce').fillna(0)
|
86 |
+
freq = pd.to_numeric(row[colunas_freq], errors='coerce').fillna(0)
|
87 |
|
88 |
if (notas > 0).any() or (freq > 0).any():
|
89 |
disciplinas_validas.append(disciplina)
|
|
|
113 |
disciplinas_validas = obter_disciplinas_validas(df_filtrado)
|
114 |
n_disciplinas = len(disciplinas_validas)
|
115 |
|
116 |
+
if n_disciplinas == 0:
|
117 |
+
raise ValueError("Nenhuma disciplina válida encontrada para plotar.")
|
118 |
+
|
119 |
# Calcular tamanho da figura baseado no número de disciplinas
|
120 |
altura_figura = max(6, n_disciplinas * 0.4)
|
121 |
plt.figure(figsize=(14, altura_figura))
|
|
|
133 |
dados_disciplina = df_filtrado[df_filtrado['Disciplina'] == disciplina]
|
134 |
if not dados_disciplina.empty:
|
135 |
notas = dados_disciplina[colunas_notas].values[0]
|
136 |
+
notas_validas = pd.to_numeric(notas, errors='coerce').fillna(0) > 0
|
137 |
|
138 |
if any(notas_validas):
|
139 |
bimestres = np.arange(1, len(colunas_notas) + 1)[notas_validas]
|
140 |
+
notas_filtradas = pd.to_numeric(notas[notas_validas], errors='coerce').fillna(0)
|
141 |
|
142 |
plt.plot(bimestres, notas_filtradas,
|
143 |
color=cores[idx % len(cores)],
|
|
|
178 |
"""Plota gráficos de médias e frequências com destaques."""
|
179 |
# Obter disciplinas válidas
|
180 |
disciplinas_validas = obter_disciplinas_validas(df_boletim_clean)
|
181 |
+
|
182 |
+
if not disciplinas_validas:
|
183 |
+
raise ValueError("Nenhuma disciplina válida encontrada no boletim.")
|
184 |
+
|
185 |
n_disciplinas = len(disciplinas_validas)
|
186 |
|
187 |
# Calcular tamanho da figura baseado no número de disciplinas
|
|
|
191 |
df_filtrado = df_boletim_clean[df_boletim_clean['Disciplina'].isin(disciplinas_validas)]
|
192 |
disciplinas = df_filtrado['Disciplina'].astype(str)
|
193 |
|
194 |
+
# Processar frequências com tratamento de erros melhorado
|
195 |
colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
|
196 |
freq_data = df_filtrado[colunas_freq].replace('%', '', regex=True)
|
197 |
+
freq_data = freq_data.apply(pd.to_numeric, errors='coerce').fillna(0)
|
198 |
+
medias_frequencia = freq_data.mean(axis=1)
|
199 |
|
200 |
+
# Processar notas com tratamento de erros melhorado
|
201 |
+
colunas_notas = ['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']
|
202 |
+
notas_data = df_filtrado[colunas_notas].apply(pd.to_numeric, errors='coerce').fillna(0)
|
203 |
+
medias_notas = notas_data.mean(axis=1)
|
204 |
|
205 |
cores_notas = ['red' if media < 5 else 'blue' for media in medias_notas]
|
206 |
cores_frequencias = ['red' if media < 75 else 'green' for media in medias_frequencia]
|
|
|
274 |
df_filtrado = df[df['Disciplina'].isin(disciplinas_validas)]
|
275 |
|
276 |
# Calcular médias
|
277 |
+
colunas_notas = ['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']
|
278 |
+
notas_data = df_filtrado[colunas_notas].apply(pd.to_numeric, errors='coerce').fillna(0)
|
279 |
+
medias_notas = notas_data.mean(axis=1)
|
280 |
|
281 |
# Processar frequências
|
282 |
colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
|
283 |
freq_data = df_filtrado[colunas_freq].replace('%', '', regex=True)
|
284 |
+
freq_data = freq_data.apply(pd.to_numeric, errors='coerce').fillna(0)
|
285 |
+
medias_freq = freq_data.mean(axis=1)
|
286 |
|
287 |
# Adicionar média global
|
288 |
media_global = medias_notas.mean()
|
|
|
354 |
# Processar notas
|
355 |
colunas_notas = ['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']
|
356 |
for col in colunas_notas:
|
357 |
+
if col in df.columns:
|
358 |
+
df[col] = df[col].apply(converter_nota)
|
359 |
print("Notas processadas")
|
360 |
|
361 |
# Gerar gráficos
|