/
Str1ke
/
TheProject
Обзор
Документация
Войти
/
Str1ke
/
TheProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/data_loader.py
115 строк
4 KB
AlekseyF7
Initial commit: Student Performance Analyzer project
26 дек 2025, 13:51
26 дек 2025, 13:51
84047cc
Код
Авторство
О чём код?
""" Модуль для загрузки и обработки данных об успеваемости студентов """ import pandas as pd from typing import Optional, Dict, Any import os class DataLoader: """Класс для загрузки данных об успеваемости студентов""" def __init__(self, file_path: str): """ Инициализация загрузчика данных Args: file_path: Путь к CSV файлу с данными """ self.file_path = file_path self.data: Optional[pd.DataFrame] = None def load_data(self) -> pd.DataFrame: """ Загружает данные из CSV файла Returns: DataFrame с данными об успеваемости Raises: FileNotFoundError: Если файл не найден ValueError: Если данные некорректны """ if not os.path.exists(self.file_path): raise FileNotFoundError(f"Файл {self.file_path} не найден") try: self.data = pd.read_csv(self.file_path) self._validate_data() return self.data except pd.errors.EmptyDataError: raise ValueError("Файл пуст") except pd.errors.ParserError as e: raise ValueError(f"Ошибка парсинга CSV: {e}") def _validate_data(self) -> None: """Проверяет корректность загруженных данных""" if self.data is None: raise ValueError("Данные не загружены") required_columns = ['student_id', 'subject', 'score'] missing_columns = [col for col in required_columns if col not in self.data.columns] if missing_columns: raise ValueError( f"Отсутствуют обязательные колонки: {', '.join(missing_columns)}" ) if self.data.empty: raise ValueError("Данные пусты") # Проверка типов данных if not pd.api.types.is_numeric_dtype(self.data['score']): raise ValueError("Колонка 'score' должна содержать числовые значения") def get_student_stats(self, student_id: str) -> Dict[str, Any]: """ Получает статистику по конкретному студенту Args: student_id: ID студента Returns: Словарь со статистикой """ if self.data is None: raise ValueError("Данные не загружены. Вызовите load_data() сначала") student_data = self.data[self.data['student_id'] == student_id] if student_data.empty: return { 'student_id': student_id, 'total_subjects': 0, 'average_score': 0.0, 'max_score': 0.0, 'min_score': 0.0, 'subjects': [] } return { 'student_id': student_id, 'total_subjects': len(student_data), 'average_score': float(student_data['score'].mean()), 'max_score': float(student_data['score'].max()), 'min_score': float(student_data['score'].min()), 'subjects': student_data['subject'].tolist() } def get_all_students_summary(self) -> pd.DataFrame: """ Получает сводную статистику по всем студентам Returns: DataFrame со статистикой по каждому студенту """ if self.data is None: raise ValueError("Данные не загружены. Вызовите load_data() сначала") summary = self.data.groupby('student_id').agg({ 'score': ['mean', 'max', 'min', 'count'] }).reset_index() summary.columns = ['student_id', 'average_score', 'max_score', 'min_score', 'subjects_count'] return summary