Click here to view this notebook on NBViewer
Last active
August 29, 2015 14:27
-
-
Save ICBacon/7e68806ccff7b37b8f68 to your computer and use it in GitHub Desktop.
Using pandas to visualize pypi package release data
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Use PyPi API to access the release data of a PyPi package" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": { | |
| "collapsed": false, | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| ":0: FutureWarning: IPython widgets are experimental and may change in the future.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import os\n", | |
| "import itertools\n", | |
| "import requests\n", | |
| "import pandas as pd\n", | |
| "\n", | |
| "from datetime import datetime, date\n", | |
| "from functools import partial\n", | |
| "from IPython.display import HTML\n", | |
| "from IPython.html import widgets" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# Choose a PyPi package\n", | |
| "package = 'scipy'" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "response = requests.get(\n", | |
| " url = 'https://pypi.python.org/pypi/%s/json' % package\n", | |
| ")\n", | |
| "data = response.json()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "> The unordered objects are in their key ``releases``." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "releases = data['releases']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": { | |
| "collapsed": false, | |
| "scrolled": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# The package version(s) are obtained from the \"releases\" keys \n", | |
| "version = releases.keys()\n", | |
| "num_versions = len(version)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "> Display the total number of releases per version of the PyPi package" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "(u'0.15.0', 5)\n", | |
| "(u'0.14.1rc1', 3)\n", | |
| "(u'0.11.0', 3)\n", | |
| "(u'0.10.1', 2)\n", | |
| "(u'0.10.0', 3)\n", | |
| "(u'0.14.1rc1.dev-52fb336', 3)\n", | |
| "(u'0.6.0', 'none')\n", | |
| "(u'0.7.2', 'none')\n", | |
| "(u'0.7.0', 'none')\n", | |
| "(u'0.12.1', 2)\n", | |
| "(u'0.12.0', 3)\n", | |
| "(u'0.16.0', 5)\n", | |
| "(u'0.13.2', 2)\n", | |
| "(u'0.4.4', 'none')\n", | |
| "(u'0.5.2', 'none')\n", | |
| "(u'0.13.1', 2)\n", | |
| "(u'0.9.0', 2)\n", | |
| "(u'0.15.1', 5)\n", | |
| "(u'0.14.1', 5)\n", | |
| "(u'0.14.0', 8)\n", | |
| "(u'0.8.0', 1)\n", | |
| "(u'0.14.1rc1.dev-205726a', 3)\n", | |
| "(u'0.13.3', 5)\n", | |
| "(u'0.13.0', 5)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "for i in range(0, num_versions):\n", | |
| " if len(releases[version[i]]) >= 1:\n", | |
| " print(version[i],len(releases[version[i]]))\n", | |
| " else:\n", | |
| " print(version[i],'none')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Use the JSON objects to collect:\n", | |
| "\n", | |
| "* All of the format releases per version\n", | |
| "* The release date for every format release per version\n", | |
| "* the total number of downloads per version format" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "downloads = []\n", | |
| "formats = []\n", | |
| "uploads = []\n", | |
| "for i in range(0, num_versions):\n", | |
| " if (len(releases[version[i]]) == 0):\n", | |
| " downloads.append(None)\n", | |
| " formats.append(None)\n", | |
| " uploads.append('N/A')\n", | |
| " else:\n", | |
| " for j in range(0, len(releases[version[i]])):\n", | |
| " downloads.append(releases[version[i]][j]['downloads'])\n", | |
| " datetime_object = datetime.strptime(releases[version[i]][j]['upload_time'], '%Y-%m-%dT%H:%M:%S')\n", | |
| " uploads.append(datetime_object.date())\n", | |
| " filename, extension = (os.path.splitext(releases[version[i]][j]['filename']))\n", | |
| " if (extension != '.gz'):\n", | |
| " formats.append(extension)\n", | |
| " else:\n", | |
| " filename1, extension1 = (os.path.splitext(filename))\n", | |
| " formats.append(extension1)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Associate every package version with its:\n", | |
| "\n", | |
| "* release date\n", | |
| "* number of downloads\n", | |
| "* archive format " | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "> Create a new list that takes into account the versions with multiple releases" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "v = []\n", | |
| "for i in range(num_versions):\n", | |
| " if (len(releases[version[i]]) >= 1):\n", | |
| " l = list(itertools.repeat(version[i], len(releases[version[i]])))\n", | |
| " v.append(l)\n", | |
| " else:\n", | |
| " v.append([version[i]])\n", | |
| "\n", | |
| "merged = list(itertools.chain(*v))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "> Associate all of the attributes of interest together" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "list1 = []\n", | |
| "for f,b in itertools.izip(merged, itertools.izip(formats, itertools.izip(uploads, downloads))):\n", | |
| " list1.append((f,b))\n", | |
| "#list1" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Extract the version number for every release of the PyPi package " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "def extract_version_number( version_string ):\n", | |
| " \"\"\"\n", | |
| " Remove the leading number part of an alphanumeric string that begins with a number\n", | |
| " \"\"\"\n", | |
| " version_number = ''\n", | |
| " for character in version_string:\n", | |
| " if character.isdigit():\n", | |
| " version_number += character\n", | |
| " else:\n", | |
| " break\n", | |
| " return int( version_number )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "> The releases use [Semantic Versionsing](http://semver.org/)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "versions = []\n", | |
| "for version in merged:\n", | |
| " try:\n", | |
| " major, minor, patch = version.split('.',2)\n", | |
| " except:\n", | |
| " patch = '0'\n", | |
| " major, minor = version.split('.',1)\n", | |
| " versions.append({\n", | |
| " 'major': extract_version_number(major),\n", | |
| " 'minor': extract_version_number(minor),\n", | |
| " 'patch': extract_version_number(patch),\n", | |
| " 'key': version\n", | |
| " })" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Use pandas to visualize the PyPi package release date\n", | |
| "\n", | |
| "> Create a table using a pandas DataFrame\n", | |
| " * Add columns to the pandas table for the:\n", | |
| "* Number of releases per version\n", | |
| "* Type of release per version\n", | |
| "* Time of release per version format\n", | |
| "* Number of downloads per version format\n", | |
| "\n", | |
| "> * Sort the DataFrame based on version" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 12, | |
| "metadata": { | |
| "collapsed": false, | |
| "scrolled": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "df = pd.DataFrame(versions)\n", | |
| "df['number_of_downloads'] = None\n", | |
| "df['number_of_releases'] = None\n", | |
| "df['type_of_release'] = None\n", | |
| "df['uploaded_on'] = None" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "metadata": { | |
| "collapsed": false, | |
| "scrolled": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "for index,sortedVersion in df.sort(['major','minor','patch']).iterrows():\n", | |
| " df.loc[index,'number_of_releases' ] = len(releases[sortedVersion['key']])\n", | |
| " df.loc[index,'type_of_release' ] = formats[index]\n", | |
| " df.loc[index,'uploaded_on' ] = uploads[index]\n", | |
| " df.loc[index,'number_of_downloads' ] = downloads[index]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "> Set the DataFrame index (row labels) using [DataFrame.set_index](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.set_index.html)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 14, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "indexed = df.set_index(['key', 'number_of_releases', 'type_of_release'])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 15, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>major</th>\n", | |
| " <th>minor</th>\n", | |
| " <th>patch</th>\n", | |
| " <th>number_of_downloads</th>\n", | |
| " <th>uploaded_on</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>key</th>\n", | |
| " <th>number_of_releases</th>\n", | |
| " <th>type_of_release</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0.4.4</th>\n", | |
| " <th>0</th>\n", | |
| " <th>NaN</th>\n", | |
| " <td>0</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>None</td>\n", | |
| " <td>N/A</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>0.5.2</th>\n", | |
| " <th>0</th>\n", | |
| " <th>NaN</th>\n", | |
| " <td>0</td>\n", | |
| " <td>5</td>\n", | |
| " <td>2</td>\n", | |
| " <td>None</td>\n", | |
| " <td>N/A</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>0.6.0</th>\n", | |
| " <th>0</th>\n", | |
| " <th>NaN</th>\n", | |
| " <td>0</td>\n", | |
| " <td>6</td>\n", | |
| " <td>0</td>\n", | |
| " <td>None</td>\n", | |
| " <td>N/A</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>0.7.0</th>\n", | |
| " <th>0</th>\n", | |
| " <th>NaN</th>\n", | |
| " <td>0</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>None</td>\n", | |
| " <td>N/A</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>0.7.2</th>\n", | |
| " <th>0</th>\n", | |
| " <th>NaN</th>\n", | |
| " <td>0</td>\n", | |
| " <td>7</td>\n", | |
| " <td>2</td>\n", | |
| " <td>None</td>\n", | |
| " <td>N/A</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>0.8.0</th>\n", | |
| " <th>1</th>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>8</td>\n", | |
| " <td>0</td>\n", | |
| " <td>56945</td>\n", | |
| " <td>2010-07-27</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">0.9.0</th>\n", | |
| " <th rowspan=\"2\" valign=\"top\">2</th>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>13242</td>\n", | |
| " <td>2011-02-28</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>32703</td>\n", | |
| " <td>2011-02-28</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"3\" valign=\"top\">0.10.0</th>\n", | |
| " <th rowspan=\"3\" valign=\"top\">3</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>10</td>\n", | |
| " <td>0</td>\n", | |
| " <td>968</td>\n", | |
| " <td>2014-07-31</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>10</td>\n", | |
| " <td>0</td>\n", | |
| " <td>13114</td>\n", | |
| " <td>2011-11-13</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>10</td>\n", | |
| " <td>0</td>\n", | |
| " <td>17207</td>\n", | |
| " <td>2011-11-13</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">0.10.1</th>\n", | |
| " <th rowspan=\"2\" valign=\"top\">2</th>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>10</td>\n", | |
| " <td>1</td>\n", | |
| " <td>33823</td>\n", | |
| " <td>2012-02-28</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>10</td>\n", | |
| " <td>1</td>\n", | |
| " <td>63332</td>\n", | |
| " <td>2012-02-28</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"3\" valign=\"top\">0.11.0</th>\n", | |
| " <th rowspan=\"3\" valign=\"top\">3</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>11</td>\n", | |
| " <td>0</td>\n", | |
| " <td>1431</td>\n", | |
| " <td>2014-07-31</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>11</td>\n", | |
| " <td>0</td>\n", | |
| " <td>320750</td>\n", | |
| " <td>2012-09-29</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>11</td>\n", | |
| " <td>0</td>\n", | |
| " <td>94598</td>\n", | |
| " <td>2012-09-29</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"3\" valign=\"top\">0.12.0</th>\n", | |
| " <th rowspan=\"3\" valign=\"top\">3</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>12</td>\n", | |
| " <td>0</td>\n", | |
| " <td>5554</td>\n", | |
| " <td>2014-07-31</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>12</td>\n", | |
| " <td>0</td>\n", | |
| " <td>93602</td>\n", | |
| " <td>2013-04-09</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>12</td>\n", | |
| " <td>0</td>\n", | |
| " <td>113455</td>\n", | |
| " <td>2013-04-09</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">0.12.1</th>\n", | |
| " <th rowspan=\"2\" valign=\"top\">2</th>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>12</td>\n", | |
| " <td>1</td>\n", | |
| " <td>10513</td>\n", | |
| " <td>2013-10-12</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>12</td>\n", | |
| " <td>1</td>\n", | |
| " <td>3246</td>\n", | |
| " <td>2013-10-12</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"5\" valign=\"top\">0.13.0</th>\n", | |
| " <th rowspan=\"5\" valign=\"top\">5</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>13</td>\n", | |
| " <td>0</td>\n", | |
| " <td>1159</td>\n", | |
| " <td>2014-07-31</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>13</td>\n", | |
| " <td>0</td>\n", | |
| " <td>946</td>\n", | |
| " <td>2014-07-31</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>13</td>\n", | |
| " <td>0</td>\n", | |
| " <td>959</td>\n", | |
| " <td>2014-07-31</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>13</td>\n", | |
| " <td>0</td>\n", | |
| " <td>48604</td>\n", | |
| " <td>2013-10-19</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>13</td>\n", | |
| " <td>0</td>\n", | |
| " <td>8386</td>\n", | |
| " <td>2013-10-19</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">0.13.1</th>\n", | |
| " <th rowspan=\"2\" valign=\"top\">2</th>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>13</td>\n", | |
| " <td>1</td>\n", | |
| " <td>26768</td>\n", | |
| " <td>2013-11-17</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>13</td>\n", | |
| " <td>1</td>\n", | |
| " <td>5852</td>\n", | |
| " <td>2013-11-17</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">0.13.2</th>\n", | |
| " <th rowspan=\"2\" valign=\"top\">2</th>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>13</td>\n", | |
| " <td>2</td>\n", | |
| " <td>74236</td>\n", | |
| " <td>2013-12-08</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>13</td>\n", | |
| " <td>2</td>\n", | |
| " <td>64609</td>\n", | |
| " <td>2013-12-08</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>...</th>\n", | |
| " <th>...</th>\n", | |
| " <th>...</th>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>0.14.0</th>\n", | |
| " <th>8</th>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>0</td>\n", | |
| " <td>68592</td>\n", | |
| " <td>2014-05-03</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"3\" valign=\"top\">0.14.1rc1</th>\n", | |
| " <th rowspan=\"3\" valign=\"top\">3</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>664</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>662</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>665</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"3\" valign=\"top\">0.14.1rc1.dev-52fb336</th>\n", | |
| " <th rowspan=\"3\" valign=\"top\">3</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>823</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>687</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>753</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"5\" valign=\"top\">0.14.1</th>\n", | |
| " <th rowspan=\"5\" valign=\"top\">5</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>4681</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>743</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1419</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>41891</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>13304</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"3\" valign=\"top\">0.14.1rc1.dev-205726a</th>\n", | |
| " <th rowspan=\"3\" valign=\"top\">3</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>656</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>648</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>14</td>\n", | |
| " <td>1</td>\n", | |
| " <td>649</td>\n", | |
| " <td>2014-12-30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"5\" valign=\"top\">0.15.0</th>\n", | |
| " <th rowspan=\"5\" valign=\"top\">5</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>15</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3645</td>\n", | |
| " <td>2015-01-11</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>15</td>\n", | |
| " <td>0</td>\n", | |
| " <td>733</td>\n", | |
| " <td>2015-01-11</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>15</td>\n", | |
| " <td>0</td>\n", | |
| " <td>1146</td>\n", | |
| " <td>2015-01-11</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>15</td>\n", | |
| " <td>0</td>\n", | |
| " <td>39965</td>\n", | |
| " <td>2015-01-11</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>15</td>\n", | |
| " <td>0</td>\n", | |
| " <td>4435</td>\n", | |
| " <td>2015-01-11</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"5\" valign=\"top\">0.15.1</th>\n", | |
| " <th rowspan=\"5\" valign=\"top\">5</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>15</td>\n", | |
| " <td>1</td>\n", | |
| " <td>70390</td>\n", | |
| " <td>2015-01-18</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>15</td>\n", | |
| " <td>1</td>\n", | |
| " <td>5422</td>\n", | |
| " <td>2015-01-18</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>15</td>\n", | |
| " <td>1</td>\n", | |
| " <td>19935</td>\n", | |
| " <td>2015-01-18</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>15</td>\n", | |
| " <td>1</td>\n", | |
| " <td>506741</td>\n", | |
| " <td>2015-01-18</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>15</td>\n", | |
| " <td>1</td>\n", | |
| " <td>67128</td>\n", | |
| " <td>2015-01-18</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"5\" valign=\"top\">0.16.0</th>\n", | |
| " <th rowspan=\"5\" valign=\"top\">5</th>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>16</td>\n", | |
| " <td>0</td>\n", | |
| " <td>15238</td>\n", | |
| " <td>2015-07-24</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>16</td>\n", | |
| " <td>0</td>\n", | |
| " <td>340</td>\n", | |
| " <td>2015-07-24</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.whl</th>\n", | |
| " <td>0</td>\n", | |
| " <td>16</td>\n", | |
| " <td>0</td>\n", | |
| " <td>7977</td>\n", | |
| " <td>2015-07-24</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.tar</th>\n", | |
| " <td>0</td>\n", | |
| " <td>16</td>\n", | |
| " <td>0</td>\n", | |
| " <td>81593</td>\n", | |
| " <td>2015-07-24</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>.zip</th>\n", | |
| " <td>0</td>\n", | |
| " <td>16</td>\n", | |
| " <td>0</td>\n", | |
| " <td>20372</td>\n", | |
| " <td>2015-07-24</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>72 rows × 5 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " major minor patch \\\n", | |
| "key number_of_releases type_of_release \n", | |
| "0.4.4 0 NaN 0 4 4 \n", | |
| "0.5.2 0 NaN 0 5 2 \n", | |
| "0.6.0 0 NaN 0 6 0 \n", | |
| "0.7.0 0 NaN 0 7 0 \n", | |
| "0.7.2 0 NaN 0 7 2 \n", | |
| "0.8.0 1 .tar 0 8 0 \n", | |
| "0.9.0 2 .tar 0 9 0 \n", | |
| " .zip 0 9 0 \n", | |
| "0.10.0 3 .whl 0 10 0 \n", | |
| " .tar 0 10 0 \n", | |
| " .zip 0 10 0 \n", | |
| "0.10.1 2 .tar 0 10 1 \n", | |
| " .zip 0 10 1 \n", | |
| "0.11.0 3 .whl 0 11 0 \n", | |
| " .tar 0 11 0 \n", | |
| " .zip 0 11 0 \n", | |
| "0.12.0 3 .whl 0 12 0 \n", | |
| " .tar 0 12 0 \n", | |
| " .zip 0 12 0 \n", | |
| "0.12.1 2 .tar 0 12 1 \n", | |
| " .zip 0 12 1 \n", | |
| "0.13.0 5 .whl 0 13 0 \n", | |
| " .whl 0 13 0 \n", | |
| " .whl 0 13 0 \n", | |
| " .tar 0 13 0 \n", | |
| " .zip 0 13 0 \n", | |
| "0.13.1 2 .tar 0 13 1 \n", | |
| " .zip 0 13 1 \n", | |
| "0.13.2 2 .tar 0 13 2 \n", | |
| " .zip 0 13 2 \n", | |
| "... ... ... ... \n", | |
| "0.14.0 8 .zip 0 14 0 \n", | |
| "0.14.1rc1 3 .whl 0 14 1 \n", | |
| " .whl 0 14 1 \n", | |
| " .whl 0 14 1 \n", | |
| "0.14.1rc1.dev-52fb336 3 .whl 0 14 1 \n", | |
| " .whl 0 14 1 \n", | |
| " .whl 0 14 1 \n", | |
| "0.14.1 5 .whl 0 14 1 \n", | |
| " .whl 0 14 1 \n", | |
| " .whl 0 14 1 \n", | |
| " .tar 0 14 1 \n", | |
| " .zip 0 14 1 \n", | |
| "0.14.1rc1.dev-205726a 3 .whl 0 14 1 \n", | |
| " .whl 0 14 1 \n", | |
| " .whl 0 14 1 \n", | |
| "0.15.0 5 .whl 0 15 0 \n", | |
| " .whl 0 15 0 \n", | |
| " .whl 0 15 0 \n", | |
| " .tar 0 15 0 \n", | |
| " .zip 0 15 0 \n", | |
| "0.15.1 5 .whl 0 15 1 \n", | |
| " .whl 0 15 1 \n", | |
| " .whl 0 15 1 \n", | |
| " .tar 0 15 1 \n", | |
| " .zip 0 15 1 \n", | |
| "0.16.0 5 .whl 0 16 0 \n", | |
| " .whl 0 16 0 \n", | |
| " .whl 0 16 0 \n", | |
| " .tar 0 16 0 \n", | |
| " .zip 0 16 0 \n", | |
| "\n", | |
| " number_of_downloads \\\n", | |
| "key number_of_releases type_of_release \n", | |
| "0.4.4 0 NaN None \n", | |
| "0.5.2 0 NaN None \n", | |
| "0.6.0 0 NaN None \n", | |
| "0.7.0 0 NaN None \n", | |
| "0.7.2 0 NaN None \n", | |
| "0.8.0 1 .tar 56945 \n", | |
| "0.9.0 2 .tar 13242 \n", | |
| " .zip 32703 \n", | |
| "0.10.0 3 .whl 968 \n", | |
| " .tar 13114 \n", | |
| " .zip 17207 \n", | |
| "0.10.1 2 .tar 33823 \n", | |
| " .zip 63332 \n", | |
| "0.11.0 3 .whl 1431 \n", | |
| " .tar 320750 \n", | |
| " .zip 94598 \n", | |
| "0.12.0 3 .whl 5554 \n", | |
| " .tar 93602 \n", | |
| " .zip 113455 \n", | |
| "0.12.1 2 .tar 10513 \n", | |
| " .zip 3246 \n", | |
| "0.13.0 5 .whl 1159 \n", | |
| " .whl 946 \n", | |
| " .whl 959 \n", | |
| " .tar 48604 \n", | |
| " .zip 8386 \n", | |
| "0.13.1 2 .tar 26768 \n", | |
| " .zip 5852 \n", | |
| "0.13.2 2 .tar 74236 \n", | |
| " .zip 64609 \n", | |
| "... ... \n", | |
| "0.14.0 8 .zip 68592 \n", | |
| "0.14.1rc1 3 .whl 664 \n", | |
| " .whl 662 \n", | |
| " .whl 665 \n", | |
| "0.14.1rc1.dev-52fb336 3 .whl 823 \n", | |
| " .whl 687 \n", | |
| " .whl 753 \n", | |
| "0.14.1 5 .whl 4681 \n", | |
| " .whl 743 \n", | |
| " .whl 1419 \n", | |
| " .tar 41891 \n", | |
| " .zip 13304 \n", | |
| "0.14.1rc1.dev-205726a 3 .whl 656 \n", | |
| " .whl 648 \n", | |
| " .whl 649 \n", | |
| "0.15.0 5 .whl 3645 \n", | |
| " .whl 733 \n", | |
| " .whl 1146 \n", | |
| " .tar 39965 \n", | |
| " .zip 4435 \n", | |
| "0.15.1 5 .whl 70390 \n", | |
| " .whl 5422 \n", | |
| " .whl 19935 \n", | |
| " .tar 506741 \n", | |
| " .zip 67128 \n", | |
| "0.16.0 5 .whl 15238 \n", | |
| " .whl 340 \n", | |
| " .whl 7977 \n", | |
| " .tar 81593 \n", | |
| " .zip 20372 \n", | |
| "\n", | |
| " uploaded_on \n", | |
| "key number_of_releases type_of_release \n", | |
| "0.4.4 0 NaN N/A \n", | |
| "0.5.2 0 NaN N/A \n", | |
| "0.6.0 0 NaN N/A \n", | |
| "0.7.0 0 NaN N/A \n", | |
| "0.7.2 0 NaN N/A \n", | |
| "0.8.0 1 .tar 2010-07-27 \n", | |
| "0.9.0 2 .tar 2011-02-28 \n", | |
| " .zip 2011-02-28 \n", | |
| "0.10.0 3 .whl 2014-07-31 \n", | |
| " .tar 2011-11-13 \n", | |
| " .zip 2011-11-13 \n", | |
| "0.10.1 2 .tar 2012-02-28 \n", | |
| " .zip 2012-02-28 \n", | |
| "0.11.0 3 .whl 2014-07-31 \n", | |
| " .tar 2012-09-29 \n", | |
| " .zip 2012-09-29 \n", | |
| "0.12.0 3 .whl 2014-07-31 \n", | |
| " .tar 2013-04-09 \n", | |
| " .zip 2013-04-09 \n", | |
| "0.12.1 2 .tar 2013-10-12 \n", | |
| " .zip 2013-10-12 \n", | |
| "0.13.0 5 .whl 2014-07-31 \n", | |
| " .whl 2014-07-31 \n", | |
| " .whl 2014-07-31 \n", | |
| " .tar 2013-10-19 \n", | |
| " .zip 2013-10-19 \n", | |
| "0.13.1 2 .tar 2013-11-17 \n", | |
| " .zip 2013-11-17 \n", | |
| "0.13.2 2 .tar 2013-12-08 \n", | |
| " .zip 2013-12-08 \n", | |
| "... ... \n", | |
| "0.14.0 8 .zip 2014-05-03 \n", | |
| "0.14.1rc1 3 .whl 2014-12-30 \n", | |
| " .whl 2014-12-30 \n", | |
| " .whl 2014-12-30 \n", | |
| "0.14.1rc1.dev-52fb336 3 .whl 2014-12-30 \n", | |
| " .whl 2014-12-30 \n", | |
| " .whl 2014-12-30 \n", | |
| "0.14.1 5 .whl 2014-12-30 \n", | |
| " .whl 2014-12-30 \n", | |
| " .whl 2014-12-30 \n", | |
| " .tar 2014-12-30 \n", | |
| " .zip 2014-12-30 \n", | |
| "0.14.1rc1.dev-205726a 3 .whl 2014-12-30 \n", | |
| " .whl 2014-12-30 \n", | |
| " .whl 2014-12-30 \n", | |
| "0.15.0 5 .whl 2015-01-11 \n", | |
| " .whl 2015-01-11 \n", | |
| " .whl 2015-01-11 \n", | |
| " .tar 2015-01-11 \n", | |
| " .zip 2015-01-11 \n", | |
| "0.15.1 5 .whl 2015-01-18 \n", | |
| " .whl 2015-01-18 \n", | |
| " .whl 2015-01-18 \n", | |
| " .tar 2015-01-18 \n", | |
| " .zip 2015-01-18 \n", | |
| "0.16.0 5 .whl 2015-07-24 \n", | |
| " .whl 2015-07-24 \n", | |
| " .whl 2015-07-24 \n", | |
| " .tar 2015-07-24 \n", | |
| " .zip 2015-07-24 \n", | |
| "\n", | |
| "[72 rows x 5 columns]" | |
| ] | |
| }, | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "indexed.sort([ 'major','minor','patch'])" | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 2", | |
| "language": "python", | |
| "name": "python2" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 2 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython2", | |
| "version": "2.7.8" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment