diff --git a/.gitignore b/.gitignore
index 58ce260..91c0477 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,8 @@ scratch.py
service.json
cache.json
.env
+.venv
+tensorboard-logs
# Created by https://www.toptal.com/developers/gitignore/api/jupyternotebooks
# Edit at https://www.toptal.com/developers/gitignore?templates=jupyternotebooks
diff --git a/README.md b/README.md
index 3596148..0f8c652 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,8 @@ Notebooks:
* [analysis](analysis.ipynb) for a intro to the dataset and premise
* [artist](artist.ipynb), [album](./album.ipynb) & [playlist](playlist.ipynb) investigations
* [stats](stats.ipynb) for high-level stats about the dataset (Spotify feature miss ratio)
-* [playlist classifier](./playlist-classifier.ipynb) using Scikit to classify tracks using the contents of playlists as models
+* [playlist SVM](./playlist-svm.ipynb) using Scikit to classify tracks using the contents of playlists as models
+* [playlist NN](./playlist-nn.ipynb) using a multi-layer perceptron to classify tracks using the contents of playlists as models
Combining Spotify & Last.fm data for exploring habits and trends
Uses two data sources,
diff --git a/album.ipynb b/album.ipynb
index ca3629e..1e1046a 100644
--- a/album.ipynb
+++ b/album.ipynb
@@ -1,85 +1,215 @@
{
- "metadata": {
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.6-final"
- },
- "orig_nbformat": 2,
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3",
- "language": "python"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2,
"cells": [
{
+ "cell_type": "markdown",
+ "metadata": {},
"source": [
"# Album Investigations"
- ],
- "cell_type": "markdown",
- "metadata": {}
+ ]
},
{
"cell_type": "code",
- "execution_count": 67,
+ "execution_count": 5,
"metadata": {},
"outputs": [
{
- "output_type": "stream",
"name": "stdout",
+ "output_type": "stream",
"text": [
- "226 scrobbles\n1 days spent listening since Nov. 2017\n0.68 minutes/day\n"
+ "437 scrobbles\n",
+ "1 days spent listening since Nov. 2017\n",
+ "1.32 minutes/day\n"
]
},
{
- "output_type": "execute_result",
"data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " acousticness | \n",
+ " danceability | \n",
+ " duration_ms | \n",
+ " energy | \n",
+ " instrumentalness | \n",
+ " key | \n",
+ " liveness | \n",
+ " loudness | \n",
+ " mode | \n",
+ " speechiness | \n",
+ " tempo | \n",
+ " time_signature | \n",
+ " valence | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " mean | \n",
+ " 0.235808 | \n",
+ " 0.514851 | \n",
+ " 209165.501144 | \n",
+ " 0.700108 | \n",
+ " 0.000498 | \n",
+ " 5.306636 | \n",
+ " 0.400828 | \n",
+ " -8.853126 | \n",
+ " 0.560641 | \n",
+ " 0.318519 | \n",
+ " 109.820730 | \n",
+ " 3.981693 | \n",
+ " 0.499444 | \n",
+ "
\n",
+ " \n",
+ " std | \n",
+ " 0.210592 | \n",
+ " 0.085053 | \n",
+ " 68305.827980 | \n",
+ " 0.090924 | \n",
+ " 0.001615 | \n",
+ " 4.180808 | \n",
+ " 0.196045 | \n",
+ " 1.101856 | \n",
+ " 0.496878 | \n",
+ " 0.126598 | \n",
+ " 34.338501 | \n",
+ " 0.134211 | \n",
+ " 0.188996 | \n",
+ "
\n",
+ " \n",
+ " min | \n",
+ " 0.010700 | \n",
+ " 0.388000 | \n",
+ " 48507.000000 | \n",
+ " 0.494000 | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ " 0.123000 | \n",
+ " -11.561000 | \n",
+ " 0.000000 | \n",
+ " 0.089200 | \n",
+ " 81.302000 | \n",
+ " 3.000000 | \n",
+ " 0.167000 | \n",
+ "
\n",
+ " \n",
+ " 25% | \n",
+ " 0.049700 | \n",
+ " 0.427000 | \n",
+ " 183320.000000 | \n",
+ " 0.604000 | \n",
+ " 0.000000 | \n",
+ " 1.000000 | \n",
+ " 0.161000 | \n",
+ " -9.636000 | \n",
+ " 0.000000 | \n",
+ " 0.203000 | \n",
+ " 89.060000 | \n",
+ " 4.000000 | \n",
+ " 0.391000 | \n",
+ "
\n",
+ " \n",
+ " 50% | \n",
+ " 0.180000 | \n",
+ " 0.528000 | \n",
+ " 211187.000000 | \n",
+ " 0.715000 | \n",
+ " 0.000000 | \n",
+ " 4.000000 | \n",
+ " 0.389000 | \n",
+ " -8.561000 | \n",
+ " 1.000000 | \n",
+ " 0.321000 | \n",
+ " 91.546000 | \n",
+ " 4.000000 | \n",
+ " 0.494000 | \n",
+ "
\n",
+ " \n",
+ " 75% | \n",
+ " 0.261000 | \n",
+ " 0.588000 | \n",
+ " 226520.000000 | \n",
+ " 0.790000 | \n",
+ " 0.000277 | \n",
+ " 11.000000 | \n",
+ " 0.624000 | \n",
+ " -8.336000 | \n",
+ " 1.000000 | \n",
+ " 0.420000 | \n",
+ " 118.965000 | \n",
+ " 4.000000 | \n",
+ " 0.628000 | \n",
+ "
\n",
+ " \n",
+ " max | \n",
+ " 0.904000 | \n",
+ " 0.676000 | \n",
+ " 513707.000000 | \n",
+ " 0.821000 | \n",
+ " 0.008230 | \n",
+ " 11.000000 | \n",
+ " 0.796000 | \n",
+ " -5.834000 | \n",
+ " 1.000000 | \n",
+ " 0.549000 | \n",
+ " 180.392000 | \n",
+ " 4.000000 | \n",
+ " 0.879000 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
"text/plain": [
" acousticness danceability duration_ms energy instrumentalness \\\n",
- "mean 0.148391 0.722531 207801.309735 0.704982 0.000695 \n",
- "std 0.157705 0.084484 48556.204645 0.123508 0.001212 \n",
- "min 0.002070 0.512000 59118.000000 0.505000 0.000000 \n",
- "25% 0.045400 0.646000 156780.000000 0.579000 0.000000 \n",
- "50% 0.133000 0.744000 213358.000000 0.697000 0.000000 \n",
- "75% 0.155000 0.756000 237297.000000 0.867000 0.000333 \n",
- "max 0.600000 0.836000 291808.000000 0.881000 0.002850 \n",
+ "mean 0.235808 0.514851 209165.501144 0.700108 0.000498 \n",
+ "std 0.210592 0.085053 68305.827980 0.090924 0.001615 \n",
+ "min 0.010700 0.388000 48507.000000 0.494000 0.000000 \n",
+ "25% 0.049700 0.427000 183320.000000 0.604000 0.000000 \n",
+ "50% 0.180000 0.528000 211187.000000 0.715000 0.000000 \n",
+ "75% 0.261000 0.588000 226520.000000 0.790000 0.000277 \n",
+ "max 0.904000 0.676000 513707.000000 0.821000 0.008230 \n",
"\n",
" key liveness loudness mode speechiness tempo \\\n",
- "mean 6.654867 0.289531 -6.128080 0.818584 0.314686 109.640204 \n",
- "std 3.064550 0.224769 2.604052 0.386218 0.152575 25.150042 \n",
- "min 1.000000 0.047900 -16.808000 0.000000 0.162000 70.128000 \n",
- "25% 7.000000 0.110000 -7.491000 1.000000 0.180000 85.486000 \n",
- "50% 7.000000 0.330000 -6.164000 1.000000 0.252000 108.126000 \n",
- "75% 9.000000 0.356000 -4.197000 1.000000 0.406000 129.983000 \n",
- "max 11.000000 0.959000 -3.626000 1.000000 0.863000 144.056000 \n",
+ "mean 5.306636 0.400828 -8.853126 0.560641 0.318519 109.820730 \n",
+ "std 4.180808 0.196045 1.101856 0.496878 0.126598 34.338501 \n",
+ "min 0.000000 0.123000 -11.561000 0.000000 0.089200 81.302000 \n",
+ "25% 1.000000 0.161000 -9.636000 0.000000 0.203000 89.060000 \n",
+ "50% 4.000000 0.389000 -8.561000 1.000000 0.321000 91.546000 \n",
+ "75% 11.000000 0.624000 -8.336000 1.000000 0.420000 118.965000 \n",
+ "max 11.000000 0.796000 -5.834000 1.000000 0.549000 180.392000 \n",
"\n",
" time_signature valence \n",
- "mean 3.915929 0.487842 \n",
- "std 0.361495 0.159650 \n",
- "min 3.000000 0.062200 \n",
- "25% 4.000000 0.379000 \n",
- "50% 4.000000 0.432000 \n",
- "75% 4.000000 0.666000 \n",
- "max 5.000000 0.784000 "
- ],
- "text/html": "\n\n
\n \n \n | \n acousticness | \n danceability | \n duration_ms | \n energy | \n instrumentalness | \n key | \n liveness | \n loudness | \n mode | \n speechiness | \n tempo | \n time_signature | \n valence | \n
\n \n \n \n mean | \n 0.148391 | \n 0.722531 | \n 207801.309735 | \n 0.704982 | \n 0.000695 | \n 6.654867 | \n 0.289531 | \n -6.128080 | \n 0.818584 | \n 0.314686 | \n 109.640204 | \n 3.915929 | \n 0.487842 | \n
\n \n std | \n 0.157705 | \n 0.084484 | \n 48556.204645 | \n 0.123508 | \n 0.001212 | \n 3.064550 | \n 0.224769 | \n 2.604052 | \n 0.386218 | \n 0.152575 | \n 25.150042 | \n 0.361495 | \n 0.159650 | \n
\n \n min | \n 0.002070 | \n 0.512000 | \n 59118.000000 | \n 0.505000 | \n 0.000000 | \n 1.000000 | \n 0.047900 | \n -16.808000 | \n 0.000000 | \n 0.162000 | \n 70.128000 | \n 3.000000 | \n 0.062200 | \n
\n \n 25% | \n 0.045400 | \n 0.646000 | \n 156780.000000 | \n 0.579000 | \n 0.000000 | \n 7.000000 | \n 0.110000 | \n -7.491000 | \n 1.000000 | \n 0.180000 | \n 85.486000 | \n 4.000000 | \n 0.379000 | \n
\n \n 50% | \n 0.133000 | \n 0.744000 | \n 213358.000000 | \n 0.697000 | \n 0.000000 | \n 7.000000 | \n 0.330000 | \n -6.164000 | \n 1.000000 | \n 0.252000 | \n 108.126000 | \n 4.000000 | \n 0.432000 | \n
\n \n 75% | \n 0.155000 | \n 0.756000 | \n 237297.000000 | \n 0.867000 | \n 0.000333 | \n 9.000000 | \n 0.356000 | \n -4.197000 | \n 1.000000 | \n 0.406000 | \n 129.983000 | \n 4.000000 | \n 0.666000 | \n
\n \n max | \n 0.600000 | \n 0.836000 | \n 291808.000000 | \n 0.881000 | \n 0.002850 | \n 11.000000 | \n 0.959000 | \n -3.626000 | \n 1.000000 | \n 0.863000 | \n 144.056000 | \n 5.000000 | \n 0.784000 | \n
\n \n
\n
"
+ "mean 3.981693 0.499444 \n",
+ "std 0.134211 0.188996 \n",
+ "min 3.000000 0.167000 \n",
+ "25% 4.000000 0.391000 \n",
+ "50% 4.000000 0.494000 \n",
+ "75% 4.000000 0.628000 \n",
+ "max 4.000000 0.879000 "
+ ]
},
+ "execution_count": 5,
"metadata": {},
- "execution_count": 67
+ "output_type": "execute_result"
}
],
"source": [
- "album_name = \"dicaprio 2\".lower()\n",
+ "album_name = \"piƱata\".lower()\n",
"album_frame = scrobbles[scrobbles[\"album\"].str.lower() == album_name]# FILTER SCROBBLES\n",
"album_frame = album_frame.sort_index(ascending=False) # SORT\n",
"# album_frame = album_frame.loc[:, descriptor_headers] # DESCRIPTORS\n",
@@ -95,19 +225,20 @@
},
{
"cell_type": "code",
- "execution_count": 68,
+ "execution_count": 6,
"metadata": {},
"outputs": [
{
- "output_type": "display_data",
"data": {
- "text/plain": "