Spotify APIを使って日本のトップチャート分析

#はじめに
Spotify APIを使い、日本のトップチャートの楽曲情報をCSVに出力する方法を紹介します。
今回はGoogle ColaboratoryでSpotify APIを使い、日本のトップチャートの分析を行いました。
[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)はJupyter notebookを基盤としたオープンソースプロジェクトで、Chromeのデスクトップ版で動作します。
Colaboratoryを使えば、Chromeブラウザ上で簡単にPythonの実行環境を作ることができます。
> [Google Colaboratoryを使えばブラウザ上でPythonの実行環境が簡単に手に入る](https://tadaken3.hatenablog.jp/entry/first-step-colabratory)

#APIキーの取得
こちらは前回の記事で紹介しているのでそちらを参考にしてみてください。
[Spotify APIで楽曲情報やアーティスト情報を取得してみた](https://qiita.com/nochifuchi/items/29ac2664fc174a56c4b4#api%E3%82%AD%E3%83%BC%E3%81%AE%E5%8F%96%E5%BE%97)

#準備
まずはSpotifyのAPIを扱うためのライブラリである「spotipy」をインストール。
ドキュメントは[こちら](https://spotipy.readthedocs.io/en/latest/)にあるみたいです。

```python
!pip install spotipy
```
「pandas」をインポートします。
「spotipy」や「json」もインポートしOAuth2で通信できる状態にします。

```python
import pandas as pd
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import json

client_id = '発行したCLIANT ID'
client_secret = '発行したCLIANT SECRET'
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
```
次に[Spotify Charts](https://spotifycharts.com/regional/jp/daily/latest)からインポートするCSVをダウンロードしておきます。
<img width="1078" alt="スクリーンショット 2019-07-17 10.37.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55699/6829a344-2d0e-102a-ac93-ba55193fe60e.png">
今回は日本のDairy TOP200のデータを使用しました。

#CSV読み込み
ダウンロードしたCSVをGoogle Colaboratoryにアップロードし、Pandasでファイルを読み込んでいきます。
以下の記事を参考にさせていただきました。
> [google Colaboratoryでファイルを読み込む方法](https://qiita.com/uni-3/items/201aaa2708260cc790b8)
> [pandasでcsv/tsvファイル読み込み（read_csv, read_table）](https://note.nkmk.me/python-pandas-read-csv-tsv/)

```python
# google Colaboratoryでファイルを読み込む
from google.colab import files
uploaded = files.upload()

# PandasでCSVを読み込む、最初の行は省略
songs = pd.read_csv("regional-jp-daily-latest.csv", index_col = 0, header = 1)
songs.head(10)

# インデックスをリセットし、振り直す
songs = songs.reset_index()
songs.head(10)
```
コードを実行すると、ファイルを選択できるので先ほどダウンロードした`regional-jp-daily-latest.csv`を読み込むと以下の結果が返ってきます。
<img width="897" alt="スクリーンショット 2019-07-17 14.44.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55699/eb322e8a-227e-b5e4-df1e-f85af9a07389.png">

#楽曲情報取得
まずデータを格納するためのPandasのDataFrameを作ります。
そのあとに、楽曲数分の情報をSpotifyの[audio_features](https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-features/)を使って読み込んでいます。
> [pandas.DataFrame.from_dict](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.from_dict.html)
> [pandas.DataFrame, Seriesのインデックスを振り直すreset_index](https://note.nkmk.me/python-pandas-reset-index/)

```python
# PandasのDataFrame作成
song_info = pd.DataFrame()

# 楽曲数分の情報を取得
for url in songs["URL"]: 
  df = pd.DataFrame.from_dict(spotify.audio_features(url))
  song_info = song_info.append(df)
song_info.head(10)

# song_infoのインデックスを振り直す
song_info = song_info.reset_index(drop = True)
song_info.head(10)
```
実行結果がこちら
<img width="1172" alt="スクリーンショット 2019-07-17 14.42.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55699/1dccfeaa-650d-4e9e-9eb1-7c2e90563e85.png">
楽曲の「アコースティック感」や「曲の過激さ」、「踊りやすさ」、「テンポ」など詳細な情報を取得することができました。

#CSVファイルに出力
先ほど楽曲の基本情報(songs)と楽曲の詳細情報(song_info)を結合して、CSVファイルに出力していきます。

```python
pd.concat([songs, song_info], axis = 1).to_csv("songs.csv")
files.download('songs.csv') 
```
実行すると以下のCSVファイルをダウンロードすることができました。
<img width="1080" alt="スクリーンショット 2019-07-17 15.26.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55699/240b3533-3065-f7c2-17d4-efc1ace74ff4.png">

#さいごに
今回Spotify APIを使い、日本のトップチャートの楽曲情報をCSVに出力することができ、Spotifyの楽曲にはたくさんの情報が付加されていて、楽曲の研究のすごさに驚きました。
自分的にも今どのようなジャンルの楽曲の人気があるのか、その楽曲はどんな情報をもった楽曲なのかということを知ることができ、満足しています。
また、Spotify APIを使い何かやってみたいと思います。

Spotify APIに興味がある方は良ければ、以下の記事も読んでみてください。
[Spotify APIで楽曲情報やアーティスト情報を取得してみた](https://qiita.com/nochifuchi/items/29ac2664fc174a56c4b4)

#参考
こちらの記事を参考にさせていただきました。
[Spotifyでトップチャートの曲(と自分の曲)の分析](https://qiita.com/kazuya-n/items/fbee07ef778e166cb6dd)