histlearn commited on
Commit
404c2a9
·
verified ·
1 Parent(s): 62eed5e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -12
app.py CHANGED
@@ -11,6 +11,12 @@ import matplotlib
11
  import shutil
12
  matplotlib.use('Agg')
13
 
 
 
 
 
 
 
14
  def extrair_tabelas_pdf(pdf_path):
15
  """Extrai tabelas do PDF e retorna um DataFrame processado."""
16
  try:
@@ -45,7 +51,11 @@ def converter_nota(valor):
45
  if pd.isna(valor) or valor == '-' or valor == 'N':
46
  return 0
47
  try:
48
- return float(str(valor).replace(',', '.')) # Tratar decimal com vírgula
 
 
 
 
49
  except:
50
  return 0
51
 
@@ -53,8 +63,8 @@ def plotar_evolucao_bimestres(df_filtrado, temp_dir):
53
  """Plota gráfico de evolução das notas por bimestre."""
54
  plt.figure(figsize=(12, 6))
55
 
56
- disciplinas_basicas = ['LINGUA PORTUGUESA', 'ARTE', 'LINGUA ESTRANGEIRA INGLES',
57
- 'GEOGRAFIA', 'CIENCIAS', 'HISTORIA', 'MATEMATICA']
58
 
59
  estilos = {
60
  'LINGUA PORTUGUESA': {'cor': '#DC143C', 'marcador': 'p', 'zorder': 1, 'linestyle': '-', 'desloc': 0.1},
@@ -70,7 +80,7 @@ def plotar_evolucao_bimestres(df_filtrado, temp_dir):
70
 
71
  colunas_notas = ['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']
72
 
73
- for disciplina in disciplinas_basicas:
74
  dados_disciplina = df_filtrado[df_filtrado['Disciplina'] == disciplina]
75
  if not dados_disciplina.empty:
76
  notas = dados_disciplina[colunas_notas].values[0]
@@ -113,14 +123,16 @@ def plotar_graficos_destacados(df_boletim_clean, temp_dir):
113
  """Plota gráficos de médias e frequências com destaques."""
114
  plt.figure(figsize=(12, 6))
115
 
116
- disciplinas = df_boletim_clean['Disciplina'].astype(str)
 
 
117
 
118
  # Processar frequências (remover % e converter para número)
119
  colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
120
- freq_data = df_boletim_clean[colunas_freq].replace('%', '', regex=True)
121
  medias_frequencia = freq_data.apply(pd.to_numeric, errors='coerce').mean(axis=1)
122
 
123
- medias_notas = df_boletim_clean[['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']].apply(pd.to_numeric, errors='coerce').mean(axis=1)
124
 
125
  cores_notas = ['red' if media < 5 else 'blue' for media in medias_notas]
126
  cores_frequencias = ['red' if media < 75 else 'green' for media in medias_frequencia]
@@ -169,15 +181,18 @@ def gerar_relatorio_pdf(df, grafico1_path, grafico2_path):
169
  pdf.cell(0, 10, 'Avisos Importantes:', 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='L')
170
  pdf.set_font('Helvetica', '', 10)
171
 
 
 
 
172
  # Calcular médias
173
- medias_notas = df[['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']].apply(pd.to_numeric, errors='coerce').mean(axis=1)
174
 
175
  # Processar frequências
176
  colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
177
- freq_data = df[colunas_freq].replace('%', '', regex=True)
178
  medias_freq = freq_data.apply(pd.to_numeric, errors='coerce').mean(axis=1)
179
 
180
- for idx, (disciplina, media_nota, media_freq) in enumerate(zip(df['Disciplina'], medias_notas, medias_freq)):
181
  if media_nota < 5:
182
  pdf.cell(0, 10, f'- {disciplina}: Média de notas abaixo de 5 ({media_nota:.1f})', 0,
183
  new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='L')
@@ -252,7 +267,7 @@ def processar_boletim(file):
252
  print("Gerando relatório PDF...")
253
  pdf_path = gerar_relatorio_pdf(df, grafico1_path, grafico2_path)
254
  print("Relatório PDF gerado")
255
-
256
  # Criar arquivo temporário para retorno
257
  output_file = tempfile.NamedTemporaryFile(delete=False, suffix='.pdf')
258
  output_path = output_file.name
@@ -276,7 +291,7 @@ def processar_boletim(file):
276
  # Interface Gradio
277
  iface = gr.Interface(
278
  fn=processar_boletim,
279
- inputs=gr.File(label="Upload do Boletim (PDF)"), # Removido o type="filepath"
280
  outputs=[
281
  gr.File(label="Relatório (PDF)"),
282
  gr.Textbox(label="Status")
 
11
  import shutil
12
  matplotlib.use('Agg')
13
 
14
+ # Lista global de disciplinas básicas
15
+ DISCIPLINAS_BASICAS = [
16
+ 'LINGUA PORTUGUESA', 'ARTE', 'LINGUA ESTRANGEIRA INGLES',
17
+ 'GEOGRAFIA', 'CIENCIAS', 'HISTORIA', 'MATEMATICA'
18
+ ]
19
+
20
  def extrair_tabelas_pdf(pdf_path):
21
  """Extrai tabelas do PDF e retorna um DataFrame processado."""
22
  try:
 
51
  if pd.isna(valor) or valor == '-' or valor == 'N':
52
  return 0
53
  try:
54
+ if isinstance(valor, str):
55
+ # Remover possíveis espaços e substituir vírgula por ponto
56
+ valor_limpo = valor.strip().replace(',', '.')
57
+ return float(valor_limpo)
58
+ return float(valor)
59
  except:
60
  return 0
61
 
 
63
  """Plota gráfico de evolução das notas por bimestre."""
64
  plt.figure(figsize=(12, 6))
65
 
66
+ # Filtrar apenas disciplinas básicas
67
+ df_filtrado = df_filtrado[df_filtrado['Disciplina'].isin(DISCIPLINAS_BASICAS)]
68
 
69
  estilos = {
70
  'LINGUA PORTUGUESA': {'cor': '#DC143C', 'marcador': 'p', 'zorder': 1, 'linestyle': '-', 'desloc': 0.1},
 
80
 
81
  colunas_notas = ['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']
82
 
83
+ for disciplina in DISCIPLINAS_BASICAS:
84
  dados_disciplina = df_filtrado[df_filtrado['Disciplina'] == disciplina]
85
  if not dados_disciplina.empty:
86
  notas = dados_disciplina[colunas_notas].values[0]
 
123
  """Plota gráficos de médias e frequências com destaques."""
124
  plt.figure(figsize=(12, 6))
125
 
126
+ # Filtrar apenas disciplinas básicas
127
+ df_filtrado = df_boletim_clean[df_boletim_clean['Disciplina'].isin(DISCIPLINAS_BASICAS)]
128
+ disciplinas = df_filtrado['Disciplina'].astype(str)
129
 
130
  # Processar frequências (remover % e converter para número)
131
  colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
132
+ freq_data = df_filtrado[colunas_freq].replace('%', '', regex=True)
133
  medias_frequencia = freq_data.apply(pd.to_numeric, errors='coerce').mean(axis=1)
134
 
135
+ medias_notas = df_filtrado[['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']].apply(pd.to_numeric, errors='coerce').mean(axis=1)
136
 
137
  cores_notas = ['red' if media < 5 else 'blue' for media in medias_notas]
138
  cores_frequencias = ['red' if media < 75 else 'green' for media in medias_frequencia]
 
181
  pdf.cell(0, 10, 'Avisos Importantes:', 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='L')
182
  pdf.set_font('Helvetica', '', 10)
183
 
184
+ # Filtrar apenas disciplinas básicas
185
+ df_filtrado = df[df['Disciplina'].isin(DISCIPLINAS_BASICAS)]
186
+
187
  # Calcular médias
188
+ medias_notas = df_filtrado[['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']].apply(pd.to_numeric, errors='coerce').mean(axis=1)
189
 
190
  # Processar frequências
191
  colunas_freq = ['%Freq B1', '%Freq B2', '%Freq B3', '%Freq B4']
192
+ freq_data = df_filtrado[colunas_freq].replace('%', '', regex=True)
193
  medias_freq = freq_data.apply(pd.to_numeric, errors='coerce').mean(axis=1)
194
 
195
+ for idx, (disciplina, media_nota, media_freq) in enumerate(zip(df_filtrado['Disciplina'], medias_notas, medias_freq)):
196
  if media_nota < 5:
197
  pdf.cell(0, 10, f'- {disciplina}: Média de notas abaixo de 5 ({media_nota:.1f})', 0,
198
  new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='L')
 
267
  print("Gerando relatório PDF...")
268
  pdf_path = gerar_relatorio_pdf(df, grafico1_path, grafico2_path)
269
  print("Relatório PDF gerado")
270
+
271
  # Criar arquivo temporário para retorno
272
  output_file = tempfile.NamedTemporaryFile(delete=False, suffix='.pdf')
273
  output_path = output_file.name
 
291
  # Interface Gradio
292
  iface = gr.Interface(
293
  fn=processar_boletim,
294
+ inputs=gr.File(label="Upload do Boletim (PDF)"),
295
  outputs=[
296
  gr.File(label="Relatório (PDF)"),
297
  gr.Textbox(label="Status")