/
dems712
/
your-learning-dashboard
Обзор
Документация
Войти
/
dems712
/
your-learning-dashboard
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/visualizations.py
137 строк
4 KB
dems712
update src/visualizations.py
18 янв 2026, 12:47
Верифицирован
18 янв 2026, 12:47
0a88055
Код
Авторство
О чём код?
""" Модуль для создания визуализаций дашборда. """ import plotly.express as px import plotly.graph_objects as go import pandas as pd from typing import Optional def create_score_distribution(df: pd.DataFrame, course: Optional[str] = None) -> go.Figure: """ Создает гистограмму распределения оценок. Args: df: DataFrame с данными course: Фильтр по курсу (опционально) Returns: Plotly Figure объект """ if course: df = df[df['course'] == course] fig = px.histogram( df, x='score', nbins=20, title=f'Распределение оценок по курсу: {course if course else "Все курсы"}', labels={'score': 'Оценка', 'count': 'Количество студентов'}, color_discrete_sequence=['#1E88E5'] ) fig.update_layout( xaxis_title="Оценка", yaxis_title="Количество", bargap=0.1, showlegend=False ) return fig def create_engagement_heatmap(df: pd.DataFrame) -> go.Figure: """ Создает тепловую карту активности студентов по дням недели и времени. Args: df: DataFrame с данными Returns: Plotly Figure объект с heatmap """ # Добавляем день недели и час df_copy = df.copy() df_copy['day_of_week'] = df_copy['date'].dt.day_name() df_copy['hour'] = df_copy['date'].dt.hour # Агрегируем данные heatmap_data = df_copy.groupby(['day_of_week', 'hour']).size().reset_index(name='activity_count') # Сортируем дни недели days_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] heatmap_data['day_of_week'] = pd.Categorical( heatmap_data['day_of_week'], categories=days_order, ordered=True ) fig = px.density_heatmap( heatmap_data, x='hour', y='day_of_week', z='activity_count', title='Активность студентов по времени', labels={'hour': 'Час дня', 'day_of_week': 'День недели', 'activity_count': 'Активность'}, color_continuous_scale='Viridis' ) fig.update_layout( xaxis=dict(tickmode='linear', dtick=2), yaxis=dict(categoryorder='array', categoryarray=days_order) ) return fig def create_progress_timeline(df: pd.DataFrame, student_id: str) -> go.Figure: """ Создает timeline прогресса конкретного студента. Args: df: DataFrame с данными student_id: ID студента Returns: Plotly Figure с прогрессом """ student_data = df[df['student_id'] == student_id].sort_values('date') if student_data.empty: # Возвращаем пустой график с сообщением fig = go.Figure() fig.add_annotation( text=f"Нет данных для студента {student_id}", xref="paper", yref="paper", x=0.5, y=0.5, showarrow=False ) return fig # Скользящее среднее для сглаживания student_data['score_ma'] = student_data['score'].rolling(window=3, min_periods=1).mean() fig = go.Figure() # Фактические оценки fig.add_trace(go.Scatter( x=student_data['date'], y=student_data['score'], mode='markers', name='Оценки', marker=dict(size=8, color='lightblue') )) # Скользящее среднее fig.add_trace(go.Scatter( x=student_data['date'], y=student_data['score_ma'], mode='lines', name='Тренд', line=dict(color='darkblue', width=2) )) fig.update_layout( title=f'Прогресс студента: {student_id}', xaxis_title='Дата', yaxis_title='Оценка', hovermode='x unified' ) return fig