Ведомость — классическая таблица «строки × столбцы»: строка — студент, столбец — предмет. На ней сходится
весь модуль: оси, argmax, статистика, сортировка. Файл data/scores.csv: первый столбец — код студента,
дальше — баллы по пяти предметам.
import numpy as np
subjects = ["математика", "физика", "программирование", "история", "английский"]
with open("data/scores.csv") as f:
print(f.read()[:110])student_id,math,physics,programming,history,english S01,68,49,68,82,81 S02,70,66,68,77,87 S03,61,58,72,60,70 S
Шаг 1. Загрузка
Баллы загрузим числами, а коды студентов — отдельно, как текст: у loadtxt для этого есть dtype=str.
Сохраните в scores таблицу баллов (столбцы 1–5), а в ids — коды студентов (столбец 0) как строки.
usecols=(1, 2, 3, 4, 5).usecols=0 и dtype=str.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
scores = ...
ids = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
scores = np.loadtxt("data/scores.csv", delimiter=",", skiprows=1, usecols=(1, 2, 3, 4, 5))
ids = np.loadtxt("data/scores.csv", delimiter=",", skiprows=1, usecols=0, dtype=str)Шаг 2. Предметы
Сохраните в subject_avg средний балл по каждому предмету, а в hardest — название предмета с самым низким
средним (названия — в списке subjects).
axis=0.subjects[subject_avg.argmin()].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
subject_avg = ...
hardest = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
subject_avg = scores.mean(axis=0)
hardest = subjects[subject_avg.argmin()]Шаг 3. Студенты
Сохраните в student_avg средний балл каждого студента, а в best_id — код студента с самым высоким средним.
axis=1.ids[student_avg.argmax()].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
student_avg = ...
best_id = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
student_avg = scores.mean(axis=1)
best_id = ids[student_avg.argmax()]Сохраните в best_by_subject коды студентов, лучших по каждому предмету, — пять кодов по порядку предметов.
Если лучших несколько (одинаковый максимум), argmax берёт первого из них — так и оставьте.
scores.argmax(axis=0) — для каждого столбца индекс строки с максимумом.ids[...].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
best_by_subject = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
best_by_subject = ids[scores.argmax(axis=0)]Шаг 4. Кто сдал всё и кто в зоне риска
all и any тоже понимают axis: (scores >= 60).all(axis=1) — для каждой строки, все ли её баллы не ниже 60.
Сохраните в all_passed число студентов, у которых все баллы не ниже 60.
scores >= 60; «все в строке» — .all(axis=1).Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
all_passed = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
all_passed = (scores >= 60).all(axis=1).sum()Сохраните в at_risk коды студентов, у которых хотя бы по одному предмету меньше 50 баллов.
.any(axis=1).ids[маска].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
at_risk = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
at_risk = ids[(scores < 50).any(axis=1)]Шаг 5. Рейтинг
Сохраните в top5 коды пяти студентов с самым высоким средним баллом — от лучшего.
np.argsort(student_avg) — от худшего к лучшему; [::-1] — наоборот; [:5] — первые пять.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
top5 = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
top5 = ids[np.argsort(student_avg)[::-1][:5]]Выводы
for name, avg in zip(subjects, np.round(subject_avg, 1)):
print(f"{name}: {avg}")
print("самый трудный:", hardest, "| лучший студент:", best_id, round(student_avg.max(), 1))
print("сдали всё:", all_passed, "из", len(ids), "| в зоне риска:", len(at_risk))
print("пятёрка лучших:", top5)математика: 67.8 физика: 66.8 программирование: 69.0 история: 69.7 английский: 66.0 самый трудный: английский | лучший студент: S12 89.8 сдали всё: 12 из 30 | в зоне риска: 9 пятёрка лучших: ['S12' 'S29' 'S21' 'S27' 'S24']
Самый трудный предмет — английский, но разница средних между предметами невелика — около 4 баллов. Все предметы сдали 12 студентов из 30, а у 9 есть хотя бы один балл ниже 50 — им стоит помочь. Весь анализ — десяток строк, и каждая — одна операция с таблицей.