Spotify ユーザーは毎年、最もよく聴いた曲、アーティスト、ジャンルを紹介するパーソナライズされた年間レビューである Spotify Wrapped のリリースを心待ちにしています。正式リリース前に Spotify の統計情報をこっそり見る方法があると言ったらどうなるでしょうか?
このガイドでは、Spotify ストリーミング データを使用して独自のパーソナライズされた統計情報を作成できる Spotify Wrapped ハックについて説明します。こうすることで、Spotify Wrapped を待つ必要がなく、Spotify では表示されない統計情報を作成することもできます。
私の以前のプロジェクトの1 つと同様に、このプロジェクトでは Jupyter Notebook を使用します。これは、データを実験したり操作したりするための優れたツールです。
Jupyter Notebook をまだインストールしていない場合は、公式 Web サイトの手順に従ってください。インストールしたら、新しい Jupyter Notebook を作成して、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)
これはすでに非常にうまく機能していますが、なぜそれで満足するのでしょうか?インタラクティブなウィジェットを使用して、UI 要素を使用してクエリをカスタマイズできます。これにより、特定の時間範囲で人気の曲を簡単に見つけることができます。
@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 体験を満喫する準備をしましょう!