Spotify API - богатый источник данных. Вы можете не только использовать его для интеграции Spotify в свои приложения, но и извлекать из него много данных.

Сегодня мы рассмотрим процесс анализа данных из одного плейлиста, в частности проанализируем существующих исполнителей в плейлисте и количество песен, в которых они представлены. Мы напишем весь код на Python, а библиотека Spotipy будет служить нашим шлюзом к Spotify API. Затем pandas и Plotly (Express) позволят нам манипулировать этими данными и отображать их в столбчатой ​​диаграмме.

Завершенный код будет разделен на два скрипта: get_spotify_playlist_data и plot_spotify_playlist_data. Первый будет иметь код для взаимодействия с API и сохранения полученных данных в файле CSV, а задача второго - просто загрузить данные и построить окончательную диаграмму.

Создайте свое приложение Spotify

Перво-наперво: для использования Spotify API вам необходимо настроить приложение (соединение) на веб-сайте Spotify for Developers.

Зайдите на сайт и войдите в систему (вы можете использовать API независимо от того, есть ли у вас бесплатная или премиум учетная запись). Нажмите на опцию Создать идентификатор клиента и введите информацию для своего приложения. Дайте ему имя и описание, и для вопроса Что вы строите для этой демонстрации будет достаточно Я не знаю. Это даст вам доступ к вашим плейлистам, и это то, на что мы нацелены.

Когда вы закончите создание приложения, страница приложения будет выглядеть примерно так

Но единственная информация, которую мы хотим отсюда, - это идентификатор клиента и секрет клиента. Это ключи, необходимые для аутентификации позже в Python через Spotipy. Как вы можете видеть по моему размытому идентификатору клиента и скрытому секрету клиента, вы должны держать эти ключи в секрете.

Следовательно, теперь, когда у вас есть доступ к ключам, самое время сохранить их как переменные среды на вашем компьютере. Если вы не знаете, как это сделать в своей операционной системе, обратитесь к Руководству по Windows здесь, Руководству по Linux здесь и Руководству для Mac здесь. Вместо того, чтобы копировать и вставлять важную информацию в сценарий, безопаснее сохранить эту информацию в переменных среды, а затем загрузить эти переменные в сценарий.

Установить библиотеки Python

Другая настройка, которая нам нужна перед тем, как перейти к коду, - это установить необходимые библиотеки Python: Spotipy, pandas и Plotly.

pip (менеджер пакетов Python по умолчанию) делает эти установки такими же тривиальными, как ввод следующих команд в терминал

pip install spotipy
pip install pandas
pip install plotly

И это все, что нужно для настройки. Когда ключи приложения сохранены как переменные среды и установлены эти три библиотеки, мы готовы приступить к написанию кода.

Скрипт для получения данных из Spotify

Первый скрипт, get_spotify_playlist_data, отвечает за взаимодействие с Spotify API. Здесь мы аутентифицируемся с помощью клиентских ключей, получаем данные списка воспроизведения, отфильтровываем то, что нам не интересно, и, наконец, записываем данные в файл CSV.

Я сразу же покажу вам полный сценарий и, поскольку код разбит на небольшие функции, я проведу вас через каждую из них.

Скрипт состоит из пяти функций:

  • authenticate: аутентифицироваться в Spotify API с помощью клиентских ключей
  • get_pl_length: вспомогательная функция для получения количества песен в плейлисте (включая локальные файлы)
  • get_tracks_artist_info: получить информацию об исполнителях каждого трека плейлиста.
  • get_artist_counts: подсчитайте частоту каждого исполнителя, используя ранее полученные данные
  • save_artists_csv: сохранить частоты исполнителей в файл CSV

Последний блок кода, который начинается с if __name__ == "__main__", важен для указания того, какой код запускается при выполнении сценария и при его импорте другим сценарием. Видите ли, когда вы импортируете скрипт в Python (т.е. файл .py), весь код в скрипте выполняется.

Таким образом, если вы заметили, что перед этим последним блоком кода нет исполняемого кода, есть только импорт и определения функций. Функции вызываются только внутри последнего блока условного кода. Если бы этот сценарий был импортирован другим сценарием, выполнялись бы только определения функций, то есть не было бы неожиданного запуска кода.

С этим объяснением теперь мы можем более внимательно изучить эти функции. Фактически, если посмотреть на условный блок, можно увидеть, как работает сценарий. Во-первых, ему необходимо загрузить клиентские ключи, хранящиеся в переменных среды. Это аутентифицирует пользователя в Spotify API (функция authenticate), возвращая аутентифицированный экземпляр этого соединения. Этот экземпляр очень важен, потому что, как вы можете видеть, он впоследствии передается в функцию get_tracks_artist_info вместе с URI списка воспроизведения.

(Да, и если вам интересно, как получить URI списка воспроизведения, щелкните его правой кнопкой мыши и выберите параметр, показанный ниже. Не забудьте изменить URI целевого списка воспроизведения, pl_uri, на один из ваших списков воспроизведения)

Одним предложением get_tracks_artist_info извлекает информацию о каждой песне / дорожке, сохраненной в целевом списке воспроизведения. Более подробно, он продолжает запрашивать песни из API до тех пор, пока не пройдёт все песни (каждый вызов может возвращать информацию не более чем для 100 песен, отсюда цикл while и переменная offset; думайте об этом, как если бы список воспроизведения был разбивается на страницы, и каждый запрос возвращает одну страницу песен).

Затем для каждого пакета треков мы просматриваем их в виде списка. Это то же самое, что и обычный цикл for, но более лаконично. Spotify возвращает большой словарь с items записью. Это список песен, извлеченных в текущем пакете, и именно этот список мы просматриваем в цикле.

Каждый элемент этого списка (каждая песня) сам по себе является словарем с одним ключом track (pl_item["track"]). Этот ключ на самом деле является информацией одной песни и выглядит так:

Поскольку то, что нам нужно, - это часть об артистах (посмотрите на строку 6 этой последней сути), синтаксис для доступа к информации об артистах каждой песни - pl_item["track"]["artists"].

Эта информация об артистах представляет собой еще один список (я надеюсь, что первый снимок экрана поможет вам разобраться в этой большой скороговорке с вложенными списками и словарями), потому что, ну, в песне может быть более одного исполнителя, и в списке художников каждый художник собственный словарь… (следующая суть показывает полную информацию для исполнителей; первый список, строка 1, является примером для песни с одним исполнителем, а второй список, строка 16, для песни с несколькими артистами ).

В любом случае, чтобы подвести итог функции get_tracks_artist_info, она возвращает список, каждый элемент которого представляет собой полную информацию об артистах каждой песни в списке воспроизведения (он возвращает список, в котором каждый элемент является списком, идентичным тем, которые показаны в приведенной выше сути).

Этот список вложенных списков с информацией об исполнителе затем передается в функцию get_artist_counts, и, к счастью, работа с вложенными списками и словарями здесь проще.

Поскольку каждый элемент основного списка (artists_info) сам по себе является списком исполнителей (словарей), мы используем равно вложенные циклы for. Внешний цикл проходит через список исполнителей за раз (track_artists), а внутренний цикл проходит через исполнителей одной песни (artist).

Теперь, когда мы наконец можем смотреть на одного исполнителя одной песни на каждой итерации вложенного цикла, мы получаем имя исполнителя (artist_name = artist["name"]) и используем его для обновления их частоты. Частоты исполнителей хранятся в новом словаре (artist_counts), где ключ - это имя исполнителя, а значение - количество песен, в которых они представлены. TL; DR, функция get_artist_counts возвращает простой словарь, который сопоставляет исполнителей с числом песен, в которых они представлены.

Наконец, после всей этой бессвязной груды вложенных данных последним шагом для этого скрипта является выполнение save_artists_csv, которое берет словарь, возвращенный get_artist_counts, помещает его в фрейм данных pandas и записывает его в файл CSV. Предположим, этого файла еще не существует, он создается автоматически (если есть, он перезаписывается).

На этом этапе создается файл CSV с необходимой информацией об артистах, и этот первый сценарий, get_spotify_playlist_data, завершен. Приступаем к построению данных с помощью второго скрипта!

Скрипт для построения данных

Самая сложная часть просмотра вложенных данных позади, теперь остается только загрузить данные и построить их.

Поскольку нам нужно выполнить всего две задачи, у скрипта всего две функции:

  • pre_process_data: загрузите данные из CSV и отсортируйте их по убыванию частот исполнителей.
  • plot_column_chart: постройте столбчатую диаграмму частот исполнителей с помощью Plotly Express, включая необходимые изменения форматирования.

Опять же, этот сценарий использует условный блок if __name__ == "__main__" для выполнения кода; перед этим блоком есть только импорт и определения функций.

Я думаю, что pre_process_data говорит само за себя, поэтому я перейду к plot_column_chart. px.bar - это функция из Plotly Express, отвечающая за построение столбчатой ​​диаграммы. Он получает данные для построения графика в виде DataFrame. data.head(n=10) означает, что на графике отображаются только первые десять строк данных, десять из которых являются наиболее частыми.

Поскольку он получает DataFrame, чтобы указать, какие данные используются для каждой оси, нам просто нужно дать ему имя соответствующих столбцов: исполнители для горизонтальной оси, частоты для вертикальной оси и снова частоты для Text. Text представляет метки данных, которые должны отображаться для каждого столбца.

fig.update_traces форматирует метки данных, fig.update_layout форматирует общие аспекты графика, такие как оси и шрифт, и, наконец, fig.show показывает график. В вашем браузере откроется вкладка с окончательной интерактивной столбчатой ​​диаграммой (да, если вы не знакомы с Plotly, все графики и диаграммы являются интерактивными).

Выводы

После всех этих объяснений мы наконец получаем результат демонстрации (интерактивный результат не включен в статью, но, по крайней мере, есть его скриншот).

Как мы видели в этой демонстрации, Spotify предоставляет много данных для каждого элемента своей платформы, и просмотр содержимого плейлиста сам по себе является большим количеством данных, которые нужно исследовать.

Я думаю, что этот пример отображения наиболее распространенных исполнителей в плейлисте - интересный способ изучить реальный набор данных, поскольку он проходит через установление соединения с API (хотя и через оболочку Spotipy), обработку данных и, наконец, их построение. в визуализации.

Вы можете найти весь код этой демонстрации на GitHub здесь.

О, в качестве последнего замечания для любопытных читателей, я реорганизовал функцию get_artist_counts (которая подсчитывает частоты исполнителей), чтобы использовать сокращение карты вместо вложенных циклов for.