{ "metadata": { "name": "", "signature": "sha256:85c6fb691d8be8e05e22e97871301d05e5f9d6389e559d01010e1472101d6f6f" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Analyse de donn\u00e9es avec `pandas`\n", "\n", "Dans ce TD nous allons utiliser la biblioth\u00e8que `pandas` pour analyser les donn\u00e9es du r\u00e9pertoire GitHub avec lequel vous avez travaill\u00e9 pour le contr\u00f4le continu.\n", "\n", "Commencez par les lignes de configuration habituelles" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "\n", "import pandas as pd" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nous allons commencer par importer des donn\u00e9es statistiques sur les contributions par utilisateur par semaine. Les lignes qui suivent t\u00e9l\u00e9chargent les donn\u00e9es de la BD de GitHub." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import urllib2, json, datetime\n", "contr = json.load(urllib2.urlopen('https://api.github.com/repos/in202-uvsq/git-manual/stats/contributors'))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "L'objet `contr` contient plein de donn\u00e9es peu int\u00e9ressantes. La cellule suivante fait le menage, en gardant uniquement cinq colonnes\u202f:\n", "\n", "- La semaine\n", "- Le nom de l'utilisateur\n", "- Le nombre de lignes ajout\u00e9s\n", "- Le nombre de lignes effac\u00e9es\n", "- Le nombre de commits\n", "\n", "La semaine est au format epoch\u00a0: nombre de millisecondes depuis le premier janvier 1970. Elle est lue avec la fonction `datetime.datetime.fromtimestamp()`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "data = [{ 'semaine' : datetime.datetime.fromtimestamp(w['w']).date(),\n", " 'utilisateur' : c['author']['login'],\n", " 'ajouts' : w['a'],\n", " 'effacements' : w['d'],\n", " 'commits' : w['c'] }\n", " for c in contr for w in c['weeks']]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercices\n", "\n", "Affichez le contenu de l'objet data. Cr\u00e9ez un `DataFrame` pandas \u00e0 partir de `data`, comme ceci." ] }, { "cell_type": "code", "collapsed": false, "input": [ "d = pd.DataFrame(data)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "3. Affichez le nombre total de commits (m\u00e9thode `.sum()`).\n", "\n", "4. Affichez les statistiques sur les donn\u00e9es (m\u00e9thode `.describe()`). Quel est le nombre maximal d'ajouts effectu\u00e9s en une semaine par un utilisateur\u202f?\n", "\n", "## S\u00e9lections\n", "\n", "1. S\u00e9lectionnez uniquement les lignes qui portent votre nom d'utilisateur (ou celui d'un de vos coll\u00e8gues, si aucun commit ne vous appartient). Affichez le r\u00e9sultat.\n", "\n", "1. Dessinnez le graphe de vos contributions par semaine. La m\u00e9thode `.plot()` peut prendre un argument pour indiquer quelle colonne mettre en abscisse\u00a0; voir exemple ci-dessous.\n", "\n", "1. Trouvez l'utilisateur qui, sur une semaine, a fait le plus de\n", " - commits,\n", " - ajouts,\n", " - effacements." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Exemple: choisir une colonne pour abscisse\n", "\n", "e = pd.DataFrame({ 'esp\u00e8ce': [ 'chien', 'loup', 'chat' ],\n", " 'age' : [15, 10, 20] })\n", "e.plot()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAEACAYAAABBDJb9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFt1JREFUeJzt3X1sXfV9x/HPNzxEQhX13BQSGjOLQbWGh5nCYLQdMWzQ\nrPRpjDAmRdRthaugrUixRMM2CO0fHRQ2wgRIQyIxbCIdgi4BLXSUjdtCu5auaWjS0lEYjlKyhAFJ\nSihgIN/94Wvn5MbXvg+/8/A75/2SLHyffE++HP18877nnpi7CwAQtzl5bwAAoHss5gBQAizmAFAC\nLOYAUAIs5gBQAizmAFACMy7mZtZnZo+Z2U/NbKuZfbF+fa+ZfcvMnjGzR8ysJ5vNBQBMx2Y6ztzM\n5kua7+6bzexdkn4k6dOSPivpJXf/mpl9SdJvuPvKTLYYAHCIGV+Zu/tOd99c/36fpKclvU/SJyXd\nXb/b3ZpY4AEAOWm5mZtZv6TTJf1A0rHuvqt+0y5JxwbfMgBAy1pazOuJ5QFJV7n7q8nbfKLTcE4A\nAMjR4bPdwcyO0MRC/o/uvr5+9S4zm+/uO81sgaQXp3kcCzwAdMDdrd3HzHY0i0m6S9LP3H114qYH\nJX2m/v1nJK1vfGx9g/gK9LVq1arct6FMX8yTeRbp6803XWef7br55s5fA8+WWT4saZmk88zsx/Wv\nJZJukHSBmT0j6fz6ZaRobGws700oFeYZFvPszjXXSMccI61Y0fnPmDGzuPsTar7g/2HnTwsAkKQN\nG6QHHpA2bZKs7bhywKzNHMUwNDSU9yaUCvMMi3l2ZmxMGh6W1q+Xenu7+1kzfmioqx9s5mn9bACI\n3fi4dO650tKl0sjIgevNTB76DdA0mBlfHfxdqlarhf+fUWHMMyzm2b4QnTwpl8xS9VfsnSzmAMoj\nVCdPyjyz1P8KkcpzxoIZANU1NiadffZEJz/nnENvjyazAEBVjY9Ll10mXX319At5N1jMI0GTDIt5\nhsU8WxO6kydxaCIAZCCNTp5EM88BMwCqZbZOnkQzB4ACSrOTJ7GYN7jhhht04okn6uijj9bJJ5+s\n9esnziH2zjvvaGRkRO9973t1wgkn6LbbbtOcOXO0f/9+SdLevXv1+c9/Xscdd5wWLlyoa6+9duq2\nEGiSYTHPsJhnc2l28iSaeYMTTzxRTzzxhObPn6/77rtPy5Yt07PPPqv169frm9/8pp566ikdddRR\nuuSSSw46XnxoaEjz58/Xc889p3379unjH/+4+vr6NDw8nOOfBkCe0u7kB0nrlI4TP/pQza4/+D5h\nvkIYGBjwDRs2+Pnnn+933nnn1PWPPvqom5m/8847vnPnTp87d66//vrrU7ffe++9ft555zX58wXa\nOACF9fzz7scc4/6977X3uPr60PaaW8hX5nm+N3jPPffolltumTql5759+/TSSy9px44d6uvrm7rf\nwoULp77ftm2b3nrrLS1YsGDquv379+v444/PbLsBFEdWnTyJZp6wbds2DQ8P6/bbb9crr7yi3bt3\n65RTTpG7a8GCBdq+ffvUfZPf9/X1ae7cuXr55Ze1e/du7d69W3v37tWWLVuCbRtNMizmGRbzPFhW\nnTyJxTzhtddek5lp3rx52r9/v9auXautW7dKki699FLdeuut2rFjh/bs2aMbb7xxqpkvWLBAF154\noVasWKFXX31V+/fv13PPPafvfOc7ef5xAORgspOPjmbQyRNYzBMWLVqkkZERnXPOOZo/f762bt2q\nj3zkIzIzXXHFFbrwwgt12mmn6YwzztBFF12kww47THPmTIzwnnvu0fj4uBYtWqTe3l4tXbpUO3fu\nDLZtg4ODwX4WmGdozHPC5PnJ163r/vzk7eJDQx16+OGHtXz58o7+uayyzADAAc3OT94uPjSUsjfe\neEMbN27U22+/rRdeeEFf/vKXdfHFF2f2/DTJsJhnWMwzn06exGLeInfX9ddfr97eXn3wgx/UySef\nrK985St5bxaAAsirkyeRWXLADIDyaOe8K60gswBAxvI4nrwZFvNI0CTDYp5hVXWeeXfypEJ+AhQA\nii7T8660IJdmDv5RayBmoTt5UqfNPPNX5ixiAGJWpE6eRDOPRFWbZFqYZ1hVmmeROnkSzRwAWlS0\nTp6UeTMHgBil2cmTOM4cAFJS1E6exGIeiSo1ySwwz7DKPs+idvIkmjkAzKDInTyJZg4ATWTVyZNo\n5gAQUAydPInFPBJlb5JZY55hlXGeMXTyJJo5ADSIpZMnzdrMzWyNpIskvejup9avO0vSbZKOkPS2\npCvd/YcNj6OZA4hOHp08Kc1mvlbSkobrvibpWnc/XdJ19csAELXYOnnSrIu5uz8uaXfD1f8r6d31\n73skvRB4u9CgjE0yT8wzrLLMM7ZOntRpM18p6Qkzu1kTvxAi+x0GAAeLsZMndbqY3yXpi+7+L2a2\n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\nE50c7eDcLAiClh4WnRzt4nzmJZdVk6xKS89qnmXu5Ek08/yxmOMQtPQw6OTIEpkFM6Kld4ZOjk7R\nzJEqWnrr6OToBs285PJukmVr6WnOsyqdPCnv/RMs5mgDLX12dHLkhcyCjtDSD0UnRwg0c+SClj6B\nTo5QaOYlV9QmGWtLDz3PKnbypKLun1XCYo6uVb2l08lRBGQWBFW1lk4nR2g0cxRKFVo6nRxpoJmX\nXGxNsugtPcQ8q97Jk2LbP8uIxRypKXNLp5OjaMgsyESZWjqdHGmimSMKsbd0OjnSRjMvubI0yaK0\n9E7nSSefXln2z5ixmCNzsbZ0OjmKjMyCXMXS0unkyArNHFErckunkyNLNPOSK3uTzLqltzNPOvns\nyr5/xoDFHIVRxJZOJ0csyCwopCK0dDo58kAzRynl1dLp5MgLzbzkqtok02rps82TTt6equ6fRcJi\njsLLuqXTyREjMguiknZLp5MjbzRzVEoaLZ1OjiKgmZccTfJg3bb06eZJJ+8c+2f+WMwRrZAtnU6O\n2JFZUArdtHQ6OYqEZg6o/ZZOJ0fRpNbMzWyNme0ysy2J63rN7Ftm9oyZPWJmPe0+MdpDk2xNqy19\ncp508jDYP/PXSjNfK2lJw3UrJX3L3d8v6d/rl5GizZs3570J0WilpW/evJlOHhD7Z/5mXczd/XFJ\nuxuu/qSku+vf3y3p04G3Cw327NmT9yZEZ6ZX6WNjezQ8LK1bJ/X25rudZcD+mb9Oj2Y51t131b/f\nJenYQNsDBDXdq/SxMen++6Wrr+YNT5RH14cm1t/l5J3OlI2NjeW9CVFLvkr/wAckszE6eUDsn/lr\n6WgWM+uX9JC7n1q//HNJg+6+08wWSHrM3X+74TEs8ADQgU6OZjm8w+d6UNJnJN1Y/+/6EBsDAOjM\nrK/MzWydpMWS5mmij18naYOk+yQdL2lM0qXuzjsgAJCT1D40BADITtdvgJrZEjP7uZn9wsy+1OQ+\nf1+//SkzO73b5yyz2eZpZoNmttfMflz/+us8tjMG033gbZr7sG+2aLZ5sm+2zsz6zOwxM/upmW01\nsy82uV/r+6e7d/wl6TBJz0rql3SEpM2SPtBwn49J2lj//mxJ3+/mOcv81eI8ByU9mPe2xvAl6fcl\nnS5pS5Pb2TfDzpN9s/VZzpc0UP/+XZL+u9u1s9tX5mdJetbdx9z9LUlfl/SphvtMfcDI3X8gqcfM\nOC59eq3MU5J4c7kFPv0H3pLYN9vQwjwl9s2WuPtOd99c/36fpKclNZ5JqK39s9vF/H2Sticu/7J+\n3Wz3Wdjl85ZVK/N0SR+q/7Vro5ktymzryod9Myz2zQ7UD/0+XdIPGm5qa//s9NDESa2+e9r425p3\nXafXylw2Sepz91+b2R9p4rDQ96e7WaXGvhkO+2abzOxdku6XdFX9Ffohd2m43HT/7PaV+QuS+hKX\n+zTx22Om+yysX4dDzTpPd3/V3X9d//5hSUeYGWcX6Qz7ZkDsm+0xsyMkPSDpn9z9kM/qqM39s9vF\n/L8knWRm/WZ2pKQ/1cQHipIelHS5JJnZ70na4wfO64KDzTpPMzvWbOIcf2Z2liYOL30l+00tBfbN\ngNg3W1ef012Sfubuq5vcra39s6vM4u5vm9mfS/o3TRyJcZe7P21mX6jf/g/uvtHMPmZmz0p6TdJn\nu3nOMmtlnpIukbTczN6W9GtJl+W2wQWX/MCbmW2XtEoTRwmxb3ZgtnmKfbMdH5a0TNJPzOzH9ev+\nUhMfxOxo/+RDQwBQAvyDzgBQAizmAFACLOYAUAIs5gBQAizmAFACLOYAUAIs5gBQAizmAFAC/w/K\ntcoDFNSbaAAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "e.plot('esp\u00e8ce')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Regrouper\n", "\n", "1. En utilisant la m\u00e9thode `.groupby`, afficher le nombre total de commits, ajouts, effacements par semaine.\n", "1. En utilisant la m\u00e9thode `.groupby`, afficher le nombre total de commits, ajouts, effacements par utilisateur.\n", "1. Trouver les cinq utilisateurs avec le plus d'ajouts (vous pouvez utiliser la m\u00e9thode `sort` pour ordonner les donn\u00e9es).\n", "1. Calculer la moyenne de commits par semaine de chaque utilisateur." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Jointures\n", "\n", "La cellule suivante t\u00e9l\u00e9charge la liste de toutes les _pull requests_ du projet." ] }, { "cell_type": "code", "collapsed": false, "input": [ "pulls = json.load(urllib2.urlopen('https://api.github.com/repos/in202-uvsq/git-manual/pulls?state=all'))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "On nettoye les donn\u00e9es, pour garder uniquement\n", "\n", "- Le num\u00e9ro de la _pull request_,\n", "- Son titre,\n", "- Son cr\u00e9ateur,\n", "- Ses dates de cr\u00e9ation et de fermeture.\n", "\n", "Les dates sont cette fois-ci au format ISO, par ex.: 2015-03-01. On les lit avec la fonction `dateutil.parser.parse`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import dateutil.parser as parser\n", "\n", "data = [{ 'numero' : p['number'],\n", " 'titre' : p['title'],\n", " 'utilisateur' : p['user']['login'],\n", " 'creation' : parser.parse(p['created_at']),\n", " 'fermeture' : parser.parse(p['closed_at']) }\n", " for p in pulls]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercices\n", "\n", "1. Cr\u00e9ez un `DataFrame` \u00e0 partir de ces donn\u00e9es.\n", "2. On peut calculer la dur\u00e9e d'une _pull request_ en faisant la diff\u00e9rence des colonnes `creation` et `fermeture`. Ajouter une colonne `duree` au DataFrame contenant cette information.\n", "\n", "Partez du `DataFrame` construit pr\u00e9c\u00e9demment, regroup\u00e9 par utilisateur et _r\u00e9-index\u00e9_\u202f:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "d.groupby('utilisateur').sum().reset_index()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
utilisateurajoutscommitseffacements
0 Emaltard 126 5 104
1 Gruudu 34 2 24
2 Iwantaponey 534 21 340
3 KaneBoubacar 158 5 80
4 Lebataclan 329 20 319
5 LowD 112 7 11
6 Melanie13340 51 1 0
7 Mr-Nico-972 115 4 57
8 Nambrok 355 15 450
9 Ousam 181 6 75
10 Protosspaspris 25 2 1
11 SuzanneAir 367 20 334
12 ThomasBrebant 233 7 65
13 Ylen96 633 9 325
14 amendiI 479 20 137
15 calae91 434 6 4
16 defeo 118 1 0
17 ducks-skills 409 2 205
18 incognitomada 16 2 12
19 moumzy 86 2 6
20 pierre-cauletUVSQ 47 4 13
21 yobero 558 22 321
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ " utilisateur ajouts commits effacements\n", "0 Emaltard 126 5 104\n", "1 Gruudu 34 2 24\n", "2 Iwantaponey 534 21 340\n", "3 KaneBoubacar 158 5 80\n", "4 Lebataclan 329 20 319\n", "5 LowD 112 7 11\n", "6 Melanie13340 51 1 0\n", "7 Mr-Nico-972 115 4 57\n", "8 Nambrok 355 15 450\n", "9 Ousam 181 6 75\n", "10 Protosspaspris 25 2 1\n", "11 SuzanneAir 367 20 334\n", "12 ThomasBrebant 233 7 65\n", "13 Ylen96 633 9 325\n", "14 amendiI 479 20 137\n", "15 calae91 434 6 4\n", "16 defeo 118 1 0\n", "17 ducks-skills 409 2 205\n", "18 incognitomada 16 2 12\n", "19 moumzy 86 2 6\n", "20 pierre-cauletUVSQ 47 4 13\n", "21 yobero 558 22 321" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Avec la m\u00e9thode `.merge`, fusionnez ce dernier `DataFrame` avec les pulls requests.\n", "2. Regroupez par utilisateur et calculez la moyenne (m\u00e9thode `.mean()`).\n", "3. Comparez la dur\u00e9e maximale des _pull requests_ de l'utilisateurs le plus productif avec la dur\u00e9e maximale de l'utilisateur le moins productif.\n", "4. Ordonnez par nombre d'ajouts, et dessinnez la dur\u00e9e maximale des _pull requests_ en fonction du nombre d'ajouts.\n", "5. M\u00eame chose pour la dur\u00e9e moyenne des _pull requests_ (vous aurez besoin de la m\u00e9thode `.aggreate()`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice: des donn\u00e9es un peu plus fines\n", "\n", "La ligne suivante t\u00e9l\u00e9charge la liste de tous les commits" ] }, { "cell_type": "code", "collapsed": false, "input": [ "commits = json.load(urllib2.urlopen('https://api.github.com/repos/in202-uvsq/git-manual/commits'))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. \u00c9tudier le format des donn\u00e9es, et en extraire\n", "\n", " - Le SHA,\n", " - La date du commit sans l'heure (utiliser `datetime` comme plus haut),\n", " - Le login du cr\u00e9ateur.\n", " \n", " Construire un `DataFrame` \u00e0 partir de ces donn\u00e9es.\n", "\n", "1. Dessinner le graphe de vos contributions jour par jour." ] } ], "metadata": {} } ] }