Skip to content

Instantly share code, notes, and snippets.

@LeonidStarykh
Created February 14, 2021 16:01
Show Gist options
  • Save LeonidStarykh/7b199cec7f65e0f3fb59c2dc5440636b to your computer and use it in GitHub Desktop.
Save LeonidStarykh/7b199cec7f65e0f3fb59c2dc5440636b to your computer and use it in GitHub Desktop.
It's my first project
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "5UYxO1GdF6Wy",
"tags": [
"f6c88c58-a82b-4f28-8bd6-fd55c0017917"
]
},
"source": [
"# Этап 1. Получение данных"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "iI4ITclJaFWh"
},
"source": [
"Изучим данные, предоставленные сервисом для проекта."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "0skiEFxDZ0Tr"
},
"source": [
"## Импорт библиотек"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "HirRov5vZ3MT"
},
"outputs": [],
"source": [
"# <импорт библиотеки pandas>\n",
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "Tr8dl3PWGFIk"
},
"source": [
"Прочитаем файл *music_project.csv* и сохраним его в переменной *df*. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "NB6j931yS4hy"
},
"outputs": [],
"source": [
"# <чтение файла с данными с сохранением в df>\n",
"df = pd.read_csv('/datasets/music_project.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "y2usmNMlDLbY",
"tags": [
"f3a2f13f-d110-4558-a520-4805b5bd1dfe"
]
},
"source": [
"Получение первых 10 строк таблицы."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "DY5i8tgXVDGj",
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>userID</th>\n",
" <th>Track</th>\n",
" <th>artist</th>\n",
" <th>genre</th>\n",
" <th>City</th>\n",
" <th>time</th>\n",
" <th>Day</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>FFB692EC</td>\n",
" <td>Kamigata To Boots</td>\n",
" <td>The Mass Missile</td>\n",
" <td>rock</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>20:28:33</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>55204538</td>\n",
" <td>Delayed Because of Accident</td>\n",
" <td>Andreas Rönnberg</td>\n",
" <td>rock</td>\n",
" <td>Moscow</td>\n",
" <td>14:07:09</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>20EC38</td>\n",
" <td>Funiculì funiculà</td>\n",
" <td>Mario Lanza</td>\n",
" <td>pop</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>20:58:07</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>A3DD03C9</td>\n",
" <td>Dragons in the Sunset</td>\n",
" <td>Fire + Ice</td>\n",
" <td>folk</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>08:37:09</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>E2DC1FAE</td>\n",
" <td>Soul People</td>\n",
" <td>Space Echo</td>\n",
" <td>dance</td>\n",
" <td>Moscow</td>\n",
" <td>08:34:34</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>842029A1</td>\n",
" <td>Преданная</td>\n",
" <td>IMPERVTOR</td>\n",
" <td>rusrap</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>13:09:41</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>4CB90AA5</td>\n",
" <td>True</td>\n",
" <td>Roman Messer</td>\n",
" <td>dance</td>\n",
" <td>Moscow</td>\n",
" <td>13:00:07</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>F03E1C1F</td>\n",
" <td>Feeling This Way</td>\n",
" <td>Polina Griffith</td>\n",
" <td>dance</td>\n",
" <td>Moscow</td>\n",
" <td>20:47:49</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\n",
" <td>8FA1D3BE</td>\n",
" <td>И вновь продолжается бой</td>\n",
" <td>NaN</td>\n",
" <td>ruspop</td>\n",
" <td>Moscow</td>\n",
" <td>09:17:40</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>E772D5C0</td>\n",
" <td>Pessimist</td>\n",
" <td>NaN</td>\n",
" <td>dance</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>21:20:49</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" userID Track artist genre \\\n",
"0 FFB692EC Kamigata To Boots The Mass Missile rock \n",
"1 55204538 Delayed Because of Accident Andreas Rönnberg rock \n",
"2 20EC38 Funiculì funiculà Mario Lanza pop \n",
"3 A3DD03C9 Dragons in the Sunset Fire + Ice folk \n",
"4 E2DC1FAE Soul People Space Echo dance \n",
"5 842029A1 Преданная IMPERVTOR rusrap \n",
"6 4CB90AA5 True Roman Messer dance \n",
"7 F03E1C1F Feeling This Way Polina Griffith dance \n",
"8 8FA1D3BE И вновь продолжается бой NaN ruspop \n",
"9 E772D5C0 Pessimist NaN dance \n",
"\n",
" City time Day \n",
"0 Saint-Petersburg 20:28:33 Wednesday \n",
"1 Moscow 14:07:09 Friday \n",
"2 Saint-Petersburg 20:58:07 Wednesday \n",
"3 Saint-Petersburg 08:37:09 Monday \n",
"4 Moscow 08:34:34 Monday \n",
"5 Saint-Petersburg 13:09:41 Friday \n",
"6 Moscow 13:00:07 Wednesday \n",
"7 Moscow 20:47:49 Wednesday \n",
"8 Moscow 09:17:40 Friday \n",
"9 Saint-Petersburg 21:20:49 Wednesday "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <получение первых 10 строк таблицы df>\n",
"df.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "FrIiRHuHIBbN",
"tags": [
"0210c096-9595-4600-b91d-42ab36a6c3f0"
]
},
"source": [
"Общая информация о данных таблицы *df*.\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "K7t8OdZsYN2y"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 65079 entries, 0 to 65078\n",
"Data columns (total 7 columns):\n",
" userID 65079 non-null object\n",
"Track 63848 non-null object\n",
"artist 57876 non-null object\n",
"genre 63881 non-null object\n",
" City 65079 non-null object\n",
"time 65079 non-null object\n",
"Day 65079 non-null object\n",
"dtypes: object(7)\n",
"memory usage: 3.5+ MB\n"
]
}
],
"source": [
"# <получение общей информации о данных в таблице df>\n",
"df.info()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "CnHv9HZCc7LN"
},
"source": [
"Рассмотрим полученную информацию подробнее.\n",
"\n",
"Всего в таблице 7 столбцов, тип данных у каждого столбца - <object>.\n",
"\n",
"Подробно разберём, какие в *df* столбцы и какую информацию они содержат:\n",
"\n",
"* userID — идентификатор пользователя;\n",
"* Track — название трека; \n",
"* artist — имя исполнителя;\n",
"* genre — название жанра;\n",
"* City — город, в котором происходило прослушивание;\n",
"* time — время, в которое пользователь слушал трек;\n",
"* Day — день недели.\n",
"\n",
"Количество значений в столбцах различается. Это говорит о том, что в данных есть <пустые> значения.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "DCYFm5VrevuB"
},
"source": [
"**Выводы**"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "PCEtjdmvezRm"
},
"source": [
"Каждая строка таблицы содержит информацию о композициях определённого жанра в определённом исполнении, которые пользователи слушали в одном из городов в определённое время и день недели. Две проблемы, которые нужно решать: пропуски и некачественные названия столбцов. Для проверки рабочих гипотез особенно ценны столбцы *time*, *day* и *City*. Данные из столбца *genre* позволят узнать самые популярные жанры."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "ZYaC0bU-IZ0a",
"tags": [
"2c946931-9c91-4e15-baf8-43fb79bcb454"
]
},
"source": [
"# Этап 2. Предобработка данных"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "Dl8grmTrPxZi"
},
"source": [
"Исключим пропуски, переименуем столбцы, а также проверим данные на наличие дубликатов."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "6OIhlsG_IjI8"
},
"source": [
"Получаем перечень названий столбцов. Какая наблюдается проблема — кроме тех, что уже были названы ранее?"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "Tag65F_Uitsx"
},
"outputs": [
{
"data": {
"text/plain": [
"Index([' userID', 'Track', 'artist', 'genre', ' City ', 'time', 'Day'], dtype='object')"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <перечень названий столбцов таблицы df>\n",
"df.columns"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "x6iJC-cEhnRL"
},
"source": [
"В названиях столбцов есть пробелы, которые могут затруднять доступ к данным."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "BK6m6-DZhlTs",
"tags": [
"c2b469cf-2148-4115-8806-0fbb00a9d55d"
]
},
"source": [
"Переименуем столбцы для удобства дальнейшей работы. Проверим результат.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "XintVfCniw2-"
},
"outputs": [],
"source": [
"# <переименование столбцов>\n",
"new_columns = ['user_id', 'track_name', 'artist_name', 'genre_name', 'city', 'time', 'weekday']\n",
"df.set_axis(new_columns, axis='columns', inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "ozQL91G4izdp"
},
"outputs": [
{
"data": {
"text/plain": [
"Index(['user_id', 'track_name', 'artist_name', 'genre_name', 'city', 'time',\n",
" 'weekday'],\n",
" dtype='object')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <проверка результатов - перечень названий столбцов>\n",
"df.columns"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "oc2qS2UBIkQu",
"tags": [
"325fae3b-abce-4c7c-8c41-87ed8a26ff5d"
]
},
"source": [
"Проверим данные на наличие пропусков вызовом набора методов для суммирования пропущенных значений."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "BZh9yLHhjy_R"
},
"outputs": [
{
"data": {
"text/plain": [
"user_id 0\n",
"track_name 1231\n",
"artist_name 7203\n",
"genre_name 1198\n",
"city 0\n",
"time 0\n",
"weekday 0\n",
"dtype: int64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <суммарное количество пропусков, выявленных методом isnull() в таблице df>\n",
"df.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "OJXGaa02tSJJ"
},
"source": [
"Пустые значения свидетельствуют, что для некоторых треков доступна не вся информация. Причины могут быть разные: скажем, не назван конкретный исполнитель народной песни. Хуже, если проблемы с записью данных. Каждый отдельный случай необходимо разобрать и выявить причину."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "-fBDAWZUkAg-"
},
"source": [
"Заменяем пропущенные значения в столбцах с названием трека и исполнителя на строку 'unknown'. После этой операции нужно убедиться, что таблица больше не содержит пропусков."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "EO8zFcJPlbvV"
},
"outputs": [],
"source": [
"# <замена пропущенных значений в столбце 'track_name' на строку 'unknown' специальным методом замены>\n",
"df['track_name'] = df['track_name'].fillna('unknown')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "3hsNZcLST0UW"
},
"outputs": [],
"source": [
"# <замена пропущенных значений в столбце 'artist_name' на строку 'unknown' специальным методом замены>\n",
"df['artist_name'] = df['artist_name'].fillna('unknown')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "Ua-Z8TAblgzC"
},
"outputs": [
{
"data": {
"text/plain": [
"user_id 0\n",
"track_name 0\n",
"artist_name 0\n",
"genre_name 1198\n",
"city 0\n",
"time 0\n",
"weekday 0\n",
"dtype: int64"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <проверка: вычисление суммарного количества пропусков, выявленных в таблице df>\n",
"df.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "-cjfT0w2ln9C",
"tags": [
"9cb28dd4-e24e-4490-aebd-b37ba9e492c5"
]
},
"source": [
"Удаляем в столбце с жанрами пустые значения; убеждаемся, что их больше не осталось."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "TIpk7lwtnZkZ"
},
"outputs": [],
"source": [
"# <удаление пропущенных значений в столбце 'genre_name'>\n",
"df.dropna(subset=['genre_name'], inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "-1CT-CCZnzTA"
},
"outputs": [
{
"data": {
"text/plain": [
"user_id 0\n",
"track_name 0\n",
"artist_name 0\n",
"genre_name 0\n",
"city 0\n",
"time 0\n",
"weekday 0\n",
"dtype: int64"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <проверка>\n",
"df.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "QsBXpJFzpxA9",
"tags": [
"ea46db29-6746-4c02-a47b-75283dde9025"
]
},
"source": [
"Необходимо установить наличие дубликатов. Если найдутся, удаляем, и проверяем, все ли удалились."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "VRVI_B0RqIgT"
},
"outputs": [
{
"data": {
"text/plain": [
"3755"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <получение суммарного количества дубликатов в таблице df>\n",
"df.duplicated().sum()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "nSYF38OeqZn-"
},
"outputs": [],
"source": [
"# <удаление всех дубликатов из таблицы df специальным методом>\n",
"df = df.drop_duplicates().reset_index(drop=True)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "O-RfjmkCqIgV"
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <проверка на отсутствие>\n",
"df.duplicated().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "e6cyWPTwsLKw"
},
"source": [
"Дубликаты могли появиться вследствие сбоя в записи данных. Стоит обратить внимание и разобраться с причинами появления такого «информационного мусора»."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "QH-HgrApInjO",
"tags": [
"46fb87e8-2d9c-497d-9c6e-746eaa2631ab"
]
},
"source": [
"Сохраняем список уникальных значений столбца с жанрами в переменной *genres_list*. \n",
"\n",
"Объявим функцию *find_genre()* для поиска неявных дубликатов в столбце с жанрами. Например, когда название одного и того же жанра написано разными словами.\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "FfaTfKAN-PCx"
},
"outputs": [],
"source": [
"# <сохранение в переменной genres_list списка уникальных значений, выявленных специальным методом в столбце 'genre_name'>\n",
"genres_list = df['genre_name'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "TA_k-VLi-S0R"
},
"outputs": [],
"source": [
"# <создание функции find_genre()>\n",
"# функция принимает как параметр строку с названием искомого жанра\n",
"# в теле объявляется переменная-счётчик, ей присваивается значение 0,\n",
"# затем цикл for проходит по списку уникальных значений\n",
"# если очередной элемент списка равен параметру функции, \n",
"# то значение счётчика увеличивается на 1\n",
"# по окончании работы цикла функция возвращает значение счётчика\n",
"def find_genre(string):\n",
" count = 0\n",
" for genre in genres_list:\n",
" if genre == string:\n",
" count += 1\n",
" return count"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "vb3CTOciIL27",
"tags": [
"b57e3325-29fc-4ade-83a3-91113c5dad32"
]
},
"source": [
"Вызов функции *find_genre()* для поиска различных вариантов названия жанра хип-хоп в таблице.\n",
"\n",
"Правильное название — *hiphop*. Поищем другие варианты:\n",
"\n",
"* hip\n",
"* hop\n",
"* hip-hop\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "YrwqExZS-dyQ"
},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <вызовом функции find_genre() проверяется наличие варианта 'hip'>\n",
"find_genre('hip')"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "ZoL4EEcR-dyU"
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <проверяется наличие варианта 'hop'>\n",
"find_genre('hop')"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "MFowmiug-qZD"
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <проверяется наличие варианта 'hip-hop'>\n",
"find_genre('hip-hop')"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "a7BQY6ORLMSG",
"tags": [
"11f77aa1-5478-453d-b31e-f20041047bb7"
]
},
"source": [
"Объявим функцию *find_hip_hop()*, которая заменяет неправильное название этого жанра в столбце *'genre_name'* на *'hiphop'* и проверяет успешность выполнения замены.\n",
"\n",
"Так исправляем все варианты написания, которые выявила проверка."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "31xlzL_c_FgB"
},
"outputs": [],
"source": [
"# <создание функции find_hip_hop()>\n",
"# функция принимает как параметры таблицу df и неверное название\n",
"# к столбцу 'genre_name' применяется специальный метод, \n",
"# который заменяет второй параметр на строку 'hiphop'\n",
"# результат работы равен подсчитанному методом count() числу значений столбца, \n",
"# которые равны второму параметру\n",
"# функция возвращает результат\n",
"def find_hip_hop(df, wrong_name):\n",
" df['genre_name'] = df['genre_name'].replace(wrong_name, 'hiphop')\n",
" result = df[df['genre_name'] == wrong_name]['genre_name'].count()\n",
" return result"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "ZFXMV2qW_FgE"
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <замена одного неверного варианта на hiphop вызовом функции find_hip_hop()>\n",
"find_hip_hop(df, 'hip')"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "i90BILA9JQpE",
"tags": [
"30535c8e-1643-4088-925b-2a32180e0333"
]
},
"source": [
"Получаем общую информацию о данных. Убеждаемся, что чистка выполнена успешно."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "-yyvdzHA_uJm"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 60126 entries, 0 to 60125\n",
"Data columns (total 7 columns):\n",
"user_id 60126 non-null object\n",
"track_name 60126 non-null object\n",
"artist_name 60126 non-null object\n",
"genre_name 60126 non-null object\n",
"city 60126 non-null object\n",
"time 60126 non-null object\n",
"weekday 60126 non-null object\n",
"dtypes: object(7)\n",
"memory usage: 3.2+ MB\n"
]
}
],
"source": [
"# <получение общей информации о данных таблицы df>\n",
"df.info()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "AReHO17cMRPM"
},
"source": [
"**Вывод**"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "yscfstUqMS4c"
},
"source": [
"На этапе предобработки в данных обнаружились не только пропуски и проблемы с названиями столбцов, но и всяческие виды дубликатов. Их удаление позволит провести анализ точнее. Поскольку сведения о жанрах важно сохранить для анализа, не просто удаляем все пропущенные значения, но заполним пропущенные имена исполнителей и названия треков. Имена столбцов теперь корректны и удобны для дальнейшей работы."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "MF4nnd1YJUrI",
"tags": [
"ac8df732-1797-479a-9c4c-a03745931a9d"
]
},
"source": [
"# Действительно ли музыку в разных городах слушают по-разному?"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "AYSL1OvyM2pL"
},
"source": [
"Была выдвинута гипотеза, что в Москве и Санкт-Петербурге пользователи слушают музыку по-разному. Проверяем это предположение по данным о трёх днях недели — понедельнике, среде и пятнице.\n",
"\n",
"Для каждого города устанавливаем количество прослушанных в эти дни композиций с известным жанром, и сравниваем результаты."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "OM5Eeh7FNWC-"
},
"source": [
"Группируем данные по городу и вызовом метода *count()* подсчитываем композиции, для которых известен жанр."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "AtH_pP1i_0m1"
},
"outputs": [
{
"data": {
"text/plain": [
"city\n",
"Moscow 41892\n",
"Saint-Petersburg 18234\n",
"Name: genre_name, dtype: int64"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <группировка данных таблицы df по столбцу 'city' и подсчёт количества значений столбца 'genre_name'>\n",
"df.groupby('city')['genre_name'].count()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "XBR226DMpIDf"
},
"source": [
"В Москве прослушиваний больше, чем в Питере, но это не значит, что Москва более активна. У Яндекс.Музыки в целом больше пользователей в Москве, поэтому величины сопоставимы."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "P7EcNQuyNbNB",
"tags": [
"133ddd49-3b63-45b1-b50c-9e6ab5fc4175"
]
},
"source": [
"Сгруппируем данные по дню недели и подсчитаем прослушанные в понедельник, среду и пятницу композиции, для которых известен жанр."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "A8E_Tb2b_3un"
},
"outputs": [
{
"data": {
"text/plain": [
"weekday\n",
"Friday 21482\n",
"Monday 20866\n",
"Wednesday 17778\n",
"Name: genre_name, dtype: int64"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <группировка данных по столбцу 'weekday' и подсчёт количества значений столбца 'genre_name'>\n",
"df.groupby('weekday')['genre_name'].count()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "Zhh6hehCpq_U"
},
"source": [
"Понедельник и пятница — время для музыки; по средам пользователи немного больше вовлечены в работу."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "bYab2U5BNdmZ",
"tags": [
"bae0a168-5e2b-40f9-9701-bfb32d016517"
]
},
"source": [
"Создаём функцию *number_tracks()*, которая принимает как параметры таблицу, день недели и название города, а возвращает количество прослушанных композиций, для которых известен жанр. Проверяем количество прослушанных композиций для каждого города и понедельника, затем среды и пятницы."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "4SqpGSi5_7hA"
},
"outputs": [],
"source": [
"# <создание функции number_tracks()>\n",
"# объявляется функция с тремя параметрами: df, day, city\n",
"# в переменной track_list сохраняются те строки таблицы df, для которых \n",
"# значение в столбце 'weekday' равно параметру day\n",
"# и одновременно значение в столбце 'city' равно параметру city\n",
"# в переменной track_list_count сохраняется число значений столбца 'genre_name',\n",
"# рассчитанное методом count() для таблицы track_list\n",
"# функция возвращает значение track_list_count\n",
"def number_tracks(df, day, city):\n",
" track_list = df[(df['weekday']==day) & (df['city']==city)]\n",
" track_list_count = track_list['genre_name'].count()\n",
" return track_list_count"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"deletable": false
},
"outputs": [
{
"data": {
"text/plain": [
"15347"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <список композиций для Москвы в понедельник>\n",
"number_tracks(df, 'Monday', 'Moscow')"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"deletable": false
},
"outputs": [
{
"data": {
"text/plain": [
"5519"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <список композиций для Санкт-Петербурга в понедельник>\n",
"number_tracks(df, 'Monday', 'Saint-Petersburg')"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"deletable": false
},
"outputs": [
{
"data": {
"text/plain": [
"10865"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <список композиций для Москвы в среду>\n",
"number_tracks(df, 'Wednesday', 'Moscow')"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"deletable": false
},
"outputs": [
{
"data": {
"text/plain": [
"6913"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <список композиций для Санкт-Петербурга в среду>\n",
"number_tracks(df, 'Wednesday', 'Saint-Petersburg')"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"deletable": false
},
"outputs": [
{
"data": {
"text/plain": [
"15680"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <список композиций для Москвы в пятницу>\n",
"number_tracks(df, 'Friday', 'Moscow')"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"deletable": false
},
"outputs": [
{
"data": {
"text/plain": [
"5802"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <список композиций для Санкт-Петербурга в пятницу>\n",
"number_tracks(df, 'Friday', 'Saint-Petersburg')"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "tCB9zwzzqZ8g",
"tags": [
"d73e12bf-3635-484b-8fb6-c7ccc2101671"
]
},
"source": [
"Сведём полученную информацию в одну таблицу, где ['city', 'monday', 'wednesday', 'friday'] названия столбцов.\n"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"deletable": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>city</th>\n",
" <th>monday</th>\n",
" <th>wednesday</th>\n",
" <th>friday</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>Moscow</td>\n",
" <td>15347</td>\n",
" <td>10865</td>\n",
" <td>15680</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>5519</td>\n",
" <td>6913</td>\n",
" <td>5802</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" city monday wednesday friday\n",
"0 Moscow 15347 10865 15680\n",
"1 Saint-Petersburg 5519 6913 5802"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <таблица с полученными данными>\n",
"columns = ['city', 'monday', 'wednesday', 'friday']\n",
"data = [\n",
" ['Moscow', 15347, 10865, 15680],\n",
" ['Saint-Petersburg', 5519, 6913, 5802],\n",
"]\n",
"table = pd.DataFrame(data=data, columns=columns)\n",
"table"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "LKCYeMXgqPxD"
},
"source": [
"**Вывод**"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "RJpg6I8jqQ0x"
},
"source": [
"Результаты показывают, что относительно среды музыку в Петербурге и Москве слушают «зеркально»: в Москве пики приходятся на понедельник и пятницу, а в среду время прослушивания снижается. Тогда как в Санкт-Петербурге среда — день самого большого интереса к музыке, а в понедельник и пятницу он меньше, причём почти одинаково меньше."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "tLdpUGyewzGf",
"tags": [
"1eb8124a-f066-4c43-b1f4-bc672c5efd57"
]
},
"source": [
"# Утро понедельника и вечер пятницы — разная музыка или одна и та же?"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "SaQlxcVntL3x"
},
"source": [
"Ищем ответ на вопрос, какие жанры преобладают в разных городах в понедельник утром и в пятницу вечером. Есть предположение, что в понедельник утром пользователи слушают больше бодрящей музыки (например, жанра поп), а вечером пятницы — больше танцевальных (например, электронику)."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "lYGAneOaPBhS"
},
"source": [
"Получим таблицы данных по Москве *moscow_general* и по Санкт-Петербургу *spb_general*."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "Pyz1i56nA5IS"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>user_id</th>\n",
" <th>track_name</th>\n",
" <th>artist_name</th>\n",
" <th>genre_name</th>\n",
" <th>city</th>\n",
" <th>time</th>\n",
" <th>weekday</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>55204538</td>\n",
" <td>Delayed Because of Accident</td>\n",
" <td>Andreas Rönnberg</td>\n",
" <td>rock</td>\n",
" <td>Moscow</td>\n",
" <td>14:07:09</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>E2DC1FAE</td>\n",
" <td>Soul People</td>\n",
" <td>Space Echo</td>\n",
" <td>dance</td>\n",
" <td>Moscow</td>\n",
" <td>08:34:34</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>4CB90AA5</td>\n",
" <td>True</td>\n",
" <td>Roman Messer</td>\n",
" <td>dance</td>\n",
" <td>Moscow</td>\n",
" <td>13:00:07</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>F03E1C1F</td>\n",
" <td>Feeling This Way</td>\n",
" <td>Polina Griffith</td>\n",
" <td>dance</td>\n",
" <td>Moscow</td>\n",
" <td>20:47:49</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\n",
" <td>8FA1D3BE</td>\n",
" <td>И вновь продолжается бой</td>\n",
" <td>unknown</td>\n",
" <td>ruspop</td>\n",
" <td>Moscow</td>\n",
" <td>09:17:40</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <td>60120</td>\n",
" <td>83A474E7</td>\n",
" <td>I Worship Only What You Bleed</td>\n",
" <td>The Black Dahlia Murder</td>\n",
" <td>extrememetal</td>\n",
" <td>Moscow</td>\n",
" <td>21:07:12</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>60121</td>\n",
" <td>729CBB09</td>\n",
" <td>My Name</td>\n",
" <td>McLean</td>\n",
" <td>rnb</td>\n",
" <td>Moscow</td>\n",
" <td>13:32:28</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>60123</td>\n",
" <td>C5E3A0D5</td>\n",
" <td>Jalopiina</td>\n",
" <td>unknown</td>\n",
" <td>industrial</td>\n",
" <td>Moscow</td>\n",
" <td>20:09:26</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>60124</td>\n",
" <td>321D0506</td>\n",
" <td>Freight Train</td>\n",
" <td>Chas McDevitt</td>\n",
" <td>rock</td>\n",
" <td>Moscow</td>\n",
" <td>21:43:59</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>60125</td>\n",
" <td>3A64EF84</td>\n",
" <td>Tell Me Sweet Little Lies</td>\n",
" <td>Monica Lopez</td>\n",
" <td>country</td>\n",
" <td>Moscow</td>\n",
" <td>21:59:46</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>41892 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" user_id track_name artist_name \\\n",
"1 55204538 Delayed Because of Accident Andreas Rönnberg \n",
"4 E2DC1FAE Soul People Space Echo \n",
"6 4CB90AA5 True Roman Messer \n",
"7 F03E1C1F Feeling This Way Polina Griffith \n",
"8 8FA1D3BE И вновь продолжается бой unknown \n",
"... ... ... ... \n",
"60120 83A474E7 I Worship Only What You Bleed The Black Dahlia Murder \n",
"60121 729CBB09 My Name McLean \n",
"60123 C5E3A0D5 Jalopiina unknown \n",
"60124 321D0506 Freight Train Chas McDevitt \n",
"60125 3A64EF84 Tell Me Sweet Little Lies Monica Lopez \n",
"\n",
" genre_name city time weekday \n",
"1 rock Moscow 14:07:09 Friday \n",
"4 dance Moscow 08:34:34 Monday \n",
"6 dance Moscow 13:00:07 Wednesday \n",
"7 dance Moscow 20:47:49 Wednesday \n",
"8 ruspop Moscow 09:17:40 Friday \n",
"... ... ... ... ... \n",
"60120 extrememetal Moscow 21:07:12 Monday \n",
"60121 rnb Moscow 13:32:28 Wednesday \n",
"60123 industrial Moscow 20:09:26 Friday \n",
"60124 rock Moscow 21:43:59 Friday \n",
"60125 country Moscow 21:59:46 Friday \n",
"\n",
"[41892 rows x 7 columns]"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# получение таблицы moscow_general из тех строк таблицы df, \n",
"# для которых значение в столбце 'city' равно 'Moscow'\n",
"moscow_general = df[df['city'] == 'Moscow']\n",
"moscow_general"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "w3NNN-2hA-al"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>user_id</th>\n",
" <th>track_name</th>\n",
" <th>artist_name</th>\n",
" <th>genre_name</th>\n",
" <th>city</th>\n",
" <th>time</th>\n",
" <th>weekday</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>FFB692EC</td>\n",
" <td>Kamigata To Boots</td>\n",
" <td>The Mass Missile</td>\n",
" <td>rock</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>20:28:33</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>20EC38</td>\n",
" <td>Funiculì funiculà</td>\n",
" <td>Mario Lanza</td>\n",
" <td>pop</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>20:58:07</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>A3DD03C9</td>\n",
" <td>Dragons in the Sunset</td>\n",
" <td>Fire + Ice</td>\n",
" <td>folk</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>08:37:09</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>842029A1</td>\n",
" <td>Преданная</td>\n",
" <td>IMPERVTOR</td>\n",
" <td>rusrap</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>13:09:41</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>E772D5C0</td>\n",
" <td>Pessimist</td>\n",
" <td>unknown</td>\n",
" <td>dance</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>21:20:49</td>\n",
" <td>Wednesday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <td>60112</td>\n",
" <td>D94F810B</td>\n",
" <td>Theme from the Walking Dead</td>\n",
" <td>Proyecto Halloween</td>\n",
" <td>film</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>21:14:40</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>60113</td>\n",
" <td>BC8EC5CF</td>\n",
" <td>Red Lips: Gta (Rover Rework)</td>\n",
" <td>Rover</td>\n",
" <td>electronic</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>21:06:50</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>60114</td>\n",
" <td>29E04611</td>\n",
" <td>Bre Petrunko</td>\n",
" <td>Perunika Trio</td>\n",
" <td>world</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>13:56:00</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>60115</td>\n",
" <td>1B91C621</td>\n",
" <td>(Hello) Cloud Mountain</td>\n",
" <td>sleepmakeswaves</td>\n",
" <td>postrock</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>09:22:13</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <td>60122</td>\n",
" <td>D08D4A55</td>\n",
" <td>Maybe One Day (feat. Black Spade)</td>\n",
" <td>Blu &amp; Exile</td>\n",
" <td>hiphop</td>\n",
" <td>Saint-Petersburg</td>\n",
" <td>10:00:00</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>18234 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" user_id track_name artist_name \\\n",
"0 FFB692EC Kamigata To Boots The Mass Missile \n",
"2 20EC38 Funiculì funiculà Mario Lanza \n",
"3 A3DD03C9 Dragons in the Sunset Fire + Ice \n",
"5 842029A1 Преданная IMPERVTOR \n",
"9 E772D5C0 Pessimist unknown \n",
"... ... ... ... \n",
"60112 D94F810B Theme from the Walking Dead Proyecto Halloween \n",
"60113 BC8EC5CF Red Lips: Gta (Rover Rework) Rover \n",
"60114 29E04611 Bre Petrunko Perunika Trio \n",
"60115 1B91C621 (Hello) Cloud Mountain sleepmakeswaves \n",
"60122 D08D4A55 Maybe One Day (feat. Black Spade) Blu & Exile \n",
"\n",
" genre_name city time weekday \n",
"0 rock Saint-Petersburg 20:28:33 Wednesday \n",
"2 pop Saint-Petersburg 20:58:07 Wednesday \n",
"3 folk Saint-Petersburg 08:37:09 Monday \n",
"5 rusrap Saint-Petersburg 13:09:41 Friday \n",
"9 dance Saint-Petersburg 21:20:49 Wednesday \n",
"... ... ... ... ... \n",
"60112 film Saint-Petersburg 21:14:40 Monday \n",
"60113 electronic Saint-Petersburg 21:06:50 Monday \n",
"60114 world Saint-Petersburg 13:56:00 Monday \n",
"60115 postrock Saint-Petersburg 09:22:13 Monday \n",
"60122 hiphop Saint-Petersburg 10:00:00 Monday \n",
"\n",
"[18234 rows x 7 columns]"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <получение таблицы spb_general>\n",
"spb_general = df[df['city'] == 'Saint-Petersburg']\n",
"spb_general"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "duDdH_WiPLky",
"tags": [
"7f7cae13-ec1c-45c4-9204-0a4354fe1766"
]
},
"source": [
"Создаём функцию *genre_weekday()*, которая возвращает список жанров по запрошенному дню недели и времени суток с такого-то часа по такой-то."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "JhUdQynHBEYw"
},
"outputs": [],
"source": [
"# объявление функции genre_weekday() с параметрами df, day, time1, time2\n",
"# в переменной genre_list сохраняются те строки df, для которых одновременно:\n",
"# 1) значение в столбце 'weekday' равно параметру day,\n",
"# 2) значение в столбце 'time' больше time1 и\n",
"# 3) меньше time2.\n",
"# в переменной genre_list_sorted сохраняются в порядке убывания \n",
"# первые 10 значений Series, полученной подсчётом числа значений 'genre_name'\n",
"# сгруппированной по столбцу 'genre_name' таблицы genre_list\n",
"# функция возвращает значение genre_list_sorted\n",
"def genre_weekday(df, day, time1, time2):\n",
" genre_list = df[(df['weekday']==day)&(df['time'] > time1)&(df['time'] < time2)]\n",
" genre_list_sorted = genre_list.groupby('genre_name')['genre_name'].count().sort_values(ascending=False).head(10)\n",
" return genre_list_sorted"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "bxGC8kXkP7B-",
"tags": [
"63e2c3f3-fa64-4376-8221-e8b753264535"
]
},
"source": [
"Cравниваем полученные результаты по таблице для Москвы и Санкт-Петербурга в понедельник утром (с 7 до 11) и в пятницу вечером (с 17 до 23)."
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "kbgeq-55BLEI"
},
"outputs": [
{
"data": {
"text/plain": [
"genre_name\n",
"pop 781\n",
"dance 549\n",
"electronic 480\n",
"rock 474\n",
"hiphop 286\n",
"ruspop 186\n",
"world 181\n",
"rusrap 175\n",
"alternative 164\n",
"classical 157\n",
"Name: genre_name, dtype: int64"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <вызов функции для утра понедельника в Москве (вместо df таблица moscow_general)>\n",
"genre_weekday(moscow_general, 'Monday', '07:00:00', '11:00:00')"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "XHwa8N2EBRXO"
},
"outputs": [
{
"data": {
"text/plain": [
"genre_name\n",
"pop 218\n",
"dance 182\n",
"rock 162\n",
"electronic 147\n",
"hiphop 80\n",
"ruspop 64\n",
"alternative 58\n",
"rusrap 55\n",
"jazz 44\n",
"classical 40\n",
"Name: genre_name, dtype: int64"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <вызов функции для утра понедельника в Петербурге (вместо df таблица spb_general)>\n",
"genre_weekday(spb_general, 'Monday', '07:00:00', '11:00:00')"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "YvdSbg2jBUeq"
},
"outputs": [
{
"data": {
"text/plain": [
"genre_name\n",
"pop 713\n",
"rock 517\n",
"dance 495\n",
"electronic 482\n",
"hiphop 273\n",
"world 208\n",
"ruspop 170\n",
"alternative 163\n",
"classical 163\n",
"rusrap 142\n",
"Name: genre_name, dtype: int64"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <вызов функции для вечера пятницы в Москве>\n",
"genre_weekday(moscow_general, 'Friday', '17:00:00', '23:00:00')"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "Ew3ig4fPBUeu"
},
"outputs": [
{
"data": {
"text/plain": [
"genre_name\n",
"pop 256\n",
"rock 216\n",
"electronic 216\n",
"dance 210\n",
"hiphop 97\n",
"alternative 63\n",
"jazz 61\n",
"classical 60\n",
"rusrap 59\n",
"world 54\n",
"Name: genre_name, dtype: int64"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <вызов функции для вечера пятницы в Питере>\n",
"genre_weekday(spb_general, 'Friday', '17:00:00', '23:00:00')"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "UenYBZTIwYT-"
},
"source": [
"Популярные жанры в понедельник утром в Питере и Москве оказались похожи: везде, как и предполагалось, популярен поп. Несмотря на это, концовка топ-10 для двух городов различается: в Питере в топ-10 входит джаз и русский рэп, а в Москве жанр *world*.\n",
"\n",
"В конце недели ситуация не меняется. Поп-музыка всё так же на первом месте. Опять разница заметна только в концовке топ-10, где в Питере пятничным вечером тоже присутствует жанр *world*."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "MBxfrKPAykp_"
},
"source": [
"**Вывод**"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "j8ypBMwSymL6"
},
"source": [
"Жанр поп безусловный лидер, а топ-5 в целом не различается в обеих столицах. При этом видно, что концовка списка более «живая»: для каждого города выделяются более характерные жанры, которые действительно меняют свои позиции в зависимости от дня недели и времени."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "D7YMmgKRw270",
"tags": [
"f363205e-76b1-4883-abf1-bf21c9572dc7"
]
},
"source": [
"# Москва и Питер — две разные столицы, два разных направления в музыке. Правда?"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "Wc5srT13zb4Z"
},
"source": [
"Гипотеза: Питер богат своей рэп-культурой, поэтому это направление там слушают чаще, а Москва — город контрастов, но основная масса пользователей слушает попсу.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "2SFE9_RV2KEL"
},
"source": [
"Сгруппируем таблицу *moscow_general* по жанру, сосчитаем численность композиций каждого жанра методом *count()*, отсортируем в порядке убывания и сохраним результат в таблице *moscow_genres*.\n",
"\n",
"Просмотрим первые 10 строк этой новой таблицы."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "OohoTcsYBheo"
},
"outputs": [],
"source": [
"# одной строкой: группировка таблицы moscow_general по столбцу 'genre_name', \n",
"# подсчёт числа значений 'genre_name' в этой группировке методом count(), \n",
"# сортировка Series в порядке убывания и сохранение в moscow_genres\n",
"moscow_genres = moscow_general.groupby('genre_name')['genre_name'].count().sort_values(ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "h7IhIKDrBher"
},
"outputs": [
{
"data": {
"text/plain": [
"genre_name\n",
"pop 5892\n",
"dance 4435\n",
"rock 3965\n",
"electronic 3786\n",
"hiphop 2096\n",
"classical 1616\n",
"world 1432\n",
"alternative 1379\n",
"ruspop 1372\n",
"rusrap 1161\n",
"Name: genre_name, dtype: int64"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <просмотр первых 10 строк moscow_genres>\n",
"moscow_genres.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "gjnf0lol2fUy",
"tags": [
"f7503a48-1b28-483d-9f7b-bae79fb182b5"
]
},
"source": [
"Сгруппируем таблицу *spb_general* по жанру, сосчитаем численность композиций каждого жанра методом *count()*, отсортируем в порядке убывания и сохраним результат в таблице *spb_genres*.\n",
"\n",
"Просматриваем первые 10 строк этой таблицы. Теперь можно сравнивать два города."
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "eQrdA85dB1LO"
},
"outputs": [],
"source": [
"# <группировка таблицы spb_general, расчёт, сохранение в spb_genres>\n",
"spb_genres = spb_general.groupby('genre_name')['genre_name'].count().sort_values(ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"colab": {},
"colab_type": "code",
"deletable": false,
"id": "AE-Z-1wCB1LS"
},
"outputs": [
{
"data": {
"text/plain": [
"genre_name\n",
"pop 2431\n",
"dance 1932\n",
"rock 1879\n",
"electronic 1736\n",
"hiphop 960\n",
"alternative 649\n",
"classical 646\n",
"rusrap 564\n",
"ruspop 538\n",
"world 515\n",
"Name: genre_name, dtype: int64"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# <просмотр первых 10 строк spb_genres>\n",
"spb_genres.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "J5E-kLgK2piO"
},
"source": [
"**Вывод**"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "-9R3-Qh02tNt"
},
"source": [
"В Москве, кроме абсолютно популярного жанра поп, есть направление русской популярной музыки. Значит, что интерес к этому жанру шире. А рэп, вопреки предположению, занимает в обоих городах близкие позиции."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "gLlT9nKMQ3ky",
"tags": [
"0d44c8c0-390b-4c9e-b797-ddc3993f6e58"
]
},
"source": [
"# Этап 4. Результаты исследования\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"deletable": false,
"id": "GtvyRBbD7dv5"
},
"source": [
"Рабочие гипотезы:\n",
"\n",
"* музыку в двух городах — Москве и Санкт-Петербурге — слушают в разном режиме;\n",
"\n",
"* списки десяти самых популярных жанров утром в понедельник и вечером в пятницу имеют характерные отличия;\n",
"\n",
"* население двух городов предпочитает разные музыкальные жанры.\n",
"\n",
"**Общие результаты**\n",
"\n",
"Москва и Петербург сходятся во вкусах: везде преобладает популярная музыка. При этом зависимости предпочтений от дня недели в каждом отдельном городе нет — люди постоянно слушают то, что им нравится. Но между городами в разрезе дней неделей наблюдается зеркальность относительно среды: Москва больше слушает в понедельник и пятницу, а Петербург наоборот - больше в среду, но меньше в понедельник и пятницу.\n",
"\n",
"В результате первая гипотеза <подтверждена>, вторая гипотеза <подтверждена> и третья <подтверждена>."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.8"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment