Spotify dengan Python Bagian 1: Pemrosesan awal
Pada artikel ini, kami akan mulai memasukkan data Spotify Anda ke dalam Python. Ini akan menjadi artikel pertama dari serangkaian artikel tentang Spotify dengan Python.
Pada artikel ini, saya akan:
- Tunjukkan cara mendapatkan data Spotify Anda ke Python.
- Muat playlist Lagu Tersimpan Anda ke dalam bingkai data.
- Dapatkan fitur audio dari semua lagu yang Anda simpan.
- Tambahkan genre (grup) ke setiap lagu.
- Berikan kesimpulan kecil dan bicarakan langkah selanjutnya.
Untuk memulainya, kredensial API Spotify pengguna Anda diperlukan.
Untuk melakukannya, Anda harus mengikuti langkah-langkah berikut:
- Buka Dasbor Pengembang Spotify (https://developer.spotify.com/dashboard/applications) dan masuk dengan akun Spotify Anda.
- Klik tombol "Buat Aplikasi" untuk membuat aplikasi Spotify baru.
- Isi informasi yang diperlukan untuk aplikasi Anda, seperti nama, deskripsi, dan situs web. Anda dapat menyetel kolom "Redirect URIs" ke URL yang ingin Anda gunakan sebagai URL pengalihan.
- Setelah membuat aplikasi, Anda akan diberikan nilai "ID Klien" dan "Rahasia Klien".
- Pastikan juga untuk menyetel “Redirect URIs” di aplikasi Spotify Anda agar cocok dengan URL “REDIRECT” yang Anda berikan .
Saya menyimpan kredensial dengan cara berikut di file "kredensial":
USER = '…'
CID = '…'
SECRET = '…'
REDIRECT = '…'
Di Notebook Jupiter, kode berikut dapat dijalankan untuk membuat token pengguna menggunakan kredensial:
#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'])
Mendapatkan lagu yang disimpan dari perpustakaan Spotify
Dalam kode berikut, Lagu Tersimpan diambil dari perpustakaan Spotify. Lagu-lagu disimpan dalam bingkai data panda.
# 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)
Memuat fitur audio
Untuk melakukan analisis eksplorasi Lagu Tersimpan Anda di Spotify, pertama-tama Anda perlu mendapatkan beberapa fitur dari lagu tersebut. Fitur-fitur yang akan diturunkan adalah:
Akustik : Nilai dari 0,0 hingga 1,0 yang menunjukkan apakah suatu trek bersifat akustik, dengan 1,0 mewakili kepercayaan tinggi pada sifat akustik.
Danceability : Ukuran dari 0,0 hingga 1,0 yang menjelaskan seberapa cocok suatu trek untuk menari berdasarkan elemen seperti tempo, stabilitas ritme, kekuatan ketukan, dan keteraturan, dengan 0,0 sebagai yang paling tidak dapat ditarikan dan 1.0 adalah yang paling dapat ditarikan.
Energi : Nilai dari 0,0 hingga 1,0 yang mewakili intensitas dan aktivitas trek, dengan trek energik terasa cepat, keras, dan berisik. Fitur perseptual seperti rentang dinamis, kenyaringan yang dirasakan, timbre, laju awitan, dan entropi berkontribusi pada atribut ini.
Instrumentalness : Prediksi apakah trek berisi vokal, dengan nilai mendekati 1,0 menunjukkan kemungkinan lebih tinggi tidak ada konten vokal. Nilai di atas 0,5 biasanya mewakili trek instrumental, dengan keyakinan yang lebih tinggi saat nilainya mendekati 1,0.
Liveness : Nilai yang menunjukkan kehadiran penonton dalam rekaman, dengan nilai yang lebih tinggi menunjukkan kemungkinan pertunjukan langsung yang lebih tinggi. Nilai di atas 0,8 menunjukkan kemungkinan kuat dari trek langsung.
Kenyaringan : Kenyaringan keseluruhan trek dalam desibel (dB), dirata-ratakan di seluruh trek dan berguna untuk membandingkan kenyaringan relatif trek. Nilai biasanya berkisar antara -60 dan 0 dB.
Speechiness : Ukuran yang menunjukkan adanya kata yang diucapkan dalam trek, dengan nilai yang mendekati 1,0 menunjukkan lebih banyak rekaman seperti ucapan. Nilai di atas 0,66 menggambarkan trek yang seluruhnya terbuat dari kata-kata yang diucapkan, sedangkan nilai antara 0,33 dan 0,66 dapat menunjukkan campuran musik dan ucapan, termasuk musik rap. Nilai di bawah 0,33 sebagian besar mewakili musik dan trek yang tidak mirip ucapan.
Tempo : Perkiraan keseluruhan tempo trek dalam ketukan per menit (BPM), yang menunjukkan kecepatan atau tempo musik.
Tanda birama : Istilah musik yang menentukan jumlah ketukan di setiap birama atau birama.
Valensi : Nilai dari 0,0 hingga 1,0 yang menggambarkan kepositifan musik yang disampaikan oleh sebuah lagu, dengan valensi tinggi menunjukkan lebih banyak emosi positif seperti kebahagiaan dan valensi rendah menunjukkan lebih banyak emosi negatif seperti kesedihan.
Mode : Indikator modalitas (mayor atau minor) trek, dengan 1 mewakili mayor dan 0 mewakili minor.
Kunci : Estimasi keseluruhan kunci trek, dipetakan ke bilangan bulat menggunakan notasi Kelas Pitch standar (misalnya 0 = C, 1 = C♯/D♭, 2 = D, dan seterusnya).
Gunakan kode berikut untuk mendapatkan semua fitur ini.
# 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")
Saya mendapat satu kesalahan untuk satu lagu, karena itu sebenarnya bukan lagu, tapi campuran 2 jam oleh Kerri Chandler. Tentu saja, tidak mungkin mendapatkan satu nilai untuk semua fitur audio ini. Oleh karena itu, 'lagu' ini tidak dibawa ke tahap pemrosesan berikutnya.
Genre
Spotify API tidak menyediakan genre apa pun dengan lagu-lagu tersebut. Ini adalah sesuatu yang harus kita selesaikan. Kita bisa melakukannya, dengan menggunakan API, yang bisa mendapatkan genre terkait dari setiap artis dan menambahkannya ke setiap lagu.
# 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)
Hitung untuk setiap genre:
# 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()
Terlihat bahwa saya sering dalam mood Funky dan Housy, sambil mendengarkan beberapa Indie, Disco dan Soul.
Catatan: 291 trek tidak memiliki genre (grup). Ini adalah masalah yang akan kami tangani di Bagian 2 dari seri ini.
Langkah selanjutnya
Simpan bingkai data ini ke file CSV:
data.to_csv('tracklist.csv', index=False, encoding='utf-8')
Pada artikel selanjutnya, saya akan:
- Lakukan analisis data eksplorasi.
- Tunjukkan cara menetapkan genre ke lagu yang tidak memilikinya.
- Buat daftar putar dari lagu yang Anda simpan di mana musik Anda diurutkan secara otomatis menggunakan Pembelajaran Mesin.
- Otomatiskan proses ini.
Buku catatan tersedia di GitHub saya:
Terima kasih banyak kepada Nils Jennissen dan Gabriel Ronnó yang bekerja sama dengan saya dalam proyek ini. Pastikan untuk mengikutinya di Medium dan GitHub mereka:
- https://medium.com/@nilsjennissen
- https://github.com/nilsjenn
- https://medium.com/@gabriel_renno
- https://github.com/GabrielRenno
Ilustrasi indah dibuat oleh Kateryna Malachkova. Pastikan untuk memeriksa Media dan Instagram-nya!
- https://medium.com/@malachkovak
- https://instagram.com/ph_malachkova?igshid=ZjE2NGZiNDQ=
- https://github.com/rubentak
- https://www.linkedin.com/in/ruben-tak-665b66194/

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































