listening-analysis/playlist.ipynb

570 lines
341 KiB
Plaintext
Raw Normal View History

2021-02-01 21:43:27 +00:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
2021-02-01 21:43:27 +00:00
"source": [
"# Playlists\n",
2021-02-01 21:43:27 +00:00
"\n",
"Below are investigations into listening from a playlist context. The start includes data for individual playlists before comparing a group of playlists.\n",
"\n",
"## Individual Playlist Investigations\n",
"\n",
"Below prepares a frame for processing and gives some high-level stats."
]
2021-02-01 21:43:27 +00:00
},
{
"cell_type": "code",
"execution_count": 3,
2021-02-01 21:43:27 +00:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
2021-02-01 21:43:27 +00:00
"text": [
2021-05-10 00:18:57 +01:00
"13,626 scrobbles\n",
2021-05-07 01:03:08 +01:00
"34 days spent listening since Nov. 2017\n",
"43.01 minutes/day\n"
2021-02-01 21:43:27 +00:00
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>acousticness</th>\n",
" <th>danceability</th>\n",
2021-05-10 00:18:57 +01:00
" <th>duration_ms</th>\n",
" <th>energy</th>\n",
" <th>instrumentalness</th>\n",
2021-05-10 00:18:57 +01:00
" <th>key</th>\n",
" <th>liveness</th>\n",
2021-05-10 00:18:57 +01:00
" <th>loudness</th>\n",
" <th>mode</th>\n",
" <th>speechiness</th>\n",
2021-05-10 00:18:57 +01:00
" <th>tempo</th>\n",
" <th>time_signature</th>\n",
" <th>valence</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>mean</th>\n",
2021-05-07 01:03:08 +01:00
" <td>0.199531</td>\n",
" <td>0.661484</td>\n",
2021-05-10 00:18:57 +01:00
" <td>227170.248933</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.696907</td>\n",
" <td>0.009208</td>\n",
2021-05-10 00:18:57 +01:00
" <td>5.398247</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.237718</td>\n",
2021-05-10 00:18:57 +01:00
" <td>-6.896979</td>\n",
" <td>0.619817</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.275724</td>\n",
2021-05-10 00:18:57 +01:00
" <td>116.912993</td>\n",
" <td>4.003049</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.475940</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
2021-05-07 01:03:08 +01:00
" <td>0.199895</td>\n",
" <td>0.146956</td>\n",
2021-05-10 00:18:57 +01:00
" <td>66374.992397</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.149636</td>\n",
" <td>0.054834</td>\n",
2021-05-10 00:18:57 +01:00
" <td>3.714732</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.170471</td>\n",
2021-05-10 00:18:57 +01:00
" <td>2.494965</td>\n",
" <td>0.485450</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.131625</td>\n",
2021-05-10 00:18:57 +01:00
" <td>30.835849</td>\n",
" <td>0.279366</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.219966</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.000017</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.261000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>60867.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.248000</td>\n",
" <td>0.000000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>0.000000</td>\n",
" <td>0.033300</td>\n",
2021-05-10 00:18:57 +01:00
" <td>-18.345000</td>\n",
" <td>0.000000</td>\n",
" <td>0.032300</td>\n",
2021-05-10 00:18:57 +01:00
" <td>47.388000</td>\n",
" <td>1.000000</td>\n",
" <td>0.027200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
2021-05-07 01:03:08 +01:00
" <td>0.044000</td>\n",
" <td>0.549000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>184854.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.582000</td>\n",
" <td>0.000000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>1.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.110000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>-8.431000</td>\n",
" <td>0.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.175000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>90.871000</td>\n",
" <td>4.000000</td>\n",
" <td>0.314000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
2021-05-07 01:03:08 +01:00
" <td>0.139000</td>\n",
" <td>0.667000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>213840.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.706000</td>\n",
" <td>0.000000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>6.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.172000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>-6.741000</td>\n",
" <td>1.000000</td>\n",
" <td>0.282000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>112.942000</td>\n",
" <td>4.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.467000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
2021-05-07 01:03:08 +01:00
" <td>0.300000</td>\n",
" <td>0.765000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>262933.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.811000</td>\n",
" <td>0.000078</td>\n",
2021-05-10 00:18:57 +01:00
" <td>9.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.330000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>-5.146000</td>\n",
" <td>1.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.365000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>139.939000</td>\n",
" <td>4.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.635000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
2021-05-07 01:03:08 +01:00
" <td>0.910000</td>\n",
" <td>0.975000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>774920.000000</td>\n",
" <td>0.993000</td>\n",
" <td>0.847000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>11.000000</td>\n",
" <td>0.979000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>-0.140000</td>\n",
" <td>1.000000</td>\n",
2021-05-07 01:03:08 +01:00
" <td>0.868000</td>\n",
2021-05-10 00:18:57 +01:00
" <td>207.982000</td>\n",
" <td>5.000000</td>\n",
" <td>0.962000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
2021-02-01 21:43:27 +00:00
"text/plain": [
2021-05-10 00:18:57 +01:00
" acousticness danceability duration_ms energy instrumentalness \\\n",
"mean 0.199531 0.661484 227170.248933 0.696907 0.009208 \n",
"std 0.199895 0.146956 66374.992397 0.149636 0.054834 \n",
"min 0.000017 0.261000 60867.000000 0.248000 0.000000 \n",
"25% 0.044000 0.549000 184854.000000 0.582000 0.000000 \n",
"50% 0.139000 0.667000 213840.000000 0.706000 0.000000 \n",
"75% 0.300000 0.765000 262933.000000 0.811000 0.000078 \n",
"max 0.910000 0.975000 774920.000000 0.993000 0.847000 \n",
2021-02-01 21:43:27 +00:00
"\n",
2021-05-10 00:18:57 +01:00
" key liveness loudness mode speechiness tempo \\\n",
"mean 5.398247 0.237718 -6.896979 0.619817 0.275724 116.912993 \n",
"std 3.714732 0.170471 2.494965 0.485450 0.131625 30.835849 \n",
"min 0.000000 0.033300 -18.345000 0.000000 0.032300 47.388000 \n",
"25% 1.000000 0.110000 -8.431000 0.000000 0.175000 90.871000 \n",
"50% 6.000000 0.172000 -6.741000 1.000000 0.282000 112.942000 \n",
"75% 9.000000 0.330000 -5.146000 1.000000 0.365000 139.939000 \n",
"max 11.000000 0.979000 -0.140000 1.000000 0.868000 207.982000 \n",
2021-02-01 21:43:27 +00:00
"\n",
2021-05-10 00:18:57 +01:00
" time_signature valence \n",
"mean 4.003049 0.475940 \n",
"std 0.279366 0.219966 \n",
"min 1.000000 0.027200 \n",
"25% 4.000000 0.314000 \n",
"50% 4.000000 0.467000 \n",
"75% 4.000000 0.635000 \n",
"max 5.000000 0.962000 "
]
2021-02-01 21:43:27 +00:00
},
"execution_count": 3,
2021-02-01 21:43:27 +00:00
"metadata": {},
"output_type": "execute_result"
2021-02-01 21:43:27 +00:00
}
],
"source": [
"playlist_name = \"ALL RAP\"\n",
2021-05-10 00:18:57 +01:00
"\n",
2021-02-01 21:43:27 +00:00
"playlist = get_playlist(playlist_name, spotnet)\n",
2021-05-10 00:18:57 +01:00
"playlist_frame = pd.merge(track_frame(playlist.tracks), scrobbles.reset_index(), on=['track', 'artist']) # FILTER SCROBBLES\n",
"# playlist_frame = playlist_frame.sort_index(ascending=False) # SORT\n",
"# playlist_frame = playlist_frame.loc[:, spotify_descriptor_headers] # DESCRIPTORS\n",
2021-02-01 21:43:27 +00:00
"\n",
"total_time = playlist_frame[\"duration_ms\"].sum() / (1000 * 60) # minutes\n",
"total_days = total_time / (60 * 24) # days\n",
2021-05-10 00:18:57 +01:00
"\n",
2021-02-01 21:43:27 +00:00
"print(f'{playlist_frame.count()[0]:,d} scrobbles')\n",
"print(f'{total_days:.0f} days spent listening since Nov. 2017')\n",
"print(f'{total_time / days_since(first_day).days:.2f} minutes/day')\n",
"\n",
"playlist_frame.describe()[1:]"
]
},
{
"cell_type": "markdown",
"metadata": {},
2021-02-01 21:43:27 +00:00
"source": [
"## Listnening Frequency Over Time"
]
2021-02-01 21:43:27 +00:00
},
{
"cell_type": "code",
"execution_count": 4,
2021-02-01 21:43:27 +00:00
"metadata": {},
"outputs": [
{
"data": {
2021-05-10 00:18:57 +01:00
"image/png": "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
"text/plain": [
"<Figure size 720x480 with 1 Axes>"
]
2021-02-01 21:43:27 +00:00
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
2021-02-01 21:43:27 +00:00
}
],
"source": [
2021-05-10 00:18:57 +01:00
"playlist_frame.set_index('time').resample(\"3W\").count()[\"track\"].plot()\n",
2021-02-01 21:43:27 +00:00
"\n",
"plt.title(f\"{playlist_name} Scrobbles\")\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
2021-02-01 21:43:27 +00:00
"source": [
"## Listening Characteristics Over Time"
]
2021-02-01 21:43:27 +00:00
},
{
"cell_type": "code",
"execution_count": 5,
2021-02-01 21:43:27 +00:00
"metadata": {},
"outputs": [
{
"data": {
2021-05-07 01:03:08 +01:00
"image/png": "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
"text/plain": [
"<Figure size 720x480 with 1 Axes>"
]
2021-02-01 21:43:27 +00:00
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
2021-02-01 21:43:27 +00:00
}
],
"source": [
"playlist_frame.set_index('time')[float_headers].resample(\"2W\").mean().plot(lw=3)\n",
2021-02-01 21:43:27 +00:00
"\n",
"plt.title(f\"{playlist_name} Characteristics Over Time\")\n",
"plt.legend(loc = \"upper left\", fontsize = \"x-small\")\n",
"plt.ylim([0, 1])\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
2021-02-01 21:43:27 +00:00
"source": [
"# Playlist Comparisons\n",
"\n",
"Comparing different playlists over parameters like listening count, average plays per track and sound characteristics."
]
2021-02-01 21:43:27 +00:00
},
{
"cell_type": "code",
"execution_count": 6,
2021-02-01 21:43:27 +00:00
"metadata": {},
"outputs": [],
"source": [
2021-05-07 01:03:08 +01:00
"# playlist_names = [\"RAP\", \"EDM\", \"ROCK\", \"METAL\", \"JAZZ\", \"POP\"] # super-genres\n",
"playlist_names = [\"ALL RAP\", \"EDM\", \"ROCK\", \"METAL\", \"JAZZ\", \"POP\"] # super-genres\n",
"# playlist_names = [\"DNB\", \"HOUSE\", \"TECHNO\", \"GARAGE\", \"DUBSTEP\", \"BASS\"] # EDM playlists\n",
"# playlist_names = [\"20s rap\", \"10s rap\", \"00s rap\", \"90s rap\", \"80s rap\"] # rap decades\n",
"# playlist_names = [\"UK RAP\", \"US RAP\"] # UK/US split\n",
"# playlist_names = [\"uk rap\", \"grime\", \"drill\", \"afro bash\"] # british rap playlists\n",
"# playlist_names = [\"20s rap\", \"10s rap\", \"00s rap\", \"90s rap\", \"80s rap\", \"trap\", \"gangsta rap\", \"industrial rap\", \"weird rap\", \"jazz rap\", \"boom bap\", \"trap metal\"] # american rap playlists\n",
"# playlist_names = [\"rock\", \"indie\", \"punk\", \"pop rock\", \"bluesy rock\", \"hard rock\", \"chilled rock\", \"emo\", \"pop punk\", \"stoner rock/metal\", \"post-hardcore\", \"melodic hardcore\", \"art rock\", \"post-rock\", \"classic pop punk\", \"90s rock & grunge\", \"90s indie & britpop\", \"psych\"] # rock playlists\n",
"# playlist_names = [\"metal\", \"metalcore\", \"mathcore\", \"hardcore\", \"black metal\", \"death metal\", \"doom metal\", \"sludge metal\", \"classic metal\", \"industrial\", \"nu metal\", \"calm metal\", \"thrash metal\"] # metal playlists"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pull and process playlist information.\n",
"\n",
"1. Get live playlist track information from spotify\n",
"2. Filter listening history for these tracks\n",
"3. Calculate various parameters and stats"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"playlists = [get_playlist(i, spotnet) for i in playlist_names] # 1)\n",
2021-02-01 21:43:27 +00:00
"\n",
"# filter playlists by join with playlist track/artist names\n",
"filtered_playlists = [pd.merge(track_frame(i.tracks), scrobbles, on=['track', 'artist']) for i in playlists] # 2)\n",
2021-02-01 21:43:27 +00:00
"\n",
"### STATS, 3) ###\n",
"# number of scrobbles per playlist\n",
2021-02-01 21:43:27 +00:00
"playlist_counts = [i.count()[0] for i in filtered_playlists]\n",
"# total time listenened per playlist\n",
2021-02-01 21:43:27 +00:00
"playlist_time = [i[\"duration_ms\"].sum() for i in filtered_playlists]\n",
"# average track time per playlist\n",
"playlist_average_track_time = [i.drop_duplicates(['uri'])[\"duration_ms\"].mean() for i in filtered_playlists]\n",
"# number of tracks per playlist\n",
"playlist_track_count = np.array([len(i.tracks) for i in playlists])\n",
2021-02-01 21:43:27 +00:00
"\n",
"# distinct on uri\n",
"filtered_playlists = [i.drop_duplicates(['uri']) for i in filtered_playlists]\n",
"# select only descriptor float columns\n",
"filtered_playlists = [i[float_headers] for i in filtered_playlists]\n",
2021-02-01 21:43:27 +00:00
"\n",
"playlist_mean = [i.mean() for i in filtered_playlists]\n",
"playlist_std = [i.std() for i in filtered_playlists]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Listening Characteristics Over Different Playlists"
]
},
2021-02-01 21:43:27 +00:00
{
"cell_type": "code",
"execution_count": 8,
2021-02-01 21:43:27 +00:00
"metadata": {},
"outputs": [
{
"data": {
2021-05-07 01:03:08 +01:00
"image/png": "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
"text/plain": [
"<Figure size 720x480 with 1 Axes>"
]
2021-02-01 21:43:27 +00:00
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
2021-02-01 21:43:27 +00:00
}
],
"source": [
2021-02-04 13:34:25 +00:00
"x_pos = np.arange(len(float_headers))\n",
"for idx, mean in enumerate(playlist_mean):\n",
" plt.plot(x_pos, mean, lw=2)\n",
2021-02-01 21:43:27 +00:00
" \n",
"plt.legend(playlist_names)\n",
"plt.xticks(x_pos, [i[:6] for i in float_headers])\n",
"plt.ylim([0, 1])\n",
2021-02-01 21:43:27 +00:00
"plt.title('Average Playlist Descriptor')\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Time Spent Listening To Each"
]
},
2021-02-01 21:43:27 +00:00
{
"cell_type": "code",
"execution_count": 9,
2021-02-01 21:43:27 +00:00
"metadata": {},
"outputs": [
{
"data": {
2021-05-07 01:03:08 +01:00
"image/png": "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
"text/plain": [
"<Figure size 720x480 with 1 Axes>"
]
2021-02-01 21:43:27 +00:00
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
2021-02-01 21:43:27 +00:00
}
],
"source": [
"plt.barh(np.arange(len(playlist_names)), np.array(playlist_time) / (1000 * 60 * 60 * 24) )\n",
"plt.yticks(np.arange(len(playlist_names)), labels=playlist_names)\n",
"plt.xlabel(\"Time (Days)\")\n",
"plt.grid(axis=\"x\")\n",
"plt.title(\"Time Spent Listening to Playlists\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Normalised\n",
"\n",
"Below normalises the above chart by dividing through by the average track length multiplied by the number of tracks per playlist. The units are essentially average plays per song. The existing data could be described as:\n",
"\n",
"*number of plays \\* track time \\* number of songs in playlist*\n",
"\n",
"By normalising by the last two terms, we get the average number of plays per song."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
2021-05-07 01:03:08 +01:00
"image/png": "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
"text/plain": [
"<Figure size 720x480 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.barh(np.arange(len(playlist_names)), np.array(playlist_time) / (playlist_track_count * playlist_average_track_time) )\n",
"plt.yticks(np.arange(len(playlist_names)), labels=playlist_names)\n",
"plt.xlabel(\"Average plays per song\")\n",
"plt.grid(axis=\"x\")\n",
"plt.title(\"Normalised listening time\")\n",
"plt.show()"
]
},
2021-02-01 21:43:27 +00:00
{
"cell_type": "markdown",
"metadata": {},
2021-02-01 21:43:27 +00:00
"source": [
"# Imports & Setup"
]
2021-02-01 21:43:27 +00:00
},
{
"cell_type": "code",
2021-05-07 01:03:08 +01:00
"execution_count": 1,
2021-02-01 21:43:27 +00:00
"metadata": {},
"outputs": [],
"source": [
"from datetime import datetime\n",
"\n",
"from google.cloud import bigquery\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib as mpl\n",
"mpl.rcParams['figure.dpi'] = 120\n",
2021-02-01 21:43:27 +00:00
"\n",
"from analysis.net import get_spotnet, get_playlist, track_frame\n",
"from analysis.query import *\n",
"from analysis import spotify_descriptor_headers, float_headers, days_since\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"client = bigquery.Client()\n",
"spotnet = get_spotnet()\n",
"cache = 'query.csv'\n",
"first_day = datetime(year=2017, month=11, day=3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
2021-02-01 21:43:27 +00:00
"source": [
"## Read Scrobble Frame"
]
2021-02-01 21:43:27 +00:00
},
{
"cell_type": "code",
"execution_count": 2,
2021-02-01 21:43:27 +00:00
"metadata": {},
"outputs": [],
"source": [
"scrobbles = get_query(cache=cache)"
2021-02-01 21:43:27 +00:00
]
},
{
"cell_type": "markdown",
"metadata": {},
2021-02-01 21:43:27 +00:00
"source": [
"## Write Scrobble Frame"
]
2021-02-01 21:43:27 +00:00
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"scrobbles.reset_index().to_csv(cache, sep='\\t')"
]
2021-02-01 21:43:27 +00:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2021-05-07 01:03:08 +01:00
"version": "3.8.9"
}
},
"nbformat": 4,
"nbformat_minor": 4
}