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])