Compare stream count over time for Youtube, soundcloud and spotify

In [48]:
%matplotlib inline
%pylab inline
pylab.rcParams['figure.figsize'] = (12, 7)
import pandas as pd
import os
import numpy as np
import matplotlib.pyplot as plt

from plotnine import *

from plotnine import options
options.set_option('figure_size' , (16,8))
theme_set(theme_minimal)

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

pd.options.display.max_columns=500

data_dir = '../data/'
Populating the interactive namespace from numpy and matplotlib
/home/paperspace/anaconda3/envs/whitelist/lib/python3.6/site-packages/IPython/core/magics/pylab.py:160: UserWarning: pylab import has clobbered these variables: ['xlim', 'ylim', 'arrow', 'annotate']
`%matplotlib` prevents importing * from pylab and numpy
  "\n`%matplotlib` prevents importing * from pylab and numpy"

Youtube

In [57]:
def exploreStreamCounts(yt, stream_type): 
    #print(yt.head())
    #print(yt.describe())

    by_day = yt.groupby('days_after_first_seen')['view_count_day'].agg([np.mean, np.median, np.std]).reset_index()
    print(ggplot(by_day[(by_day['days_after_first_seen']<=100)], aes('days_after_first_seen', 'median')) + geom_line() + ggtitle(f'Median number of streams after first seen for {stream_type}'))
    print(ggplot(by_day[(by_day['days_after_first_seen']<=100) & (by_day['days_after_first_seen']>=0)] , aes('days_after_first_seen', 'median')) + geom_line() + ggtitle(f'Median number of streams after first seen for {stream_type}'))
    print(ggplot(by_day[(by_day['days_after_first_seen']<=100) & (by_day['days_after_first_seen']>=0)] , aes('days_after_first_seen', 'mean')) + geom_line()+ ggtitle(f'Mean number of plays on {stream_type} after first seen'))
In [58]:
yt = pd.read_feather('../data/yt_streams_with_diff.feather')
exploreStreamCounts(yt, 'Youtube')
/home/paperspace/anaconda3/envs/whitelist/lib/python3.6/site-packages/plotnine/geoms/geom_path.py:76: UserWarning: geom_path: Removed 1 rows containing missing values.
  warn(msg.format(n1-n2))
<ggplot: (-9223363308670673159)>
<ggplot: (-9223363308670717615)>
<ggplot: (-9223363308916411041)>
In [59]:
sc = pd.read_feather('../data/sound_cloud_streams_with_diff.feather')
exploreStreamCounts(sc, 'Sound Cloud')
/home/paperspace/anaconda3/envs/whitelist/lib/python3.6/site-packages/plotnine/geoms/geom_path.py:76: UserWarning: geom_path: Removed 1 rows containing missing values.
  warn(msg.format(n1-n2))
<ggplot: (8728175146255)>
/home/paperspace/anaconda3/envs/whitelist/lib/python3.6/site-packages/plotnine/geoms/geom_path.py:76: UserWarning: geom_path: Removed 1 rows containing missing values.
  warn(msg.format(n1-n2))
<ggplot: (8728180730095)>
/home/paperspace/anaconda3/envs/whitelist/lib/python3.6/site-packages/plotnine/geoms/geom_path.py:76: UserWarning: geom_path: Removed 1 rows containing missing values.
  warn(msg.format(n1-n2))
<ggplot: (-9223363308674045752)>
In [60]:
spotify = pd.read_feather('../data/archive_as_of_friday_20_july/train_streams_with_release.feather')
spotify.head()
spotify['view_count_day'] = spotify['all_streams'] 
spotify['days_after_first_seen'] = spotify['days_from_release']
In [61]:
exploreStreamCounts(spotify, 'Spotify')
<ggplot: (-9223363308670628811)>
<ggplot: (-9223363308679485475)>
<ggplot: (8728070848190)>
In [62]:
def normaliseStreams(yt, idfield,  stream_type, max_days = 100):
    yt_n = yt.copy()
    yt_n = yt_n[yt_n['days_after_first_seen'] <= max_days]
    yt_n = yt_n[yt_n['days_after_first_seen'] >= 0]
    
    
    total_count_per_track = yt_n.groupby(idfield)[['view_count_day']].sum().reset_index().rename(columns = {'view_count_day':'total_view_count'})
    yt_n = pd.merge(yt_n, total_count_per_track, on= idfield)

    yt_n['normalised_count_day'] = yt_n['view_count_day']/yt_n['total_view_count']
    yt_n['stream_type'] = stream_type

    return yt_n[['days_after_first_seen','normalised_count_day', 'stream_type']]
    
In [63]:
all_streams = pd.concat( [normaliseStreams(yt, 'ytid','Youtube'), normaliseStreams(spotify, 'track_id', 'Spotify'), normaliseStreams(sc, 'scid', 'Soundcloud')], ignore_index=True)
In [64]:
all_streams.head()
Out[64]:
days_after_first_seen normalised_count_day stream_type
0 0.0 NaN Youtube
1 1.0 0.063257 Youtube
2 2.0 0.045799 Youtube
3 3.0 0.034030 Youtube
4 4.0 0.021478 Youtube
In [65]:
all_stream_agg = all_streams.groupby(['stream_type', 'days_after_first_seen'])['normalised_count_day'].agg([np.mean, np.median, np.std]).reset_index()
In [66]:
all_stream_agg.head()
Out[66]:
stream_type days_after_first_seen mean median std
0 Soundcloud 0.0 NaN NaN NaN
1 Soundcloud 1.0 0.148589 0.107533 0.140005
2 Soundcloud 2.0 0.124637 0.095177 0.115450
3 Soundcloud 3.0 0.102364 0.074074 0.105962
4 Soundcloud 4.0 0.087467 0.061203 0.097722
In [67]:
ggplot(all_stream_agg, aes('days_after_first_seen', 'mean')) + geom_line(aes(color = 'stream_type')) + ylab('Mean fraction of total streams over 100 total')
/home/paperspace/anaconda3/envs/whitelist/lib/python3.6/site-packages/plotnine/geoms/geom_path.py:76: UserWarning: geom_path: Removed 1 rows containing missing values.
  warn(msg.format(n1-n2))
Out[67]:
<ggplot: (-9223363308660205091)>
In [68]:
ggplot(all_stream_agg, aes('days_after_first_seen', 'median')) + geom_line(aes(color = 'stream_type'))
/home/paperspace/anaconda3/envs/whitelist/lib/python3.6/site-packages/plotnine/geoms/geom_path.py:76: UserWarning: geom_path: Removed 1 rows containing missing values.
  warn(msg.format(n1-n2))
Out[68]:
<ggplot: (8728194531718)>
In [ ]:
all_stream_agg