データアナリストのメモ帳

データアナリストのメモ帳

IT企業で働くデータアナリストのブログ

ミスチルの関連アーティストは?SpotifyのAPIを使ってを調べてみた【Python】

SpotifyのAPIを使ってミスチルの関連アーティストを調べてみる

SpotifyAPIを使うと任意のアーティストの関連アーティストを取得できます。 Spotify APIの使い方は前回の記事で詳しく説明してるので、ぜひ読んでみてください!

前回の記事:
k2-tech.hatenablog.com

ミスチルの関連アーティスト20組は誰だ?

関連アーティストの定義は、ユーザーの視聴履歴に基づいているようです。
もちろん詳しい定義は明記されていません。

では、さっそくコードを書いてみましょう!
spotipyをインストールしていない場合は、先にpip installしましょう。

!pip install spotipy

以下のようにrelated_list_getという関数を定義し、関連アーティストを取得します。アーティストのIDは、SpotifyのアーティストページのURLのartist/以下の文字列となります。 https://open.spotify.com/artist/1qma7XhwZotCAucL7NHVLY

# import modules
import pandas as pd
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

# API reference https://spotipy.readthedocs.io/en/2.17.1/
client_id = 'XXXXXXXXXXXXXXXX'
client_secret = 'XXXXXXXXXXXXXXXX'
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

# アーティストのIDを取得
artist_id = '1qma7XhwZotCAucL7NHVLY' # Mr.Children

# 関連アーティストのリストを生成する関数
def related_list_get(artist):

  related_list_raw = spotify.artist_related_artists(artist)
  related_list = []
  for i in range(len(related_list_raw['artists'])):
    id_ = related_list_raw['artists'][i]['id']
    name = related_list_raw['artists'][i]['name']
    followers = related_list_raw['artists'][i]['followers']['total']
    popularity = related_list_raw['artists'][i]['popularity']
    values = [id_, name, followers, popularity]
    related_list.append(values)

  return related_list

related_list = related_list_get(artist_id)

pd.DataFrame(related_list).rename(columns = {0: 'id', 1: 'name', 2: 'followers', 3: 'popularity'})

この結果が以下です。 ちなみに、followersはフォロワー数、popularityは直近の再生回数に基づく人気度です。 SpotifyのAPIを使ってミスチルの関連アーティストを調べてみる

Bank Bandスピッツ、ポルノグラフティ、Superfly、米米CLUBなど、たしかにミスチルが好きな人が聴いていそうなアーティストですね!
今回は以上です。

【SQL】BigQueryで文字列をGROUP BYしてカンマでつなげる

複数行にまたがる文字列のレコードを、GROUP BYで1行にまとめる方法です。 STRING_AGGを使います。

SELECT
  gender,
  STRING_AGG(name, ', ') AS names
FROM UNNEST(ARRAY<STRUCT<gender STRING, name STRING>>
  [
  ('male', 'taro'),
  ('male', 'jiro'),
  ('female', 'aiko'),
  ('female', 'hanako'),
  ('male', 'saburo')
  ])
GROUP BY gender

こういう結果になります。 https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210225/20210225101408.png

参考: https://cloud.google.com/bigquery/docs/reference/standard-sql/aggregate_functions?hl=ja#string_agg

【SQL】UNIXタイムスタンプを日付に直す方法

SQLUNIX時間をタイムスタンプや日付に変換する方法です。 UNIXタイムスタンプとは、1970年1月1日午前0時0分0秒(UTC)からの経過秒数(整数)のことですね。

TIMESTAMP_SECONDS()やDATE()使うことで、UTCタイムスタンプや日付に変換できます。

SELECT
  TIMESTAMP_SECONDS(1614067958) AS utcTimestamp,
  DATE(TIMESTAMP_SECONDS(1614067958)) AS utcDate,
  DATE(TIMESTAMP_SECONDS(1614067958), 'Asia/Tokyo') AS jpDate```

Cloud Functionsを定期実行してBigQueryにデータを流す【GCP/Python】

https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210109/20210109161507.jpg

GCPのCloud Schedulerを用いて、Cloud Functionsを定期実行してみます。
また、Cloud FunctionsではデータをBigQueryにインサートする処理をPythonで書きます。

この一連の処理を応用すれば、「Pythonを用いてあるサイトからスクレイピングして得られたデータを、BigQuery内に作ったdatasetの中に格納する」という処理を毎日定期実行することもできます。便利ですよね!

1. BigQueryに空のtableを作る

まずは、BigQueryに空のテーブルを作ります。
プロジェクトの中にdatasetを作り、そこに空のテーブルを作りましょう。

https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210109/20210109144346.png

ここでは、test_datasetの中にtest_tableというテーブルを作ります。
スキーマはdatetimeとvalueを、どちらもFLOAT型で指定しておきます。
「テーブルを作成」ボタンをクリックすれば、空のテーブルが出来上がります。

https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210109/20210109144733.png

上の画像の様に、空のテーブルができていればOKです。

2. Cloud FunctionsでBigQueryにデータを送る処理をPythonで書く

次はCloud Functionsで定期実行したい処理を作ります。

2.1. 構成の設定

https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210109/20210109145111.png https://console.cloud.google.com/functions/

「関数を作成」をクリックします。

https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210109/20210109145713.png

上の画像のようなページに遷移します。
関数名をtest-functionとし、トリガーのタイプとしてCloud Pub/Subを選択してください。
すると、「Cloud Pub/Subトピックを選択してください」と表示されるので、「トピックを作成する」ボタンをクリックして、トピックを作成してください。
ここでは、トピック名をtest-function-shceduler-topicとしました。

2.2. Pythonコードを書く

次に、Pythonコードを書きます。
ランタイムでPython 3.7を選択し、main.pyとrequirements.txtを書き換えます。

デフォルトでは以下のようになっていると思います。 https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210109/20210109150223.png

main.pyを書き換えましょう。
ここでは、insert_rows_jsonを使って、json形式でBigQueryにデータをインサートします。
インサートするデータは、現在の時刻とランダムな値です。

value = np.random.random()
dt = datetime.datetime.now().timestamp()

json形式でインサートするため、.timestamp()を用いてUNIX時間に変換します。
書き換えるコードは以下の通りです。GCPのプロジェクトネーム(your-project-name)をご自身のものに変更してください。

import base64
from google.cloud import bigquery
import datetime
import numpy as np

def hello_pubsub(event, context):

    value = np.random.random()
    dt = datetime.datetime.now().timestamp()

    # Construct a BigQuery client object.
    client = bigquery.Client()

    # TODO(developer): Set table_id to the ID of table to append to.
    # table_id = "your-project.your_dataset.your_table"

    rows_to_insert = [
        {u"datetime": dt, u"value": value},
    ]

    errors = client.insert_rows_json('your-project-name.test_dataset.test_table', rows_to_insert)  # Make an API request.
    if errors == []:
      print("New rows have been added.")
    else:
      print("Encountered errors while inserting rows: {}".format(errors))

次に、requirements.txtを書き換えます。
main.pyで使ったパッケージのバージョンを記載しておきます。

# Function dependencies, for example:
# package>=version
numpy==1.19.4
bigquery==0.0.8

「デプロイ」ボタンをクリックして、デプロイします。

https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210109/20210109151857.png

エラーなくデプロイできていれば、緑色のチェックマークが付くはずです。
エラーが出ている場合は右にある「操作」→「ログを表示」でエラー文言を確認してみましょう。

これで、Cloud Functionsの設定は完了です!

3. Cloud Schedulerの設定をする

Cloud Schedulerの設定をしましょう。これで上で作った関数を定期実行できるようになります。

https://console.cloud.google.com/cloudscheduler

ジョブの作成ページで、
・名前(ここではtest-function-schedulerとしました)
・頻度(ここでは毎分にしています)
タイムゾーン
・トピック(2で作成したものを選択)
ペイロード(testと書いておく)
以上5つを入力します。

https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210109/20210109152746.png

これで「作成」ボタンを押せばOK!

https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210109/20210109152753.png

上の画像のようになっていればOKです。
「今すぐ実行」ボタンをクリックして、エラーが出ないか確認しましょう。エラーが出る場合はログを表示してみましょう。

4. BigQueryでインサートされたデータを確認

最後に、BigQueryにデータがインサートされているか確認してみましょう。

https://cdn-ak.f.st-hatena.com/images/fotolife/s/stinkydofu/20210109/20210109153536.png

上の画像のように、指定した通りdatetimeにUNIX時間のtimestampが、valueにランダムな数値が入っていればOKです。

以上、Cloud FunctionsをCloud Schedulerで定期実行してBigQueryにデータを流す方法でした!

参考記事: Cloud Functionsを定期実行させてみる | DevelopersIO

【Python】パッケージ(ライブラリ)のバージョンを確認する

スクリプト内で、ライブラリのバージョンを確認する方法です。 pandasで試してみましょう。

import pandas as pd
pd.__version__
# 1.1.5