diff --git a/individual_4.py b/individual_4.py new file mode 100644 index 0000000..8c61688 --- /dev/null +++ b/individual_4.py @@ -0,0 +1,68 @@ +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])