Spotify kullanıcıları her yıl, en çok dinlenen şarkıları, sanatçıları ve türleri sergileyen kişiselleştirilmiş bir yıllık inceleme olan Spotify Wrapped'ın yayınlanmasını sabırsızlıkla bekliyor. Ya size resmi yayınlanmadan önce Spotify istatistiklerinize göz atmanın bir yolu olduğunu söylesem?
Bu kılavuzda, Spotify akış verilerinizi kullanarak kendi kişiselleştirilmiş istatistiklerinizi oluşturmanıza olanak tanıyan Spotify Wrapped hack'ini size anlatacağım. Bu sayede Spotify Wrapped'ı beklemenize gerek kalmayacak ve Spotify'ın size göstermeyeceği istatistikler de oluşturabileceksiniz.
Daha önceki projelerime benzer şekilde bu projede de Jupyter Notebook'u kullanacağız. Verilerle denemeler yapmak ve çalışmak için harika bir araçtır.
Jupyter Notebook'u henüz yüklemediyseniz resmi web sitesindeki talimatları izleyin. Kurulduktan sonra yeni bir Jupyter Notebook oluşturabilir ve Spotify istatistiklerinize dalmaya hazırlanabilirsiniz.
Başlamak için Spotify akış verilerinizi istemeniz gerekir. Bunu buradan yapabilirsiniz (“Genişletilmiş yayın geçmişi”ni talep ettiğinizden emin olun). Spotify'ın sana verilerini göndermesi biraz zaman alacak. Yalnızca "Hesap verilerini" talep etmek daha hızlı olacak ve aynı zamanda size geçen yılın yayın geçmişini de verecektir. Ancak çok daha az ayrıntılıdır ve kodu uyarlamanız gerekecektir.
Verileri aldıktan sonra içe aktarabiliriz. Birden fazla JSON dosyası alacaksınız. Her dosya, çalınan bir şarkı veya podcast bölümü hakkında bilgi içeren bir dizi nesneden oluşur:
{ "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 }
Bu, bir şarkıyı ne zaman ve hangi cihazda dinlediğinizi anlamanıza olanak sağlamanın yanı sıra, şarkıyı atlayıp atlamadığınız, ne zaman atladığınız gibi bilgileri de verir.
Hepsini tek bir Pandas veri çerçevesinde birleştireceğiz:
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)
Daha sonra podcast'leri kaldırarak, kısa oynatma sürelerini filtreleyerek ve zaman damgalarını daha okunabilir bir formata dönüştürerek onu temizleyeceğiz:
# 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()
Tüm zamanların en sevdiğiniz şarkılarını keşfederek işe başlayalım. Yayın geçmişinize göre en iyi parçalarımızı kolayca açıklayabiliriz:
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)
Bu yılın müzik trendlerini merak mı ediyorsunuz? 2023'ün en popüler şarkılarını ortaya çıkarmak için bu işlevi kullanabiliriz:
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)
Bu zaten çok işe yarıyor ama neden bununla yetinelim ki? Kullanıcı arayüzü öğelerini kullanarak sorguları özelleştirmek için etkileşimli widget'lar kullanabiliriz. Bu, herhangi bir zaman aralığındaki en iyi şarkılarınızı zahmetsizce bulmamıza olanak tanır:
@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)
Artık en iyi şarkılarımızı, en iyi sanatçılarımızı ve en iyi albümlerimizi bildiğimize göre biraz daha ileri gidebiliriz. Örneğin Spotify'da haftanın hangi günlerinde en aktif olduğumuzu keşfetmek:
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()
Kendi Spotify istatistiklerinize dalmaya hazır mısınız? Dinleme istatistiklerinizi keşfetmenizi sağlayacak daha fazla işlev de dahil olmak üzere tüm kodu bulmak için GitHub depoma göz atın.
Spotify istatistiklerinizi resmi yayınlanmadan önce oluşturmak yalnızca eğlence unsuru eklemekle kalmaz, aynı zamanda benzersiz dinleme alışkanlıklarınıza ilişkin bilgiler de sağlar. Spotify Wrapped'ı sabırsızlıkla beklerken müzik analizi maceranıza neden bir adım önde başlamıyorsunuz?
Kişiselleştirilmiş Spotify Wrapped deneyiminize katılmaya hazır olun!