paint-brush
Spotify Wrapped Hack: создайте свою собственную статистику до официального релизак@lukaskrimphove
10,553 чтения
10,553 чтения

Spotify Wrapped Hack: создайте свою собственную статистику до официального релиза

к Lukas Krimphove5m2023/11/27
Read on Terminal Reader

Слишком долго; Читать

Это способ получить представление о вашей статистике Spotify до официального выпуска Spotify Wrapped. Узнайте, как использовать историю потокового вещания, чтобы найти песни, исполнителей и альбомы, которые вы слушали чаще всего.
featured image - Spotify Wrapped Hack: создайте свою собственную статистику до официального релиза
Lukas Krimphove HackerNoon profile picture
0-item

Введение

Каждый год пользователи 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()

Анализ и визуализация вашей статистики Spotify

Лучшие песни всех времен

Давайте начнем с изучения ваших самых любимых песен. Мы можем легко представить наши лучшие треки на основе вашей истории стриминга:

 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 года

Хотите узнать о музыкальных тенденциях этого года? Мы можем использовать эту функцию, чтобы выявить лучшие песни 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) 

Мои лучшие песни 2023 года

Интерактивность с виджетами

Это уже работает очень хорошо, но зачем соглашаться на это? Мы можем использовать интерактивные виджеты для настройки запросов с помощью элементов пользовательского интерфейса. Это позволяет нам без особых усилий находить ваши лучшие песни в любом конкретном временном диапазоне:

 @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!