Counter Strike

Популярное оружие в Counter-Strike

В этом уроке вы напишете код, который покажет, какое оружие встречается чаще всего в датасете csgo_round_snapshots.csv.

Что считаем "популярностью"

В датасете есть столбцы:

  • ct_weapon_X - сколько единиц оружия X у команды Counter-Terrorists в раунде
  • t_weapon_X - сколько единиц оружия X у команды Terrorists в раунде

Мы будем считать популярность так:

  1. Берём все столбцы ct_weapon_* и t_weapon_*.
  2. Делаем очистку данных: убираем пистолеты (стартовое оружие раунда).
  3. Складываем значения по всем строкам.
  4. Сортируем по убыванию.
  5. Берём топ оружия.

В рамках курса считаем, что одна строка в файле - это один раунд.

Важный этап работы Data Engineer

Исключение лишних категорий (в нашем случае пистолетов) - это этап очистки данных.
Это нормальная часть цикла работы Data Engineer:
сбор данных → очистка → преобразование → расчёты и проверка результата.

Упражнение 1. Найти столбцы оружия

Добавьте в counterstrike.py функцию:

PISTOL_WEAPONS = {
    'glock',
    'usps',
    'p2000',
    'p250',
    'fiveseven',
    'tec9',
    'deagle',
    'elite',
    'cz75auto',
    'r8revolver',
}
 
 
def is_non_pistol_weapon_column(column_name: str) -> bool:
    if not (column_name.startswith('ct_weapon_') or column_name.startswith('t_weapon_')):
        return False
 
    weapon_name = column_name.replace('ct_weapon_', '').replace('t_weapon_', '')
    return weapon_name not in PISTOL_WEAPONS
 
 
def get_weapon_columns():
    with open('csgo_round_snapshots.csv', 'r', encoding='utf-8') as file:
        reader = csv.reader(file)
        header = next(reader)
 
    ct_weapon_columns = [
        col for col in header if col.startswith('ct_weapon_') and is_non_pistol_weapon_column(col)
    ]
    t_weapon_columns = [
        col for col in header if col.startswith('t_weapon_') and is_non_pistol_weapon_column(col)
    ]
 
    print("Исключаем пистолеты как стартовое оружие раунда.")
    print(f"Counter-Terrorists weapon columns (без пистолетов): {len(ct_weapon_columns)}")
    print(f"Terrorists weapon columns (без пистолетов): {len(t_weapon_columns)}")
    return ct_weapon_columns, t_weapon_columns

Запуск:

python counterstrike.py get_weapon_columns

Ожидаемо: столбцов станет меньше, потому что пистолеты будут исключены.

Упражнение 2. Посчитать популярность оружия для Counter-Terrorists и Terrorists

Добавьте функцию:

def calculate_weapon_totals():
    with open('csgo_round_snapshots.csv', 'r', encoding='utf-8') as file:
        reader = csv.DictReader(file)
 
        ct_cols, t_cols = get_weapon_columns()
 
        totals = {}
 
        for row in reader:
            for col in ct_cols:
                weapon = col.replace('ct_weapon_', '')
                totals[weapon] = totals.get(weapon, 0) + int(float(row[col]))
 
            for col in t_cols:
                weapon = col.replace('t_weapon_', '')
                totals[weapon] = totals.get(weapon, 0) + int(float(row[col]))
 
    return totals

Упражнение 3. Вывести топ-10 самого популярного оружия

Добавьте функцию:

def top_10_weapons():
    totals = calculate_weapon_totals()
    sorted_totals = sorted(totals.items(), key=lambda item: item[1], reverse=True)
 
    print("Топ-10 самого популярного оружия:")
    for idx, (weapon, count) in enumerate(sorted_totals[:10], start=1):
        print(f"{idx}. {weapon}: {count}")

Запуск:

python counterstrike.py top_10_weapons

Упражнение 4 (дополнительно). Сравнить Counter-Terrorists и Terrorists отдельно

Сделайте две отдельные функции:

  • top_weapons_ct()
  • top_weapons_t()

Идея:

  • в первой учитывайте только ct_weapon_* и исключайте пистолеты;
  • во второй только t_weapon_* и исключайте пистолеты.

Это покажет, отличается ли популярное оружие по сторонам.

Мини-чеклист

  • Скрипт запускается через python counterstrike.py <имя_функции>.
  • В коде используются только нужные столбцы ct_weapon_* и t_weapon_*, без пистолетов.
  • Вы видите топ оружия в терминале.
  • Вы можете объяснить, как считается популярность оружия по раундам.