Task1_of_summer_practice/individual_5.py

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