Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -157,86 +157,86 @@ class ReportGenerator:
|
|
157 |
return basic_stats
|
158 |
|
159 |
def generate_graphs(self) -> List[plt.Figure]:
|
160 |
-
|
161 |
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
|
194 |
-
|
195 |
-
|
196 |
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
|
241 |
def generate_pdf(self, output_path: str, graphs: List[plt.Figure]) -> None:
|
242 |
"""Gera relatório em PDF com análise detalhada."""
|
|
|
157 |
return basic_stats
|
158 |
|
159 |
def generate_graphs(self) -> List[plt.Figure]:
|
160 |
+
graphs = []
|
161 |
|
162 |
+
# Configurações globais de estilo
|
163 |
+
plt.rcParams['figure.figsize'] = [12, 6]
|
164 |
+
plt.rcParams['axes.grid'] = True
|
165 |
+
plt.rcParams['grid.alpha'] = 0.3
|
166 |
+
plt.rcParams['font.size'] = 10
|
167 |
+
plt.rcParams['axes.titlesize'] = 12
|
168 |
+
plt.rcParams['axes.titlepad'] = 20
|
169 |
+
plt.rcParams['axes.labelpad'] = 10
|
170 |
|
171 |
+
# 1. Distribuição por nível
|
172 |
+
plt.figure()
|
173 |
+
nivel_counts = self.data['Nível'].value_counts()
|
174 |
+
colors = {'Avançado': '#2ecc71', 'Intermediário': '#f1c40f', 'Necessita Atenção': '#e74c3c'}
|
175 |
|
176 |
+
bars = plt.bar(nivel_counts.index, nivel_counts.values)
|
177 |
+
for i, bar in enumerate(bars):
|
178 |
+
bar.set_color(colors[nivel_counts.index[i]])
|
179 |
+
plt.text(bar.get_x() + bar.get_width()/2, bar.get_height(),
|
180 |
+
str(nivel_counts.values[i]),
|
181 |
+
ha='center', va='bottom')
|
182 |
|
183 |
+
plt.title('Distribuição dos Alunos por Nível de Desempenho')
|
184 |
+
plt.ylabel('Número de Alunos')
|
185 |
+
graphs.append(plt.gcf())
|
186 |
+
plt.close()
|
187 |
+
|
188 |
+
# 2. Top 10 alunos
|
189 |
+
plt.figure()
|
190 |
+
top_10 = self.data.head(10)
|
191 |
+
bars = plt.barh(top_10['Nome do Aluno'], top_10['Acertos Absolutos'],
|
192 |
+
color='#3498db')
|
193 |
|
194 |
+
plt.title('Top 10 Alunos - Acertos Absolutos')
|
195 |
+
plt.xlabel('Número de Acertos')
|
196 |
|
197 |
+
for i, bar in enumerate(bars):
|
198 |
+
plt.text(bar.get_width(), bar.get_y() + bar.get_height()/2,
|
199 |
+
f' {bar.get_width():.0f}',
|
200 |
+
va='center')
|
201 |
|
202 |
+
plt.tight_layout()
|
203 |
+
graphs.append(plt.gcf())
|
204 |
+
plt.close()
|
205 |
+
|
206 |
+
# 3. Relação tempo x acertos
|
207 |
+
plt.figure()
|
208 |
+
for nivel in colors:
|
209 |
+
mask = self.data['Nível'] == nivel
|
210 |
+
tempo = pd.to_timedelta(self.data[mask]['Total Tempo']).dt.total_seconds() / 60
|
211 |
+
plt.scatter(tempo, self.data[mask]['Acertos Absolutos'],
|
212 |
+
c=colors[nivel], label=nivel, alpha=0.6, s=100)
|
213 |
|
214 |
+
plt.title('Relação entre Tempo e Acertos por Nível')
|
215 |
+
plt.xlabel('Tempo Total (minutos)')
|
216 |
+
plt.ylabel('Número de Acertos')
|
217 |
+
plt.legend()
|
218 |
+
graphs.append(plt.gcf())
|
219 |
+
plt.close()
|
220 |
+
|
221 |
+
# 4. Relação Tarefas x Acertos com linha de tendência
|
222 |
+
plt.figure()
|
223 |
+
plt.scatter(self.data['Tarefas Completadas'], self.data['Acertos Absolutos'],
|
224 |
+
color='#3498db', alpha=0.6, s=100)
|
225 |
|
226 |
+
z = np.polyfit(self.data['Tarefas Completadas'], self.data['Acertos Absolutos'], 1)
|
227 |
+
p = np.poly1d(z)
|
228 |
+
x_range = np.linspace(self.data['Tarefas Completadas'].min(),
|
229 |
+
self.data['Tarefas Completadas'].max(), 100)
|
230 |
+
plt.plot(x_range, p(x_range), "r--", alpha=0.8, label='Tendência')
|
231 |
|
232 |
+
plt.title('Relação entre Tarefas Completadas e Acertos')
|
233 |
+
plt.xlabel('Número de Tarefas Completadas')
|
234 |
+
plt.ylabel('Número de Acertos')
|
235 |
+
plt.legend()
|
236 |
+
graphs.append(plt.gcf())
|
237 |
+
plt.close()
|
238 |
+
|
239 |
+
return graphs
|
240 |
|
241 |
def generate_pdf(self, output_path: str, graphs: List[plt.Figure]) -> None:
|
242 |
"""Gera relatório em PDF com análise detalhada."""
|