ЭТАЛОН ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ №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()