%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/'
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'))
yt = pd.read_feather('../data/yt_streams_with_diff.feather')
exploreStreamCounts(yt, 'Youtube')
sc = pd.read_feather('../data/sound_cloud_streams_with_diff.feather')
exploreStreamCounts(sc, 'Sound Cloud')
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']
exploreStreamCounts(spotify, 'Spotify')
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']]
all_streams = pd.concat( [normaliseStreams(yt, 'ytid','Youtube'), normaliseStreams(spotify, 'track_id', 'Spotify'), normaliseStreams(sc, 'scid', 'Soundcloud')], ignore_index=True)
all_streams.head()
all_stream_agg = all_streams.groupby(['stream_type', 'days_after_first_seen'])['normalised_count_day'].agg([np.mean, np.median, np.std]).reset_index()
all_stream_agg.head()
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')
ggplot(all_stream_agg, aes('days_after_first_seen', 'median')) + geom_line(aes(color = 'stream_type'))
all_stream_agg