histlearn commited on
Commit
aab19b1
·
verified ·
1 Parent(s): 1a31ba8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -15
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
- return float(valor)
 
 
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
- notas = row[colunas_notas].astype(float)
73
- freq = row[colunas_freq].replace('%', '', regex=True).astype(float)
 
 
 
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 (remover % e converter para número)
175
  colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
176
  freq_data = df_filtrado[colunas_freq].replace('%', '', regex=True)
177
- medias_frequencia = freq_data.apply(pd.to_numeric, errors='coerce').mean(axis=1)
 
178
 
179
- medias_notas = df_filtrado[['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']].apply(pd.to_numeric, errors='coerce').mean(axis=1)
 
 
 
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
- medias_notas = df_filtrado[['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']].apply(pd.to_numeric, errors='coerce').mean(axis=1)
 
 
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
- medias_freq = freq_data.apply(pd.to_numeric, errors='coerce').mean(axis=1)
 
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
- df[col] = df[col].apply(converter_nota)
 
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