forked from zovos/summer_practice
98 lines
4 KiB
Python
98 lines
4 KiB
Python
import os
|
||
import sys
|
||
import matplotlib.pyplot as plt
|
||
import numpy as np
|
||
import pandas as pd
|
||
|
||
|
||
def parse_score(df, col):
|
||
"""
|
||
Разделяет счет в формате 'H:A' на два числовых столбца (хозяева и гости).
|
||
"""
|
||
parts = df[col].str.split(':', expand=True)
|
||
home = pd.to_numeric(parts[0], errors='coerce').fillna(0)
|
||
away = pd.to_numeric(parts[1], errors='coerce').fillna(0)
|
||
return home, away
|
||
|
||
|
||
def calculate_period_goals_diff(filename, period_number, team_name):
|
||
"""
|
||
Загружает данные из файла и рассчитывает разницу забитых и пропущенных
|
||
шайб в заданном периоде для указанной команды.
|
||
"""
|
||
df = pd.read_csv(filename)
|
||
|
||
# Фильтруем матчи только с участием выбранной команды
|
||
team_df = df[(df['Команда_1'] == team_name) | (df['Команда_2'] == team_name)].copy()
|
||
|
||
# Сортируем по датам
|
||
team_df = team_df.sort_values(by='Дата')
|
||
|
||
# Парсим счет в заданном периоде
|
||
period_col = f'Период_{period_number}'
|
||
h, a = parse_score(team_df, period_col)
|
||
|
||
# Определяем разницу забитых и пропущенных шайб для выбранной команды
|
||
is_home = team_df['Команда_1'] == team_name
|
||
deltas = (h - a) * (2 * is_home.astype(int) - 1)
|
||
|
||
result = pd.DataFrame({
|
||
'Дата': team_df['Дата'],
|
||
'Разница': deltas.astype(int)
|
||
})
|
||
return result
|
||
|
||
|
||
def show_period_goals_diff_histogram(filename, period_number, team_name, output_path=None):
|
||
"""
|
||
Строит и отображает/сохраняет гистограмму разницы
|
||
забитых и пропущенных шайб в заданном периоде для выбранной команды по датам.
|
||
"""
|
||
data = calculate_period_goals_diff(filename, period_number, team_name)
|
||
|
||
dates = data['Дата']
|
||
deltas = data['Разница']
|
||
|
||
plt.figure(figsize=(14, 7))
|
||
|
||
# Задаем красивые цвета без ветвления
|
||
color_map = {-1: '#e74c3c', 0: '#95a5a6', 1: '#2ecc71'}
|
||
signs = np.sign(deltas)
|
||
colors = [color_map[s] for s in signs]
|
||
|
||
# Рисуем столбчатую диаграмму
|
||
plt.bar(dates, deltas, color=colors, edgecolor='black', alpha=0.85)
|
||
|
||
plt.title(f"Разница шайб в {period_number}-м периоде у команды '{team_name}' по датам", fontsize=14, fontweight='bold')
|
||
plt.xlabel('Дата матча', fontsize=12)
|
||
plt.ylabel('Разница забитых и пропущенных шайб', fontsize=12)
|
||
|
||
# Настраиваем деления оси Y, чтобы были только целые числа
|
||
min_val = int(deltas.min())
|
||
max_val = int(deltas.max())
|
||
plt.yticks(range(min_val - 1, max_val + 2))
|
||
|
||
# Поворачиваем даты на 90 градусов
|
||
plt.xticks(rotation=90, fontsize=8)
|
||
|
||
# Добавляем горизонтальную линию на уровне 0
|
||
plt.axhline(0, color='black', linewidth=1.2, linestyle='--')
|
||
|
||
# Добавляем сетку по оси Y
|
||
plt.grid(axis='y', linestyle=':', alpha=0.6)
|
||
|
||
plt.tight_layout()
|
||
|
||
# Вызываем нужный метод сохранения или показа без ветвления через словарь
|
||
actions = {
|
||
True: lambda: plt.savefig(output_path, dpi=200),
|
||
False: lambda: plt.show()
|
||
}
|
||
actions[output_path is not None]()
|
||
|
||
|
||
# Дополняем аргументы командной строки до 5 элементов, чтобы избежать IndexError
|
||
args = sys.argv + [None] * (5 - len(sys.argv))
|
||
|
||
# Запуск
|
||
show_period_goals_diff_histogram(args[1], int(args[2]), args[3], args[4])
|