Sur base des données extraites dans github-RPackage-repository.csv (Github), dans cran-description.csv (CRAN), bioconductorsvn_description.csv (BioConductor) et r-forge_description.csv (R-Forge), nous allons regarder la répartition des packages de Github au sein des différentes communautés.
In [1]:
%matplotlib inline
from IPython.display import set_matplotlib_formats
#set_matplotlib_formats('pdf')
In [2]:
import pandas
github = pandas.DataFrame.from_csv('../data/github-RPackage-repository.csv')
cran = pandas.DataFrame.from_csv('../data/cran-description.csv', index_col=None)
bioconductor = pandas.DataFrame.from_csv('../data/bioconductorsvn_description.csv', index_col=None)
rforge = pandas.DataFrame.from_csv('../data/r-forge_description.csv', index_col=None)
Pour chacune de ces sources de données, nous allons conserver les dépendances ainsi que les auteurs et ajouter une étiquette pour la "source" de ce package (Github, CRAN, Bioconductor et R-Forge). Si un package est présent sur plusieurs sources, nous utiliserons les données prioritairement dans l'ordre suivant : Cran, Bioconductor, Github et enfin, R-Forge.
Préparation du dataset Github Il n'y a pas grand chose à faire sur ce dataset, car il a été préparé de sorte à fitter au mieux ce qui allait suivre. Il est, par contre, nécessaire de sélectionner les dépôts dits "canoniques" (ie. un seul dépôt pour chaque valeur de Package) pour respecter les index. Pour rappel, un dépôt canonique signifie que le dépôt n'est à priori pas un fork, et est le plus vieux dépôt créé parmi l'ensemble des dépôts hébergeant le même package.
In [3]:
print len(github)
github = github.query('canonical == True')
print len(github)
Préparation du dataset CRAN
Le dataframe cran
contient toutes les données des fichiers DESCRIPTION
. Il convient maintenant de ne filtrer que les éléments qui font partie du snapshot à la date qui nous intéresse. Ces informations sont présentes dans le fichier cran-snapshot.csv.
In [4]:
snapshot = pandas.DataFrame.from_csv('../data/cran-snapshot-20150319.csv', index_col=None)
cran = cran.merge(snapshot, how='inner')
In [5]:
temp = cran.drop_duplicates(('package', 'key'), take_last=True).rename(columns={'package': 'Package'})[['Package', 'key', 'value']]
cran_author = temp.query('key == "Author"').rename(columns={'value': 'Author'})[['Package', 'Author']]
cran_imports = temp.query('key == "Imports"').rename(columns={'value': 'Imports'})[['Package', 'Imports']]
cran_depends = temp.query('key == "Depends"').rename(columns={'value': 'Depends'})[['Package', 'Depends']]
_ = temp[['Package']].drop_duplicates().merge(cran_author, how='left', on='Package')
_ = _.merge(cran_imports, how='left', on='Package')
cran = _.merge(cran_depends, how='left', on='Package')
Préparation du dataset Bioconductor
In [6]:
bioconductor = bioconductor[['Package', 'Author', 'Imports', 'Depends']].copy()
Préparation du dataset R-Forge
In [7]:
rforge = rforge[['Package', 'Author', 'Imports', 'Depends']].copy()
Ajout des étiquettes sur la provenance
In [8]:
github['github'] = 1
cran['cran'] = 1
bioconductor['bioconductor'] = 1
rforge['rforge'] = 1
Nous allons maintenant regrouper les différents datasets en un seul, en se basant sur le nom du package. Comme indiqué précédemment, un ordre va être appliqué pour récupérer les informations qui sont présentes pour un même package provenant de plusieurs sources (typiquement le cas pour Github).
In [9]:
github.set_index('Package', inplace=True, verify_integrity=True)
cran.set_index('Package', inplace=True, verify_integrity=True)
bioconductor.set_index('Package', inplace=True, verify_integrity=True)
rforge.set_index('Package', inplace=True, verify_integrity=True)
packages = cran.combine_first(bioconductor).combine_first(github).combine_first(rforge)
Nous remplissons les N/A par les valeurs adéquates, et nous obtenons un joli petit dataset avec toutes les informations utiles sur la provenance. Il nous reste à ajouter une clé "Github only" pour indiquer qu'un package n'est présent que sur Github.
In [10]:
packages = packages.fillna({'Author': '',
'Depends': '',
'Imports': '',
'bioconductor': 0,
'canonical': 0,
'cran': 0,
'fork': 0,
'github': 0,
'owner': '',
'repository': '',
'rforge': 0})
In [11]:
def _f(row):
if row['github'] == 1:
if row['cran'] == row['rforge'] == row['bioconductor'] == 0:
return 1
else:
return 0
else:
return 0
packages['Github only'] = packages.apply(_f, axis=1)
In [12]:
packages.to_csv('../data/R-Packages.csv')
Nous pouvons maintenant afficher ces informations graphiquement.
In [17]:
from matplotlib_venn import venn3
from matplotlib import pyplot as plt
github_set = set(packages.query('github == 1').index)
cran_set = set(packages.query('cran == 1').index)
bioconductor_set = set(packages.query('bioconductor == 1').index)
rforge_set = set(packages.query('rforge == 1').index)
v = venn3((github_set, cran_set, bioconductor_set), ('github', 'cran', 'bioconductor'))
v.get_patch_by_id('001').set_color('yellow')
In [14]:
v = venn3((github_set, cran_set, rforge_set), ('github', 'cran', 'r-forge'))
In [15]:
v = venn3((github_set, bioconductor_set, rforge_set), ('github', 'bioconductor', 'r-forge'))
v.get_patch_by_id('010').set_color('yellow')
In [16]:
len(github_set.union(bioconductor_set).union(rforge_set).union(cran_set))
Out[16]: