| khl_3 | ||
| khl_3_win | ||
| .gitignore | ||
| 3.py | ||
| divisions.py | ||
| individual_1.py | ||
| individual_4.py | ||
| individual_5.py | ||
| main.py | ||
| README.md | ||
| РАЗБОР_КОДА.md | ||
Летняя практика — Турнирные таблицы КХЛ
Проект анализирует результаты матчей регулярного чемпионата КХЛ за сезоны 2018/19 – 2021/22 и строит по ним турнирные таблицы и графики. Основной инструмент — библиотека pandas (работа с таблицами) и matplotlib (графики).
1. Структура проекта
| Файл / папка | Назначение |
|---|---|
main.py |
Основная программа: строит полную турнирную таблицу чемпионата и таблицы по конференциям (Запад / Восток). |
individual_1.py |
Индивидуальное задание: гистограмма набранных очков по командам. |
individual_4.py |
Индивидуальное задание: гистограмма всего заброшенных шайб за сезон. |
individual_5.py |
Индивидуальное задание: гистограмма разницы шайб конкретной команды в заданном периоде по датам. |
khl_3/ |
Исходные данные — CSV-файлы матчей (кодировка UTF-8). |
khl_3_win/ |
Те же данные в кодировке UTF-8 с BOM — открываются в Excel без «кракозябр». |
Формат исходных данных (CSV)
,Номер,Дата,Команда_1,Команда_2,Период_1,Период_2,Период_3,Овертайм,Буллиты
0,1,2018-09-01,Ак Барс,СКА,0:1,1:2,0:3,:,:
Команда_1— хозяева,Команда_2— гости.Период_1..3,Овертайм,Буллиты— счёт в форматехозяева:гости.- Пустой
:означает, что период не игрался (нет овертайма/буллитов).
2. Установка и запуск
pip install pandas numpy matplotlib
# Полная турнирная таблица + таблицы по конференциям
python3 main.py khl_3/khl_2018_19.csv
# Гистограмма очков (по желанию — сохранить в файл)
python3 individual_1.py khl_3/khl_2018_19.csv [output.png]
# Гистограмма заброшенных шайб
python3 individual_4.py khl_3/khl_2018_19.csv
# Разница шайб команды в N-м периоде по датам
python3 individual_5.py khl_3/khl_2018_19.csv 2 "Ак Барс" [output.png]
Имя файла важно:
main.pyдостаёт код сезона (2018_19) из имениkhl_2018_19.csv, чтобы понять, какие команды в какой конференции играли.
3. Как работает main.py (ядро проекта)
Логика построена на векторных операциях pandas: вычисления делаются сразу над целым столбцом, без циклов по строкам.
Шаг 1. parse_score(df, col) — разбирает строку счёта "3:1" на два числа.
str.split(':', expand=True) раскладывает столбец в два, to_numeric(..., errors='coerce')
превращает текст в числа, а пустой период (:) через fillna(0) считается как 0:0.
Шаг 2. build_standings(df, conf_map) — превращает список матчей в таблицу команд:
- Считает голы в основное время (сумма трёх периодов).
- Определяет тип исхода каждого матча сравнением столбцов: победа в основное время / в овертайме / по буллитам — и аналогично поражения. Победителю по буллитам добавляется ровно 1 решающая шайба.
- «Разворачивает» матч в две строки — взгляд хозяев и взгляд гостей —
и склеивает их (
pd.concat). Теперь у каждой команды по строке на матч. groupby('Команда').sum()суммирует все показатели по командам.- Считает производные показатели:
- И — игры, О — очки (победа = 2, поражение в ОТ/буллитах = 1),
- Р — разница шайб, %О — процент набранных очков.
%Осчитается с отбрасыванием знаков (np.floor), как на сайте КХЛ, а не округлением.
- Сортирует по регламенту КХЛ:
%О → В → ВО → ВБ → Р → ГЗ.
Шаг 3. show_table и main — печатают полную таблицу, затем отдельно
конференции Запад и Восток (фильтр по столбцу Конф).
Обозначения столбцов
И — игры · В — победы в основное время · ВО — победы в овертайме ·
ВБ — победы по буллитам · ПБ — поражения по буллитам · ПО — поражения в овертайме ·
П — поражения в основное время · ГЗ — голы забитые · ГП — голы пропущенные ·
Р — разница · О — очки · %О — процент очков.
4. Индивидуальные задания
individual_1.py— переиспользуетparse_scoreизmain.py, считает очки каждой команды и строит столбчатую диаграмму очков. Поддерживает сохранение в PNG.individual_4.py— суммирует все заброшенные шайбы каждой команды за сезон и строит гистограмму с подписями значений над столбцами.individual_5.py— фильтрует матчи одной команды, считает разницу шайб в выбранном периоде по датам. Столбцы раскрашены: зелёный (плюс), красный (минус), серый (ноль); добавлена линия нуля и сетка.
5. Материал к защите
О чём проект. По «сырым» результатам матчей КХЛ автоматически строится официальная турнирная таблица и набор графиков. Цель — освоить обработку табличных данных в pandas и визуализацию в matplotlib.
Ключевые идеи, которые стоит назвать на защите:
- Векторизация вместо циклов. Все расчёты — операции над столбцами целиком
(сложение, сравнение, маски
True/False). Это и быстрее, и короче, чемforпо строкам. - Приём «одна строка матча → две строки команд». Чтобы посчитать статистику
команды, каждый матч дублируется: одна запись со стороны хозяев, другая — гостей.
После этого
groupbyсводит всё в таблицу команд. - Булевы маски. Тип исхода (победа/поражение и как именно) — это столбцы
True/False, которые переводятся в1/0через.astype(int)и суммируются. - Точное соответствие регламенту КХЛ. Система очков (2/1/0), добавление шайбы за буллиты, отбрасывание (а не округление) процента очков, порядок критериев сортировки.
- Переиспользование кода.
individual_1.pyимпортирует функции изmain.py, чтобы не дублировать логику разбора счёта.
Возможные вопросы и ответы:
- Почему пустой период = 0:0? — Овертайм/буллиты есть не во всех матчах;
fillna(0)делает расчёт единообразным. - Почему
np.floor, а неround? — Сайт КХЛ отбрасывает знаки после второго (72.448 → 72.44), а не округляет. - Зачем папка
khl_3_win? — то же содержимое, но с BOM, чтобы Excel правильно показывал кириллицу. - Как добавить новый сезон? — добавить CSV в
khl_3/и описать конференции в словареCONFERENCESвнутриmain.py.