Загрузка данных


import csv

# Инициализация структур для сбора статистики
pclass_counts = {}  # 1. Всего человек в каждом классе
total_survived = 0  # 2. Всего выжило
total_dead = 0  # 2. Всего утонуло
class_survived = {}  # 3. Выжило в каждом классе
gender_survived = {"F": 0, "M": 0}  # 4. Выжившие по полу
gender_class_survived = (
    {}
)  # 5. Разбиение выживших женщин и мужчин по классам

survived_passengers = []  # Для задач 6 и 7 (поиск старших/младших выживших)
class_fares = {}  # 8. Стоимость билетов по классам

# Открытие и чтение CSV-файла
# Замените 'titanic.csv' на путь к вашему файлу
with open("titanic.csv", mode="r", encoding="utf-8") as file:
    # Используем DictReader, чтобы каждая строчка была словарем
    reader = csv.DictReader(file)

    for row in reader:
        # Пропускаем строки с незаполненными ключевыми данными, если такие есть
        if not row["Pclass"] or not row["Survived"]:
            continue

        pclass = row["Pclass"]
        survived = int(row["Survived"])
        sex = row["Sex"]

        # 1. Сколько человек плыло в каждом классе
        pclass_counts[pclass] = pclass_counts.get(pclass, 0) + 1

        # 2. Сколько всего человек выжило, а сколько утонуло
        if survived == 1:
            total_survived += 1

            # 3. Сколько человек в каждом классе выжило
            class_survived[pclass] = class_survived.get(pclass, 0) + 1

            # 4. Кого больше выжило, женщин или мужчин
            if sex in gender_survived:
                gender_survived[sex] += 1

            # 5. Найдите разбиение выживших женщин и мужчин по классам
            if pclass not in gender_class_survived:
                gender_class_survived[pclass] = {"F": 0, "M": 0}
            if sex in gender_class_survived[pclass]:
                gender_class_survived[pclass][sex] += 1

            # Сбор данных для 6 и 7 задач (возраст)
            if row["Age"]:  # Проверяем, указан ли возраст
                try:
                    age = float(row["Age"])
                    # Сохраняем имя и возраст выжившего
                    name = f"{row.get('First Name', '')} {row.get('Last Name', '')}".strip()
                    if not name:  # Если колонки называются иначе (например, Name)
                        name = row.get("Name", "Неизвестно")
                    survived_passengers.append({"name": name, "age": age})
                except ValueError:
                    pass  # Если возраст некорректный

        else:
            total_dead += 1

        # 8. Сбор стоимости билетов для каждого класса
        if row["Fare"]:
            try:
                fare = float(row["Fare"])
                if pclass not in class_fares:
                    class_fares[pclass] = []
                class_fares[pclass].append(fare)
            except ValueError:
                pass

# --- ВЫВОД РЕЗУЛЬТАТОВ ---

print("1. Количество людей в каждом классе:")
for pclass, count in sorted(pclass_counts.items()):
    print(f"   Класс {pclass}: {count} чел.")

print(f"\n2. Всего выжило: {total_survived} чел., утонуло: {total_dead} чел.")

print("\n3. Количество выживших в каждом классе:")
for pclass, count in sorted(class_survived.items()):
    print(f"   Класс {pclass}: {count} чел.")

print(
    f"\n4. Выжило женщин: {gender_survived['F']}, мужчин: {gender_survived['M']}"
)
if gender_survived["F"] > gender_survived["M"]:
    print("   Выжило больше женщин.")
elif gender_survived["M"] > gender_survived["F"]:
    print("   Выжило больше мужчин.")
else:
    print("   Выжило поровну.")

print("\n5. Разбиение выживших женщин и мужчин по классам:")
for pclass, genders in sorted(gender_class_survived.items()):
    print(
        f"   Класс {pclass} -> Женщин: {genders['F']}, Мужчин: {genders['M']}"
    )

# Сортировка пассажиров для задач 6 и 7
# Сортируем по возрасту в порядке убывания
survived_passengers.sort(key=lambda x: x["age"], reverse=True)

print("\n6. Пять самых старших выживших:")
for p in survived_passengers[:5]:
    print(f"   {p['name']} — {p['age']} лет")

print("\n7. Пять самых молодых выживших:")
# Берём 5 элементов с конца отсортированного списка (самые молодые)
for p in reversed(survived_passengers[-5:]):
    print(f"   {p['name']} — {p['age']} лет")

print("\n8. Стоимость билетов по классам (Макс / Мин / Средняя):")
for pclass, fares in sorted(class_fares.items()):
    max_fare = max(fares)
    min_fare = min(fares)
    avg_fare = sum(fares) / len(fares)
    print(
        f"   Класс {pclass} -> Макс: {max_fare:.2f}, Мин: {min_fare:.2f}, Средняя: {avg_fare:.2f}"
    )