Среднее время решения упражнений студентами

Junior Python EdTech

Условие задания

**Данные:** DataFrame `exercise_progress` с колонками: `student_id`, `exercise_id`, `lesson_id`, `started_at`, `completed_at`, `is_correct` (True/False).

Урок длится 60 минут. Упражнения решаются во второй половине урока (с 30-й минуты).

**Задание:**
1. Рассчитайте время решения каждого упражнения в минутах
2. Оставьте только упражнения, начатые во второй половине урока
3. Найдите среднее время решения по упражнениям и процент правильных ответов

Пример данных

Структура для ориентира — реальные значения из эталонного решения.

import pandas as pd
import numpy as np

np.random.seed(42)
n_students = 50
exercises = ['ex_1', 'ex_2', 'ex_3', 'ex_4', 'ex_5']
lessons = ['lesson_A', 'lesson_B']

rows = []
for sid in range(1, n_students + 1):
    for lesson in lessons:
        lesson_start = pd.Timestamp('2024-03-15 10:00:00')
        for ex in exercises:
            # Начало упражнения: случайная минута урока
            start_min = np.random.randint(0, 55)
            duration_min = np.random.exponential(8) + 1
            is_correct = np.random.random() < 0.7

            started = lesson_start + pd.Timedelta(minutes=start_min)
            completed = started + pd.Timedelta(minutes=duration_min)

            rows.append({
                'student_id': sid,
                'exercise_id': ex,
                'lesson_id': lesson,
                'started_at': started,
                'completed_at': completed,
                'is_correct': is_correct,
            })

df = pd.DataFrame(rows)

# 1. Время решения в минутах
df['solve_time_min'] = (
    (df['completed_at'] - df['started_at']).dt.total_seconds() / 60
).round(1)

# 2. Фильтр: только вторая половина урока (минута >= 30)
df['lesson_minute'] = (
    (df['started_at'] - pd.Timestamp('2024-03-15 10:00:00'))
    .dt.total_seconds() / 60
).astype(int)

second_half = df[df['lesson_minute'] >= 30].copy()
print(f"Всего записей: {len(df)}")
print(f"Во второй половине: {len(second_half)}")

# 3. Среднее время и % правильных по упражнениям
summary = second_half.groupby('exercise_id').agg(
    avg_solve_time=('solve_time_min', 'mean'),
    median_solve_time=('solve_time_min', 'median'),
    correct_pct=('is_correct', 'mean'),
    attempts=('student_id', 'count'),
).round(2)

summary['correct_pct'] = (summary['correct_pct'] * 100).round(1)
summary = summary.sort_values('avg_solve_time')

print("\nСтатистика по упражнениям (вторая половина урока):")
print(summary.to_string())

# Самое сложное (долгое + низкий % правильных)
hardest = summary.sort_values(
    ['correct_pct', 'avg_solve_time'], ascending=[True, False]
).index[0]
print(f"\nСамое сложное: {hardest} "
      f"(время: {summary.loc[hardest, 'avg_solve_time']} мин, "
      f"правильных: {summary.loc[hardest, 'correct_pct']}%)")

Темы

pandas groupby timedelta фильтрация образование

Подсказки

Все тестовые задания →

Частые вопросы

Какой уровень знаний нужен для задачи "Среднее время решения упражнений студентами"?

Это задание для уровня Junior. Подходит для начинающих аналитиков, проверяет базовые знания SQL/Python/статистики.

На каких собеседованиях встречается такая задача?

Подобные задания в категории «Python» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: pandas, groupby, timedelta, фильтрация, образование.

Сколько времени даётся на решение?

На реальном собеседовании на подобную задачу отводится 5-10 минут — проверяется скорость и базовая грамотность. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.

Где ещё потренироваться по теме «Python»?

На zasqlpython.ru есть 482 Python задачи с проверкой через Pyodide, конспекты Python и pandas, AI мок-собеседование с разбором ваших ответов.

← Все задания