Каждый год пользователи Spotify с нетерпением ждут выхода Spotify Wrapped — персонализированного отчета за год, в котором представлены их самые прослушиваемые песни, исполнители и жанры. Что, если я скажу вам, что есть способ взглянуть на вашу статистику Spotify до официального релиза?
В этом руководстве я познакомлю вас с хаком Spotify Wrapped, который позволит вам создавать собственную персонализированную статистику, используя данные потоковой передачи Spotify. Таким образом, вам не придется ждать Spotify Wrapped, и вы также сможете создавать статистику, которую Spotify вам не покажет.
Как и в одном из моих предыдущих проектов , в этом мы будем использовать Jupyter Notebook. Это отличный инструмент для экспериментов и работы с данными.
Если вы еще не установили Jupyter Notebook, следуйте инструкциям на их официальном сайте . После установки вы можете создать новый блокнот Jupyter и подготовиться к погружению в статистику Spotify.
Чтобы начать, вам нужно запросить данные потоковой передачи Spotify. Вы можете сделать это здесь (убедитесь, что вы запросили «Расширенную историю потоковой передачи»). Spotify потребуется некоторое время, чтобы отправить вам ваши данные. Запрос только «данных учетной записи» будет быстрее, а также предоставит вам историю потоковой передачи за прошлый год. Однако он менее детализирован, и вам придется адаптировать код.
Как только у вас появятся данные, мы сможем их импортировать. Вы получите несколько файлов JSON. Каждый файл состоит из массива объектов, содержащих информацию о воспроизводимой песне или выпуске подкаста:
{ "ts": "2023-01-30T16:36:40Z", "username": "", "platform": "linux", "ms_played": 239538, "conn_country": "DE", "ip_addr_decrypted": "", "user_agent_decrypted": "", "master_metadata_track_name": "Wonderwall - Remastered", "master_metadata_album_artist_name": "Oasis", "master_metadata_album_album_name": "(What's The Story) Morning Glory? (Deluxe Remastered Edition)", "spotify_track_uri": "spotify:track:7ygpwy2qP3NbrxVkHvUhXY", "episode_name": null, "episode_show_name": null, "spotify_episode_uri": null, "reason_start": "remote", "reason_end": "remote", "shuffle": false, "skipped": false, "offline": false, "offline_timestamp": 0, "incognito_mode": false }
Это позволяет вам не только выяснить, когда и на каком устройстве вы слушали песню, но также дает вам информацию, например, пропустили ли вы ее и когда и когда.
Мы просто объединим их все в один фрейм данных Pandas:
path_to_json = 'my_spotify_data/' frames = [] for file_name in [file for file in os.listdir(path_to_json) if file.endswith('.json')]: frames.append(pd.read_json(path_to_json + file_name)) df = pd.concat(frames)
После этого мы очистим его, удалив подкасты, отфильтровав короткую продолжительность воспроизведения и преобразуя временные метки в более читаемый формат:
# drop all rows containing podcasts df = df[df['spotify_track_uri'].notna()] # drop all songs which were playing less than 15 seconds df = df[df['ms_played'] > 15000] # convert ts from string to datetime df['ts'] = pd.to_datetime(df['ts'], utc=False) df['date'] = df['ts'].dt.date # drop all columns which are not needed columns_to_keep = [ 'ts', 'date', 'ms_played', 'platform', 'conn_country', 'master_metadata_track_name', 'master_metadata_album_artist_name', 'master_metadata_album_album_name', 'spotify_track_uri' ] df = df[columns_to_keep] df = df.sort_values(by=['ts']) songs_df = df.copy()
Давайте начнем с изучения ваших самых любимых песен. Мы можем легко представить наши лучшие треки на основе вашей истории стриминга:
df = songs_df.copy() df = df.groupby(['spotify_track_uri']).size().reset_index().rename(columns={0: 'count'}) df = df.sort_values(by=['count'], ascending=False).reset_index() df = df.merge(songs_df.drop_duplicates(subset='spotify_track_uri')) df = df[['master_metadata_track_name', 'master_metadata_album_artist_name', 'master_metadata_album_album_name', 'count']] df.head(20)
Хотите узнать о музыкальных тенденциях этого года? Мы можем использовать эту функцию, чтобы выявить лучшие песни 2023 года:
def top_songs_in_year(year): df = songs_df.copy() df['year'] = df['ts'].dt.year df = df.loc[(df['year'] == year)] print(f"Time listened in {year}: {datetime.timedelta(milliseconds=int(df['ms_played'].sum()))}") df = df.groupby(['spotify_track_uri']).size().reset_index().rename(columns={0: 'count'}) df = df.sort_values(by=['count'], ascending=False).reset_index() df = df.merge(songs_df.drop_duplicates(subset='spotify_track_uri')) df = df[['master_metadata_track_name', 'master_metadata_album_artist_name', 'master_metadata_album_album_name', 'count']] return df.head(20)
Это уже работает очень хорошо, но зачем соглашаться на это? Мы можем использовать интерактивные виджеты для настройки запросов с помощью элементов пользовательского интерфейса. Это позволяет нам без особых усилий находить ваши лучшие песни в любом конкретном временном диапазоне:
@interact def top_songs(date_range=date_range_slider): df = songs_df.copy() time_range_start = pd.Timestamp(date_range[0]) time_range_end = pd.Timestamp(date_range[1]) df = df.loc[(df['date'] >= time_range_start.date()) & (df['date'] <= time_range_end.date())] df = df.groupby(['spotify_track_uri']).size().reset_index().rename(columns={0: 'count'}) df = df.sort_values(by=['count'], ascending=False).reset_index() df = df.merge(songs_df.drop_duplicates(subset='spotify_track_uri')) df = df[['master_metadata_track_name', 'master_metadata_album_artist_name', 'master_metadata_album_album_name', 'count']] return df.head(20)
Теперь, когда мы знаем наши лучшие песни, лучших исполнителей и лучшие альбомы, мы можем пойти немного дальше. Например, выясним, в какие дни недели мы наиболее активны на Spotify:
def plot_weekday_distribution(): df = songs_df.copy() df['year'] = df['ts'].dt.year df['weekday'] = df['ts'].dt.weekday df = df.groupby(['year', 'weekday']).size().reset_index(name='count') fig, ax = plt.subplots(figsize=(12, 8)) for year, data in df.groupby('year'): ax.plot(data['weekday'], data['count'], label=str(year)) weekdays_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] plt.xticks(range(7), weekdays_order) plt.title('Weekday Distribution of Played Tracks Over Years') plt.xlabel('Weekday') plt.ylabel('Number of Played Tracks') plt.legend(title='Year') plt.show()
Готовы погрузиться в свою собственную статистику Spotify? Посетите мой репозиторий GitHub , чтобы найти весь код, включая еще больше функций для изучения статистики прослушивания.
Создание статистики Spotify до официального выпуска не только добавляет элемент веселья, но и дает представление о ваших уникальных привычках прослушивания. Поскольку мы с нетерпением ждем Spotify Wrapped, почему бы не начать свое приключение в области музыкального анализа?
Приготовьтесь погрузиться в персонализированный опыт Spotify Wrapped!