Меломан оказался таким же последовательным поклонником определённых жанров, как и те, кому хватает пяти композиций в день (исследования на остальных меломанах это подтверждают). Значит, по своим вкусам и поведению наша аудитория однородна, оценивать её «счастье» можно показателями «середнячков». Чтобы представить себе среднестатистического пользователя, понадобится описательная статистика. Из её показателей для количественного описания данных в нашей простой задаче нужны четыре меры — максимум, минимум, медиана и среднее. Наибольшее и наименьшее обычно вычисляют только по одному признаку. Например, можно получить минимальное и максимальное значение количества прослушанных секунд композиции (столбец 'total_play_seconds'). Для поиска максимума вызывают метод max(): print(df['total_play_seconds'].max()) 4707.422018 Самый длинный трек звучал почти полтора часа. Интересно, какую композицию слушали так долго. Запросим из df строку с максимальным значением, прибегнув к логической индексации с условием df['total_play_seconds'] == df['total_play_seconds'].max(): print(df[df['total_play_seconds'] == df['total_play_seconds'].max()]) USER_ID TOTAL_PLAY_SECONDS ARTIST_NAME GENRE_NAME TRACK_NAME 22181 87B5F115 4707.42 Mishary Rashid Al-Afassy world Alaraf Минимальное значение — самый короткий трек — ищут методом min(). Понятно, что в Яндекс.Музыке показателей меньше нуля не бывает: если пользователь пролистнул трек, значение 'total_play_seconds' равно 0. Нам интересно установить композиции, которые слушали хоть и недолго, но не пропустили сразу. Вот как мы создаём выборку без пропущенных треков и находим в ней минимальное значение: df_min = df[df['total_play_seconds'] != 0] print(df_min['total_play_seconds'].min()) 0.000794 Получим названия композиции, которую пропустили быстрее всего. Как и при поиске максимума, воспользуемся условием и логической индексацией: print(df_min[df_min['total_play_seconds'] == df_min['total_play_seconds'].min()]) USER_ID TOTAL_PLAY_SECONDS ARTIST_NAME GENRE_NAME TRACK_NAME 12431 984326C8 0.000794 Madera & Jenny T feat. Jenny T dance Just Don't Say Goodbye 36140 2815A725 0.000794 Chicco pop Modjadji 50506 C371F506 0.000794 Людмила Лопато romances Три года ты мне снилась Результат вывода — три трека, которые соответствуют минимальному значению. На основе полученных данных можно сделать вывод, что время прослушивания треков находится в диапазоне от 0.000794 до 4707.422018 секунд, не включая пропущенные. Это знание пригодится, чтобы разобраться с медианой и средним арифметическим. Среднее и медиана оценивают значения в центре выборки. Если тех, кто слушает долго, столько же, сколько тех, кто слушает мало — среднее подойдет. Но когда есть оторванные от основной массы лидеры, слушающие музыку по 8 часов, их результаты сильно смещают значение среднего вверх. Вот почему оценивать предпочтения широкого круга потребителей лучше медианой. image В геометрии медиана делит фигуру на две равные по площади. В статистике она делит выборку пополам: в одной половине значения меньше медианного, в другой больше. Логично, что для определения медианы список обязательно должен быть отсортирован — либо по возрастанию, либо по убыванию. Когда количество значений нечётное, медиана будет равна тому значению, которое оказалось ровно посередине отсортированного набора. Если же количество данных чётное, то медиана рассчитывается как среднее арифметическое двух соседних чисел в середине набора. Для примера возьмем 5 последних строк в таблице. Обратимся к столбцу 'total_play_seconds' и отсортируем его: df_stat_1 = df.tail() print(df_stat_1['total_play_seconds'].sort_values()) 61211 11.529112 61209 26.127000 61207 109.000000 61208 220.551837 61210 292.455000 Name: total_play_seconds, dtype: float64 Значение в середине равно 109 — это и будет медиана. Возьмём 4 последних строки в таблице, обратимся к столбцу 'total_play_seconds': df_stat = df.tail(4) print(df_stat['total_play_seconds'].sort_values()) 61211 11.529112 61209 26.127000 61208 220.551837 61210 292.455000 Name: total_play_seconds, dtype: float64 Возьмём два значения в середине — 26.127 и 220.551837. Посчитаем среднее: (26.127 + 220.551837) / 2 123.3394185 В Pandas есть метод median(), который считает медиану. По аналогии с min() и max() его можно применять ко всей таблице, к отдельному столбцу или к сгруппированным данным. Сравним результаты с теми, которые мы получили вручную: print(df_stat['total_play_seconds'].median()) 124.3138585 Теперь применим медиану ко всем значениям времени прослушивания в нашей таблице, исключив нулевые: df_drop_null = df[df['total_play_seconds'] != 0] print(df_drop_null['total_play_seconds'].median()) 37.0 Чтобы убедиться, что лидеры действительно смещают средний показатель вверх, найдём среднее арифметическое всех этих значений методом mean(): print(df_drop_null['total_play_seconds'].mean()) 109.81197057131848 Убедились? А теперь — за дело! TASK_1_7 Получите таблицу с композициями самого популярного жанра — pop, исключив пропущенные треки. Сохраните результат в переменной pop_music. SOLUTION import pandas as pd df = pd.read_csv('music_log_upd.csv') pop_music=df[(df['genre_name']=='pop')&(df['total_play_seconds']!=0)] TASK_2_7 Найдите максимальное время прослушивания песни в жанре pop. Сохраните результат в переменной pop_music_max_total_play и выведите её значение на экран. SOLUTION import pandas as pd df = pd.read_csv('music_log_upd.csv') pop_music=df[(df['genre_name']=='pop')&(df['total_play_seconds']!=0)] pop_music_max_total_play=pop_music['total_play_seconds'].max() print(pop_music_max_total_play) TASK_3_7 Получите строку таблицы pop_music c информацией о самой длинной по времени прослушивания песне жанра 'pop' и сохраните её в переменной pop_music_max_info. Выведите эту строку на экран. Закомментируйте вывод результата предыдущей задачи. SOLUTION import pandas as pd df = pd.read_csv('music_log_upd.csv') pop_music=df[(df['genre_name']=='pop')&(df['total_play_seconds']!=0)] pop_music_max_total_play=pop_music['total_play_seconds'].max() #print(pop_music_max_total_play) pop_music_max_info=pop_music[pop_music['total_play_seconds']==pop_music['total_play_seconds'].max()] print(pop_music_max_info) TASK_4_7 Найдите минимальное ненулевое время прослушивания композиции в жанре pop. Сохраните его в переменной pop_music_min_total_play, значение выведите на экран. Вывод результата предыдущей задачи закомментируйте. SOLUTION import pandas as pd df = pd.read_csv('music_log_upd.csv') pop_music=df[(df['genre_name']=='pop')&(df['total_play_seconds']!=0)] pop_music_max_total_play=pop_music['total_play_seconds'].max() #print(pop_music_max_total_play) pop_music_max_info=pop_music[pop_music['total_play_seconds']==pop_music['total_play_seconds'].max()] #print(pop_music_max_info) pop_music_min_total_play=pop_music['total_play_seconds'].min() print(pop_music_min_total_play) TASK_5_7 Выведите на экран информацию о композиции жанра pop, которую запустили, но быстрее всех остальных выключили. Результат сохраните в переменную pop_music_min_info и выведите на экран. Вывод результата предыдущей задачи закомментируйте. SOLUTION import pandas as pd df = pd.read_csv('music_log_upd.csv') pop_music=df[(df['genre_name']=='pop')&(df['total_play_seconds']!=0)] pop_music_max_total_play=pop_music['total_play_seconds'].max() #print(pop_music_max_total_play) pop_music_max_info=pop_music[pop_music['total_play_seconds']==pop_music['total_play_seconds'].max()] #print(pop_music_max_info) pop_music_min_total_play=pop_music['total_play_seconds'].min() #print(pop_music_min_total_play) pop_music_min_info=pop_music[pop_music['total_play_seconds']==pop_music['total_play_seconds'].min()] print(pop_music_min_info) TASK_6_7 Рассчитайте медиану времени прослушивания произведений жанра pop. Сохраните результат в переменной pop_music_median и выведите на экран. Вывод результата предыдущей задачи закомментируйте. SOLUTION import pandas as pd df = pd.read_csv('music_log_upd.csv') pop_music=df[(df['genre_name']=='pop')&(df['total_play_seconds']!=0)] pop_music_max_total_play=pop_music['total_play_seconds'].max() #print(pop_music_max_total_play) pop_music_max_info=pop_music[pop_music['total_play_seconds']==pop_music['total_play_seconds'].max()] #print(pop_music_max_info) pop_music_min_total_play=pop_music['total_play_seconds'].min() #print(pop_music_min_total_play) pop_music_min_info=pop_music[pop_music['total_play_seconds']==pop_music['total_play_seconds'].min()] #print(pop_music_min_info) pop_music_median=pop_music['total_play_seconds'].median() print(pop_music_median) TASK_7_7 Рассчитайте среднее арифметическое времени прослушивания произведений жанра pop. Сохраните результат в переменной pop_music_mean и выведите на экран. Вывод результата предыдущей задачи закомментируйте. SOLUTION import pandas as pd df = pd.read_csv('music_log_upd.csv') pop_music = df[(df['genre_name'] == 'pop')&(df['total_play_seconds'] != 0)] pop_music_max_total_play = pop_music['total_play_seconds'].max() #print(pop_music_max_total_play) pop_music_max_info = pop_music.loc[pop_music['total_play_seconds'] == pop_music['total_play_seconds'].max()] #print(pop_music_max_info) pop_music_min_total_play = pop_music['total_play_seconds'].min() #print(pop_music_min_total_play) pop_music_min_info = pop_music.loc[pop_music['total_play_seconds'] == pop_music['total_play_seconds'].min()] #print(pop_music_min_info) pop_music_median = pop_music['total_play_seconds'].median() #print(pop_music_median) pop_music_mean=pop_music['total_play_seconds'].mean() print(pop_music_mean)