Analyzing Taylor Swift’s Songs¶
To celebrate Taylor’s new album which has 10 of the top 10 Billboard charts (first time to ever happen), let’s explore Taylor’s discography with the Spotify API.
Don’t wait, download now and transform your career!
Your FREE Guide to Become a Data Scientist
Get credentials from Spotify API¶
Go to your Spotify Dashboard at https://developer.spotify.com/dashboard/ and create a new application, then grab the Client ID and Client Secret Key.
# FILL IN THESE VALUES WITH YOUR OWN KEYS
# client_id = ""
# client_secret = ""
# Make sure to add this on "Edit Settings" in your Dashboard
# redirect_uri = "http://localhost:9000"
Upon creating the Web App, you’ll need to go to “Edit Settings” and add a redirect URI, in our case, we aren’t hosting anything, so just set it to a localhost URL (make sure this doesn’t interfere with anything you have running locally, like Jupyter Notebook for instance).
Connect with spotipy library¶
Next we will use the Spotipy library (which is a wrapper on the official REST API) to connect with the Spotify API directly with Python:
# !pip install spotipy
import spotipy
from spotipy.oauth2 import SpotifyOAuth
Now we will connect, but we also need to define the scope of our App, do we want the app to be able to edit/create playlists? Or just read general information from Spotify? You can find a list of scopes here:
https://developer.spotify.com/documentation/general/guides/authorization/scopes/
# Connect with API Keys created earlier
scope = "user-read-recently-played"
sp = spotipy.Spotify(auth_manager=SpotifyOAuth(scope=scope,
client_id=client_id,
client_secret=client_secret,
redirect_uri=redirect_uri))
Test the API¶
Let’s explore our most recently 50 played songs using Spotipy. (And also let’s will strongly consider if we should quickly listen to 50 “cool” songs for a public blog post, but then decide that we’re confortable sharing the fact that we still listen to the Hercules cartoon soundtrack by Alan Menken).
# Running this should open a new tab, click "agree"
results = sp.current_user_recently_played()
type(results)
dict
results.keys()
dict_keys(['items', 'next', 'cursors', 'limit', 'href'])
for idx, item in enumerate(results['items']):
track_id = item['track']
track_name = track_id['name']
# This assumes one artist name, but its a list for collabs
artist_name = track_id['artists'][0]['name']
print(f"{idx}.) {track_name} by {artist_name}")
0.) You've Got a Friend in Me - From "Toy Story"/Soundtrack Version by Randy Newman 1.) For the Night by Chlöe 2.) Unholy (feat. Kim Petras) by Sam Smith 3.) You're On Your Own, Kid by Taylor Swift 4.) Snow On The Beach (feat. Lana Del Rey) by Taylor Swift 5.) Anti-Hero by Taylor Swift 6.) Maroon by Taylor Swift 7.) Snow On The Beach (feat. Lana Del Rey) by Taylor Swift 8.) Anti-Hero by Taylor Swift 9.) Maroon by Taylor Swift 10.) Lavender Haze by Taylor Swift 11.) Hiddensee by Ceeys 12.) Open by Luke Howard 13.) As the Darkness Falls by Maxence Cyrin 14.) Solfeggio, H. 220 by Carl Philipp Emanuel Bach 15.) Domestic Pressures by Jóhann Jóhannsson 16.) String Quartet No. 3, "Mishima": VI. Mishima / Closing by Philip Glass 17.) 16 Waltzes, Op. 39: No. 15 In A Flat Major by Johannes Brahms 18.) Nocturne No. 10 In E Minor by Benjamin Frith 19.) Biomes by James Heather 20.) Mendelssohn: Songs Without Words, Book VI, Op. 67: No. 2, Allegro leggiero, MWV U145 by Felix Mendelssohn 21.) Preludes, Op. 28: No. 4 in E Minor, Largo by Frédéric Chopin 22.) Running By The Roads, Running By The Fields (Solo Piano) by Library Tapes 23.) Flute Sonata in E-Flat Major, BWV 1031: II. Siciliano (arr. I. Friedman for piano) by Ignaz Friedman 24.) Carnaval, Op. 9: No. 12. Chopin by Robert Schumann 25.) Ultraviolet by James Heather 26.) Tumbling Tumbleweeds by Johnny Bond 27.) A Tale from the Past by Maxence Cyrin 28.) Violin Concerto No. 1 (1987) Movement II by Philip Glass 29.) Niemand bringt Marten um - Lambert Rework by Marteria 30.) Merry Christmas Mr. Lawrence by Ryuichi Sakamoto 31.) Kaleidoscope Heart by Sara Bareilles 32.) Political Science by Randy Newman 33.) I Know Him by Jonathan Groff 34.) Rise Up by Kecia Lewis-Evans 35.) I'm Only Thinking of Him by Natascia Diaz 36.) You Make Me Feel Like It’s Halloween by Muse 37.) Ghosts (How Can I Move On) by Muse 38.) Won’t Stand Down by Muse 39.) Liberation by Muse 40.) Meant For You - Alternate Version With Session Intro by The Beach Boys 41.) Man of La Mancha (I, Don Quixote) by Brian Stokes Mitchell 42.) Hold On - Remastered 2010 by John Lennon 43.) Don't Worry Baby - Remastered 2001 by The Beach Boys 44.) Telephone Line by Electric Light Orchestra 45.) As the Romans Do by Theo Katzman 46.) Motivation by Benjamin Booker 47.) Dosed by Red Hot Chili Peppers 48.) Under the Westway by Blur 49.) Zero To Hero by Chorus - Hercules
Ok, so that worked! And also shared my…ecletic tastes in music.
Taylor Swift Albums¶
Let’s now shift gears to focus on a single artist – Taylor Swift who recently released a new album. Go to spotify.com and then look up the artist, you should see the ID in the URL.
taylor_swift = sp.artist("06HL4z0CvFAxyc27GXpf02")
taylor_swift
{'external_urls': {'spotify': 'https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02'}, 'followers': {'href': None, 'total': 61126540}, 'genres': ['pop'], 'href': 'https://api.spotify.com/v1/artists/06HL4z0CvFAxyc27GXpf02', 'id': '06HL4z0CvFAxyc27GXpf02', 'images': [{'height': 640, 'url': 'https://i.scdn.co/image/ab6761610000e5eb5a00969a4698c3132a15fbb0', 'width': 640}, {'height': 320, 'url': 'https://i.scdn.co/image/ab676161000051745a00969a4698c3132a15fbb0', 'width': 320}, {'height': 160, 'url': 'https://i.scdn.co/image/ab6761610000f1785a00969a4698c3132a15fbb0', 'width': 160}], 'name': 'Taylor Swift', 'popularity': 100, 'type': 'artist', 'uri': 'spotify:artist:06HL4z0CvFAxyc27GXpf02'}
Now let’s get Taylor’s albums:
taylor_albums = sp.artist_albums(taylor_swift['id'],limit=50)
for album in taylor_albums['items']:
print(f"Album: {album['name']} -- ID: {album['id']}")
Album: Midnights (3am Edition) -- ID: 3lS1y25WAhcqJDATJK70Mq Album: Midnights (3am Edition) -- ID: 4894htPwC6zoiuTqUQwn4I Album: Midnights -- ID: 151w1FgRZfnKZA9FEcg9Z3 Album: Midnights -- ID: 4moVP48t9bji7djUc5VOvi Album: Red (Taylor's Version) -- ID: 6kZ42qRrzov54LcAk4onW9 Album: Red (Taylor's Version) -- ID: 6x9s2ObPdpATZgrwxsk9c0 Album: Fearless (Taylor's Version) -- ID: 4hDok0OAJd57SGIT8xuWJH Album: evermore (deluxe version) -- ID: 6AORtDjduMM3bupSWzbTSG Album: evermore (deluxe version) -- ID: 1DT6fDJL6AWPJxe7Lq1dPb Album: evermore -- ID: 2Xoteh7uEpea4TohMxjtaq Album: evermore -- ID: 5jmVg7rwRcgd6ARPAeYNSm Album: folklore: the long pond studio sessions (from the Disney+ special) [deluxe edition] -- ID: 0PZ7lAru5FDFHuirTkWe9Z Album: folklore: the long pond studio sessions (from the Disney+ special) [deluxe edition] -- ID: 3VaaZ7OIbGLi60NVsnueoo Album: folklore (deluxe version) -- ID: 1pzvBxYgT6OVwJLtHkrdQK Album: folklore (deluxe version) -- ID: 7v7pe5vZQPWB5zW0JrKRiw Album: folklore -- ID: 2fenSS68JI1h4Fo296JfGr Album: folklore -- ID: 0xS0iOtxQRoJvfcFcJA5Gv Album: Lover -- ID: 1NAmidJlEaVgA3MpcPFYGq Album: Taylor Swift Karaoke: reputation -- ID: 1MHuZZrGT36cXLxAQ5cLP3 Album: reputation -- ID: 6DEjYFkNZh67HP7R9PSZvv Album: reputation (Big Machine Radio Release Special) -- ID: 1Hrs3jLGexOvBoaPMoOQYJ Album: reputation Stadium Tour Surprise Song Playlist -- ID: 1MPAXuTVL2Ej5x0JHiSPq8 Album: 1989 -- ID: 2QJmrSgbdM35R67eoGQo4j Album: 1989 (Big Machine Radio Release Special) -- ID: 6EsTJnpahwW6xX20zvqQgZ Album: Taylor Swift Karaoke: 1989 -- ID: 02H4kc9YLgorpUIREOwa0q Album: 1989 (Deluxe Edition) -- ID: 34OkZVpuzBa9y40DCy0LPR Album: Red -- ID: 1EoDsNmgTLtmwe1BDAVxV5 Album: Red (Deluxe Edition) -- ID: 1KlU96Hw9nlvqpBPlSqcTV Album: Red (Big Machine Radio Release Special) -- ID: 4jTYApZPMapg56gRycOn0D Album: Taylor Swift Karaoke: Red -- ID: 11gfxXxJPd3j6sdWUyEA5S Album: Speak Now World Tour Live -- ID: 6fyR4wBPwLHKcRtxgd4sGh Album: Speak Now -- ID: 5MfAxS5zz8MlfROjGQVXhy Album: Speak Now (Big Machine Radio Release Special) -- ID: 75N0Z60SNMQbAPYZuxKgWd Album: Taylor Swift Karaoke: Speak Now -- ID: 1BdjHo5IR6twMhJDxzlpLt Album: Speak Now (Deluxe Edition) -- ID: 5EpMjweRD573ASl7uNiHym Album: Fearless -- ID: 2dqn5yOQWdyGwOpOIi9O4x Album: Fearless (Big Machine Radio Release Special) -- ID: 3EzFY9Rg0PpbADMth746zi Album: Fearless Karaoke -- ID: 6vRfYCQ1mKKfnB6D7R4N5p Album: Fearless Platinum Edition -- ID: 43OpbkiiIxJO8ktIB777Nn Album: Live From Clear Channel Stripped 2008 -- ID: 1ycoesYxIFymXWebfmz828 Album: Taylor Swift -- ID: 7mzrIsaAjnXihW3InKjlC3 Album: Taylor Swift (Big Machine Radio Release Special) -- ID: 2rU7u7C2v5i45MFVxx7xG1 Album: Taylor Swift Karaoke -- ID: 1ymIvQpnPQBj1lGlJRqrFQ Album: Carolina (From The Motion Picture “Where The Crawdads Sing”) -- ID: 5Bwg2XxrjTlrNy6BC7KQZf Album: All Too Well (10 Minute Version) (The Short Film) -- ID: 2O1NYIBQCUobrL97A2Unk8 Album: This Love (Taylor’s Version) -- ID: 3In1CblWZswwun5MhOa10y Album: The Joker And The Queen (feat. Taylor Swift) -- ID: 0vkAczpFKCazPKaoLtnBr0 Album: Message In A Bottle (Fat Max G Remix) (Taylor’s Version) -- ID: 6d8IUfMwq7HGCnR2efXjdm Album: All Too Well (Sad Girl Autumn Version) - Recorded at Long Pond Studios -- ID: 4qgs0gHJBgycj5SKqafFOB Album: All Too Well (Sad Girl Autumn Version) - Recorded at Long Pond Studios -- ID: 6iLFzruqCNyIXjIgRioa2c
Cleaning the Data¶
Looks like we have a few issues, here, due to Taylor Swift re-releasing album’s via her “Taylor Edition” and also having many “special edition” versions of albums, we have duplicate entries. Let’s drop these duplicates and create a clean list of album ids:
album_names = []
albums = []
for album in taylor_albums['items']:
album_name = album['name']
album_id = album['id']
# Very ugly hacky code to clean out the duplicates, but it worked...
if album_name[:3] not in album_names and "remix" not in album_name and "Karaoke" not in album_name and "Live" not in album_name:
album_names.append(album_name[:3] )
albums.append((album_name,album_id))
albums
[('Midnights (3am Edition)', '3lS1y25WAhcqJDATJK70Mq'), ("Red (Taylor's Version)", '6kZ42qRrzov54LcAk4onW9'), ("Fearless (Taylor's Version)", '4hDok0OAJd57SGIT8xuWJH'), ('evermore (deluxe version)', '6AORtDjduMM3bupSWzbTSG'), ('folklore: the long pond studio sessions (from the Disney+ special) [deluxe edition]', '0PZ7lAru5FDFHuirTkWe9Z'), ('Lover', '1NAmidJlEaVgA3MpcPFYGq'), ('reputation', '6DEjYFkNZh67HP7R9PSZvv'), ('1989', '2QJmrSgbdM35R67eoGQo4j'), ('Speak Now', '5MfAxS5zz8MlfROjGQVXhy'), ('Taylor Swift', '7mzrIsaAjnXihW3InKjlC3'), ('Carolina (From The Motion Picture “Where The Crawdads Sing”)', '5Bwg2XxrjTlrNy6BC7KQZf'), ('All Too Well (10 Minute Version) (The Short Film)', '2O1NYIBQCUobrL97A2Unk8'), ('This Love (Taylor’s Version)', '3In1CblWZswwun5MhOa10y'), ('The Joker And The Queen (feat. Taylor Swift)', '0vkAczpFKCazPKaoLtnBr0'), ('Message In A Bottle (Fat Max G Remix) (Taylor’s Version)', '6d8IUfMwq7HGCnR2efXjdm')]
We can see that there are a few singles or EPs here, let’s go ahead and just slice those out:
final_album_list = albums[:-5]
final_album_list
[('Midnights (3am Edition)', '3lS1y25WAhcqJDATJK70Mq'), ("Red (Taylor's Version)", '6kZ42qRrzov54LcAk4onW9'), ("Fearless (Taylor's Version)", '4hDok0OAJd57SGIT8xuWJH'), ('evermore (deluxe version)', '6AORtDjduMM3bupSWzbTSG'), ('folklore: the long pond studio sessions (from the Disney+ special) [deluxe edition]', '0PZ7lAru5FDFHuirTkWe9Z'), ('Lover', '1NAmidJlEaVgA3MpcPFYGq'), ('reputation', '6DEjYFkNZh67HP7R9PSZvv'), ('1989', '2QJmrSgbdM35R67eoGQo4j'), ('Speak Now', '5MfAxS5zz8MlfROjGQVXhy'), ('Taylor Swift', '7mzrIsaAjnXihW3InKjlC3')]
Alright, now we have Taylor’s main 10 albums. Let’s explore the songs in them.
Songs from Taylor’s Albums¶
taylor_song_ids = []
for album_name, album_id in final_album_list:
tracks = sp.album_tracks(album_id)['items']
for track in tracks:
track_name = track['name']
track_id = track['id']
taylor_song_ids.append((album_name,album_id,track_name,track_id))
taylor_song_ids[0]
('Midnights (3am Edition)', '3lS1y25WAhcqJDATJK70Mq', 'Lavender Haze', '4g2c7NoTWAOSYDy44l9nub')
len(taylor_song_ids)
202
Song Features¶
Spotify has machine generated features for songs, let’s grab them with the API.
import pandas as pd
# Test out one song:
features = sp.audio_features(tracks=['4g2c7NoTWAOSYDy44l9nub'])
features
[{'danceability': 0.735, 'energy': 0.444, 'key': 10, 'loudness': -10.519, 'mode': 1, 'speechiness': 0.0684, 'acousticness': 0.204, 'instrumentalness': 0.0012, 'liveness': 0.17, 'valence': 0.0984, 'tempo': 97.038, 'type': 'audio_features', 'id': '4g2c7NoTWAOSYDy44l9nub', 'uri': 'spotify:track:4g2c7NoTWAOSYDy44l9nub', 'track_href': 'https://api.spotify.com/v1/tracks/4g2c7NoTWAOSYDy44l9nub', 'analysis_url': 'https://api.spotify.com/v1/audio-analysis/4g2c7NoTWAOSYDy44l9nub', 'duration_ms': 202396, 'time_signature': 4}]
pd.Series(features[0])
danceability 0.735 energy 0.444 key 10 loudness -10.519 mode 1 speechiness 0.0684 acousticness 0.204 instrumentalness 0.0012 liveness 0.17 valence 0.0984 tempo 97.038 type audio_features id 4g2c7NoTWAOSYDy44l9nub uri spotify:track:4g2c7NoTWAOSYDy44l9nub track_href https://api.spotify.com/v1/tracks/4g2c7NoTWAOS... analysis_url https://api.spotify.com/v1/audio-analysis/4g2c... duration_ms 202396 time_signature 4 dtype: object
Let’s create a pandas DataFrame of this song feature data:
df = pd.DataFrame()
# This will take awhile, due to us not using the batch feature
for album_name,album_id,track_name, track_id in taylor_song_ids:
features = sp.audio_features(tracks=[track_id])[0]
features['album_name'] = album_name
features['album_id'] = album_id
features['track_name'] = track_name
ser = pd.Series(features)
df = pd.concat([df,ser],axis=1)
# Tranpose to fix concat issue due to axis=1
df = df.transpose().set_index('id')
df.head()[['danceability', 'energy', 'key', 'acousticness','album_name','track_name']]
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
danceability | energy | key | acousticness | album_name | track_name | |
---|---|---|---|---|---|---|
id | ||||||
4g2c7NoTWAOSYDy44l9nub | 0.735 | 0.444 | 10 | 0.204 | Midnights (3am Edition) | Lavender Haze |
199E1RRrVmVTQqBXih5qRC | 0.658 | 0.378 | 7 | 0.0593 | Midnights (3am Edition) | Maroon |
02Zkkf2zMkwRGQjZ7T4p8f | 0.638 | 0.634 | 4 | 0.133 | Midnights (3am Edition) | Anti-Hero |
6ADDIJxxqzM9LMpm78yzQG | 0.659 | 0.323 | 9 | 0.735 | Midnights (3am Edition) | Snow On The Beach (feat. Lana Del Rey) |
7gVWKBcfIW93YxNBi3ApIE | 0.694 | 0.38 | 2 | 0.416 | Midnights (3am Edition) | You’re On Your Own, Kid |
Visualizing the Songs¶
Let’s explore how much Taylor’s music varies from album to album. We’ll begin by creating a dataframe that consists only of the Spotify audio features:
df.columns
Index(['danceability', 'energy', 'key', 'loudness', 'mode', 'speechiness', 'acousticness', 'instrumentalness', 'liveness', 'valence', 'tempo', 'type', 'uri', 'track_href', 'analysis_url', 'duration_ms', 'time_signature', 'album_name', 'album_id', 'track_name'], dtype='object')
data_features = df.drop(['type', 'uri', 'track_href', 'analysis_url','album_name', 'album_id', 'track_name'],axis=1)
data_features.describe()[['danceability', 'energy', 'key', 'loudness', 'mode', 'speechiness','acousticness']]
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
danceability | energy | key | loudness | mode | speechiness | acousticness | |
---|---|---|---|---|---|---|---|
count | 202.000000 | 202.000000 | 202.000000 | 202.000000 | 202.000000 | 202.000000 | 202.000000 |
mean | 0.583371 | 0.550678 | 4.688119 | -7.856045 | 0.905941 | 0.056680 | 0.368242 |
std | 0.115050 | 0.192372 | 3.363065 | 2.841624 | 0.292637 | 0.055445 | 0.350734 |
min | 0.292000 | 0.131000 | 0.000000 | -15.434000 | 0.000000 | 0.023100 | 0.000191 |
25% | 0.511250 | 0.396000 | 2.000000 | -10.149500 | 1.000000 | 0.030650 | 0.040300 |
50% | 0.594000 | 0.567500 | 5.000000 | -7.330000 | 1.000000 | 0.038200 | 0.215000 |
75% | 0.656250 | 0.702750 | 7.000000 | -5.723750 | 1.000000 | 0.056875 | 0.748250 |
max | 0.897000 | 0.950000 | 11.000000 | -2.098000 | 1.000000 | 0.519000 | 0.971000 |
It looks like our columns are still str objects, let’s change them to float:
for col in data_features.columns:
data_features[col] = data_features[col].apply(float)
data_features.describe()[['danceability', 'energy', 'key', 'loudness', 'mode', 'speechiness','acousticness']]
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
danceability | energy | key | loudness | mode | speechiness | acousticness | |
---|---|---|---|---|---|---|---|
count | 202.000000 | 202.000000 | 202.000000 | 202.000000 | 202.000000 | 202.000000 | 202.000000 |
mean | 0.583371 | 0.550678 | 4.688119 | -7.856045 | 0.905941 | 0.056680 | 0.368242 |
std | 0.115050 | 0.192372 | 3.363065 | 2.841624 | 0.292637 | 0.055445 | 0.350734 |
min | 0.292000 | 0.131000 | 0.000000 | -15.434000 | 0.000000 | 0.023100 | 0.000191 |
25% | 0.511250 | 0.396000 | 2.000000 | -10.149500 | 1.000000 | 0.030650 | 0.040300 |
50% | 0.594000 | 0.567500 | 5.000000 | -7.330000 | 1.000000 | 0.038200 | 0.215000 |
75% | 0.656250 | 0.702750 | 7.000000 | -5.723750 | 1.000000 | 0.056875 | 0.748250 |
max | 0.897000 | 0.950000 | 11.000000 | -2.098000 | 1.000000 | 0.519000 | 0.971000 |
Plotting acoustic music quality¶
If you’re a true “Swiftie”, then you know some albums sound way more acoustic than others, let’s explore the data features to see if that is reflected in the data:
plt.figure(dpi=200)
sns.scatterplot(x='loudness',y='acousticness',data=data_features,hue=df['album_name'])
plt.legend(loc=(1.05,0.2))
If you are familiar with Taylor’s albums, you can see that it makes sense that more folklore and evermore songs are higher on the “acousticness” feature spectrum and lower on the “loudness” feature.
It looks like “reputation” is one of the more distinct albums. Let’s explore Taylor’s songwriting range by finding her most distinct songs.
Calculating Taylor’s Songwriting Range¶
Obviously there is a lot of variance in Taylor’s songwriting across albums, but what songs are the most different? We can calculate the euclidean distance between all the songs and then find the largest distance.
import scipy
distances = scipy.spatial.distance.cdist(data_features, data_features, metric='euclidean')
distances.shape
(202, 202)
Here we can see a heatmap of the distance between each song. Obviously, each song will have 0 distance between itself (which is the dark diagonal line you see). But what about this crazy range we see around the 48-50 id mark?
plt.figure(dpi=200)
sns.heatmap(distances)
df[distances==distances.max()][['album_name','track_name']]
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
album_name | track_name | |
---|---|---|
id | ||
5jAIouBES8LWMiriuNq170 | Red (Taylor’s Version) | State Of Grace (Acoustic Version) (Taylor’s Ve… |
1gaLZjPrDnHQWJds2Jg4KT | folklore: the long pond studio sessions (from … | this is me trying – the long pond studio sessions |
Looks like its “Glitch” from Midnights and “All Too Well (10 Minute Version) (Taylor’s Version)” from the album Red. So what’s the next step? Give both songs a quick listen, and you’ll notice they are actually not extremely different, except for the length of time. Could that have been a major feature? Let’s try dropping some data features and trying out this analysis again.
no_time = data_features.drop(['duration_ms','time_signature'],axis=1)
distances = scipy.spatial.distance.cdist(no_time, no_time, metric='euclidean')
distances.max()
140.85228039209588
df[distances==distances.max()][['album_name','track_name']]
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
album_name | track_name | |
---|---|---|
id | ||
5jAIouBES8LWMiriuNq170 | Red (Taylor’s Version) | State Of Grace (Acoustic Version) (Taylor’s Ve… |
1gaLZjPrDnHQWJds2Jg4KT | folklore: the long pond studio sessions (from … | this is me trying – the long pond studio sessions |
Interesting. My conclusion after listening to these songs? Given these features, its probably not useful to take such a mathematical approach on these songs, and instead, better to just listen and enjoy them!
Hope you found this interesting, check out our other blog posts for more fun analysis!