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