매년 Spotify 사용자는 가장 많이 듣는 노래, 아티스트 및 장르를 보여주는 맞춤형 연간 리뷰인 Spotify Wrapped의 출시를 간절히 기다리고 있습니다. 공식 출시 전에 Spotify 통계를 미리 볼 수 있는 방법이 있다고 말하면 어떻게 될까요?
이 가이드에서는 Spotify 스트리밍 데이터를 사용하여 나만의 개인화된 통계를 생성할 수 있는 Spotify Wrapped 해킹을 안내해 드리겠습니다. 이렇게 하면 Spotify Wrapped를 기다릴 필요가 없으며 Spotify가 표시하지 않는 통계를 생성할 수도 있습니다.
이전 프로젝트 중 하나와 유사하게 이번 프로젝트에서는 Jupyter Notebook을 사용하겠습니다. 데이터를 실험하고 작업하기 위한 훌륭한 도구입니다.
아직 Jupyter Notebook을 설치하지 않았다면 공식 웹사이트 의 지침을 따르세요. 설치가 완료되면 새로운 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 환경에 빠져들 준비를 하세요!