Sur base des événements de type PushEvent liés à des dépôts relatifs au langage R, nous allons identifier quels sont les dépôts les plus "populaires" (par activité, par starred, par fork, etc.).
In [1]:
import pandas
import pymongo
import dateutil.parser
from itertools import imap
conn = pymongo.MongoClient()
def _from_json_to_flat(e):
return {'created_at': dateutil.parser.parse(e['created_at']),
'owner': e['repository']['owner'],
'repository': e['repository']['name'],
'is_a_fork': e['repository']['fork'],
'forks': e['repository']['forks'],
'starred': e['repository']['stargazers'],
'watchers': e['repository']['watchers']}
events = imap(_from_json_to_flat,
conn.r.events.find({'type': 'PushEvent'},
fields=['created_at', 'repository.name', 'repository.owner',
'repository.fork', 'repository.forks',
'repository.stargazers', 'repository.watchers']))
In [2]:
# This should take some time (expect 683425 items)
df_events = pandas.DataFrame(list(events))
In [3]:
# Which ones are R packages?
_ = pandas.read_csv('../data/github-description.csv').query('key == "Package"')
_ = _.rename(columns={'value': 'package_name'})
_ = _[['owner', 'repository', 'package_name']]
# Add a flag
_['package'] = True
df = df_events.merge(_, how='left', on=('owner', 'repository'))
# Complete flag
df = df.fillna({'package': False})
In [4]:
# Aggregate by month
df['date_agg'] = df.apply(lambda x: pandas.datetime(x['created_at'].year, x['created_at'].month, 1), axis=1)
groups = df.groupby(('date_agg', 'owner', 'repository'), sort=False)
df_agg = groups.aggregate(pandas.np.max).drop('created_at', axis=1)
In [5]:
def topmost(df, date, criterion, limit=10):
return df.loc[date].sort(criterion, ascending=False)[:limit]
Il suffit maintenant d'utiliser la fonction topmost afin d'obtenir un classement des dépôts.
Par exemple, topmost(df_agg, '2014-01-01', 'forks') pour obtenir la liste des 10 dépôts les plus forkés en fin janvier 2014.
Il est facile de filtrer pour ne conserver que les packages. Par exemple, topmost(df_agg[df_agg['package'] == True], '2014-01-01', 'forks').
En particulier, voyons s'il y a des changements dans certains classements à des dates clés (pour rappel, les données d'une date correspondent aux données en fin de mois). Il y a essentiellement 3 moments clés dans l'activité des paquets : un tout petit pic en novembre/décembre 2013, et deux augmentation de l'activité en février/mars 2014 et octobre 2014.
Les dates retenues sont donc :
In [6]:
from IPython.display import display
dates_of_interest = ['2013-11-01', '2014-01-01', '2014-03-01', '2014-09-01', '2014-12-01']
criteria = ['forks', 'watchers', 'starred']
for _df in [df_agg, df_agg[df_agg['package'] == True]]:
for criterion in criteria:
print '=====', criterion
for date in dates_of_interest:
print '---', date
display(topmost(_df, date, criterion, 5)[['package_name', criterion]])