ПРИЛОЖЕНИЕ 5

 

ЭТАЛОН ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ №4 (ЛР4): ТАБЛИЧНЫЙ АНАЛИЗ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ PANDAS

 

import pandas as pd

# =========================
# Константы
# =========================

DATA_PATH = "data/spotify_edu_dataset_ru_complex.csv"

NUMERIC_COLUMNS = [
    "duration_sec",
    "energy",
    "danceability",
    "tempo",
    "views"
]

# =========================
# Функции
# =========================

def load_data(path: str) -> pd.DataFrame:
    """Загрузка данных из CSV-файла."""
    return pd.read_csv(path)


def convert_numeric_columns(df: pd.DataFrame, columns: list) -> pd.DataFrame:
    """Приведение указанных столбцов к числовому типу."""
    for col in columns:
        df[col] = pd.to_numeric(df[col], errors="coerce")
    return df


def basic_info(df: pd.DataFrame) -> None:
    """Вывод общей информации о DataFrame."""
    print(df.info())
    print("\nКоличество пропусков:")
    print(df.isna().sum())


def filter_high_energy(df: pd.DataFrame) -> pd.DataFrame:
    """Фильтрация треков с высоким energy."""
    return df[df["energy"] > 0.8]


def top_views(df: pd.DataFrame, n: int = 10) -> pd.DataFrame:
    """Топ-N треков по просмотрам."""
    return df.sort_values("views", ascending=False).head(n)


def group_by_genre(df: pd.DataFrame) -> pd.DataFrame:
    """Группировка по жанру."""
    return df.groupby("genre").agg({
        "views": "mean",
        "duration_sec": "median"
    })


def build_pivot(df: pd.DataFrame) -> pd.DataFrame:
    """Построение сводной таблицы."""
    return pd.pivot_table(
        df,
        values="views",
        index="genre",
        aggfunc="mean"
    )


# =========================
# Основной сценарий
# =========================

def main():

    # Загрузка
    df = load_data(DATA_PATH)

    # Первичный анализ
    print(df.head())
    basic_info(df)

    # Очистка типов
    df = convert_numeric_columns(df, NUMERIC_COLUMNS)

    # Фильтрация
    high_energy = filter_high_energy(df)
    print("\nТреки с energy > 0.8:")
    print(high_energy.head())

    # Топ по просмотрам
    print("\nТоп 10 по просмотрам:")
    print(top_views(df))

    # Группировка
    print("\nГруппировка по жанрам:")
    print(group_by_genre(df))

    # Сводная таблица
    print("\nСводная таблица:")
    print(build_pivot(df))


if __name__ == "__main__":
    main()