summer_practice/individual_4.py
Danil 3486e2826a Индивидуальное задание 4
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 18:57:10 +03:00

68 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import sys # чтобы взять имя файла из аргументов командной строки
import pandas as pd # для чтения csv и работы с таблицей
import matplotlib.pyplot as plt # для построения гистограммы
# Разбирает счёт вида "3:1" в одном столбце на два числовых столбца:
# голы хозяев и голы гостей. Пустой период (":") становится 0:0.
def parse_score(df, col):
parts = df[col].str.split(':', expand=True) # делим каждую строку по ":" на две колонки
home = pd.to_numeric(parts[0], errors='coerce').fillna(0) # число до ":", пусто -> 0
away = pd.to_numeric(parts[1], errors='coerce').fillna(0) # число после ":", пусто -> 0
return home, away
# Индивидуальное задание №4:
# принимает имя файла и строит гистограмму общего числа заброшенных каждой командой шайб.
def task4(filename):
df = pd.read_csv(filename) # читаем матчи в таблицу
# Разбираем счёт по всем стадиям матча
h1, a1 = parse_score(df, 'Период_1') # голы хозяев/гостей в 1 периоде
h2, a2 = parse_score(df, 'Период_2') # 2 период
h3, a3 = parse_score(df, 'Период_3') # 3 период
oth, ota = parse_score(df, 'Овертайм') # овертайм (0:0, если его не было)
soh, soa = parse_score(df, 'Буллиты') # буллиты (0:0, если их не было)
# Голы в основное время = сумма трёх периодов (поэлементно по строкам)
reg_h = h1 + h2 + h3
reg_a = a1 + a2 + a3
# Ничья в основное время -> мог быть победный буллит (за него команде +1 шайба)
tie = (reg_h == reg_a)
win_home_so = tie & (oth == ota) & (soh > soa) # буллиты выиграли хозяева
win_away_so = tie & (oth == ota) & (soa > soh) # буллиты выиграли гости
# Итоговые заброшенные шайбы: основное время + овертайм + 1 за победу по буллитам
goals_home = reg_h + oth + win_home_so.astype(int) # все шайбы хозяев в матче
goals_away = reg_a + ota + win_away_so.astype(int) # все шайбы гостей в матче
# Каждый матч даёт по строке двум командам: хозяевам и гостям
home = pd.DataFrame({'Команда': df['Команда_1'], 'ГЗ': goals_home})
away = pd.DataFrame({'Команда': df['Команда_2'], 'ГЗ': goals_away})
both = pd.concat([home, away], ignore_index=True) # склеиваем оба взгляда в один список
# Суммируем заброшенные шайбы по каждой команде и сортируем по убыванию
totals = both.groupby('Команда')['ГЗ'].sum().astype(int)
totals = totals.sort_values(ascending=False)
teams = totals.index # ось X: названия команд
goals = totals.values # ось Y: всего заброшено шайб
plt.figure(figsize=(12, 6)) # широкое окно, чтобы влезли все команды
plt.bar(teams, goals, color='steelblue') # столбики: один на команду
plt.title('Всего заброшено шайб за сезон') # заголовок
plt.xlabel('Команда') # подпись оси X
plt.ylabel('Заброшено шайб') # подпись оси Y
plt.xticks(rotation=90) # имена команд вертикально, чтобы не накладывались
for i, value in enumerate(goals): # подпись числа над каждым столбиком
plt.text(i, value, str(value), ha='center', va='bottom')
plt.tight_layout() # подгоняем поля, чтобы подписи не обрезались
plt.show() # показываем окно с графиком
# Запуск только при прямом старте файла; имя csv берём из аргумента командной строки
if __name__ == '__main__':
task4(sys.argv[1])