Spotify trong Python Phần 1: Tiền xử lý
Trong bài viết này, chúng ta sẽ bắt đầu đưa dữ liệu Spotify của bạn vào Python. Đây sẽ là bài viết đầu tiên trong loạt bài viết về Spotify bằng Python.
Trong bài viết này, tôi sẽ:
- Chỉ cho bạn cách đưa dữ liệu Spotify của bạn vào Python.
- Tải danh sách phát Bài hát đã lưu của bạn vào khung dữ liệu.
- Loại bỏ các tính năng âm thanh khỏi tất cả các bài hát đã lưu của bạn.
- Thêm một thể loại (nhóm) cho mỗi bài hát.
- Đưa ra một kết luận nhỏ và nói về các bước tiếp theo.
Để bắt đầu, cần có thông tin đăng nhập API Spotify người dùng của bạn.
Để làm điều này, bạn sẽ cần phải làm theo các bước sau:
- Truy cập Trang tổng quan dành cho nhà phát triển Spotify (https://developer.spotify.com/dashboard/applications) và đăng nhập bằng tài khoản Spotify của bạn.
- Nhấp vào nút “Tạo ứng dụng” để tạo ứng dụng Spotify mới.
- Điền thông tin cần thiết cho ứng dụng của bạn, chẳng hạn như tên, mô tả và trang web. Bạn có thể đặt trường “URI chuyển hướng” thành URL bạn muốn sử dụng làm URL chuyển hướng.
- Sau khi tạo ứng dụng, bạn sẽ được cung cấp các giá trị “Client ID” và “Client Secret”.
- Đảm bảo cũng đặt “URI chuyển hướng” trong ứng dụng Spotify của bạn để khớp với URL “CHUYỂN ĐỔI” mà bạn đã cung cấp .
Tôi đã lưu trữ thông tin đăng nhập theo cách sau trong tệp “thông tin xác thực”:
USER = '…'
CID = '...'
SECRET = '…'
REDIRECT = '…'
Trong Máy tính xách tay Jupiter, mã sau đây có thể được chạy để tạo mã thông báo người dùng bằng thông tin xác thực:
#importing libraries
import credentials
import spotipy
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Retrieve user credentials from separate file
user = credentials.USER
cid = credentials.CID
secret = credentials.SECRET
redirect_uri = credentials.REDIRECT
# Define scope of access
scope = 'user-library-read' # user-library-read, user-read-recently-played
# Prompt for user token using credentials
token = spotipy.util.prompt_for_user_token(user, scope, client_id=cid, client_secret=secret, redirect_uri=redirect_uri)
# Create Spotify token and check if successful
if token:
sp = spotipy.Spotify(auth=token)
print('Token created for', user)
else:
print("Can't get token for", user)
# User data
user_data = sp.current_user()
print('My data:')
print('Name:', user_data['display_name'])
print('Followers:', user_data['followers']['total'])
print('Link:', user_data['external_urls']['spotify'])
Lấy các bài hát đã lưu từ thư viện Spotify
Trong đoạn mã sau, Bài hát đã lưu được truy xuất từ thư viện Spotify. Các bài hát được lưu trữ trong khung dữ liệu gấu trúc.
# Function to get all saved tracks
def get_saved_tracks():
results = sp.current_user_saved_tracks()
tracks = []
while results['next']:
tracks.extend(results['items'])
results = sp.next(results)
return tracks
# Converting tracks to dataframe
def deconstruct_tracks(tracks):
saved_tracks = []
for track in tracks:
saved_track = {
'added_at': track['added_at'],
'id': track['track']['id'],
'name': track['track']['name'],
'popularity': track['track']['popularity'],
'uri': track['track']['uri'],
'artist': track['track']['artists'][0]['name'],
'album': track['track']['album']['name'],
'release_date': track['track']['album']['release_date'],
'duration_ms': track['track']['duration_ms']
}
saved_tracks.append(saved_track)
return pd.DataFrame(saved_tracks)
tracks_called = get_saved_tracks()
tracklist = deconstruct_tracks(tracks_called)
#%%
tracklist.head(10)
Đang tải các tính năng âm thanh
Để thực hiện phân tích khám phá về Bài hát đã lưu của bạn trên Spotify, trước tiên cần rút ra một số tính năng từ bài hát. Các tính năng sẽ được bắt nguồn là:
Độ âm thanh : Giá trị từ 0,0 đến 1,0 cho biết bản nhạc có âm thanh hay không, với 1,0 thể hiện độ tin cậy cao về bản chất âm thanh.
Khả năng khiêu vũ : Một thước đo từ 0,0 đến 1,0 mô tả mức độ phù hợp của một bản nhạc để khiêu vũ dựa trên các yếu tố như nhịp độ, độ ổn định của nhịp điệu, độ mạnh của nhịp và tính đều đặn, với 0,0 là ít dễ nhảy nhất và 1,0 là dễ nhảy nhất.
Năng lượng : Giá trị từ 0,0 đến 1,0 biểu thị cường độ và hoạt động của một bản nhạc, với các bản nhạc tràn đầy năng lượng có cảm giác nhanh, to và ồn ào. Các tính năng cảm nhận như phạm vi động, âm lượng cảm nhận, âm sắc, tốc độ khởi động và entropy góp phần tạo nên thuộc tính này.
Tính nhạc cụ : Dự đoán liệu bản nhạc có chứa giọng hát hay không, với các giá trị càng gần 1,0 cho biết khả năng không có nội dung giọng hát càng cao. Các giá trị trên 0,5 thường đại diện cho các bản nhạc cụ, với độ tin cậy cao hơn khi giá trị tiến đến 1,0.
Sự sống động : Giá trị biểu thị sự hiện diện của khán giả trong bản ghi, với các giá trị càng cao thể hiện khả năng biểu diễn trực tiếp càng cao. Giá trị trên 0,8 cho thấy khả năng cao là có một bản nhạc trực tiếp.
Độ ồn : Độ ồn tổng thể của một rãnh tính bằng decibel (dB), được tính trung bình trên toàn bộ rãnh và hữu ích để so sánh độ ồn tương đối của các rãnh. Các giá trị thường nằm trong khoảng từ -60 đến 0 dB.
Speechiness : Một biện pháp cho biết sự hiện diện của các từ được nói trong một bản nhạc, với các giá trị càng gần 1,0 cho thấy các bản ghi giống giọng nói hơn. Các giá trị trên 0,66 mô tả các bản nhạc hoàn toàn bằng lời nói, trong khi các giá trị từ 0,33 đến 0,66 có thể biểu thị sự kết hợp giữa âm nhạc và lời nói, bao gồm cả nhạc rap. Các giá trị dưới 0,33 chủ yếu đại diện cho âm nhạc và các bản nhạc không giống như lời nói.
Tempo : Nhịp độ ước tính tổng thể của một bản nhạc tính theo nhịp mỗi phút (BPM), cho biết tốc độ hoặc tốc độ của bản nhạc.
Ký hiệu nhịp : Một thuật ngữ âm nhạc chỉ định số nhịp trong mỗi ô nhịp hoặc ô nhịp.
Hóa trị : Giá trị từ 0,0 đến 1,0 mô tả tính tích cực âm nhạc được truyền tải bởi một bản nhạc, với hóa trị cao biểu thị nhiều cảm xúc tích cực hơn như hạnh phúc và hóa trị thấp biểu thị nhiều cảm xúc tiêu cực hơn như buồn bã.
Chế độ : Chỉ báo về thể thức (chính hoặc phụ) của rãnh, với 1 đại diện cho chính và 0 đại diện cho phụ.
Khóa : Khóa tổng thể ước tính của một rãnh, được ánh xạ tới các số nguyên bằng cách sử dụng ký hiệu Lớp cao độ tiêu chuẩn (ví dụ: 0 = C, 1 = C♯/D♭, 2 = D, v.v.).
Sử dụng đoạn mã sau để lấy được tất cả các tính năng này.
# Function to get all audio features of the saved tracks
def get_track_features(id):
metadata = sp.track(id)
features = sp.audio_features(id)
# metadata
id = metadata['id']
name = metadata['name']
album = metadata['album']['name']
artist = metadata['album']['artists'][0]['name']
release_date = metadata['album']['release_date']
length = metadata['duration_ms']
popularity = metadata['popularity']
# audio features
acousticness = features[0]['acousticness']
danceability = features[0]['danceability']
energy = features[0]['energy']
instrumentalness = features[0]['instrumentalness']
liveness = features[0]['liveness']
loudness = features[0]['loudness']
speechiness = features[0]['speechiness']
tempo = features[0]['tempo']
time_signature = features[0]['time_signature']
valence = features[0]['valence']
mode = features[0]['mode']
key = features[0]['key']
track = [name, album, artist, release_date, length, popularity, danceability, acousticness, danceability, energy,
instrumentalness, liveness, loudness, speechiness, tempo, time_signature, valence, mode, key]
return track
print("Function defined")
# Loop through each track id and get the tracks features
for i in range(len(tracklist)):
try:
track = get_track_features(tracklist['id'][i])
tracklist.loc[i, 'name'] = track[0]
tracklist.loc[i, 'album'] = track[1]
tracklist.loc[i, 'artist'] = track[2]
tracklist.loc[i, 'release_date'] = track[3]
tracklist.loc[i, 'length'] = track[4]
tracklist.loc[i, 'popularity'] = track[5]
tracklist.loc[i, 'danceability'] = track[6]
tracklist.loc[i, 'acousticness'] = track[7]
tracklist.loc[i, 'danceability'] = track[8]
tracklist.loc[i, 'energy'] = track[9]
tracklist.loc[i, 'instrumentalness'] = track[10]
tracklist.loc[i, 'liveness'] = track[11]
tracklist.loc[i, 'loudness'] = track[12]
tracklist.loc[i, 'speechiness'] = track[13]
tracklist.loc[i, 'tempo'] = track[14]
tracklist.loc[i, 'time_signature'] = track[15]
tracklist.loc[i, 'valence'] = track[16]
tracklist.loc[i, 'mode'] = track[17]
tracklist.loc[i, 'key'] = track[18]
# Save to df
tracklist.to_csv('tracklist.csv', index=False, encoding='utf-8')
except:
print(f"Error with track {i}")
pass
print(f"Features of {len(tracklist)} tracks extracted and saved to tracklist.csv")
Tôi đã gặp một lỗi đối với một bài hát, vì đó không thực sự là một bài hát mà là một bản hòa âm dài 2 giờ của Kerri Chandler. Tất nhiên, không thể lấy một giá trị cho tất cả các tính năng âm thanh này. Do đó, 'bài hát' này không được đưa đến công đoạn xử lý tiếp theo.
thể loại
API Spotify không cung cấp bất kỳ thể loại nào với các bài hát. Đây là một cái gì đó chúng ta phải làm việc xung quanh. Chúng tôi có thể làm điều này bằng cách sử dụng API, có thể lấy các thể loại liên quan của từng nghệ sĩ và nối các thể loại này vào từng bài hát.
# Add all genres of the artists to the dataframe
genres = []
for i in range(len(data)):
artist = data['artist'][i]
artist_id = sp.search(artist, type='artist')['artists']['items'][0]['id']
artist_genres = sp.artist(artist_id)['genres']
genres.append(artist_genres)
data['genres'] = genres
data.head(10)
# Transform the genre column to extract specific genres
data['genres'] = data['genres'].astype(str)
data['genres'] = data['genres'].str.replace('[', '')
data['genres'] = data['genres'].str.replace(']', '')
data['genres'] = data['genres'].str.replace("'", '')
data['genres'] = data['genres'].str.replace('"', '')
data.head(10)
# Search for predefined genres in the genre column
strings = ['pop', 'techno', 'house', 'disco', 'electronic',
'trance', 'hip hop', 'rap', 'r&b', 'soul', 'rock',
'metal', 'punk', 'jazz', 'blues', 'country', 'folk',
'reggae', 'classical', 'indie', 'funk']
for string in strings:
data.loc[data['genres'].str.contains(string), 'genre_group'] = string
data.head(10)
Đếm cho từng thể loại:
# Check how many tracks are in each genre group
data['genre_group'].value_counts()
# Count missing values
data['genre_group'].isnull().sum()
print(f"{data['genre_group'].isnull().sum()} tracks are missing a genre group")
# visualize the distribution of the genres
plt.figure(figsize=(15, 10))
sns.countplot(y='genre_group', data=data, order=data['genre_group'].value_counts().index)
for i, genre in enumerate(data['genre_group'].value_counts().index):
count = data['genre_group'].value_counts()[genre]
plt.text(count + 10, i, f'{count}', ha='left', va='center', color='black')
plt.title('Distribution of genres with counts')
plt.show()
Có thể thấy rằng tôi thường có tâm trạng Funky và Housy, đồng thời nghe một số Indie, Disco và Soul.
Lưu ý: 291 bản nhạc bị thiếu một thể loại (nhóm). Đây là một vấn đề chúng ta sẽ giải quyết trong Phần 2 của loạt bài này.
Bước tiếp theo
Lưu khung dữ liệu này vào tệp CSV:
data.to_csv('tracklist.csv', index=False, encoding='utf-8')
Trong các bài tiếp theo, tôi sẽ:
- Thực hiện phân tích dữ liệu thăm dò.
- Chỉ ra cách gán thể loại cho các bài hát không có.
- Tạo danh sách phát các bài hát đã lưu trong đó nhạc của bạn được sắp xếp tự động bằng Máy học.
- Tự động hóa quá trình này.
Sổ ghi chép có sẵn trên GitHub của tôi:
Xin chân thành cảm ơn Nils Jennissen và Gabriel Ronnó, những người mà tôi đã làm việc trong dự án này. Hãy nhớ theo dõi anh ấy trên Phương tiện và GitHub của họ :
- https://medium.com/@nilsjennissen
- https://github.com/nilsjenn
- https://medium.com/@gabriel_renno
- https://github.com/GabrielRenno
Hình minh họa tuyệt vời được thực hiện bởi Kateryna Malachkova. Hãy nhớ xem Phương tiện và Instagram của cô ấy!
- https://medium.com/@malachkovak
- https://instagram.com/ph_malachkova?igshid=ZjE2NGZiNDQ=
- https://github.com/rubentak
- https://www.linkedin.com/in/ruben-tak-665b66194/

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































