#python #pandas
Жестко затупил на контрольном задании на курсе ЯндексПрактикум "Аналитик данных"
Дана таблица:
df = pd.read_csv('/datasets/music_project.csv')
Задание:
Утро понедельника и вечер пятницы — разная музыка или одна и та же?
Ищем ответ на вопрос, какие жанры преобладают в разных городах в понедельник утром
и в пятницу вечером. Есть предположение, что в понедельник утром пользователи слушают
больше бодрящей музыки (например, жанра поп), а вечером пятницы — больше танцевальных
(например, электронику).
Получим таблицы данных по Москве moscow_general и по Санкт-Петербургу spb_general.
# получение таблицы moscow_general из тех строк таблицы df,
# для которых значение в столбце 'city' равно 'Moscow'
moscow_general = df[df['city'] == 'Moscow']
# получение таблицы spb_general
# для которых значение в столбце 'city' равно 'Saint-Petersbur'
spb_general = df[df['city'] == 'Saint-Petersburg']
Создаём функцию genre_weekday(), которая возвращает список жанров по запрошенному
дню недели и времени суток с такого-то часа по такой-то.
def genre_weekday(df, day, time1, time2):
genre_list = df[ (df['weekday'] == day) & (df['time']>time1) & (time2>df['time'])]
genre_list_sorted = genre_list.groupby('genre_name')['genre_name'].count().sort_values(ascending
= False).head(10)
return genre_list_sorted
# объявление функции genre_weekday() с параметрами df, day, time1, time2
# в переменной genre_list сохраняются те строки df, для которых одновременно:
# 1) значение в столбце 'weekday' равно параметру day,
# 2) значение в столбце 'time' больше time1 и
# 3) меньше time2.
# в переменной genre_list_sorted сохраняются в порядке убывания
# первые 10 значений Series, полученной подсчётом числа значений 'genre_name'
# сгруппированной по столбцу 'genre_name' таблицы genre_list
# функция возвращает значение genre_list_sorted
Cравниваем полученные результаты по таблице для Москвы и Санкт-Петербурга в понедельник
утром (с 7 до 11) и в пятницу вечером (с 17 до 23).
Утро понедельника в Москве
# <вызов функции для утра понедельника в Москве (вместо df таблица moscow_general)>
genre_weekday(moscow_general, 'Monday', '07:00:00', '11:00:00')
Результат:
genre_name
pop 781
dance 549
electronic 480
rock 474
hiphop 286
ruspop 186
world 181
rusrap 175
alternative 164
classical 157
Name: genre_name, dtype: int64
Утро понедельника в СПб
# <вызов функции для утра понедельника в Петербурге (вместо df таблица spb_general)>
genre_weekday(spb_general, 'Monday', '07:00:00', '11:00:00')
Результат:
genre_name
pop 218
dance 182
rock 162
electronic 147
hiphop 80
ruspop 64
alternative 58
rusrap 55
jazz 44
classical 40
Name: genre_name, dtype: int64
Вечер пятницы в Москве
# <вызов функции для вечера пятницы в Москве>
genre_weekday(moscow_general, 'Friday', '17:00:00', '23:00:00')
Результат:
genre_name
pop 713
rock 517
dance 495
electronic 482
hiphop 273
world 208
ruspop 170
alternative 163
classical 163
rusrap 142
Name: genre_name, dtype: int64
Вечер пятницы в СПб
# <вызов функции для вечера пятницы в Питере>
genre_weekday(spb_general, 'Friday', '17:00:00', '23:00:00')
Результат:
genre_name
pop 256
rock 216
electronic 216
dance 210
hiphop 97
alternative 63
jazz 61
classical 60
rusrap 59
world 54
Name: genre_name, dtype: int64
Популярные жанры в понедельник утром в Питере и Москве оказались похожи: везде, как
и предполагалось, популярен поп. Несмотря на это, концовка топ-10 для двух городов
различается: в Питере в топ-10 входит джаз и русский рэп, а в Москве жанр world.
В конце недели ситуация не меняется. Поп-музыка всё так же на первом месте. Опять
разница заметна только в концовке топ-10, где в Питере пятничным вечером тоже присутствует
жанр world
Конец задания
Вроде все сходится с написанными Яндексом подсказками и выводами, но при сдаче задания
на проверку дает ошибку The truth value of a Series is ambiguous. Use a.empty, a.bool(),
a.item(), a.any() or a.all().
Суть ошибки вроде бы понял, но не понимаю в какой момент она возникает.
Если это может помочь, ссылка на диск со всеми заданиями. cell In [48]:
https://yadi.sk/d/xO0cm83NXVyPJA
Ответы
Ответ 1
Возможно, проблема в этой строке: genre_list = df[ (df['weekday'] == day) & (df['time']>time1) & (time2>df['time'])] Попробуйте заменить на какой-нибудь из этих вариантов: genre_list = df.query('weekday == @day and @time2 > time > @time1') genre_list = df.loc[(df['weekday'] == day) & (df['time'].between(time1, time2, inclusive=False))]Ответ 2
У меня валидатор принял такой вариант: genre_list = df[ (df['weekday'] == day) & (df['time'] > time1) & (df['time'] < time2)] возможно ему важно в каком порядке идут сравниваемые величины..
Комментариев нет:
Отправить комментарий