Skip to content

Instantly share code, notes, and snippets.

@benkamphaus
Last active February 8, 2020 23:48
Show Gist options
  • Save benkamphaus/04ed8cba003bbc2b2edf707f558a3472 to your computer and use it in GitHub Desktop.
Save benkamphaus/04ed8cba003bbc2b2edf707f558a3472 to your computer and use it in GitHub Desktop.
Analysis of my streaming revenue
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Earnings Report Exploration\n",
"\n",
"Looking at breakdown of streaming pays from major services. This is pretty basic, but maybe fun to look at?\n",
"\n",
"Note: package management in data science land is sheer insanity and Docker (or various isolated/containerized cloud packaging) the only reasonable solution; thus project structure matches my typical docker compose setup."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%cd /project/"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Reading and poking at the data we see some various quality issues, missing error ranges at reporting boundary, etc."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"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>Start of reporting period</th>\n",
" <th>End of reporting period</th>\n",
" <th>Store</th>\n",
" <th>Store service</th>\n",
" <th>Country of sale or stream</th>\n",
" <th>Album</th>\n",
" <th>UPC</th>\n",
" <th>Track</th>\n",
" <th>ISRC</th>\n",
" <th>Quantity of sales or streams</th>\n",
" <th>Gross earnings (USD)</th>\n",
" <th>Net earnings (USD)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Walking the Manifold</td>\n",
" <td>CAGOO1804133</td>\n",
" <td>2</td>\n",
" <td>1.400000</td>\n",
" <td>1.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Merlin Sickness</td>\n",
" <td>CAGOO1804127</td>\n",
" <td>2</td>\n",
" <td>1.400000</td>\n",
" <td>1.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>To Andromeda (Silver Wings)</td>\n",
" <td>CAGOO1804130</td>\n",
" <td>2</td>\n",
" <td>1.400000</td>\n",
" <td>1.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Departure</td>\n",
" <td>CAGOO1804134</td>\n",
" <td>2</td>\n",
" <td>1.400000</td>\n",
" <td>1.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Raid on the Caleuche</td>\n",
" <td>CAGOO1804129</td>\n",
" <td>2</td>\n",
" <td>1.400000</td>\n",
" <td>1.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>The Physical Option</td>\n",
" <td>CAGOO1804128</td>\n",
" <td>2</td>\n",
" <td>1.400000</td>\n",
" <td>1.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Orbital Resonance</td>\n",
" <td>CAGOO1804131</td>\n",
" <td>2</td>\n",
" <td>1.400000</td>\n",
" <td>1.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Falling Toward Resurgam (Bonus Track)</td>\n",
" <td>CAGOO1804132</td>\n",
" <td>2</td>\n",
" <td>1.400000</td>\n",
" <td>1.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>2018-03-30</td>\n",
" <td>2018-05-03</td>\n",
" <td>ITunes</td>\n",
" <td>Apple Music</td>\n",
" <td>AU</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Walking the Manifold</td>\n",
" <td>CAGOO1804133</td>\n",
" <td>1</td>\n",
" <td>0.006435</td>\n",
" <td>0.006435</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>2018-03-30</td>\n",
" <td>2018-05-03</td>\n",
" <td>ITunes</td>\n",
" <td>Apple Music</td>\n",
" <td>AU</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Merlin Sickness</td>\n",
" <td>CAGOO1804127</td>\n",
" <td>1</td>\n",
" <td>0.006435</td>\n",
" <td>0.006435</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Start of reporting period End of reporting period Store Store service \\\n",
"0 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"1 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"2 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"3 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"4 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"5 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"6 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"7 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"8 2018-03-30 2018-05-03 ITunes Apple Music \n",
"9 2018-03-30 2018-05-03 ITunes Apple Music \n",
"\n",
" Country of sale or stream Album UPC Track \\\n",
"0 US NaN NaN Walking the Manifold \n",
"1 US NaN NaN Merlin Sickness \n",
"2 US NaN NaN To Andromeda (Silver Wings) \n",
"3 US NaN NaN Departure \n",
"4 US NaN NaN Raid on the Caleuche \n",
"5 US NaN NaN The Physical Option \n",
"6 US NaN NaN Orbital Resonance \n",
"7 US NaN NaN Falling Toward Resurgam (Bonus Track) \n",
"8 AU NaN NaN Walking the Manifold \n",
"9 AU NaN NaN Merlin Sickness \n",
"\n",
" ISRC Quantity of sales or streams Gross earnings (USD) \\\n",
"0 CAGOO1804133 2 1.400000 \n",
"1 CAGOO1804127 2 1.400000 \n",
"2 CAGOO1804130 2 1.400000 \n",
"3 CAGOO1804134 2 1.400000 \n",
"4 CAGOO1804129 2 1.400000 \n",
"5 CAGOO1804128 2 1.400000 \n",
"6 CAGOO1804131 2 1.400000 \n",
"7 CAGOO1804132 2 1.400000 \n",
"8 CAGOO1804133 1 0.006435 \n",
"9 CAGOO1804127 1 0.006435 \n",
"\n",
" Net earnings (USD) \n",
"0 1.400000 \n",
"1 1.400000 \n",
"2 1.400000 \n",
"3 1.400000 \n",
"4 1.400000 \n",
"5 1.400000 \n",
"6 1.400000 \n",
"7 1.400000 \n",
"8 0.006435 \n",
"9 0.006435 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv(\"data/earnings-report.csv\")\n",
"df.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Mostly pandas figured out types Ok, but datetime encoding usually worth it."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Start of reporting period object\n",
"End of reporting period object\n",
"Store object\n",
"Store service object\n",
"Country of sale or stream object\n",
"Album object\n",
"UPC float64\n",
"Track object\n",
"ISRC object\n",
"Quantity of sales or streams int64\n",
"Gross earnings (USD) float64\n",
"Net earnings (USD) float64\n",
"dtype: object"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"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>Start of reporting period</th>\n",
" <th>End of reporting period</th>\n",
" <th>Store</th>\n",
" <th>Store service</th>\n",
" <th>Country of sale or stream</th>\n",
" <th>Album</th>\n",
" <th>UPC</th>\n",
" <th>Track</th>\n",
" <th>ISRC</th>\n",
" <th>Quantity of sales or streams</th>\n",
" <th>Gross earnings (USD)</th>\n",
" <th>Net earnings (USD)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Walking the Manifold</td>\n",
" <td>CAGOO1804133</td>\n",
" <td>2</td>\n",
" <td>1.4</td>\n",
" <td>1.4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Merlin Sickness</td>\n",
" <td>CAGOO1804127</td>\n",
" <td>2</td>\n",
" <td>1.4</td>\n",
" <td>1.4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2018-04-01</td>\n",
" <td>2018-05-05</td>\n",
" <td>ITunes</td>\n",
" <td>iTunes Store</td>\n",
" <td>US</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>To Andromeda (Silver Wings)</td>\n",
" <td>CAGOO1804130</td>\n",
" <td>2</td>\n",
" <td>1.4</td>\n",
" <td>1.4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Start of reporting period End of reporting period Store Store service \\\n",
"0 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"1 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"2 2018-04-01 2018-05-05 ITunes iTunes Store \n",
"\n",
" Country of sale or stream Album UPC Track \\\n",
"0 US NaN NaN Walking the Manifold \n",
"1 US NaN NaN Merlin Sickness \n",
"2 US NaN NaN To Andromeda (Silver Wings) \n",
"\n",
" ISRC Quantity of sales or streams Gross earnings (USD) \\\n",
"0 CAGOO1804133 2 1.4 \n",
"1 CAGOO1804127 2 1.4 \n",
"2 CAGOO1804130 2 1.4 \n",
"\n",
" Net earnings (USD) \n",
"0 1.4 \n",
"1 1.4 \n",
"2 1.4 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"date_fields = ['Start of reporting period', 'End of reporting period']\n",
"for date_field in date_fields:\n",
" df[date_field] = pd.to_datetime(df[date_field]) \n",
"df.head(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Just verifying the degree of variation in reporting range. Monthly-ish."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Timedelta('-30 days +21:42:24.698963'), Timedelta('3 days 13:46:15.560952'))"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['Date range'] = df['Start of reporting period'] - df['End of reporting period']\n",
"df['Date range'].mean(), df['Date range'].std()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Store/Service Breakdown\n",
"\n",
"Just want to figure out the relationship between store and service. Reasonably straightforward. I.e., ITunes is store, Apple Music is the\n",
"streaming service. Some are both, etc. Both filtering out noise of\n",
"one-off listens on services without much representation."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ITunes 8945\n",
"Spotify 7756\n",
"YouTube 411\n",
"GooglePlay 349\n",
"VKontakte 207\n",
"Deezer 124\n",
"BOOM App UMA 30\n",
"Name: Store, dtype: int64"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"store_counts = df['Store'].value_counts()\n",
"store_counts[store_counts > 10]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Apple Music 8670\n",
"Spotify 7756\n",
"Google Play Music Streaming 341\n",
"Content ID 264\n",
"iTunes Match 234\n",
"VKontakte 207\n",
"Streaming 176\n",
"Deezer 124\n",
"iTunes Store 41\n",
"BOOM App UMA 30\n",
"Name: Store service, dtype: int64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"services = df['Store service'].value_counts()\n",
"services[services > 10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## The Big Two\n",
"\n",
"Vast majority of my plays/streaming income are via Spotify and Apple Music, so deeper dive into those follows."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"apple_music = df[(df['Store'] == 'ITunes') & \\\n",
" (df['Store service'] == 'Apple Music')]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"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>UPC</th>\n",
" <th>Quantity of sales or streams</th>\n",
" <th>Gross earnings (USD)</th>\n",
" <th>Net earnings (USD)</th>\n",
" <th>Date range</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>0.0</td>\n",
" <td>8670.000000</td>\n",
" <td>8670.000000</td>\n",
" <td>8670.000000</td>\n",
" <td>8670</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>NaN</td>\n",
" <td>4.520992</td>\n",
" <td>0.029707</td>\n",
" <td>0.029707</td>\n",
" <td>-30 days +17:09:45.467128</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>NaN</td>\n",
" <td>9.690443</td>\n",
" <td>0.068153</td>\n",
" <td>0.068153</td>\n",
" <td>3 days 06:46:47.279287</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>NaN</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>-34 days +00:00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>NaN</td>\n",
" <td>1.000000</td>\n",
" <td>0.005012</td>\n",
" <td>0.005012</td>\n",
" <td>-34 days +00:00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>NaN</td>\n",
" <td>2.000000</td>\n",
" <td>0.010099</td>\n",
" <td>0.010099</td>\n",
" <td>-27 days +00:00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>NaN</td>\n",
" <td>4.000000</td>\n",
" <td>0.025090</td>\n",
" <td>0.025090</td>\n",
" <td>-27 days +00:00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>NaN</td>\n",
" <td>299.000000</td>\n",
" <td>2.201731</td>\n",
" <td>2.201731</td>\n",
" <td>-27 days +00:00:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" UPC Quantity of sales or streams Gross earnings (USD) \\\n",
"count 0.0 8670.000000 8670.000000 \n",
"mean NaN 4.520992 0.029707 \n",
"std NaN 9.690443 0.068153 \n",
"min NaN 1.000000 0.000000 \n",
"25% NaN 1.000000 0.005012 \n",
"50% NaN 2.000000 0.010099 \n",
"75% NaN 4.000000 0.025090 \n",
"max NaN 299.000000 2.201731 \n",
"\n",
" Net earnings (USD) Date range \n",
"count 8670.000000 8670 \n",
"mean 0.029707 -30 days +17:09:45.467128 \n",
"std 0.068153 3 days 06:46:47.279287 \n",
"min 0.000000 -34 days +00:00:00 \n",
"25% 0.005012 -34 days +00:00:00 \n",
"50% 0.010099 -27 days +00:00:00 \n",
"75% 0.025090 -27 days +00:00:00 \n",
"max 2.201731 -27 days +00:00:00 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"apple_music.describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Just a sanity check to verify that w/digital only streams/sales, this difference doesn't matter."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(apple_music[apple_music['Gross earnings (USD)'] != \\\n",
" apple_music['Net earnings (USD)']])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Simple Average Stream Rate\n",
"\n",
"Just a quick check reveals average pay per stream (truncated) to be:\n",
" \n",
"- Apple: `0.0065`\n",
"- Spotify: `0.0038`"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"39197"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"streams = apple_music['Quantity of sales or streams'].sum()\n",
"streams"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"257.56376144663363"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"payout = apple_music['Gross earnings (USD)'].sum()\n",
"payout"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.00657100700172548"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"payout / streams"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"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>Start of reporting period</th>\n",
" <th>End of reporting period</th>\n",
" <th>Store</th>\n",
" <th>Store service</th>\n",
" <th>Country of sale or stream</th>\n",
" <th>Album</th>\n",
" <th>UPC</th>\n",
" <th>Track</th>\n",
" <th>ISRC</th>\n",
" <th>Quantity of sales or streams</th>\n",
" <th>Gross earnings (USD)</th>\n",
" <th>Net earnings (USD)</th>\n",
" <th>Date range</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>118</th>\n",
" <td>2018-05-01</td>\n",
" <td>2018-05-31</td>\n",
" <td>Spotify</td>\n",
" <td>Spotify</td>\n",
" <td>BR</td>\n",
" <td>PatternShift EP</td>\n",
" <td>8.007395e+11</td>\n",
" <td>Merlin Sickness</td>\n",
" <td>CAGOO1804127</td>\n",
" <td>2</td>\n",
" <td>0.003650</td>\n",
" <td>0.003650</td>\n",
" <td>-30 days</td>\n",
" </tr>\n",
" <tr>\n",
" <th>119</th>\n",
" <td>2018-05-01</td>\n",
" <td>2018-05-31</td>\n",
" <td>Spotify</td>\n",
" <td>Spotify</td>\n",
" <td>US</td>\n",
" <td>PatternShift EP</td>\n",
" <td>8.007395e+11</td>\n",
" <td>Merlin Sickness</td>\n",
" <td>CAGOO1804127</td>\n",
" <td>4</td>\n",
" <td>0.008624</td>\n",
" <td>0.008624</td>\n",
" <td>-30 days</td>\n",
" </tr>\n",
" <tr>\n",
" <th>120</th>\n",
" <td>2018-05-01</td>\n",
" <td>2018-05-31</td>\n",
" <td>Spotify</td>\n",
" <td>Spotify</td>\n",
" <td>US</td>\n",
" <td>PatternShift EP</td>\n",
" <td>8.007395e+11</td>\n",
" <td>Merlin Sickness</td>\n",
" <td>CAGOO1804127</td>\n",
" <td>28</td>\n",
" <td>0.086129</td>\n",
" <td>0.086129</td>\n",
" <td>-30 days</td>\n",
" </tr>\n",
" <tr>\n",
" <th>121</th>\n",
" <td>2018-05-01</td>\n",
" <td>2018-05-31</td>\n",
" <td>Spotify</td>\n",
" <td>Spotify</td>\n",
" <td>DE</td>\n",
" <td>PatternShift EP</td>\n",
" <td>8.007395e+11</td>\n",
" <td>Merlin Sickness</td>\n",
" <td>CAGOO1804127</td>\n",
" <td>1</td>\n",
" <td>0.002963</td>\n",
" <td>0.002963</td>\n",
" <td>-30 days</td>\n",
" </tr>\n",
" <tr>\n",
" <th>122</th>\n",
" <td>2018-05-01</td>\n",
" <td>2018-05-31</td>\n",
" <td>Spotify</td>\n",
" <td>Spotify</td>\n",
" <td>GB</td>\n",
" <td>PatternShift EP</td>\n",
" <td>8.007395e+11</td>\n",
" <td>Merlin Sickness</td>\n",
" <td>CAGOO1804127</td>\n",
" <td>9</td>\n",
" <td>0.068183</td>\n",
" <td>0.068183</td>\n",
" <td>-30 days</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Start of reporting period End of reporting period Store Store service \\\n",
"118 2018-05-01 2018-05-31 Spotify Spotify \n",
"119 2018-05-01 2018-05-31 Spotify Spotify \n",
"120 2018-05-01 2018-05-31 Spotify Spotify \n",
"121 2018-05-01 2018-05-31 Spotify Spotify \n",
"122 2018-05-01 2018-05-31 Spotify Spotify \n",
"\n",
" Country of sale or stream Album UPC Track \\\n",
"118 BR PatternShift EP 8.007395e+11 Merlin Sickness \n",
"119 US PatternShift EP 8.007395e+11 Merlin Sickness \n",
"120 US PatternShift EP 8.007395e+11 Merlin Sickness \n",
"121 DE PatternShift EP 8.007395e+11 Merlin Sickness \n",
"122 GB PatternShift EP 8.007395e+11 Merlin Sickness \n",
"\n",
" ISRC Quantity of sales or streams Gross earnings (USD) \\\n",
"118 CAGOO1804127 2 0.003650 \n",
"119 CAGOO1804127 4 0.008624 \n",
"120 CAGOO1804127 28 0.086129 \n",
"121 CAGOO1804127 1 0.002963 \n",
"122 CAGOO1804127 9 0.068183 \n",
"\n",
" Net earnings (USD) Date range \n",
"118 0.003650 -30 days \n",
"119 0.008624 -30 days \n",
"120 0.086129 -30 days \n",
"121 0.002963 -30 days \n",
"122 0.068183 -30 days "
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"spotify = df[(df['Store'] == 'Spotify') & \\\n",
" (df['Store service'] == 'Spotify')]\n",
"spotify.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"57590"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sp_streams = spotify['Quantity of sales or streams'].sum()\n",
"sp_streams"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"220.11416147851116"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sp_payout = spotify['Gross earnings (USD)'].sum()\n",
"sp_payout"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.0038220899718442642"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sp_payout / sp_streams"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Apple also tends to pay me slightly more on time. Both only caught up\n",
"to last year ranges."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Timestamp('2019-11-30 00:00:00'), Timestamp('2019-12-26 00:00:00'))"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(spotify['End of reporting period'].max(),\n",
" apple_music['End of reporting period'].max())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"_Note_ re: Fiddly Bits in `pandas`\n",
"\n",
"This copy is because I'm going to assign new columns, and because\n",
"pandas is structured to avoid copy and provide views into other\n",
"data frames, it would otherwise complain a bunch at me."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"spotify = spotify.copy()\n",
"apple_music = apple_music.copy()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Per stream histogram\n",
"\n",
"What's behind an average pay per stream? Well, there's a complicated breakdown by country, free or paid user on Spotify, etc. I'm not going to go into that entire mess,\n",
"but will at least provide a histogram of steam counts per payout bin\n",
"for both services."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"spotify['Per stream (USD)'] = spotify['Gross earnings (USD)'] / \\\n",
" spotify['Quantity of sales or streams']"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"spotify['Per stream (USD)'].hist(bins=100)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"apple_music['Per stream (USD)'] = apple_music['Gross earnings (USD)'] / \\\n",
" apple_music['Quantity of sales or streams']"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"apple_music['Per stream (USD)'].hist(bins=100)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Yeah, the range breaks default spread by naive binning. Looks like we have to something smart in setting axis range."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.0034317150283437775, 0.0020821268824345127)"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"spotify['Per stream (USD)'].mean(), spotify['Per stream (USD)'].std()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.006918049667291591, 0.0056609539997116605)"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"apple_music['Per stream (USD)'].mean(), apple_music['Per stream (USD)'].std()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Apple music has the larger spread, so we use its range bounds to estimate a good extent for the plot."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.02390091166642657"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"0.006918049667291591 + 3*0.0056609539997116605"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1332x756 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"apple_music['Per stream (USD)'].hist(bins=100, range=(0.0, 0.025), alpha=0.6)\n",
"spotify['Per stream (USD)'].hist(bins=100, range=(0.0, 0.025),alpha=0.6)\n",
"fig = plt.gcf()\n",
"fig.set_size_inches(18.5, 10.5)\n",
"plt.ylabel('Stream count')\n",
"plt.xlabel('Payment per stream (USD)')\n",
"plt.title('Spotify (Orange) vs. Apple Music (Blue) Payment Per Stream')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wrap-up\n",
"\n",
"Yeah, Apple Music pays more. Spotify has (at least recently) been pretty good to me re: discovery (getting into Discover Weekly plays, etc. is a better deal for an artist looking to find listeners than about any other streaming feature out there). What do I make of all this?\n",
"\n",
"# 🤷‍♂️\n",
"\n",
"If this was fun to read, you can try to go out and [contribute some of your own stats](https://open.spotify.com/artist/6MNFOvQOGj0BYmHJa6tVIV?si=LFaJVGhqRO2hNBAL3ujj5A)! 😉"
]
}
],
"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",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment