/
Str1ke
/
TheProject
Обзор
Документация
Войти
/
Str1ke
/
TheProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/visualizer.py
187 строк
7 KB
AlekseyF7
Initial commit: Student Performance Analyzer project
26 дек 2025, 13:51
26 дек 2025, 13:51
84047cc
Код
Авторство
О чём код?
""" Модуль для визуализации результатов анализа """ import matplotlib.pyplot as plt import seaborn as sns import pandas as pd from typing import Optional import os class PerformanceVisualizer: """Класс для создания визуализаций успеваемости""" def __init__(self, output_dir: str = "reports"): """ Инициализация визуализатора Args: output_dir: Директория для сохранения графиков """ self.output_dir = output_dir os.makedirs(output_dir, exist_ok=True) sns.set_style("whitegrid") plt.rcParams['figure.figsize'] = (12, 6) def plot_student_scores_distribution( self, data: pd.DataFrame, filename: Optional[str] = None ) -> str: """ Создает график распределения оценок Args: data: DataFrame с данными filename: Имя файла для сохранения Returns: Путь к сохраненному файлу """ plt.figure(figsize=(10, 6)) plt.hist(data['score'], bins=20, edgecolor='black', alpha=0.7) plt.xlabel('Оценка', fontsize=12) plt.ylabel('Количество', fontsize=12) plt.title('Распределение оценок студентов', fontsize=14, fontweight='bold') plt.grid(True, alpha=0.3) if filename is None: filename = "score_distribution.png" filepath = os.path.join(self.output_dir, filename) plt.savefig(filepath, dpi=300, bbox_inches='tight') plt.close() return filepath def plot_subject_comparison( self, subject_stats: pd.DataFrame, filename: Optional[str] = None ) -> str: """ Создает график сравнения предметов Args: subject_stats: DataFrame со статистикой по предметам filename: Имя файла для сохранения Returns: Путь к сохраненному файлу """ plt.figure(figsize=(12, 6)) subject_stats_sorted = subject_stats.sort_values('average_score', ascending=True) plt.barh( subject_stats_sorted['subject'], subject_stats_sorted['average_score'], alpha=0.7 ) plt.xlabel('Средний балл', fontsize=12) plt.ylabel('Предмет', fontsize=12) plt.title('Средний балл по предметам', fontsize=14, fontweight='bold') plt.grid(True, alpha=0.3, axis='x') if filename is None: filename = "subject_comparison.png" filepath = os.path.join(self.output_dir, filename) plt.savefig(filepath, dpi=300, bbox_inches='tight') plt.close() return filepath def plot_student_performance( self, student_summary: pd.DataFrame, top_n: int = 10, filename: Optional[str] = None ) -> str: """ Создает график успеваемости топ-N студентов Args: student_summary: DataFrame со сводкой по студентам top_n: Количество студентов для отображения filename: Имя файла для сохранения Returns: Путь к сохраненному файлу """ top_students = student_summary.nlargest(top_n, 'average_score') plt.figure(figsize=(12, 6)) plt.bar( range(len(top_students)), top_students['average_score'], alpha=0.7, color='steelblue' ) plt.xlabel('Студент (топ-' + str(top_n) + ')', fontsize=12) plt.ylabel('Средний балл', fontsize=12) plt.title(f'Топ-{top_n} студентов по успеваемости', fontsize=14, fontweight='bold') plt.xticks(range(len(top_students)), top_students['student_id'], rotation=45) plt.grid(True, alpha=0.3, axis='y') if filename is None: filename = "top_students.png" filepath = os.path.join(self.output_dir, filename) plt.savefig(filepath, dpi=300, bbox_inches='tight') plt.close() return filepath def create_summary_report( self, overall_stats: dict, subject_stats: pd.DataFrame, at_risk_students: list ) -> str: """ Создает текстовый отчет с визуализациями Args: overall_stats: Общая статистика subject_stats: Статистика по предметам at_risk_students: Список студентов группы риска Returns: Путь к сохраненному отчету """ report_path = os.path.join(self.output_dir, "summary_report.txt") with open(report_path, 'w', encoding='utf-8') as f: f.write("=" * 60 + "\n") f.write("ОТЧЕТ ПО УСПЕВАЕМОСТИ СТУДЕНТОВ\n") f.write("=" * 60 + "\n\n") f.write("ОБЩАЯ СТАТИСТИКА:\n") f.write("-" * 60 + "\n") f.write(f"Всего студентов: {overall_stats['total_students']}\n") f.write(f"Всего предметов: {overall_stats['total_subjects']}\n") f.write(f"Общий средний балл: {overall_stats['overall_average']:.2f}\n") f.write(f"Медианный балл: {overall_stats['overall_median']:.2f}\n") f.write(f"Стандартное отклонение: {overall_stats['overall_std']:.2f}\n\n") f.write("СТУДЕНТЫ ГРУППЫ РИСКА:\n") f.write("-" * 60 + "\n") if at_risk_students: for student in at_risk_students: f.write( f"Студент {student['student_id']}: " f"средний балл {student['average_score']:.2f}\n" ) else: f.write("Студентов группы риска не обнаружено.\n") f.write("\n") f.write("СТАТИСТИКА ПО ПРЕДМЕТАМ:\n") f.write("-" * 60 + "\n") for _, row in subject_stats.iterrows(): f.write( f"{row['subject']}: средний балл {row['average_score']:.2f}, " f"студентов: {row['students_count']}\n" ) return report_path