/
CW3
/
The_Project
Обзор
Документация
Войти
/
CW3
/
The_Project
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/generate_html_report.py
351 строка
14 KB
CW3
Initial project setup with structure and CI/CD
28 дек 2025, 12:40
28 дек 2025, 12:40
5cacb7a
Код
Авторство
О чём код?
#!/usr/bin/env python3 """ Генерация HTML отчета анализа """ import sys import os sys.path.append('.') import pandas as pd import numpy as np from datetime import datetime from pathlib import Path from src.data.log_parser import LMSLogParser from src.data.sample_generator import generate_sample_grades from src.analysis.activity_analyzer import ActivityAnalyzer from src.visualization.activity_charts import ActivityVisualizer def generate_html_report(): """Генерация полного HTML отчета""" print("🌐 Генерация HTML отчета анализа обучения") # Создаем директории html_dir = Path("reports/html") html_dir.mkdir(parents=True, exist_ok=True) # 1. Загрузка данных parser = LMSLogParser('data/sample_logs.csv') logs_df = parser.load_logs() # Генерируем оценки, если файла нет grades_file = 'data/grades.csv' if not os.path.exists(grades_file): generate_sample_grades(grades_file, 100) grades_df = pd.read_csv(grades_file) # 2. Анализ analyzer = ActivityAnalyzer(logs_df, grades_df) activity_metrics = analyzer.calculate_activity_metrics() patterns_df = analyzer.identify_learning_patterns() # 3. Создание HTML страницы html_content = f""" <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Learning Path Analysis Report</title> <style> body {{ font-family: Arial, sans-serif; line-height: 1.6; margin: 0; padding: 20px; background-color: #f5f5f5; }} .container {{ max-width: 1200px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; box-shadow: 0 0 20px rgba(0,0,0,0.1); }} .header {{ text-align: center; margin-bottom: 40px; padding-bottom: 20px; border-bottom: 3px solid #4CAF50; }} .header h1 {{ color: #333; margin-bottom: 10px; }} .stats-grid {{ display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 30px; }} .stat-card {{ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 20px; border-radius: 8px; text-align: center; }} .stat-card h3 {{ margin-top: 0; font-size: 2.5em; }} .stat-card p {{ margin-bottom: 0; opacity: 0.9; }} .section {{ margin-bottom: 40px; padding: 20px; background: #f9f9f9; border-radius: 8px; border-left: 4px solid #4CAF50; }} .section h2 {{ color: #333; margin-top: 0; }} table {{ width: 100%; border-collapse: collapse; margin: 20px 0; }} th, td {{ padding: 12px; text-align: left; border-bottom: 1px solid #ddd; }} th {{ background-color: #4CAF50; color: white; }} tr:hover {{ background-color: #f5f5f5; }} .chart-container {{ margin: 30px 0; text-align: center; }} .chart-container img {{ max-width: 100%; height: auto; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }} .pattern-badges {{ display: flex; flex-wrap: wrap; gap: 10px; margin: 20px 0; }} .pattern-badge {{ background: #4CAF50; color: white; padding: 8px 16px; border-radius: 20px; font-size: 0.9em; }} .recommendations {{ background: #e8f5e9; padding: 20px; border-radius: 8px; margin: 20px 0; }} footer {{ text-align: center; margin-top: 40px; padding-top: 20px; border-top: 1px solid #ddd; color: #666; font-size: 0.9em; }} </style> </head> <body> <div class="container"> <div class="header"> <h1>🎓 Learning Path Analysis Report</h1> <p>Дата генерации: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</p> <p>Анализ данных LMS для оптимизации пути обучения</p> </div> <div class="stats-grid"> <div class="stat-card"> <h3>{len(logs_df):,}</h3> <p>Всего записей в логах</p> </div> <div class="stat-card"> <h3>{logs_df['student_id'].nunique()}</h3> <p>Уникальных студентов</p> </div> <div class="stat-card"> <h3>{logs_df['course_id'].nunique()}</h3> <p>Уникальных курсов</p> </div> <div class="stat-card"> <h3>{activity_metrics['total_events'].mean():.1f}</h3> <p>Средняя активность на студента</p> </div> </div> <div class="section"> <h2>📊 Общая статистика</h2> <p><strong>Период данных:</strong> {logs_df['timestamp'].min()} — {logs_df['timestamp'].max()}</p> <h3>Распределение событий по типам:</h3> <table> <tr> <th>Тип события</th> <th>Количество</th> <th>Процент</th> </tr> """ # Добавляем строки с событиями event_counts = parser.categorize_events() total_events = sum(event_counts.values()) for event_type, count in sorted(event_counts.items(), key=lambda x: x[1], reverse=True): percentage = (count / total_events) * 100 html_content += f""" <tr> <td>{event_type}</td> <td>{count:,}</td> <td>{percentage:.1f}%</td> </tr> """ html_content += """ </table> </div> <div class="section"> <h2>🔍 Паттерны обучения студентов</h2> """ # Добавляем распределение паттернов if 'learning_pattern' in patterns_df.columns: pattern_counts = patterns_df['learning_pattern'].value_counts() html_content += """ <div class="pattern-badges"> """ for pattern, count in pattern_counts.items(): html_content += f""" <div class="pattern-badge">{pattern}: {count}</div> """ html_content += """ </div> <h3>Описание паттернов:</h3> <ul> <li><strong>active_learner</strong>: Высокая активность по заданиям и тестам</li> <li><strong>passive_learner</strong>: Преимущественно просмотр материалов</li> <li><strong>social_learner</strong>: Активность в социальных взаимодействиях</li> <li><strong>intensive_learner</strong>: Очень высокая общая активность</li> <li><strong>sporadic_learner</strong>: Нерегулярная активность</li> <li><strong>balanced_learner</strong>: Сбалансированная активность по всем типам</li> </ul> """ html_content += """ </div> <div class="section"> <h2>📈 Примеры визуализаций</h2> <div class="chart-container"> <h3>Распределение событий по типам</h3> <p>График будет сгенерирован при полном анализе</p> </div> <div class="chart-container"> <h3>Активность студентов по времени</h3> <p>Интерактивные графики доступны в полном отчете</p> </div> </div> <div class="section"> <h2>💡 Ключевые выводы</h2> <div class="recommendations"> <h3>Рекомендации для оптимизации обучения:</h3> <ul> <li><strong>Для passive learners:</strong> Рекомендуется увеличить интерактивную активность</li> <li><strong>Для intensive learners:</strong> Важно соблюдать баланс и делать перерывы</li> <li><strong>Для sporadic learners:</strong> Создание регулярного расписания занятий</li> <li><strong>Для всех студентов:</strong> Разнообразие типов учебной активности</li> </ul> </div> <h3>Метрики эффективности:</h3> <ul> <li>Средняя активность: {activity_metrics['total_events'].mean():.1f} событий на студента</li> <li>Активных дней в среднем: {activity_metrics['active_days'].mean():.1f}</li> <li>Среднее событий в день: {activity_metrics['avg_events_per_day'].mean():.1f}</li> </ul> </div> <div class="section"> <h2>🚀 Как использовать эти данные</h2> <ol> <li><strong>Для преподавателей:</strong> Адаптировать материалы под разные паттерны обучения</li> <li><strong>Для студентов:</strong> Получить персонализированные рекомендации по улучшению</li> <li><strong>Для администрации:</strong> Оптимизировать структуру курсов на основе активности</li> <li><strong>Для разработчиков:</strong> Улучшить UX LMS на основе данных использования</li> </ol> </div> <footer> <p>📊 <strong>Learning Path Analyzer</strong> — система анализа эффективности обучения</p> <p>Сгенерировано автоматически | Версия 1.0 | {datetime.now().strftime('%Y')}</p> <p>Для подробного анализа запустите полный отчет: <code>python scripts/analyze_learning_paths.py</code></p> </footer> </div> </body> </html> """ # 4. Сохранение HTML файла html_file = html_dir / f"report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.html" with open(html_file, 'w', encoding='utf-8') as f: f.write(html_content) print(f"✅ HTML отчет сохранен: {html_file}") # 5. Генерация дополнительных файлов try: visualizer = ActivityVisualizer() # Сохраняем график распределения событий img_path = html_dir / f"event_distribution_{datetime.now().strftime('%Y%m%d')}.png" visualizer.plot_event_distribution(event_counts, save_path=str(img_path)) print(f"📊 Графики сохранены в: {html_dir}") except Exception as e: print(f"⚠️ Ошибка при генерации графиков: {e}") return html_file def main(): """Основная функция""" try: generate_html_report() print("\n🎉 HTML отчет успешно сгенерирован!") print("📁 Отчеты сохранены в папке: reports/html/") except Exception as e: print(f"\n❌ Ошибка при генерации отчета: {e}") import traceback traceback.print_exc() return 1 return 0 if __name__ == "__main__": sys.exit(main())