Jedes Jahr warten Spotify-Nutzer sehnsüchtig auf die Veröffentlichung von Spotify Wrapped, einem personalisierten Jahresrückblick, der ihre meistgehörten Songs, Künstler und Genres präsentiert. Was wäre, wenn ich Ihnen sagen würde, dass es eine Möglichkeit gibt, vor der offiziellen Veröffentlichung einen ersten Blick auf Ihre Spotify-Statistiken zu werfen?
In dieser Anleitung führe ich Sie durch einen Spotify Wrapped-Hack, mit dem Sie mithilfe Ihrer Spotify-Streaming-Daten Ihre eigenen personalisierten Statistiken erstellen können. Auf diese Weise müssen Sie nicht auf Spotify Wrapped warten und können auch Statistiken erstellen, die Spotify Ihnen nicht anzeigt.
Ähnlich wie bei einem meiner früheren Projekte werden wir für dieses Jupyter Notebook verwenden. Es ist ein großartiges Werkzeug zum Experimentieren und Arbeiten mit Daten.
Wenn Sie Jupyter Notebook noch nicht installiert haben, befolgen Sie die Anweisungen auf der offiziellen Website . Nach der Installation können Sie ein neues Jupyter-Notizbuch erstellen und sich darauf vorbereiten, in Ihre Spotify-Statistiken einzutauchen.
Um zu beginnen, müssen Sie Ihre Spotify-Streaming-Daten anfordern. Sie können dies hier tun (stellen Sie sicher, dass Sie den „Erweiterten Streaming-Verlauf“ anfordern). Es wird einige Zeit dauern, bis Spotify Ihnen Ihre Daten sendet. Wenn Sie nur die „Kontodaten“ anfordern, geht das schneller und Sie erhalten auch den Streaming-Verlauf des letzten Jahres. Allerdings ist es viel weniger detailliert und Sie müssen den Code anpassen.
Sobald Sie die Daten haben, können wir sie importieren. Sie erhalten mehrere JSON-Dateien. Jede Datei besteht aus einem Array von Objekten, die Informationen zu einem abgespielten Lied oder einer Podcast-Episode enthalten:
{ "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 }
Dadurch können Sie nicht nur herausfinden, wann und auf welchem Gerät Sie einen Song angehört haben, sondern erhalten auch Informationen darüber, ob und wann Sie ihn übersprungen haben.
Wir werden sie einfach alle in einem einzigen Pandas-Datenrahmen zusammenführen:
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)
Anschließend bereinigen wir es, indem wir Podcasts entfernen, kurze Wiedergabedauern herausfiltern und Zeitstempel in ein besser lesbares Format konvertieren:
# 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()
Beginnen wir mit der Erkundung Ihrer Lieblingslieder aller Zeiten. Wir können unsere Top-Titel ganz einfach anhand Ihres Streaming-Verlaufs enthüllen:
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)
Neugierig auf die Musiktrends dieses Jahres? Mit dieser Funktion können wir die Top-Songs des Jahres 2023 enthüllen:
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)
Das funktioniert schon sehr gut, aber warum sollte man sich damit zufrieden geben? Wir können interaktive Widgets verwenden, um die Abfragen mithilfe von UI-Elementen anzupassen. Dadurch können wir mühelos Ihre Top-Songs in einem bestimmten Zeitraum herausfinden:
@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)
Da wir nun unsere Top-Songs, Top-Künstler und Top-Alben kennen, können wir noch einen Schritt weiter gehen. Erkunden Sie beispielsweise, an welchen Wochentagen wir auf Spotify am aktivsten sind:
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()
Sind Sie bereit, in Ihre eigenen Spotify-Statistiken einzutauchen? Schauen Sie sich mein GitHub-Repository an, um den gesamten Code zu finden, einschließlich noch mehr Funktionen zum Erkunden Ihrer Hörstatistiken.
Das Erstellen Ihrer Spotify-Statistiken vor der offiziellen Veröffentlichung macht nicht nur Spaß, sondern bietet auch Einblicke in Ihre individuellen Hörgewohnheiten. Während wir Spotify Wrapped mit Spannung erwarten, können Sie sich gleich einen Vorsprung in Ihr Musikanalyse-Abenteuer verschaffen.
Machen Sie sich bereit für Ihr personalisiertes Spotify Wrapped-Erlebnis!