/
dems712
/
your-learning-dashboard
Обзор
Документация
Войти
/
dems712
/
your-learning-dashboard
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/generate_sample_data.py
118 строк
5 KB
dems712
update scripts/generate_sample_data.py
18 янв 2026, 12:46
Верифицирован
18 янв 2026, 12:46
f1f0cd9
Код
Авторство
О чём код?
#!/usr/bin/env python3 """ Скрипт для генерации тестовых данных об успеваемости студентов. Генерирует CSV файл с правдоподобными данными для дашборда. """ import pandas as pd import numpy as np from datetime import datetime, timedelta import os def generate_student_data(num_students: int = 100, num_courses: int = 5) -> pd.DataFrame: """ Генерирует данные об успеваемости студентов. Args: num_students: Количество студентов num_courses: Количество курсов Returns: DataFrame с данными об успеваемости """ # Создаем списки студентов и курсов student_ids = [f"S{str(i).zfill(3)}" for i in range(1, num_students + 1)] student_names = [f"Student_{i}" for i in range(1, num_students + 1)] courses = [f"Course_{i}" for i in range(1, num_courses + 1)] # Генерируем данные data = [] start_date = datetime(2024, 1, 1) for student_id, student_name in zip(student_ids, student_names): for course in courses: # Каждый студент имеет разную успеваемость по разным курсам base_score = np.random.normal(loc=70, scale=15) # Генерируем 10-20 записей активности на курс num_records = np.random.randint(10, 21) for i in range(num_records): # Дата активности (случайная в течение семестра) days_offset = np.random.randint(0, 120) date = start_date + timedelta(days=days_offset) # Оценка с некоторой вариативностью score_variation = np.random.normal(0, 10) score = max(0, min(100, base_score + score_variation)) # Время, затраченное на задание (в минутах) time_spent = np.random.randint(15, 180) # Тип активности activity_types = ['quiz', 'assignment', 'exam', 'lab', 'participation'] activity = np.random.choice(activity_types) # Завершено или нет (чем выше оценка, тем выше вероятность завершения) completed = score > 40 or np.random.random() > 0.3 # Уровень сложности задания difficulty = np.random.choice(['easy', 'medium', 'hard'], p=[0.4, 0.4, 0.2]) data.append({ 'student_id': student_id, 'student_name': student_name, 'course': course, 'date': date, 'score': round(score, 1), 'time_spent': time_spent, 'activity_type': activity, 'difficulty': difficulty, 'completed': completed }) df = pd.DataFrame(data) # Сортируем по дате для реалистичности df = df.sort_values('date').reset_index(drop=True) return df def main(): """Основная функция генерации данных.""" print("🎲 Генерация тестовых данных для Learning Dashboard...") # Создаем директории, если их нет os.makedirs("data/raw", exist_ok=True) os.makedirs("data/processed", exist_ok=True) # Генерируем данные df = generate_student_data(num_students=50, num_courses=3) # Сохраняем в CSV raw_path = "data/raw/sample.csv" df.to_csv(raw_path, index=False) # Создаем также агрегированный файл для быстрой загрузки aggregated = df.groupby(['student_id', 'student_name', 'course']).agg({ 'score': 'mean', 'time_spent': 'sum', 'completed': 'sum', 'date': 'count' }).reset_index() aggregated.columns = ['student_id', 'student_name', 'course', 'avg_score', 'total_time', 'completed_tasks', 'total_tasks'] aggregated['completion_rate'] = (aggregated['completed_tasks'] / aggregated['total_tasks'] * 100).round(1) processed_path = "data/processed/aggregated.csv" aggregated.to_csv(processed_path, index=False) print(f"✅ Данные сгенерированы!") print(f" Сырые данные: {raw_path} ({len(df)} записей)") print(f" Агрегированные данные: {processed_path} ({len(aggregated)} записей)") print(f" Период данных: {df['date'].min().date()} - {df['date'].max().date()}") print(f" Уникальных студентов: {df['student_id'].nunique()}") print(f" Курсов: {df['course'].nunique()}") if __name__ == "__main__": main()