{
"metadata": {
"name": "",
"signature": "sha256:9d1ddefac829300f7158b7898a962860c55eb2d4b297d0569f08aca3f6e25518"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Wikipedia Network Analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By Brian Keegan, Ph.D. -- October 4, 2014\n",
"\n",
"Released under a [CC-BY-SA 3.0 License](https://creativecommons.org/licenses/by-sa/3.0/).\n",
"\n",
"[Web](http://www.brianckeegan.com); [@bkeegan](https://twitter.com/bkeegan); [GitHub](github.com/brianckeegan/)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Importing libraries we'll want to use throughout the analysis right away."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Standard packages for data analysis\n",
"%matplotlib inline\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# pandas handles tabular data\n",
"import pandas as pd\n",
"\n",
"# networkx handles network data\n",
"import networkx as nx\n",
"\n",
"# json handles reading and writing JSON data\n",
"import json\n",
"\n",
"# To visualize webpages within this webpage\n",
"from IPython.display import HTML\n",
"\n",
"# To run queries against MediaWiki APIs\n",
"from wikitools import wiki, api\n",
"\n",
"# Some other helper functions\n",
"from collections import Counter\n",
"from operator import itemgetter"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Write a basic query against the Wikipedia API"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Running a test query in the browser"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We are going to make a query using the `list=users` action. [This page](http://en.wikipedia.org/w/api.php) contains all the documentation for the different queries you can run from Wikipedia's MediaWiki API. For our first test query, we'll want to get the information about a single user. Search for \"list=users\". You can also find similar information about this specific query action [here](https://www.mediawiki.org/wiki/API:Users) in the general MediaWiki documentation.\n",
"\n",
"We can actually write a test query in the URL which will return results if the parameters are all valid. Use the example given on the `api.php` page of documentation:\n",
"\n",
"http://en.wikipedia.org/w/api.php?action=query&list=users&ususers=Madcoverboy|Jimbo_Wales&usprop=blockinfo|groups|editcount|registration|gender\n",
"\n",
"There are four parameters in this API call, separated by `&` signs:\n",
"\n",
"* **`action`** - We pass a `query` option here to differentiate it from other actions we can run on the API like `parse`. But `action=query` will be what we use much of the time.\n",
"* **`list`** - This is one of several parameters we can use to make a query; search for \"action=query\" for others besides `list`. We pass a `users` option to `list` because we want to generate information about users. This lets us run the sub-options detailed in the documentation below.\n",
"* **`ususers`** - Here we list the names of Wikipedia users we want to get information about. We can pass more than one name by adding a pipe \"`|`\" between names. The documentation says we can only pass up to 50 names per request. Here we pass two names `Madcoverboy` for yours truly and `Jimbo_Wales` for the founder of Wikipedia.\n",
"* **`usprop`** - Here we pass a list of options detailed under the `list=users` about information we can obtain about any user. Again we use pipes to connect multiple options together. We are going to get information about whether a user is currently blocked (`blockinfo`), what powers the user has (`groups`), their total number of edits (`editcount`), the date and time they registered their account (`registration`), and their self-reported gender (`gender`).\n",
"\n",
"In summary, this API request is going to perform a query action that expects us to pass a list of user names and will return information about the users. We have given the query the names of the users we want information about as well as the specific types of information about each of these users.\n",
"\n",
"The codeblock below shows what clicking the URL should return."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"HTML('http://en.wikipedia.org/w/api.php?action=query&list=users&ususers=Madcoverboy|Jimbo_Wales&usprop=blockinfo|groups|editcount|registration|gender')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"\n",
"
\n",
"\tMediaWiki API Result\n",
"\n",
"\n",
"
\n",
"\n",
"You are looking at the HTML representation of the XML format.
\n",
"HTML is good for debugging, but is unsuitable for application use.
\n",
"Specify the format parameter to change the output format.
\n",
"To see the non HTML representation of the XML format, set format=xml.
\n",
"See the complete documentation, or\n",
"API help for more information.\n",
"\n",
"\n",
"<?xml version="1.0"?>\n",
"<api>\n",
" <query>\n",
" <users>\n",
" <user userid="304994" name="Madcoverboy" editcount="12348" registration="2005-06-21T13:52:16Z" gender="male">\n",
" <groups>\n",
" <g>reviewer</g>\n",
" <g>*</g>\n",
" <g>user</g>\n",
" <g>autoconfirmed</g>\n",
" </groups>\n",
" </user>\n",
" <user userid="24" name="Jimbo Wales" editcount="11768" registration="2001-03-27T20:47:31Z" gender="unknown">\n",
" <groups>\n",
" <g>checkuser</g>\n",
" <g>founder</g>\n",
" <g>oversight</g>\n",
" <g>sysop</g>\n",
" <g>*</g>\n",
" <g>user</g>\n",
" <g>autoconfirmed</g>\n",
" </groups>\n",
" </user>\n",
" </users>\n",
" </query>\n",
"</api>\n",
"
\n",
"\n",
"\n",
""
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 27,
"text": [
""
]
}
],
"prompt_number": 27
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There's a lot of padding and fields from the XML markup this returns by default, but the data are all in there. My `userid` is \"304994\", my `username` is \"Madcoverboy\" (which we already knew), I have 12,348 edts, I registered my account on June 21, 2005 at 1:52:16pm GMT, I identify as male, and I'm a member of four \"groups\" corresponding to my editing privileges: `reviewer`, `*`, `user`, and `autoconfirmed`."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Running the same query in Python"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Clicking on the link will run the query and return the results in your web browser. However, the point of using an API is not for you to make queries with a URL and then copy-paste the results into Python. We're going to run the query within Python (rather than the web browser) and return the data back to us in a format that we can continue to use for analysis.\n",
"\n",
"First we need to write a function that will accept something that corresponds to the query we want to run, goes out and connects to the English Wikipedia's MediaWiki API \"spigot\", formats our query for this API to understand, runs the query until all the results come back, and then returns the results to us as some data object. The function below does all of those things, but it's best to just treat it as a black box for now that accepts queries and spits out the results from the English Wikipedia. \n",
"\n",
"(If you want to use another another MediaWiki API, replace the current URL following `site_url` with the corresponding API location. For example, [Memory Alpha](http://en.memory-alpha.org/)'s is http://en.memory-alpha.org/api.php)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def wikipedia_query(query_params,site_url='http://en.wikipedia.org/w/api.php'):\n",
" site = wiki.Wiki(url=site_url)\n",
" request = api.APIRequest(site, query_params)\n",
" result = request.query()\n",
" return result[query_params['action']]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can write the exact same query as we used above using a dictionary for all the same request parameters as key value pairs and save the dictionary as `user_query`. For example, where we used `action=query` in the URL above, we use `'action':'query'` as a key-value pair of strings (make sure to include the quotes marking these as strings, rather than variables!) in the query dictionary. Then we can pass this query dictionary to the `wikipedia_query` black box function defined above to get the exact same information out. We save the output in `query_results` and can look at the results by calling this variable."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"user_query = {'action':'query',\n",
" 'list':'users',\n",
" 'usprop':'blockinfo|groups|editcount|registration|gender',\n",
" 'ususers':'Madcoverboy|Jimbo Wales'}\n",
"\n",
"query_results = wikipedia_query(user_query)\n",
"query_results"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"{u'users': [{u'editcount': 12348,\n",
" u'gender': u'male',\n",
" u'groups': [u'reviewer', u'*', u'user', u'autoconfirmed'],\n",
" u'name': u'Madcoverboy',\n",
" u'registration': u'2005-06-21T13:52:16Z',\n",
" u'userid': 304994},\n",
" {u'editcount': 11778,\n",
" u'gender': u'unknown',\n",
" u'groups': [u'checkuser',\n",
" u'founder',\n",
" u'oversight',\n",
" u'sysop',\n",
" u'*',\n",
" u'user',\n",
" u'autoconfirmed'],\n",
" u'name': u'Jimbo Wales',\n",
" u'registration': u'2001-03-27T20:47:31Z',\n",
" u'userid': 24}]}"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The data structure that is returned is a dictionary keyed by `'users'` which returns a list of dictionaries. Knowing that the data corresponding to `Jimbo Wales` is the second element in the list of dictionaries (remember Python indices start at 0, so the 2nd element corresponds to 1), we can access his edit count. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"query_results['users'][1]['editcount']"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"11778"
]
}
],
"prompt_number": 7
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Write a function to simplify the process"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Instead of writing each query manually, we can define a function `get_user_properties` that accepts a user name(s), and returns ther results of the query used above but replaces \"Madcoverboy\" and \"Jimbo Wales\" with the user name(s) passed."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def get_user_properties(user):\n",
" result = wikipedia_query({'action':'query',\n",
" 'list':'users',\n",
" 'usprop':'blockinfo|groups|editcount|registration|gender',\n",
" 'ususers':user})\n",
" return result"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can test this function on another user, \"Koavf\" who is the [most active user on the English Wikipedia](https://en.wikipedia.org/wiki/Wikipedia:List_of_Wikipedians_by_number_of_edits#1.E2.80.931000). We'll save his results to `koavf_query_results`."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"koavf_query_results = get_user_properties('Koavf')\n",
"koavf_query_results"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"{u'users': [{u'editcount': 1335895,\n",
" u'gender': u'male',\n",
" u'groups': [u'accountcreator',\n",
" u'autoreviewer',\n",
" u'epcampus',\n",
" u'eponline',\n",
" u'filemover',\n",
" u'ipblock-exempt',\n",
" u'reviewer',\n",
" u'rollbacker',\n",
" u'templateeditor',\n",
" u'*',\n",
" u'user',\n",
" u'autoconfirmed'],\n",
" u'name': u'Koavf',\n",
" u'registration': u'2005-03-05T20:22:47Z',\n",
" u'userid': 205121}]}"
]
}
],
"prompt_number": 9
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Write the data we collected to disk"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"All the data we've collected in `query_results` and `koavf_query_results` exist only in memory. Once we shut this notebook down, these data will cease to exist. So we'll want to save these data to disk by \"serializing\" into a format that other programs can use. Two very common file formats are [JavaScript Object Notation (JSON)](https://en.wikipedia.org/wiki/JSON) and [Comma-separated Values (CSV)](https://en.wikipedia.org/wiki/Comma-separated_values). JSON is better for more complex data that contains a mixture of strings, arrays (lists), dictionaries, and booleans while CSV is better for \"flatter\" data that you might want to read into a spreadsheet.\n",
"\n",
"We can save a the `koavf_query_results` as a JSON file by creating and opening a file named `koavf_query_results.json` and referring to this connection as `f`. We use the `json.dump` function to translate all the data in the `koavf_query_results` dictionary into the file and once this process is done, the file automatically closes itself so that other programs can access it."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"with open('koavf_query_results.json','wb') as f:\n",
" json.dump(koavf_query_results,f)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check to make sure this data was properly exported by reading it back in as `loaded_koavf_query_results`."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"with open('koavf_query_results.json','rb') as f:\n",
" loaded_koavf_query_results = json.load(f)\n",
" \n",
"loaded_koavf_query_results"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": [
"{u'users': [{u'editcount': 1335895,\n",
" u'gender': u'male',\n",
" u'groups': [u'accountcreator',\n",
" u'autoreviewer',\n",
" u'epcampus',\n",
" u'eponline',\n",
" u'filemover',\n",
" u'ipblock-exempt',\n",
" u'reviewer',\n",
" u'rollbacker',\n",
" u'templateeditor',\n",
" u'*',\n",
" u'user',\n",
" u'autoconfirmed'],\n",
" u'name': u'Koavf',\n",
" u'registration': u'2005-03-05T20:22:47Z',\n",
" u'userid': 205121}]}"
]
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `query_results` data has two \"observations\" corresponding to \"Madcoverboy\" and \"Jimbo Wales\". We could create a CSV with the columns corresponding to the field names (`editcount`, `gender`, `groups`, `name`, `registration`, `userid`) and then two rows containing the corresponding values for each user.\n",
"\n",
"Using a powerful library called \"[pandas](http://pandas.pydata.org/)\" (short for \"panel data\", not the [cute bears](https://inhistime.files.wordpress.com/2010/10/cute-panda.jpg)), we can pass the list of data inside `query_results` and pandas will attempt to convert it to a tabular format called a DataFrame that can be exported to CSV. We save this as `df` and then use the `to_csv` function to write this DataFrame to a CSV file. We use to extra options, declaring quotation marks to make sure the data in `groups`, which already contains commas, doesn't get split up later. We don't care about the row numbers (the index), so we declare `index=False` so they aren't exported."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"query_results['users']"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": [
"[{u'editcount': 12348,\n",
" u'gender': u'male',\n",
" u'groups': [u'reviewer', u'*', u'user', u'autoconfirmed'],\n",
" u'name': u'Madcoverboy',\n",
" u'registration': u'2005-06-21T13:52:16Z',\n",
" u'userid': 304994},\n",
" {u'editcount': 11778,\n",
" u'gender': u'unknown',\n",
" u'groups': [u'checkuser',\n",
" u'founder',\n",
" u'oversight',\n",
" u'sysop',\n",
" u'*',\n",
" u'user',\n",
" u'autoconfirmed'],\n",
" u'name': u'Jimbo Wales',\n",
" u'registration': u'2001-03-27T20:47:31Z',\n",
" u'userid': 24}]"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"df = pd.DataFrame(query_results['users'])\n",
"df.to_csv('query_results.csv',quotechar='\"',index=False)\n",
"df"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" editcount | \n",
" gender | \n",
" groups | \n",
" name | \n",
" registration | \n",
" userid | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 12348 | \n",
" male | \n",
" [reviewer, *, user, autoconfirmed] | \n",
" Madcoverboy | \n",
" 2005-06-21T13:52:16Z | \n",
" 304994 | \n",
"
\n",
" \n",
" 1 | \n",
" 11778 | \n",
" unknown | \n",
" [checkuser, founder, oversight, sysop, *, user... | \n",
" Jimbo Wales | \n",
" 2001-03-27T20:47:31Z | \n",
" 24 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": [
" editcount gender groups \\\n",
"0 12348 male [reviewer, *, user, autoconfirmed] \n",
"1 11778 unknown [checkuser, founder, oversight, sysop, *, user... \n",
"\n",
" name registration userid \n",
"0 Madcoverboy 2005-06-21T13:52:16Z 304994 \n",
"1 Jimbo Wales 2001-03-27T20:47:31Z 24 "
]
}
],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check to make sure this data was properly exported by reading it back in."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pd.read_csv('query_results.csv',quotechar='\"')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" editcount | \n",
" gender | \n",
" groups | \n",
" name | \n",
" registration | \n",
" userid | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 12348 | \n",
" male | \n",
" [u'reviewer', u'*', u'user', u'autoconfirmed'] | \n",
" Madcoverboy | \n",
" 2005-06-21T13:52:16Z | \n",
" 304994 | \n",
"
\n",
" \n",
" 1 | \n",
" 11778 | \n",
" unknown | \n",
" [u'checkuser', u'founder', u'oversight', u'sys... | \n",
" Jimbo Wales | \n",
" 2001-03-27T20:47:31Z | \n",
" 24 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
" editcount gender groups \\\n",
"0 12348 male [u'reviewer', u'*', u'user', u'autoconfirmed'] \n",
"1 11778 unknown [u'checkuser', u'founder', u'oversight', u'sys... \n",
"\n",
" name registration userid \n",
"0 Madcoverboy 2005-06-21T13:52:16Z 304994 \n",
"1 Jimbo Wales 2001-03-27T20:47:31Z 24 "
]
}
],
"prompt_number": 14
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Summary"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this section, we've covered the basics for how:\n",
"\n",
"* to look up documentation about the MediaWiki API\n",
"* format a basic query and test to make sure it works within a web browser\n",
"* running the same query within Python\n",
"* writing a function to simplify querying data\n",
"* writing the results of these queries to files so we can access these data later.\n",
"\n",
"In the next sections, we'll use other queries to get more interesting data about relationships and more advanced data manipulation techniques to prepare these data for social network analysis."
]
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Create hyperlink network"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"List of articles currently linked *from* an article"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We are going to use the `prop=links` query to identify a list of articles that are *currently* linked *from* an article. We will use the article for \"[Hillary Rodham Clinton](https://en.wikipedia.org/wiki/Hillary_Rodham_Clinton)\". The general MediaWiki documentation for this query is [here](https://www.mediawiki.org/wiki/API:Properties#links_.2F_pl). We will specify a query using the `action=query` to define a general class of query, the `prop=links` to indicate we want the current links from a page, and then pass the name of a page with `titles=Hillary Rodham Clinton`.\n",
"\n",
"There are [many \"namespaces\" of Wikipedia pages](https://en.wikipedia.org/wiki/Wikipedia:Namespace) that reflect different kinds of pages for articles, article talk pages, user pages, user talk pages, and other administrative pages. Links to and from a Wikipedia article can come from all these name spaces, but because the Wikipedia articles that 99% of us ever read are located inside the \"0\" namespace, we'll only want to limit ourselves to links in that namespace rather than these \"backchannel\" links. We enforce this limit with the `plnamespace=0` option.\n",
"\n",
"There could potentially be hudreds of links from a single article but the API will only return some number per request. The `wikitools` library takes care of automatically generating additional requests if there is more data to obtain after the first request. Ideally, we could specify a large number like 10,000 to make sure we get all the links with a single request, but the API enforces a limit of 500 links per request and defaults to only 10 per request. We use the `pllimit=500` to make sure we get the maximum number of links per request instead of issuing 50 requests."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"outlink_query = {'action': 'query',\n",
" 'prop': 'links',\n",
" 'titles': 'Hillary Rodham Clinton',\n",
" 'pllimit': '500',\n",
" 'plnamespace':'0'}\n",
"\n",
"hrc_outlink_data = wikipedia_query(outlink_query)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_outlink_data['pages'][u'5043192']['links'][:5]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 78,
"text": [
"[{u'ns': 0, u'title': u'Virginia Clinton Kelley'},\n",
" {u'ns': 0, u'title': u'2008 Democratic National Convention'},\n",
" {u'ns': 0, u'title': u'Scottish people'},\n",
" {u'ns': 0, u'title': u'United Press International'},\n",
" {u'ns': 0, u'title': u'Edmund Hillary'}]"
]
}
],
"prompt_number": 78
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The data returned by this query is a dictionary of dictionaries that you'll need to dive \"into\" more deeply to access the data itself. The top dictionary contains a single key `'pages'` which returns a dictionary containing a single key `u'5043192'` corresponding to the page ID for the article. Once you're inside this dictionary, you can access the list of links, which are unfortunately a list of dictionaries! Using something called a \"[list comprehension](http://www.pythonforbeginners.com/basics/list-comprehensions-in-python)\", I can clean this data up to get a nice concise list of links, which we save as `hrc_outlink_list`. I also print out the number of links in this list and 10 examples of these links. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_outlink_list = [link['title'] for link in hrc_outlink_data['pages'][u'5043192']['links']]\n",
"print \"There are {0} links from the Hillary Rodham Clinton article\".format(len(hrc_outlink_list))\n",
"hrc_outlink_list[:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 1419 links from the Hillary Rodham Clinton article\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 19,
"text": [
"[u'Virginia Clinton Kelley',\n",
" u'2008 Democratic National Convention',\n",
" u'Scottish people',\n",
" u'United Press International',\n",
" u'Edmund Hillary',\n",
" u'Madeleine Albright',\n",
" u'Alan Keyes presidential campaign, 2008',\n",
" u'Margaret Bourke-White',\n",
" u'Anna Harrison',\n",
" u'Jeremiah S. Black']"
]
}
],
"prompt_number": 19
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"A note on redirects"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that there is an article for \"Hillary Clinton\" as well, but this article is a [redirect](https://en.wikipedia.org/wiki/Wikipedia:Redirect). In other words, this article exists and has data that can be accessed from the API, but it's suspiciously sparse and just points to \"Hillary Rodham Clinton\"."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"outlink_query_hc = {'action': 'query',\n",
" 'prop': 'links',\n",
" 'titles': 'Hillary Clinton',\n",
" 'pllimit': '500',\n",
" 'plnamespace': '0'}\n",
"\n",
"hc_outlink_data = wikipedia_query(outlink_query_hc)\n",
"hc_outlink_data"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 20,
"text": [
"{u'pages': {u'39797486': {u'links': [{u'ns': 0,\n",
" u'title': u'Hillary Rodham Clinton'}],\n",
" u'ns': 0,\n",
" u'pageid': 39797486,\n",
" u'title': u'Hillary Clinton'}}}"
]
}
],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The MediaWiki API has a `redirects` option that lets us ignore these placeholder redirect pages and will follow the redirect to take us to the intended page. Adding this option to the query but specifying the same `Hillary Clinton` value for the `titles` parameter that previously led to a redirect now returns all the data at the \"Hillary Rodham Clinton\" article. We'll make sure to use this `redirects` option in future queries."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"outlink_query_hc_redirect = {'action': 'query',\n",
" 'prop': 'links',\n",
" 'titles': 'Hillary Clinton', # still \"Hillary Clinton\"\n",
" 'pllimit': '500',\n",
" 'plnamespace': '0',\n",
" 'redirects': 'True'} # redirects parameter added\n",
"\n",
"hcr_outlink_data = wikipedia_query(outlink_query_hc_redirect)\n",
"hcr_outlink_list = [link['title'] for link in hcr_outlink_data['pages'][u'5043192']['links']]\n",
"print \"There are {0} links from the Hillary Clinton article\".format(len(hcr_outlink_list))\n",
"hcr_outlink_list[:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 1419 links from the Hillary Clinton article\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 21,
"text": [
"[u'Virginia Clinton Kelley',\n",
" u'2008 Democratic National Convention',\n",
" u'Scottish people',\n",
" u'United Press International',\n",
" u'Edmund Hillary',\n",
" u'Madeleine Albright',\n",
" u'Alan Keyes presidential campaign, 2008',\n",
" u'Margaret Bourke-White',\n",
" u'Anna Harrison',\n",
" u'Jeremiah S. Black']"
]
}
],
"prompt_number": 21
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"List of articles currently linking *to* an article"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We are going to use the `prop=linkshere` query to identify a list of articles that *currently* link to the Hillary Rodham Clinton article. The parameters for this query are a bit different. We still use a namespace limitation so we are only getting pages in the article namespace by specifying `lhnamespace=0` and we want to maximize the number of links per query that the API allows by specifying `lhlimit=500`. However, we don't want to include redirects that point to this article (e.g., \"Hillary Clinton\" points to \"Hillary Rodham Clinton\") by specifying `lhshow=!redirect`. Finally we only want the names of the articles, rather than less important information like \"pageid\" or \"redirects\", so we can limit this by specifying `lhprop=title`."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"inlink_query_hrc = {'action': 'query',\n",
" 'redirects': 'True',\n",
" 'prop': 'linkshere',\n",
" 'titles': 'Hillary Rodham Clinton',\n",
" 'lhlimit': '500',\n",
" 'lhnamespace': '0',\n",
" 'lhshow': '!redirect',\n",
" 'lhprop': 'title'}\n",
"\n",
"hrc_inlink_data = wikipedia_query(inlink_query_hrc)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again some data processing and cleanup is necessary to drill down into the dictionaries of dictionaries to extract the list of links from the data returned by the query. I use a similar list comprehension as above to get this list of links out. Again, I count the number of links in this list and give an example of 10 links."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_inlink_list = [link['title'] for link in hrc_inlink_data['pages'][u'5043192']['linkshere']]\n",
"print \"There are {0} links to the Hillary Rodham Clinton article\".format(len(hrc_inlink_list))\n",
"hrc_inlink_list[:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 1835 links to the Hillary Rodham Clinton article\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 24,
"text": [
"[u'Virginia Clinton Kelley',\n",
" u'2011 attack on the British Embassy in Iran',\n",
" u'James Watson (New York)',\n",
" u'International security',\n",
" u'Shannon County, Missouri',\n",
" u'Margaret Bourke-White',\n",
" u'2008 Democratic National Convention',\n",
" u'Alice Paul',\n",
" u'Foreign relations of Mexico',\n",
" u'HRC: State Secrets and the Rebirth of Hillary Clinton']"
]
}
],
"prompt_number": 24
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Combining queries"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the previous two sections, we came up with two separate queries to get both the links *from* an article and the links *to* an article. However, much to the credit of the MediaWiki API engineers, you can ***combine*** both queries into one. We'll need all the same parameter information that we had included before (`pllimit`, `lhlimit`, etc.), but we can combine the queries together by combining `prop=links` and `prop=linkshere` with a pipe (like we did with user names in the very first query), `prop=links|linkshere`."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"alllinks_query_hrc = {'action': 'query',\n",
" 'redirects': 'True',\n",
" 'prop': 'links|linkshere', #combined both prop calls with a pipe\n",
" 'titles': 'Hillary Rodham Clinton',\n",
" 'pllimit': '500', #still need the \"prop=links\" \"pl\" parameters and below\n",
" 'plnamespace': '0',\n",
" 'lhlimit': '500', #still need the \"prop=linkshere\" \"lh\" parameters and below\n",
" 'lhnamespace': '0',\n",
" 'lhshow': '!redirect',\n",
" 'lhprop': 'title'}\n",
"\n",
"hrc_alllink_data = wikipedia_query(alllinks_query_hrc)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 25
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again, we need to do some data processing and cleanup to get the lists of links out. However, there are now two different sub-dictionaries within `hrc_alllink_data` object reflecting the output from the `links` and the `linkshere` calls."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_alllink_outlist = [link['title'] for link in hrc_alllink_data['pages'][u'5043192']['links']]\n",
"hrc_alllink_inlist = [link['title'] for link in hrc_alllink_data['pages'][u'5043192']['linkshere']]\n",
"print \"There are {0} out links from and {1} in links to the Hillary Rodham Clinton article\".format(len(hrc_alllink_outlist),len(hrc_alllink_inlist))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 1419 out links from and 1835 in links to the Hillary Rodham Clinton article\n"
]
}
],
"prompt_number": 26
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also write a function `get_article_links` that takes an article name as an input and returns the lists containing all the in and out links for that article. We use the combined query described above, but replace Hillary's article title with a generic `article` variable, run the query, pull out the `page_id`, and then do the data processing and cleanup to produce a list of outlinks and a list of inlinks, both of which are passed back out of the function. Again, this query will only pull out the current links on the article, not historical links."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def get_article_links(article):\n",
" query = {'action': 'query',\n",
" 'redirects': 'True',\n",
" 'prop': 'links|linkshere',\n",
" 'titles': article, # the article variable is passed into here\n",
" 'pllimit': '500',\n",
" 'plnamespace': '0',\n",
" 'lhlimit': '500',\n",
" 'lhnamespace': '0',\n",
" 'lhshow': '!redirect',\n",
" 'lhprop': 'title'}\n",
" results = wikipedia_query(query) # do the query\n",
" page_id = results['pages'].keys()[0] # get the page_id\n",
" \n",
" if 'links' in results['pages'][page_id].keys(): #sometimes there are no links\n",
" outlist = [link['title'] for link in results['pages'][page_id]['links']] # clean up outlinks\n",
" else:\n",
" outlist = [] # return empty list if no outlinks\n",
" \n",
" if 'linkshere' in results['pages'][page_id].keys(): #sometimes there are no links\n",
" inlist = [link['title'] for link in results['pages'][page_id]['linkshere']] # clean up inlinks\n",
" else:\n",
" inlist = [] # return empty list if no inlinks\n",
" return outlist,inlist"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 27
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can test this on Bill Clinton's article, for example."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bc_out, bc_in = get_article_links(\"Bill Clinton\")\n",
"print \"There are {0} out links from and {1} in links to the Bill Clinton article\".format(len(bc_out),len(bc_in))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 1249 out links from and 9460 in links to the Bill Clinton article\n"
]
}
],
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets put the data for both these queries into a dictionary called `clinton_link_data` so it's easier to access and save. We'll save this data to disk as a JSON as well so we can access it in the future."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"clinton_link_data = {\"Hillary Rodham Clinton\": {\"In\": hrc_alllink_inlist,\n",
" \"Out\": hrc_alllink_outlist},\n",
" \"Bill Clinton\": {\"In\": bc_in,\n",
" \"Out\": bc_out}\n",
" }\n",
"\n",
"with open('clinton_link_data.json','wb') as f:\n",
" json.dump(clinton_link_data,f)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 30
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Make a network"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Having collected data about the neighboring articles that are linked to or from one article, we can turn these data into a network. Using the `NetworkX` library (shortened to `nx` on import at the top), we will create a `DiGraph` object called `hrc_g` and then fill it with the connection data we just collected. We do this by iterating over the lists of links (`hrc_alllink_outlist` and `hrc_alllink_inlist`) and adding a directed edge between each neighbor and the original article. It's important to pay attention to edge direction as the out links should start at \"Hillary Rodham Clinton\" and end at the neighboring article whereas the in links should start at the neighboring article and end at \"Hillary Rodham Clinton\"."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_alllink_outlist[:5]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 31,
"text": [
"[u'Virginia Clinton Kelley',\n",
" u'2008 Democratic National Convention',\n",
" u'Scottish people',\n",
" u'United Press International',\n",
" u'Edmund Hillary']"
]
}
],
"prompt_number": 31
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_g = nx.DiGraph()\n",
"\n",
"for article in hrc_alllink_outlist:\n",
" hrc_g.add_edge(\"Hillary Rodham Clinton\",article)\n",
" \n",
"for article in hrc_alllink_inlist:\n",
" hrc_g.add_edge(article,\"Hillary Rodham Clinton\")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 32
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can compute some basic statistics about the network such as the number of nodes."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"len(hrc_alllink_outlist) + len(hrc_alllink_inlist)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 34,
"text": [
"3254"
]
}
],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_g.number_of_nodes()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 33,
"text": [
"2647"
]
}
],
"prompt_number": 33
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print \"There are {0} edges and {1} nodes in the network\".format(hrc_g.number_of_edges(), hrc_g.number_of_nodes())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 3254 edges and 2647 nodes in the network\n"
]
}
],
"prompt_number": 122
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We might also ask how many of these hyperlink edges are reciprocated, or link in both directions. We start with an empty container `reciprocal_edges` we'll use to fill with edges that are reciprocated. Next, we iterate through all the edges in the graph (`hrc_g.edges()` returns a list of all edges) and check two things. The first check is for whether the graph contains an edge the goes in the opposite direction. So given an edge (`i`,`j`), we check if there's also a (`j`,`i`). The second check is to make sure we haven't already added this edge to the `reciprocal_edges` list. If both these conditions are true, then we can add the edge to `reciprocal_edges`."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"reciprocal_edges = list()\n",
"for (i,j) in hrc_g.edges():\n",
" if hrc_g.has_edge(j,i) and (j,i) not in reciprocal_edges:\n",
" reciprocal_edges.append((i,j))\n",
" \n",
"reciprocation_fraction = round(float(len(reciprocal_edges))/hrc_g.number_of_edges(),3)\n",
"print \"There are {0} reciprocated edges out of {1} edges in the network, giving a reciprocation fraction of {2}.\".format(len(reciprocal_edges),hrc_g.number_of_edges(),reciprocation_fraction)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 608 reciprocated edges out of 3254 edges in the network, giving a reciprocation fraction of 0.187.\n"
]
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can compare this to the network for Bill Clinton. There are many more edges in his network, but a much smaller fraction of these edges are reciprocated. This suggests that there are fewer articles expressing some similarity or relationship with Bill Clinton that his article also acknowledges by linking. This in turn invites questions about:\n",
"\n",
"* how the rate of reciprocity differs among biographies versus geographic entities\n",
"* contemporary versus historical elites\n",
"* high versus low quality articles\n",
"* how these rates of reciprocation change over the evolution of the article's collaboration\n",
"\n",
"With the query we've covered above, you canbegin to answer these open questions."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bc_g = nx.DiGraph()\n",
"\n",
"for article in bc_out:\n",
" bc_g.add_edge(\"Bill Clinton\",article)\n",
" \n",
"for article in bc_in:\n",
" bc_g.add_edge(article,\"Bill Clinton\")\n",
"\n",
"bc_reciprocal_edges = list()\n",
"for (i,j) in bc_g.edges():\n",
" if bc_g.has_edge(j,i) and (j,i) not in bc_reciprocal_edges:\n",
" bc_reciprocal_edges.append((i,j))\n",
" \n",
"bc_reciprocation_fraction = round(float(len(bc_reciprocal_edges))/bc_g.number_of_edges(),3)\n",
"print \"There are {0} reciprocated edges out of {1} edges in the network, giving a reciprocation fraction of {2}.\".format(len(bc_reciprocal_edges),bc_g.number_of_edges(),bc_reciprocation_fraction)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 926 reciprocated edges out of 10709 edges in the network, giving a reciprocation fraction of 0.086.\n"
]
}
],
"prompt_number": 36
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is a pretty basic \"star\"-shaped network that contains Hillary's article at the center and is surrounded by all the articles linking to and from it. In particular, we could \"[snowball](https://en.wikipedia.org/wiki/Snowball_sampling)\" out from the the articles that link to and are linked from a given page and visit each of *those* articles and create their local networks. We could continue to do this until we traverse the whole hyperlink network, but that would take a very long time, involve a lot of data, and would be an abusive use of the API (if you want the whole hyperlink network, you can download the data directly [here](https://dumps.wikimedia.org/enwiki/) by clicking a backup date and searching for \"Wiki page-to-page link records.\"). \n",
"\n",
"We could also create the \"1.5-step ego\" hyperlink network around a given page that consists of the focal article, all the articles that link to or from it, and then whether these neighboring articles are linked to each other. This could provide a better picture of which neighboring articles link to which other articles.\n",
"\n",
"Unfortunately, even the scrape for the 2-step ego hyperlink network could take over an hour of data collection and generate hundreds of megabytes of data. Furthermore, Wikipedia article also contain [templates](https://en.wikipedia.org/wiki/Help:Template) which creates lots of \"redundant\" links between articles that share templates even those these links don't appear in the body of the article itself. You'll need to do much more advanced text parsing of wiki-markup to actually get links in the body of an article, but that's beyond the scope of the present tutorial.\n",
"\n",
"***I don't recommend crawling more than the immediate (1-step) neighbors of Wikipedia articles.***"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Links from historical versions of an article"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The queries above only looked at the links coming from the *current* version of the article. However Wikipedia archives every version of the article, so we can rewind the tape all the way back to the first version of Hillary's article back in 2001, a few months after Wikipedia was created. Specific versions of a Wikipedia article are identified with a `revid`, which is also called an `oldid` in some contexts. In subsequent sections, we'll go into more detail on how to get a list of all revisions to an article and find the oldest revision. But for the time being, just trust me that `revid` \"256189\" is the oldest version of the Hillary Rodham Clinton article. Take a peek at what the article looked like back then below:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"HTML('')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
""
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 37,
"text": [
""
]
}
],
"prompt_number": 37
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The MediaWiki API allows us to extract the out links from this old version of the article. Here we'll perform a different kind of `action` on the API than the previous `query` parameter we've used. The `action=parse` will extract information from a given version of an article, such as the links. We can specify that links should be parsed out with the `prop=links` parameter. Finally, we pass the `oldid=256189` so that this specific revision is parsed."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"oldest_outlinks_query_hrc = {'action': 'parse', #query changes to parse\n",
" 'prop': 'links',\n",
" 'oldid': '256189'}\n",
"\n",
"oldest_outlinks_data = wikipedia_query(oldest_outlinks_query_hrc)\n",
"oldest_outlinks_data"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"URLError: trying request again in 5 seconds\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 38,
"text": [
"{u'links': [{u'*': u'Baby Boom', u'exists': u'', u'ns': 0},\n",
" {u'*': u'Bill Clinton', u'exists': u'', u'ns': 0},\n",
" {u'*': u'First Lady', u'exists': u'', u'ns': 0},\n",
" {u'*': u'New York', u'exists': u'', u'ns': 0},\n",
" {u'*': u'October 26', u'exists': u'', u'ns': 0},\n",
" {u'*': u'Senators Of The United States', u'exists': u'', u'ns': 0},\n",
" {u'*': u'United States/President', u'exists': u'', u'ns': 0},\n",
" {u'*': u'United States Senate', u'exists': u'', u'ns': 0},\n",
" {u'*': u'Watergate', u'exists': u'', u'ns': 0}],\n",
" u'revid': 256189,\n",
" u'title': u'Hillary Rodham Clinton'}"
]
}
],
"prompt_number": 38
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again, data processing and cleanup using a list comprehension is necessary to get a list of links from this result."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"oldest_outlink_list = [link['*'] for link in oldest_outlinks_data['links']]\n",
"print \"There are {0} out links from the Hillary Rodham Clinton article\".format(len(oldest_outlink_list))\n",
"oldest_outlink_list"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 9 out links from the Hillary Rodham Clinton article\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 86,
"text": [
"[u'Baby Boom',\n",
" u'Bill Clinton',\n",
" u'First Lady',\n",
" u'New York',\n",
" u'October 26',\n",
" u'Senators Of The United States',\n",
" u'United States/President',\n",
" u'United States Senate',\n",
" u'Watergate']"
]
}
],
"prompt_number": 86
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So now we can also extract links from historical versions of the article. However, it's *much* more difficult to get the history of what links in to an article (e.g., `linkshere`) as this would require potentially looking at the history of every other article to check if a link was ever made from that article to another article. This is not impossible, just very *very* time-consuming."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Summary"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this section we learned to write and combine queries to get us the links to and from the current version of an article, clean the output of these queries up into lists of links, use these lists of links to make a network object, and did some preliminary analysis of an article's ego network. There are some limitations on the specificity of the links that the API passes back which limits our ability to generate more complex networks using this query. We also showed that it's possible to get the out links from a historical version of an article using a new kind of API action called a `parse`. Using the out links from all the changes to an article could let us look at the evolution of what the article linked to over time. We'll go into how to get all the changes to an article in the next section."
]
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Get all the revisions made to an article"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The previous section showed how to make a basic network from the current hyperlinks to and from a Wikipedia article. It also alluded to the fact that Wikipedia captures the history of every change made to the article since it was created as well as who made these changes and when (among other meta-data). In this section, we'll explore some queries around how to extract the \"revision history\" of an article from the API. We'll do some exploratory analysis using these data to understand patterns in the distribution of editors' activity, changes in content, and the persistence of revisions. Additionally, we'll construct a co-authorship network of what editors made a change to the article.\n",
"\n",
"Starting with a basic query, we'll get every change that's been made to the \"Hillary Rodham Clinton\" article. We'll use `action=query` and `prop=revisions` to get the list of changes to an article (see detailed documentation [here](https://www.mediawiki.org/wiki/API:Properties#revisions_.2F_rv)). There are many options to specify here. We pass several options to `rvprop` to get the revision ids, timestamp, user, user ID, revision comment, and the size of the article; \"max\" to `rvlimit` to get all the revisions; \"newer\" to `rvdir` so the revisions come back in chronological order (oldest to newest). There are many other options that can be specified such as `rvprop=content` to get the content of each revision or `rvstart` and `rvend` to get revisions within a specific timeframe, and `rvexcludeuser` to omit changes from bots for example."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"revisions_query_hrc = {'action': 'query',\n",
" 'redirects': 'True',\n",
" 'prop': 'revisions',\n",
" 'titles': \"Hillary Rodham Clinton\",\n",
" 'rvprop': 'ids|user|timestamp|userid|comment|size',\n",
" 'rvlimit': '500',\n",
" 'rvdir': 'newer'}\n",
"\n",
"revisions_data_hrc = wikipedia_query(revisions_query_hrc)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 135
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There's a lot of data in there and you can already expect that we'll need to do some data processing and cleaning to get it into a more usable form. \n",
"\n",
"* As before, the query returns the list of revisions buried deep within a dictionary so we extract that out and, like we did with the user information in the very first section, we pass convert this list of revisions to a \"pandas\" `DataFrame` object that we'll call `hrc_rv_df`. \n",
"* The `timestamp` column inside of this new DataFrame are still strings rather than meaningful dates that we can sort on, so we need to convert them using the `to_datetime` function and passing a [`strftime`](http://strftime.org/) formatting magic so that we know which string sequences correspond to meaningful years, months, days, hours, minutes, and seconds values. \n",
"* The `anon` column has a strange mixture of NaN and empty strings corresponding to whether the revision was made by a registered account or now. The `replace` method swaps the NaNs out with `False` and the strings with `True` booleans to make this more interpretable. \n",
"* We sort the DataFrame on these newly-meaningful `timestamp` values, reset the index (row numbers) so they correspond to the revision count, and label this index as \"revision\".\n",
"* Finally, we save the data to disk as a CSV file named `hrc_revisions.csv` making sure that we encode non-ASCII characters in \"utf8\". You'll want to make a habit out of doing this."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Extract and convert to DataFrame\n",
"hrc_rv_df = pd.DataFrame(revisions_data_hrc['pages']['5043192']['revisions']) \n",
"\n",
"# Make it clear what's being edited\n",
"hrc_rv_df['page'] = [u'Hillary Rodham Clinton']*len(hrc_rv_df)\n",
"\n",
"# Clean up timestamps\n",
"hrc_rv_df['timestamp'] = pd.to_datetime(hrc_rv_df['timestamp'],format=\"%Y-%m-%dT%H:%M:%SZ\",unit='s')\n",
"\n",
"# Clean up anon column\n",
"hrc_rv_df = hrc_rv_df.replace({'anon':{np.nan:False,u'':True}})\n",
"\n",
"# Sort the data on timestamp and reset the index\n",
"hrc_rv_df = hrc_rv_df.sort('timestamp').reset_index(drop=True)\n",
"hrc_rv_df.index.name = 'revision'\n",
"hrc_rv_df = hrc_rv_df.reset_index()\n",
"\n",
"# Set the index to a MultiIndex\n",
"hrc_rv_df.set_index(['page','revision'],inplace=True)\n",
"\n",
"# Save the data to disk\n",
"hrc_rv_df.to_csv('hrc_revisions.csv',encoding='utf8')\n",
"\n",
"# Show the first 5 rows\n",
"hrc_rv_df.head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" anon | \n",
" comment | \n",
" parentid | \n",
" revid | \n",
" size | \n",
" timestamp | \n",
" user | \n",
" userid | \n",
"
\n",
" \n",
" page | \n",
" revision | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Hillary Rodham Clinton | \n",
" 0 | \n",
" False | \n",
" * | \n",
" 0 | \n",
" 256189 | \n",
" 380 | \n",
" 2001-08-01 20:21:17 | \n",
" Koyaanis Qatsi | \n",
" 90 | \n",
"
\n",
" \n",
" 1 | \n",
" True | \n",
" *added a bit on Hillary Clinton | \n",
" 256189 | \n",
" 256190 | \n",
" 697 | \n",
" 2001-12-07 01:58:07 | \n",
" 152.163.197.xxx | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" False | \n",
" Took out the slander | \n",
" 256190 | \n",
" 256191 | \n",
" 663 | \n",
" 2001-12-07 02:14:20 | \n",
" Paul Drye | \n",
" 6 | \n",
"
\n",
" \n",
" 3 | \n",
" True | \n",
" Automated conversion | \n",
" 256191 | \n",
" 72270 | \n",
" 877 | \n",
" 2002-02-25 15:51:15 | \n",
" Conversion script | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" True | \n",
" * | \n",
" 72270 | \n",
" 72271 | \n",
" 920 | \n",
" 2002-05-18 16:37:57 | \n",
" 210.49.193.178 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 271,
"text": [
" anon comment \\\n",
"page revision \n",
"Hillary Rodham Clinton 0 False * \n",
" 1 True *added a bit on Hillary Clinton \n",
" 2 False Took out the slander \n",
" 3 True Automated conversion \n",
" 4 True * \n",
"\n",
" parentid revid size timestamp \\\n",
"page revision \n",
"Hillary Rodham Clinton 0 0 256189 380 2001-08-01 20:21:17 \n",
" 1 256189 256190 697 2001-12-07 01:58:07 \n",
" 2 256190 256191 663 2001-12-07 02:14:20 \n",
" 3 256191 72270 877 2002-02-25 15:51:15 \n",
" 4 72270 72271 920 2002-05-18 16:37:57 \n",
"\n",
" user userid \n",
"page revision \n",
"Hillary Rodham Clinton 0 Koyaanis Qatsi 90 \n",
" 1 152.163.197.xxx 0 \n",
" 2 Paul Drye 6 \n",
" 3 Conversion script 0 \n",
" 4 210.49.193.178 0 "
]
}
],
"prompt_number": 271
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"User activity"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We might be interested in looking at the most active editors over the history of the article. We can perform a `groupby` operation that effectively creates a mini-DataFrame for each user's revisions. We use the `aggregate` function to collection information (`len` gets us the number of revisions they made) across all these mini-DataFrames and returns a `Series` object with the username and the number of their revisions. Sorting these revisions is descending order and then look at the top-5 revisions, which exhibits variation over nearly two orders of magnitude."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_rv_gb_user = hrc_rv_df.groupby('user')\n",
"hrc_user_revisions = hrc_rv_gb_user['revid'].aggregate(len).sort(ascending=False,inplace=False)\n",
"print \"There are {0} unique users who have made a contribution to the article.\".format(len(hrc_user_revisions))\n",
"hrc_user_revisions.head(10)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 3567 unique users who have made a contribution to the article.\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 272,
"text": [
"user\n",
"Wasted Time R 2189\n",
"LukeTH 656\n",
"Tvoz 296\n",
"K157 137\n",
"Mark Miller 81\n",
"Anythingyouwant 78\n",
"StuffOfInterest 74\n",
"Ohnoitsjamie 56\n",
"Gamaliel 52\n",
"Kelw 48\n",
"Name: revid, dtype: int64"
]
}
],
"prompt_number": 272
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Given the wide variation among the number of contributions from users, we can create a kind of \"histogram\" that plots how many users made how many revisions. Because there is so much variation in the data, we use logged axes. In the upper left, there are several thousand editors who made only a single contribution. In the lower right, are the single editors listed above who made several hundred revisions to this article."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"revisions_counter = Counter(hrc_user_revisions.values)\n",
"plt.scatter(revisions_counter.keys(),revisions_counter.values(),s=50)\n",
"plt.ylabel('Number of users',fontsize=15)\n",
"plt.xlabel('Number of revisions',fontsize=15)\n",
"plt.yscale('log')\n",
"plt.xscale('log')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nkdj+PzIP0aGLDgu4AAAAAElFTkSuQmCC\n",
"text": [
""
]
}
],
"prompt_number": 273
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll add some information to the DataFrame about the cumulative number of unique users who've ever edited the article. This should give us a sense of how the size of the collaboration changed over time. Starting with empty lists for `unique_users` that we will add the names of users to as they make their first edit and `unique_count` that counts the number of unique users at each point in time. We add the `unique_count` list to the DataFrame under the `unique_users` column."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def count_unique_users(user_series):\n",
" unique_users = []\n",
" unique_count = []\n",
" for user in user_series.values:\n",
" if user not in unique_users:\n",
" unique_users.append(user)\n",
" unique_count.append(len(unique_users))\n",
" else:\n",
" unique_count.append(unique_count[-1])\n",
" return unique_count\n",
" \n",
"hrc_rv_df['unique_users'] = count_unique_users(hrc_rv_df['user'])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 307
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can look at changes to the contribution patterns on the article over time. First we need to do some data processing to convert the timestamps into generic dates. Then we group the activity by date together and use aggregate to create a new DataFrame called `activity_by_day` that contains the number of unique users and number of revisions made on each day. Finally, plot the distribution of this activity over time. \n",
"\n",
"Looking at the blue line for the number of unique users, we see the collaboration is initially small through 2004, but then between 2005 and 2008 undergoes rapid growth from a few hundred editors to over 3,000 editors. After 2008 however, the number of new news grows much more slowly and constantly. This is somewhat surprising as this timeframe includes a number of historic events like Hillary's campaign for president in 2008 as well as her tenure as Secretary of State.\n",
"\n",
"Looking at the green line for the number of revisions made per day, there is a lot of variation in daily editing activity, but much of it seems to again occur between 2005 and 2009, and slows down substantially thereafter. Peaks might correspond to major news events (like nominations) or to edit wars (editors fighting over content)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_rv_df['date'] = hrc_rv_df['timestamp'].apply(lambda x:x.date())\n",
"activity_by_day = hrc_rv_df.groupby('date').aggregate({'unique_users':max,'revid':len})\n",
"ax = activity_by_day.plot(lw=1,secondary_y=['revid'])\n",
"ax.set_xlabel('Time',fontsize=15)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 275,
"text": [
""
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
""
]
}
],
"prompt_number": 275
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Changes in article size"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also look at the distribution in changes to the article's size. In other words, how much content (in bytes) was introduced or removed from the article by an editor's changes? We see there is a very wide (axes are still on log scales) and mostly symmetrical distribution in additions and removals of content. In other words, the most frequent changes are extremely minor (-1 to 1 bytes) and the biggest changes (dozens of kilobytes) are very rare --- and likely the result of vandalism and reversion of vandalism. Nevertheless it's the case that this Wikipedia article's history is as much about the *removal* of content as it is about the *addition* of content."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_rv_df['diff'] = hrc_rv_df['size'].diff()\n",
"diff_counter = Counter(hrc_rv_df['diff'].values)\n",
"plt.scatter(diff_counter.keys(),diff_counter.values(),s=50,alpha=.1)\n",
"plt.xlabel('Difference (bytes)',fontsize=15)\n",
"plt.ylabel('Number of revisions',fontsize=15)\n",
"plt.yscale('log')\n",
"plt.xscale('symlog')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nAElFTkSuQmCC\n",
"text": [
""
]
}
],
"prompt_number": 276
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Re-compute the `activity_by_day` DataFrame to include the `diff` variable computed above using the `np.median` method to get the median change in the article on a given day. Substantively, this means that we can track how much content was added or removed on each day. This is noisy, so we can smooth using `rolling_mean` and specifying a 60-day window. There's a general tendency for the articl to grow on any given day, but there are a few time periods when the article shrinks drastically, likely reflecting sections of an article being [split out](https://en.wikipedia.org/wiki/Wikipedia:Splitting) into sub-articles."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"activity_by_day = hrc_rv_df.groupby('date').aggregate({'unique_users':max,\n",
" 'revid':len,\n",
" 'diff':np.median})\n",
"\n",
"# Compute a 60-day rolling average to remove spikiness, plot\n",
"pd.rolling_mean(activity_by_day['diff'],60).plot()\n",
"plt.yscale('symlog')\n",
"plt.xlabel('Time',fontsize=15)\n",
"plt.ylabel('Difference (bytes)',fontsize=15)\n",
"plt.axhline(0,lw=2,c='k')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 277,
"text": [
""
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
""
]
}
],
"prompt_number": 277
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Distribution of edit latencies"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also explore how long an edit persists on the article before another edit is subsequently made. The average edit only persists for ~34,500 seconds (~9.5 hours) but the median edit only persists for 881 seconds (~15 minutes)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# The diff returns timedeltas, but dividing by a 1-second timedelta returns a float\n",
"# Round these numbers off to smooth out the distribution and add 1 second to everything to make the plot behave\n",
"hrc_rv_df['latency'] = [round(i/np.timedelta64(1,'s'),-1) + 1 for i in hrc_rv_df['timestamp'].diff().values]\n",
"diff_counter = Counter(hrc_rv_df['latency'].values)\n",
"plt.scatter(diff_counter.keys(),diff_counter.values(),s=50,alpha=.1)\n",
"plt.xlabel('Latency time (seconds)',fontsize=15)\n",
"plt.ylabel('Number of changes',fontsize=15)\n",
"plt.yscale('log')\n",
"plt.xscale('log')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
""
]
}
],
"prompt_number": 278
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_rv_df['latency'].describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 279,
"text": [
"count 12045.000000\n",
"mean 34469.446658\n",
"std 216675.835396\n",
"min 1.000000\n",
"25% 141.000000\n",
"50% 881.000000\n",
"75% 13591.000000\n",
"max 10993011.000000\n",
"dtype: float64"
]
}
],
"prompt_number": 279
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we did above, we can recompute `activity_by_day` to include daily median changes in the latency between edits. There is substantial variation in how long edits persist. Again, the pre-2006 era is marked by content that goes days or weeks without changes, but between 2006 and 2009 the time between edits becomes much shorter, presumably corresponding with the attention around her presidential campaign. After 2008, the time between changes increases again and stabilizes at its (smoothed) current value of around 2 days between edits."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"activity_by_day = hrc_rv_df.groupby('date').aggregate({'unique_users':max,\n",
" 'revid':len,\n",
" 'diff':np.median,\n",
" 'latency':np.median})\n",
"\n",
"# Compute a 60-day rolling average to remove spikiness, plot\n",
"pd.rolling_mean(activity_by_day['latency'],60).plot()\n",
"plt.yscale('symlog')\n",
"plt.xlabel('Time',fontsize=15)\n",
"plt.ylabel('Latency time (seconds)',fontsize=15)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 280,
"text": [
""
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
""
]
}
],
"prompt_number": 280
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Co-authorship network"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We previously created a direct network of hyperlinks where the nodes were all articles and the edges indicated the direction of the link(s) between the central article and its neighbors. In this section, we're going to construct a different kind of network that contains a mixture of editors and articles and the edges indicate whether an editor contributed to an article. For simplicity's sake, we're going to start with the 1-step ego co-authorship network with the \"Hillary Rodham Clinton\" article and the set of editors who have ever made changes to it. Because there are two-types of nodes in this network (articles and editors) and editors can't edit editors and articles can't edit articles, we call this network a \"[bipartite network](https://en.wikipedia.org/wiki/Bipartite_graph)\" (also known as an \"affiliation\" or \"two-mode\" network).\n",
"\n",
"Even though bipartite networks are traditionally undirected, we're going to use a directed network because `NetworkX` does some wacky things when using an undirected network with bipartite properties. We're also going to make this a *weighted* network where the edges have values that correspond to the number of times an editor made a change to the article. This basically replicates the analysis we did above in \"User Activity\" but is an example of the information from the revision history that we might want to include in the network representation.\n",
"\n",
"We go over every user in the `user` column inside `hrc_rv_df` and first check whether or not a (`user`,\"Hillary Rodham Clinton\") edge exists. If one already exists, then we increment its `weight` attribute by 1. Otherwise if there is no such edge in the network, we add a (`user`,\"Hillary Rodham Clinton\") edge with a `weight` of 1. We can inspect five of the edges to make sure this worked."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hrc_bg = nx.DiGraph()\n",
"\n",
"for user in hrc_rv_df['user'].values:\n",
" if hrc_bg.has_edge(user,u'Hillary Rodham Clinton'):\n",
" hrc_bg[user][u'Hillary Rodham Clinton']['weight'] += 1\n",
" else:\n",
" hrc_bg.add_edge(user,u'Hillary Rodham Clinton',weight=1)\n",
"\n",
"print \"There are {0} nodes and {1} edges in the network.\".format(hrc_bg.number_of_nodes(),hrc_bg.number_of_edges())\n",
"\n",
"hrc_bg.edges(data=True)[:5]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 3568 nodes and 3567 edges in the network.\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 289,
"text": [
"[(u'Mansfieldkelly', u'Hillary Rodham Clinton', {'weight': 7}),\n",
" (u'12.173.64.204', u'Hillary Rodham Clinton', {'weight': 2}),\n",
" (u'Ottava Rima', u'Hillary Rodham Clinton', {'weight': 2}),\n",
" (u'JudithSouth', u'Hillary Rodham Clinton', {'weight': 1}),\n",
" (u'Haroldandkumar', u'Hillary Rodham Clinton', {'weight': 2})]"
]
}
],
"prompt_number": 289
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Co-authorship network of the hyperlink neighborhood"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Based on everything we did in the previous analysis to query the revisions, reshape and clean up the data, and extract new features for analysis, we are now going to write a big function that does all of this automatically. The function `get_revision_df` will accept an article name, perform the query, and proceed to do many of the steps outlined above, and returns a cleaned DataFrame at the end."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def get_revision_df(article):\n",
" revisions_query = {'action': 'query',\n",
" 'redirects': 'True',\n",
" 'prop': 'revisions',\n",
" 'titles': article,\n",
" 'rvprop': 'ids|user|timestamp|user|userid|comment|size',\n",
" 'rvlimit': '500',\n",
" 'rvdir': 'newer'}\n",
"\n",
" revisions_data = wikipedia_query(revisions_query)\n",
" page_id = revisions_data['pages'].keys()[0]\n",
"\n",
" # Extract and convert to DataFrame. Try/except for links to pages that don't exist\n",
" try:\n",
" df = pd.DataFrame(revisions_data['pages'][page_id]['revisions'])\n",
" except KeyError:\n",
" print u\"{0} doesn't exist!\".format(article)\n",
" pass\n",
"\n",
" # Make it clear what's being edited\n",
" df['page'] = [article]*len(df)\n",
"\n",
" # Clean up timestamps\n",
" df['timestamp'] = pd.to_datetime(df['timestamp'],format=\"%Y-%m-%dT%H:%M:%SZ\",unit='s')\n",
"\n",
" # Clean up anon column. If/else for articles that have all non-anon editors\n",
" if 'anon' in df.columns:\n",
" df = df.replace({'anon':{np.nan:False,u'':True}})\n",
" else:\n",
" df['anon'] = [False] * len(df)\n",
"\n",
" # Sort the data on timestamp and reset the index\n",
" df = df.sort('timestamp').reset_index(drop=True)\n",
" df.index.name = 'revision'\n",
" df = df.reset_index()\n",
"\n",
" # Set the index to a MultiIndex\n",
" df.set_index(['page','revision'],inplace=True)\n",
" \n",
" # Compute additional features\n",
" df['date'] = df['timestamp'].apply(lambda x:x.date())\n",
" df['diff'] = df['size'].diff()\n",
" df['unique_users'] = count_unique_users(df['user'])\n",
" df['latency'] = [round(i/np.timedelta64(1,'s'),-1) + 1 for i in df['timestamp'].diff().values]\n",
" \n",
" # Don't return random other columns\n",
" df = df[[u'anon',u'comment',u'parentid',\n",
" u'revid',u'size',u'timestamp',\n",
" u'user',u'userid',u'unique_users',\n",
" u'date', u'diff', u'latency']]\n",
" \n",
" return df"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 39
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Try this out on \"Bill Clinton\"."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"bc_rv_df = get_revision_df(\"Bill Clinton\")\n",
"bc_rv_df.head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Server lag, sleeping for 6 seconds\n"
]
},
{
"ename": "NameError",
"evalue": "global name 'count_unique_users' is not defined",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mbc_rv_df\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_revision_df\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Bill Clinton\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mbc_rv_df\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m\u001b[0m in \u001b[0;36mget_revision_df\u001b[0;34m(article)\u001b[0m\n\u001b[1;32m 41\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'date'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timestamp'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'diff'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'size'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiff\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 43\u001b[0;31m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'unique_users'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcount_unique_users\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'user'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 44\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'latency'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mround\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimedelta64\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m's'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timestamp'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiff\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: global name 'count_unique_users' is not defined"
]
}
],
"prompt_number": 79
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We've created a DataFrame for both Hillary's revision history (`hrc_rv_df`) as well as Bill's revision history (`bc_df`). We can now combine both of these together (cross your fingers!!!) using the `concat` method. We can check to make sure that they both made it into the dataframe by checking the first level of the `index` and we see they're both there. We also save all the data we've scraped and cleaned to disk --- the resulting file takes up just under 5 MB."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"clinton_df = pd.concat([bc_rv_df,hrc_rv_df])\n",
"\n",
"print clinton_df.index.levels[0]\n",
"print \"There are a total of {0} revisions across both the Hillary and Bill Clinton articles.\".format(len(clinton_df))\n",
"\n",
"clinton_df.to_csv('clinton_revisions.csv',encoding='utf8')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Index([u'Bill Clinton', u'Hillary Rodham Clinton'], dtype='object')\n",
"There are a total of 26952 revisions across both the Hillary and Bill Clinton articles.\n"
]
}
],
"prompt_number": 321
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Clinton co-authorship network"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We are going to use these data to create a coauthorship network of all the editors who contributed to both these articles. If we've already crawled this data, we can just load it from disk, specifying options to make sure we have the right encoding, the columns are properly indexed, and the dates are parsed."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"clinton_df = pd.read_csv('clinton_revisions.csv',\n",
" encoding='utf8',\n",
" index_col=['page','revision'],\n",
" parse_dates=['timestamp','date'])\n",
"clinton_df.head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" anon | \n",
" comment | \n",
" parentid | \n",
" revid | \n",
" size | \n",
" timestamp | \n",
" user | \n",
" userid | \n",
" unique_users | \n",
" date | \n",
" diff | \n",
" latency | \n",
"
\n",
" \n",
" page | \n",
" revision | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Bill Clinton | \n",
" 0 | \n",
" True | \n",
" builing -> building* | \n",
" 330742655 | \n",
" 331410539 | \n",
" 6851 | \n",
" 2001-10-26 16:25:00 | \n",
" 212.188.19.xxx | \n",
" 0 | \n",
" 1 | \n",
" 2001-10-26 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 1 | \n",
" True | \n",
" * | \n",
" 331410539 | \n",
" 238014 | \n",
" 7006 | \n",
" 2001-11-17 22:51:50 | \n",
" Wmorrow | \n",
" 0 | \n",
" 2 | \n",
" 2001-11-17 | \n",
" 155 | \n",
" 1924011 | \n",
"
\n",
" \n",
" 2 | \n",
" True | \n",
" * | \n",
" 238014 | \n",
" 238015 | \n",
" 7046 | \n",
" 2001-12-08 22:14:42 | \n",
" 208.144.114.xxx | \n",
" 0 | \n",
" 3 | \n",
" 2001-12-08 | \n",
" 40 | \n",
" 1812171 | \n",
"
\n",
" \n",
" 3 | \n",
" True | \n",
" brady bill, partial birth abortion veto, DOMA ... | \n",
" 238015 | \n",
" 238016 | \n",
" 7317 | \n",
" 2001-12-09 03:01:09 | \n",
" Alan_D | \n",
" 0 | \n",
" 4 | \n",
" 2001-12-09 | \n",
" 271 | \n",
" 17191 | \n",
"
\n",
" \n",
" 4 | \n",
" True | \n",
" DADT was implemented in 1993 | \n",
" 238016 | \n",
" 238017 | \n",
" 7323 | \n",
" 2001-12-09 08:15:36 | \n",
" Dmerrill | \n",
" 0 | \n",
" 5 | \n",
" 2001-12-09 | \n",
" 6 | \n",
" 18871 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 41,
"text": [
" anon \\\n",
"page revision \n",
"Bill Clinton 0 True \n",
" 1 True \n",
" 2 True \n",
" 3 True \n",
" 4 True \n",
"\n",
" comment \\\n",
"page revision \n",
"Bill Clinton 0 builing -> building* \n",
" 1 * \n",
" 2 * \n",
" 3 brady bill, partial birth abortion veto, DOMA ... \n",
" 4 DADT was implemented in 1993 \n",
"\n",
" parentid revid size timestamp \\\n",
"page revision \n",
"Bill Clinton 0 330742655 331410539 6851 2001-10-26 16:25:00 \n",
" 1 331410539 238014 7006 2001-11-17 22:51:50 \n",
" 2 238014 238015 7046 2001-12-08 22:14:42 \n",
" 3 238015 238016 7317 2001-12-09 03:01:09 \n",
" 4 238016 238017 7323 2001-12-09 08:15:36 \n",
"\n",
" user userid unique_users date diff \\\n",
"page revision \n",
"Bill Clinton 0 212.188.19.xxx 0 1 2001-10-26 NaN \n",
" 1 Wmorrow 0 2 2001-11-17 155 \n",
" 2 208.144.114.xxx 0 3 2001-12-08 40 \n",
" 3 Alan_D 0 4 2001-12-09 271 \n",
" 4 Dmerrill 0 5 2001-12-09 6 \n",
"\n",
" latency \n",
"page revision \n",
"Bill Clinton 0 NaN \n",
" 1 1924011 \n",
" 2 1812171 \n",
" 3 17191 \n",
" 4 18871 "
]
}
],
"prompt_number": 41
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We want to create an \"edgelist\" that contains all the (`editor`, `article`) pairs of who contributed to which articles. This could by done by looping over the list, but this is inefficient on larger datasets like the one we crawled. Instead, we'll use a `groupby` approach to not only count the number of times an editor contributed to an article (the `weight` we defined previous), but a whole host of other potentially interesting attributes.\n",
"\n",
"We use the `agg` method on the data that's been grouped by `page` and `user` to aggregate the information into nice summary statistics. We count the number of revisions using `len` and relabel this variable `weight`. For the `timestamp`, `diff`, `latency`, and `revision` variables, we compute new summary statistics for the minimum, median, and maximum values. This operation returns a new DataFrame, indexed by (`page`, `user`) with columns corresponding to labels like `weight`, `ts_min`, etc. Each row in this DataFrame will become attributes in the graph object we make below. This operation creates a weird multi-column, so we drop the redundant 0-level of the column to have a nice concise column.\n",
"\n",
"We're going to do something different to the `timestamp` data because these data are stored as `Timestamp` objects that don't always place nicely with other functions. Instead, we're going to convert these data to counts for the amount of time (in days) since January 16, 2001, the date that Wikipedia was founded. In effect, we're counting how \"old\" Wikipedia was when an action occurred and this `float` count will work better in subsequent steps."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"clinton_gb_edge = clinton_df.reset_index().groupby(['page','user'])\n",
"clinton_edgelist = clinton_gb_edge.agg({'revid':{'weight':len},\n",
" 'timestamp':{'ts_min':np.min,'ts_max':np.max},\n",
" 'diff':{'diff_min':np.min,'diff_median':np.median,'diff_max':np.max},\n",
" 'latency':{'latency_min':np.min,'latency_median':np.median,'latency_max':np.max},\n",
" 'revision':{'revision_min':np.min,'revision_max':np.max}\n",
" })\n",
"\n",
"# Drop the legacy/redundant column names\n",
"clinton_edgelist.columns = clinton_edgelist.columns.droplevel(0)\n",
"\n",
"# Convert the ts_min and ts_max to floats for the number of days since Wikipedia was founded\n",
"clinton_edgelist['ts_min'] = (clinton_edgelist['ts_min'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"clinton_edgelist['ts_max'] = (clinton_edgelist['ts_max'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"\n",
"clinton_edgelist.head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" ts_min | \n",
" ts_max | \n",
" revision_min | \n",
" revision_max | \n",
" weight | \n",
" latency_min | \n",
" latency_median | \n",
" latency_max | \n",
" diff_median | \n",
" diff_max | \n",
" diff_min | \n",
"
\n",
" \n",
" page | \n",
" user | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Bill Clinton | \n",
" 00666 | \n",
" 2083.873866 | \n",
" 2083.941644 | \n",
" 9970 | \n",
" 9972 | \n",
" 3 | \n",
" 1551 | \n",
" 3751 | \n",
" 4311 | \n",
" 0.0 | \n",
" 5072 | \n",
" -72 | \n",
"
\n",
" \n",
" 1.21 jigwatts | \n",
" 2336.214977 | \n",
" 2903.078646 | \n",
" 11337 | \n",
" 12762 | \n",
" 2 | \n",
" 211 | \n",
" 10951 | \n",
" 21691 | \n",
" 47380.0 | \n",
" 94780 | \n",
" -20 | \n",
"
\n",
" \n",
" 100110100 | \n",
" 2098.175683 | \n",
" 2098.207037 | \n",
" 10096 | \n",
" 10101 | \n",
" 6 | \n",
" 31 | \n",
" 656 | \n",
" 42181 | \n",
" -0.5 | \n",
" 23 | \n",
" -33 | \n",
"
\n",
" \n",
" 108.18.185.163 | \n",
" 3483.056007 | \n",
" 3483.056007 | \n",
" 13668 | \n",
" 13668 | \n",
" 1 | \n",
" 41581 | \n",
" 41581 | \n",
" 41581 | \n",
" 4.0 | \n",
" 4 | \n",
" 4 | \n",
"
\n",
" \n",
" 10shistory | \n",
" 1861.760359 | \n",
" 1864.803692 | \n",
" 5663 | \n",
" 5676 | \n",
" 2 | \n",
" 461 | \n",
" 29186 | \n",
" 57911 | \n",
" 56.0 | \n",
" 124 | \n",
" -12 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 43,
"text": [
" ts_min ts_max revision_min \\\n",
"page user \n",
"Bill Clinton 00666 2083.873866 2083.941644 9970 \n",
" 1.21 jigwatts 2336.214977 2903.078646 11337 \n",
" 100110100 2098.175683 2098.207037 10096 \n",
" 108.18.185.163 3483.056007 3483.056007 13668 \n",
" 10shistory 1861.760359 1864.803692 5663 \n",
"\n",
" revision_max weight latency_min \\\n",
"page user \n",
"Bill Clinton 00666 9972 3 1551 \n",
" 1.21 jigwatts 12762 2 211 \n",
" 100110100 10101 6 31 \n",
" 108.18.185.163 13668 1 41581 \n",
" 10shistory 5676 2 461 \n",
"\n",
" latency_median latency_max diff_median \\\n",
"page user \n",
"Bill Clinton 00666 3751 4311 0.0 \n",
" 1.21 jigwatts 10951 21691 47380.0 \n",
" 100110100 656 42181 -0.5 \n",
" 108.18.185.163 41581 41581 4.0 \n",
" 10shistory 29186 57911 56.0 \n",
"\n",
" diff_max diff_min \n",
"page user \n",
"Bill Clinton 00666 5072 -72 \n",
" 1.21 jigwatts 94780 -20 \n",
" 100110100 23 -33 \n",
" 108.18.185.163 4 4 \n",
" 10shistory 124 -12 "
]
}
],
"prompt_number": 43
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The nodes in this bipartite network also have attributes we can extract from the data. Remember, because this is a bipartite network, we'll need to generate attribute data for both the users and the pages. We can perform an analogous `groupby` operation as we used above, but simply group on either the `user` or the `page` values. After each of these `groupby` operations, we can perform similar `agg` operations to aggregate the data into summary statistics. In the case of the user, these summary statistics are across all articles in the data. Thus the `clinton_usernodelist` summarizes how many total edits a *user* made, their first and last observed edits, and the distribution of their `diff`, `latency`, and `revision` statistics. The `clinton_pagenodelist` summarizes how many total edits were made to the *page*, the date of the first and last edit, and so on."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Create the usernodelist by grouping on user and aggregating\n",
"clinton_gb_user = clinton_df.reset_index().groupby(['user'])\n",
"clinton_usernodelist = clinton_gb_user.agg({'revid':{'revisions':len},\n",
" 'timestamp':{'ts_min':np.min,'ts_max':np.max},\n",
" 'diff':{'diff_min':np.min,'diff_median':np.median,'diff_max':np.max},\n",
" 'latency':{'latency_min':np.min,'latency_median':np.median,'latency_max':np.max},\n",
" 'revision':{'revision_min':np.min,'revision_median':np.median,'revision_max':np.max}\n",
" })\n",
"\n",
"# Clean up the columns and convert the timestamps to counts\n",
"clinton_usernodelist.columns = clinton_usernodelist.columns.droplevel(0)\n",
"clinton_usernodelist['ts_min'] = (clinton_usernodelist['ts_min'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"clinton_usernodelist['ts_max'] = (clinton_usernodelist['ts_max'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"\n",
"\n",
"# Create the usernodelist by grouping on page and aggregating\n",
"clinton_gb_page = clinton_df.reset_index().groupby(['page'])\n",
"clinton_pagenodelist = clinton_gb_page.agg({'revid':{'revisions':len},\n",
" 'timestamp':{'ts_min':np.min,'ts_max':np.max},\n",
" 'diff':{'diff_min':np.min,'diff_median':np.median,'diff_max':np.max},\n",
" 'latency':{'latency_min':np.min,'latency_median':np.median,'latency_max':np.max},\n",
" 'revision':{'revision_min':np.min,'revision_median':np.median,'revision_max':np.max}\n",
" })\n",
"\n",
"# Clean up the columns and convert the timestamps to counts\n",
"clinton_pagenodelist.columns = clinton_pagenodelist.columns.droplevel(0)\n",
"clinton_pagenodelist['ts_min'] = (clinton_pagenodelist['ts_min'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"clinton_pagenodelist['ts_max'] = (clinton_pagenodelist['ts_max'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"\n",
"clinton_pagenodelist.head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" ts_min | \n",
" ts_max | \n",
" revision_min | \n",
" revision_max | \n",
" revision_median | \n",
" revisions | \n",
" latency_min | \n",
" latency_median | \n",
" latency_max | \n",
" diff_median | \n",
" diff_max | \n",
" diff_min | \n",
"
\n",
" \n",
" page | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Bill Clinton | \n",
" 283.684028 | \n",
" 5008.568900 | \n",
" 0 | \n",
" 14905 | \n",
" 7452.5 | \n",
" 14906 | \n",
" 1 | \n",
" 891 | \n",
" 6267951 | \n",
" 1 | \n",
" 417533 | \n",
" -417533 | \n",
"
\n",
" \n",
" Hillary Rodham Clinton | \n",
" 197.848113 | \n",
" 5003.015405 | \n",
" 0 | \n",
" 12045 | \n",
" 6022.5 | \n",
" 12046 | \n",
" 1 | \n",
" 881 | \n",
" 10993011 | \n",
" 3 | \n",
" 1878770 | \n",
" -1878770 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 44,
"text": [
" ts_min ts_max revision_min revision_max \\\n",
"page \n",
"Bill Clinton 283.684028 5008.568900 0 14905 \n",
"Hillary Rodham Clinton 197.848113 5003.015405 0 12045 \n",
"\n",
" revision_median revisions latency_min \\\n",
"page \n",
"Bill Clinton 7452.5 14906 1 \n",
"Hillary Rodham Clinton 6022.5 12046 1 \n",
"\n",
" latency_median latency_max diff_median diff_max \\\n",
"page \n",
"Bill Clinton 891 6267951 1 417533 \n",
"Hillary Rodham Clinton 881 10993011 3 1878770 \n",
"\n",
" diff_min \n",
"page \n",
"Bill Clinton -417533 \n",
"Hillary Rodham Clinton -1878770 "
]
}
],
"prompt_number": 44
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we've created all this rich contextual data about edges, pages, and editors, we can load it all into a `NetworkX` `DiGraph` object called `clinton_g`. We start by looping over the index in the `clinton_edgelist` dataframe that corresponds to the edges in the network, convert the edge attributes to a dictionary for `NetworkX` to better digest, and then add this edge and all its data to the `clinton_g` graph object. This creates placeholder nodes, but we want to add the rich node data we created above as well. We can loop over the `clinton_usernodelist`, convert the node attributes to a dictionary, and then overwrite the placeholder nodes by adding the data-rich user nodes to the `clinton_g` graph object. We do the same for the `clinton_pagenodelist`, then check the number of nodes and edges in the network, and finally print out a few examples of the data-rich nodes and edges."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"clinton_g = nx.DiGraph()\n",
"# Add the edges and edge attributes\n",
"for (article,editor) in iter(clinton_edgelist.index.values):\n",
" edge_attributes = dict(clinton_edgelist.ix[(article,editor)])\n",
" clinton_g.add_edge(editor,article,edge_attributes)\n",
"\n",
"# Add the user nodes and attributes\n",
"for node in iter(clinton_usernodelist.index):\n",
" node_attributes = dict(clinton_usernodelist.ix[node])\n",
" clinton_g.add_node(node,node_attributes)\n",
"\n",
"# Add the page nodes and attributes\n",
"for node in iter(clinton_pagenodelist.index):\n",
" node_attributes = dict(clinton_pagenodelist.ix[node])\n",
" clinton_g.add_node(node,node_attributes)\n",
" \n",
"print \"There are {0} nodes and {1} edges in the network.\".format(clinton_g.number_of_nodes(),clinton_g.number_of_edges())\n",
"\n",
"clinton_g.edges(data=True)[:3]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 8539 nodes and 9270 edges in the network.\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 45,
"text": [
"[(u'Mansfieldkelly',\n",
" u'Hillary Rodham Clinton',\n",
" {'diff_max': 9285.0,\n",
" 'diff_median': 218.0,\n",
" 'diff_min': 29.0,\n",
" 'latency_max': 106201.0,\n",
" 'latency_median': 121.0,\n",
" 'latency_min': 21.0,\n",
" 'revision_max': 6392.0,\n",
" 'revision_min': 6381.0,\n",
" 'ts_max': 2307.2359837962963,\n",
" 'ts_min': 2307.2230671296297,\n",
" 'weight': 7.0}),\n",
" (u'JJGlendenning',\n",
" u'Bill Clinton',\n",
" {'diff_max': 199.0,\n",
" 'diff_median': 3.0,\n",
" 'diff_min': 0.0,\n",
" 'latency_max': 74931.0,\n",
" 'latency_median': 641.0,\n",
" 'latency_min': 371.0,\n",
" 'revision_max': 3008.0,\n",
" 'revision_min': 2989.0,\n",
" 'ts_max': 1706.7711458333333,\n",
" 'ts_min': 1705.1043865740742,\n",
" 'weight': 3.0}),\n",
" (u'24.254.92.184',\n",
" u'Bill Clinton',\n",
" {'diff_max': -57410.0,\n",
" 'diff_median': -57410.0,\n",
" 'diff_min': -57410.0,\n",
" 'latency_max': 49391.0,\n",
" 'latency_median': 49391.0,\n",
" 'latency_min': 49391.0,\n",
" 'revision_max': 1879.0,\n",
" 'revision_min': 1879.0,\n",
" 'ts_max': 1566.8687615740741,\n",
" 'ts_min': 1566.8687615740741,\n",
" 'weight': 1.0})]"
]
}
],
"prompt_number": 45
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Scrape revisions for all the articles in the hyperlink network"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now it's time to do a really audacious data scrape. We're going to get the revision histories for all 2,646 articles linked to and from Hillary's article. The data will be stored in the `dataframe_dict` dictionary that will be keyed by article title and the values will be the dataframes themselves. We'll use a `for` loop to go over every article in the `all_links` and call the `get_revision_df` function we defined and tested above to get the cleaned revision DataFrame and store it in the `dataframe_dict` object. Because this scrape may take a while, we're going to put in some exception handling (try, except) so that if an error occurs, we don't lose all our progress. When an exception occurs, we'll add the article name to the `errors` list so we can go back and check what happened.\n",
"\n",
"We'll concatenate all these DataFrames together into a gigantic DataFrame containing all the data we've scraped and then save it. This is a 485 MB file!\n",
"\n",
"***This will take a long time and a lot of memory!!!*** To prevent you from accidentally executing this, the block below is in a \"raw\" format that you'll need to convert to \"Code\" from the dropdown above."
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"# List of DataFrames\n",
"dataframe_dict = {u'Bill Clinton': bc_rv_df,\n",
" u'Hillary Rodham Clinton': hrc_rv_df}\n",
"\n",
"# Set operations\n",
"all_links = list(set(hrc_alllink_outlist) | set(hrc_alllink_inlist))\n",
"\n",
"# Start the scrape\n",
"errors = list()\n",
"for article in all_links:\n",
" try:\n",
" df = get_revision_df(article)\n",
" dataframe_dict[article] = df\n",
" except:\n",
" errors.append(article)\n",
" pass\n",
"\n",
"gigantic_df = pd.concat(dataframe_dict.values())\n",
"gigantic_df.to_csv('gigantic_df.csv',encoding='utf8')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And there are nearly 3 millions revisions in the dataset!"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"len(gigantic_df)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 338,
"text": [
"2889692"
]
}
],
"prompt_number": 338
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Make a coauthorship network"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The analysis can start again here by loading the CSV file rather than having to re-scrape the data from above. Loading the file to `gigantic_df`, there are a few rows that seem to be broken, so we'll use `drop` to remove them. We also use `to_datetime` to make sure the timestamp information is using the appropriate units."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"gigantic_df = pd.read_csv('gigantic_df.csv',\n",
" encoding='utf8',\n",
" index_col=['page','revision'],\n",
" parse_dates=['timestamp','date']\n",
" )\n",
"\n",
"gigantic_df = gigantic_df.drop((\"[[History of the United States]] at [[History of the United States#British colonization|British Colonization]]. ([[WP:TW|TW]])\",589285361))\n",
"gigantic_df = gigantic_df.drop((\"United States\",32868))\n",
"\n",
"gigantic_df['timestamp'] = pd.to_datetime(gigantic_df['timestamp'],unit='s')\n",
"gigantic_df['date'] = pd.to_datetime(gigantic_df['date'],unit='d')\n",
"\n",
"gigantic_df.head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/Users/brianckeegan/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py:1139: DtypeWarning: Columns (2,4,5) have mixed types. Specify dtype option on import or set low_memory=False.\n",
" data = self._reader.read(nrows)\n"
]
},
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" anon | \n",
" comment | \n",
" parentid | \n",
" revid | \n",
" size | \n",
" timestamp | \n",
" user | \n",
" userid | \n",
" unique_users | \n",
" date | \n",
" diff | \n",
" latency | \n",
"
\n",
" \n",
" page | \n",
" revision | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Yucaipa Companies | \n",
" 0 | \n",
" False | \n",
" create org-stub | \n",
" 0 | \n",
" 38555542 | \n",
" 799 | \n",
" 2006-02-07 02:16:04 | \n",
" Rj | \n",
" 43158 | \n",
" 1 | \n",
" 2006-02-07 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 1 | \n",
" False | \n",
" hq | \n",
" 38555542 | \n",
" 38557692 | \n",
" 878 | \n",
" 2006-02-07 02:32:44 | \n",
" Rj | \n",
" 43158 | \n",
" 1 | \n",
" 2006-02-07 | \n",
" 79 | \n",
" 1001 | \n",
"
\n",
" \n",
" 2 | \n",
" False | \n",
" [[GameSpy]] | \n",
" 38557692 | \n",
" 38565610 | \n",
" 920 | \n",
" 2006-02-07 03:42:00 | \n",
" Rj | \n",
" 43158 | \n",
" 1 | \n",
" 2006-02-07 | \n",
" 42 | \n",
" 4161 | \n",
"
\n",
" \n",
" 3 | \n",
" False | \n",
" Disambiguate [[Franchise]] to [[Franchising]] ... | \n",
" 38565610 | \n",
" 40811579 | \n",
" 932 | \n",
" 2006-02-23 04:12:35 | \n",
" Deville | \n",
" 364144 | \n",
" 2 | \n",
" 2006-02-23 | \n",
" 12 | \n",
" 1384241 | \n",
"
\n",
" \n",
" 4 | \n",
" True | \n",
" NaN | \n",
" 40811579 | \n",
" 49638872 | \n",
" 1025 | \n",
" 2006-04-22 19:51:18 | \n",
" 67.190.40.99 | \n",
" 0 | \n",
" 3 | \n",
" 2006-04-22 | \n",
" 93 | \n",
" 5067521 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 46,
"text": [
" anon \\\n",
"page revision \n",
"Yucaipa Companies 0 False \n",
" 1 False \n",
" 2 False \n",
" 3 False \n",
" 4 True \n",
"\n",
" comment \\\n",
"page revision \n",
"Yucaipa Companies 0 create org-stub \n",
" 1 hq \n",
" 2 [[GameSpy]] \n",
" 3 Disambiguate [[Franchise]] to [[Franchising]] ... \n",
" 4 NaN \n",
"\n",
" parentid revid size timestamp \\\n",
"page revision \n",
"Yucaipa Companies 0 0 38555542 799 2006-02-07 02:16:04 \n",
" 1 38555542 38557692 878 2006-02-07 02:32:44 \n",
" 2 38557692 38565610 920 2006-02-07 03:42:00 \n",
" 3 38565610 40811579 932 2006-02-23 04:12:35 \n",
" 4 40811579 49638872 1025 2006-04-22 19:51:18 \n",
"\n",
" user userid unique_users date \\\n",
"page revision \n",
"Yucaipa Companies 0 Rj 43158 1 2006-02-07 \n",
" 1 Rj 43158 1 2006-02-07 \n",
" 2 Rj 43158 1 2006-02-07 \n",
" 3 Deville 364144 2 2006-02-23 \n",
" 4 67.190.40.99 0 3 2006-04-22 \n",
"\n",
" diff latency \n",
"page revision \n",
"Yucaipa Companies 0 NaN NaN \n",
" 1 79 1001 \n",
" 2 42 4161 \n",
" 3 12 1384241 \n",
" 4 93 5067521 "
]
}
],
"prompt_number": 46
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now do all the `groupby` and `agg` operations to create the edgelists and nodelists we'll need to make a network as well as the data cleanup steps we did above."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"edge_agg_function = {'revid':{'weight':len},\n",
" 'timestamp':{'ts_min':np.min,'ts_max':np.max},\n",
" 'diff':{'diff_min':np.min,'diff_median':np.median,'diff_max':np.max},\n",
" 'latency':{'latency_min':np.min,'latency_median':np.median,'latency_max':np.max},\n",
" 'revision':{'revision_min':np.min,'revision_max':np.max}\n",
" }\n",
"\n",
"# Create the edgelist by grouping on both page and user \n",
"gigantic_gb_edge = gigantic_df.reset_index().groupby(['page','user'])\n",
"gigantic_edgelist = gigantic_gb_edge.agg(edge_agg_function)\n",
"\n",
"# Drop the legacy/redundant column names\n",
"gigantic_edgelist.columns = gigantic_edgelist.columns.droplevel(0)\n",
"\n",
"# Convert the ts_min and ts_max to floats for the number of days since Wikipedia was founded\n",
"gigantic_edgelist['ts_min'] = (gigantic_edgelist['ts_min'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"gigantic_edgelist['ts_max'] = (gigantic_edgelist['ts_max'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"\n",
"print \"There are {0} edges in the network.\".format(len(gigantic_edgelist))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 1198564 edges in the network.\n"
]
}
],
"prompt_number": 47
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"node_agg_function = {'revid':{'revisions':len},\n",
" 'timestamp':{'ts_min':np.min,'ts_max':np.max},\n",
" 'diff':{'diff_min':np.min,'diff_median':np.median,'diff_max':np.max},\n",
" 'latency':{'latency_min':np.min,'latency_median':np.median,'latency_max':np.max},\n",
" 'revision':{'revision_min':np.min,'revision_median':np.median,'revision_max':np.max}\n",
" }\n",
"\n",
"# Create the usernodelist by grouping on user and aggregating\n",
"gigantic_gb_user = gigantic_df.reset_index().groupby(['user'])\n",
"gigantic_usernodelist = gigantic_gb_user.agg(node_agg_function)\n",
"\n",
"# Clean up the columns and convert the timestamps to counts\n",
"gigantic_usernodelist.columns = gigantic_usernodelist.columns.droplevel(0)\n",
"gigantic_usernodelist['ts_min'] = (gigantic_usernodelist['ts_min'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"gigantic_usernodelist['ts_max'] = (gigantic_usernodelist['ts_max'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"\n",
"print \"There are {0} editor nodes in the network.\".format(len(gigantic_usernodelist))\n",
"\n",
"gigantic_usernodelist.head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 609386 editor nodes in the network.\n"
]
},
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" ts_min | \n",
" ts_max | \n",
" revision_min | \n",
" revision_max | \n",
" revision_median | \n",
" revisions | \n",
" latency_min | \n",
" latency_median | \n",
" latency_max | \n",
" diff_median | \n",
" diff_max | \n",
" diff_min | \n",
"
\n",
" \n",
" user | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" !!2011WorldProtests!! | \n",
" 3667.980139 | \n",
" 3671.951539 | \n",
" 473 | \n",
" 4059 | \n",
" 3106.0 | \n",
" 33 | \n",
" 31 | \n",
" 111 | \n",
" 5031 | \n",
" 57.0 | \n",
" 324 | \n",
" -22 | \n",
"
\n",
" \n",
" !!2011WorldProtests!!Appletart!! | \n",
" 3667.906146 | \n",
" 3667.917222 | \n",
" 2459 | \n",
" 2466 | \n",
" 2462.5 | \n",
" 2 | \n",
" 151 | \n",
" 301 | \n",
" 451 | \n",
" 13.5 | \n",
" 27 | \n",
" 0 | \n",
"
\n",
" \n",
" !\"\u00a3$ | \n",
" 2103.991366 | \n",
" 2103.991366 | \n",
" 664 | \n",
" 664 | \n",
" 664.0 | \n",
" 1 | \n",
" 94341 | \n",
" 94341 | \n",
" 94341 | \n",
" 113.0 | \n",
" 113 | \n",
" 113 | \n",
"
\n",
" \n",
" !1029qpwoalskzmxn | \n",
" 3032.998449 | \n",
" 3032.998449 | \n",
" 17228 | \n",
" 17228 | \n",
" 17228.0 | \n",
" 1 | \n",
" 15381 | \n",
" 15381 | \n",
" 15381 | \n",
" 185.0 | \n",
" 185 | \n",
" 185 | \n",
"
\n",
" \n",
" !ComputerAlert! | \n",
" 3328.060347 | \n",
" 3328.060347 | \n",
" 1266 | \n",
" 1266 | \n",
" 1266.0 | \n",
" 1 | \n",
" 426451 | \n",
" 426451 | \n",
" 426451 | \n",
" 21.0 | \n",
" 21 | \n",
" 21 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 48,
"text": [
" ts_min ts_max revision_min \\\n",
"user \n",
"!!2011WorldProtests!! 3667.980139 3671.951539 473 \n",
"!!2011WorldProtests!!Appletart!! 3667.906146 3667.917222 2459 \n",
"!\"\u00a3$ 2103.991366 2103.991366 664 \n",
"!1029qpwoalskzmxn 3032.998449 3032.998449 17228 \n",
"!ComputerAlert! 3328.060347 3328.060347 1266 \n",
"\n",
" revision_max revision_median revisions \\\n",
"user \n",
"!!2011WorldProtests!! 4059 3106.0 33 \n",
"!!2011WorldProtests!!Appletart!! 2466 2462.5 2 \n",
"!\"\u00a3$ 664 664.0 1 \n",
"!1029qpwoalskzmxn 17228 17228.0 1 \n",
"!ComputerAlert! 1266 1266.0 1 \n",
"\n",
" latency_min latency_median latency_max \\\n",
"user \n",
"!!2011WorldProtests!! 31 111 5031 \n",
"!!2011WorldProtests!!Appletart!! 151 301 451 \n",
"!\"\u00a3$ 94341 94341 94341 \n",
"!1029qpwoalskzmxn 15381 15381 15381 \n",
"!ComputerAlert! 426451 426451 426451 \n",
"\n",
" diff_median diff_max diff_min \n",
"user \n",
"!!2011WorldProtests!! 57.0 324 -22 \n",
"!!2011WorldProtests!!Appletart!! 13.5 27 0 \n",
"!\"\u00a3$ 113.0 113 113 \n",
"!1029qpwoalskzmxn 185.0 185 185 \n",
"!ComputerAlert! 21.0 21 21 "
]
}
],
"prompt_number": 48
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Create the usernodelist by grouping on page and aggregating\n",
"gigantic_gb_page = gigantic_df.reset_index().groupby(['page'])\n",
"gigantic_pagenodelist = gigantic_gb_page.agg(node_agg_function)\n",
"\n",
"# Clean up the columns and convert the timestamps to counts\n",
"gigantic_pagenodelist.columns = gigantic_pagenodelist.columns.droplevel(0)\n",
"gigantic_pagenodelist['ts_min'] = (gigantic_pagenodelist['ts_min'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"gigantic_pagenodelist['ts_max'] = (gigantic_pagenodelist['ts_max'] - pd.Timestamp('2001-1-16'))/np.timedelta64(1,'D')\n",
"\n",
"print \"There are {0} page nodes in the network.\".format(len(gigantic_pagenodelist))\n",
"\n",
"gigantic_pagenodelist.head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 2644 page nodes in the network.\n"
]
},
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" ts_min | \n",
" ts_max | \n",
" revision_min | \n",
" revision_max | \n",
" revision_median | \n",
" revisions | \n",
" latency_min | \n",
" latency_median | \n",
" latency_max | \n",
" diff_median | \n",
" diff_max | \n",
" diff_min | \n",
"
\n",
" \n",
" page | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 10 Janpath | \n",
" 1952.730394 | \n",
" 4918.583762 | \n",
" 0 | \n",
" 86 | \n",
" 43.0 | \n",
" 87 | \n",
" 21 | \n",
" 142856 | \n",
" 34497461 | \n",
" 13.5 | \n",
" 568 | \n",
" -548 | \n",
"
\n",
" \n",
" 107th United States Congress | \n",
" 1068.466620 | \n",
" 4866.595417 | \n",
" 0 | \n",
" 497 | \n",
" 248.5 | \n",
" 498 | \n",
" 11 | \n",
" 40651 | \n",
" 11445051 | \n",
" 9.0 | \n",
" 95328 | \n",
" -95328 | \n",
"
\n",
" \n",
" 11/22/63 | \n",
" 3697.706644 | \n",
" 4997.840532 | \n",
" 0 | \n",
" 955 | \n",
" 477.5 | \n",
" 956 | \n",
" 1 | \n",
" 2041 | \n",
" 4650531 | \n",
" 5.0 | \n",
" 34146 | \n",
" -34146 | \n",
"
\n",
" \n",
" 111th United States Congress | \n",
" 1647.791111 | \n",
" 5001.887164 | \n",
" 0 | \n",
" 3410 | \n",
" 1705.0 | \n",
" 3411 | \n",
" 11 | \n",
" 1476 | \n",
" 27124741 | \n",
" 1.0 | \n",
" 26558 | \n",
" -17513 | \n",
"
\n",
" \n",
" 14 Women | \n",
" 2805.139792 | \n",
" 4828.690787 | \n",
" 0 | \n",
" 39 | \n",
" 19.5 | \n",
" 40 | \n",
" 21 | \n",
" 2127091 | \n",
" 17709771 | \n",
" 16.0 | \n",
" 705 | \n",
" -95 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 49,
"text": [
" ts_min ts_max revision_min \\\n",
"page \n",
"10 Janpath 1952.730394 4918.583762 0 \n",
"107th United States Congress 1068.466620 4866.595417 0 \n",
"11/22/63 3697.706644 4997.840532 0 \n",
"111th United States Congress 1647.791111 5001.887164 0 \n",
"14 Women 2805.139792 4828.690787 0 \n",
"\n",
" revision_max revision_median revisions \\\n",
"page \n",
"10 Janpath 86 43.0 87 \n",
"107th United States Congress 497 248.5 498 \n",
"11/22/63 955 477.5 956 \n",
"111th United States Congress 3410 1705.0 3411 \n",
"14 Women 39 19.5 40 \n",
"\n",
" latency_min latency_median latency_max \\\n",
"page \n",
"10 Janpath 21 142856 34497461 \n",
"107th United States Congress 11 40651 11445051 \n",
"11/22/63 1 2041 4650531 \n",
"111th United States Congress 11 1476 27124741 \n",
"14 Women 21 2127091 17709771 \n",
"\n",
" diff_median diff_max diff_min \n",
"page \n",
"10 Janpath 13.5 568 -548 \n",
"107th United States Congress 9.0 95328 -95328 \n",
"11/22/63 5.0 34146 -34146 \n",
"111th United States Congress 1.0 26558 -17513 \n",
"14 Women 16.0 705 -95 "
]
}
],
"prompt_number": 49
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Having created the edge and node lists in the previous step, we can now add these data to a `NetworkX` `DiGraph` object we'll call `gigantic_g`. As before, we add the edges and edge attributes from `gigantic_edgelist` and then add the nodes and node attribtues from `gigantic_usernodelist` and `gigantic_pagenodelist`. We perform a dictionary comprehension to convert the values of the attribtues in the dictionary to `float` data type rather than the `numpy.float64` which doesn't play nicely with the graph writing function in `NetworkX`. And then we can do the \"grand reveal\" to describe the coauthorship network of the articles in the hyperlink network neighborhood of Hillary's article."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"gigantic_g = nx.DiGraph()\n",
"# Add the edges and edge attributes\n",
"for (article,editor) in iter(gigantic_edgelist.index.values):\n",
" edge_attributes = dict(gigantic_edgelist.ix[(article,editor)])\n",
" edge_attributes = {k:float(v) for k,v in edge_attributes.iteritems()}\n",
" gigantic_g.add_edge(editor,article,edge_attributes)\n",
"\n",
"# Add the user nodes and attributes\n",
"for node in iter(gigantic_usernodelist.index):\n",
" node_attributes = dict(gigantic_usernodelist.ix[node])\n",
" node_attributes = {k:float(v) for k,v in node_attributes.iteritems()}\n",
" gigantic_g.add_node(node,node_attributes)\n",
"\n",
"# Add the page nodes and attributes\n",
"for node in iter(gigantic_pagenodelist.index):\n",
" node_attributes = dict(gigantic_pagenodelist.ix[node])\n",
" node_attributes = {k:float(v) for k,v in node_attributes.iteritems()}\n",
" gigantic_g.add_node(node,node_attributes)\n",
" \n",
"print \"There are {0} nodes and {1} edges in the network.\".format(gigantic_g.number_of_nodes(),gigantic_g.number_of_edges())\n",
"\n",
"gigantic_g.edges(data=True)[:3]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"There are 612010 nodes and 1198564 edges in the network.\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 70,
"text": [
"[(u'168.169.192.149',\n",
" u'John McCain',\n",
" {'diff_max': 33.0,\n",
" 'diff_median': 13.5,\n",
" 'diff_min': -6.0,\n",
" 'latency_max': 71.0,\n",
" 'latency_median': 51.0,\n",
" 'latency_min': 31.0,\n",
" 'revision_max': 858.0,\n",
" 'revision_min': 857.0,\n",
" 'ts_max': 1893.7183449074073,\n",
" 'ts_min': 1893.7175578703705,\n",
" 'weight': 2.0}),\n",
" (u'128.230.245.28',\n",
" u'John Marshall',\n",
" {'diff_max': 50.0,\n",
" 'diff_median': 50.0,\n",
" 'diff_min': 50.0,\n",
" 'latency_max': 46211.0,\n",
" 'latency_median': 46211.0,\n",
" 'latency_min': 46211.0,\n",
" 'revision_max': 1164.0,\n",
" 'revision_min': 1164.0,\n",
" 'ts_max': 2809.7745601851852,\n",
" 'ts_min': 2809.7745601851852,\n",
" 'weight': 1.0}),\n",
" (u'206.176.248.71',\n",
" u'Anticoagulant',\n",
" {'diff_max': 3.0,\n",
" 'diff_median': 1.0,\n",
" 'diff_min': -1.0,\n",
" 'latency_max': 1126091.0,\n",
" 'latency_median': 563116.0,\n",
" 'latency_min': 141.0,\n",
" 'revision_max': 199.0,\n",
" 'revision_min': 198.0,\n",
" 'ts_max': 3592.6432523148146,\n",
" 'ts_min': 3592.6416435185183,\n",
" 'weight': 2.0})]"
]
}
],
"prompt_number": 70
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, having gone through all this effort to make a co-authorship network with such rich attributes and complex properties, we should save our work. There are many different file formats for storing network objects to disk, but the two I use the most are [\"graphml\"](http://graphml.graphdrawing.org/) and [\"gexf\"](http://gexf.net/format/). They do slightly different things, but they're generally interoperable and compatible with many programs for visualizing networks like [Gephi](http://www.gephi.org/)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"nx.write_graphml(gigantic_g,'gigantic_g.graphml')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 71
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Analyze the `gigantic_g` network"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's perform some basic network analyses on this gigantic graph we've created. An extremely easy and important metric to compute is the degree centrality of nodes in the network: how well-connected a node is based on the number of edges it has to other nodes. We use the directed nature of the edges to distinguish between articles (which receive links in) and editors (which send links out) to compute the in- and out-degree centralities respectively with the `nx.in_degree_centrality` and `nx.out_degree_centrality` functions. These functions return a *normalized* degree centrality, where the values aren't the integer count of the number of connected edges, but rather the fraction of other nodes connected to which it's connected. The values are recorded in a dictionary keyed by the node ID (article title or user name), which are saved as `g_idc` and `g_odc`."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"g_idc = nx.in_degree_centrality(gigantic_g)\n",
"g_odc = nx.out_degree_centrality(gigantic_g)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 51
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can use a fancy bit of programming called `itemgetter` to quickly sort these dictionaries and return the 10-top connected articles and users. Hillary, despite being the central node we started at, is not actually the best-connected article, but rather other major people and entities. The top editors, interestingly enough are not actually people, but automated bots who perform a variety of maintenance and cleanup tasks across articles. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sorted(g_idc.iteritems(), key=itemgetter(1),reverse=True)[:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 58,
"text": [
"[(u'George W. Bush', 0.023424492123481844),\n",
" (u'United States', 0.015543889060454993),\n",
" (u'World War II', 0.012124004712349002),\n",
" (u'Chicago', 0.011112581677720425),\n",
" (u'Barack Obama', 0.010483505961513638),\n",
" (u'India', 0.010083185051200228),\n",
" (u'Ronald Reagan', 0.009625675439413473),\n",
" (u'Diana, Princess of Wales', 0.009333196080449796),\n",
" (u'Bill Clinton', 0.009318490414356652),\n",
" (u'New York City', 0.00905215446178079)]"
]
}
],
"prompt_number": 58
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sorted(g_odc.iteritems(), key=itemgetter(1),reverse=True)[:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 53,
"text": [
"[(u'SmackBot', 0.0032515861694844355),\n",
" (u'Addbot', 0.002730352004627383),\n",
" (u'Cydebot', 0.002475453792346191),\n",
" (u'Yobot', 0.0024378726456637076),\n",
" (u'RjwilmsiBot', 0.0023659782780972175),\n",
" (u'AnomieBOT', 0.0019640234048845687),\n",
" (u'ClueBot NG', 0.0019199064066051316),\n",
" (u'Rjwilmsi', 0.00177775163437139),\n",
" (u'ClueBot', 0.0017140270813010919),\n",
" (u'FrescoBot', 0.001547362865578774)]"
]
}
],
"prompt_number": 53
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can plot a histogram of connectivity patterns for the articles and editors, which shows a very skewed distribution: most editors edit only a single article while there are single editors who make thousands of contributions. The distribution for articles shows a less severe but still very long-tailed distribution of contribution patterns."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"g_size = gigantic_g.number_of_nodes()\n",
"g_idc_counter = Counter([v*(g_size-1) for v in g_idc.itervalues() if v != 0])\n",
"g_odc_counter = Counter([v*(g_size-1) for v in g_odc.itervalues() if v != 0])\n",
"\n",
"plt.scatter(g_idc_counter.keys(),g_idc_counter.values(),s=50,c='b',label='Articles')\n",
"plt.scatter(g_odc_counter.keys(),g_odc_counter.values(),s=50,c='r',label='Editors')\n",
"plt.yscale('log')\n",
"plt.xscale('log')\n",
"plt.xlabel('Number of connections',fontsize=15)\n",
"plt.ylabel('Number of nodes',fontsize=15)\n",
"plt.legend(loc='upper right',scatterpoints=1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 54,
"text": [
""
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n8/8BXbKMVS+CIcYAAAAASUVORK5CYII=\n",
"text": [
""
]
}
],
"prompt_number": 54
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also look at the distribution of edge weights, or the number of times that an editor contributed to an article. We could do this using the `gigantic_edgelist` DataFrame, but let's practice using the data attributes we've stored in the graph object. Using a list comprehension as before, we iterate (note the use of `edes_iter(data=True)` to both be more memory efficient and to return the edge attributes) over the edges which return a tuple (`i`,`j`,`attributes_dict`). We access the tuples' weights and store them in the list `weights`. Proceed with a `Counter` operation and then plot the results."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"weights = [attributes['weight'] for i,j,attributes in gigantic_g.edges_iter(data=True)]\n",
"weight_counter = Counter(weights)\n",
"\n",
"plt.scatter(weight_counter.keys(),weight_counter.values(),s=50,c='b',label='Weights')\n",
"plt.yscale('log')\n",
"plt.xscale('log')\n",
"plt.xlabel('Number of contributions',fontsize=15)\n",
"plt.ylabel('Number of edges',fontsize=15)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 55,
"text": [
""
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
""
]
}
],
"prompt_number": 55
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can compute another degree-related metric called \"assortativity\" that measures how well connected your neighbors are on average. We compute this statistic on the set of article and editor nodes using the `nx.assortativity.average_degree_connectivity` function with special attention to the direction of the ties as well as limiting the nodes to those in the set of pages or users, respectively. Plotting the distribution, both the articles and the editors exhibit negative correlations. In other words, for those editors (articles) connected with few articles (editors), those articles (editors) have a tendency to be well-connected to other nodes in the set. Conversely, for those editors (articles) connected with many articles (editors), those articles (editors) have a tendency to be poorly connected to other nodes in the set. Articles exhibit a stronger correlation than editors."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"article_nn_degree = nx.assortativity.average_degree_connectivity(gigantic_g,source='in',target='out',nodes=gigantic_pagenodelist.index)\n",
"editor_nn_degree = nx.assortativity.average_degree_connectivity(gigantic_g,source='out',target='in',nodes=gigantic_usernodelist.index)\n",
"\n",
"plt.scatter(article_nn_degree.keys(),article_nn_degree.values(),s=50,c='b',label='Articles',alpha=.5)\n",
"plt.scatter(editor_nn_degree.keys(),editor_nn_degree.values(),s=50,c='r',label='Editors',alpha=.5)\n",
"plt.yscale('log')\n",
"plt.xscale('log')\n",
"plt.xlabel('Degree',fontsize=15)\n",
"plt.ylabel('Average neighbor degree',fontsize=15)\n",
"plt.legend(loc='upper right',scatterpoints=1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 56,
"text": [
""
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
""
]
}
],
"prompt_number": 56
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Testing other things out"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Just trying other things."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"gigantic_g.edges(data=True)[1]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 72,
"text": [
"(u'128.230.245.28',\n",
" u'John Marshall',\n",
" {'diff_max': 50.0,\n",
" 'diff_median': 50.0,\n",
" 'diff_min': 50.0,\n",
" 'latency_max': 46211.0,\n",
" 'latency_median': 46211.0,\n",
" 'latency_min': 46211.0,\n",
" 'revision_max': 1164.0,\n",
" 'revision_min': 1164.0,\n",
" 'ts_max': 2809.7745601851852,\n",
" 'ts_min': 2809.7745601851852,\n",
" 'weight': 1.0})"
]
}
],
"prompt_number": 72
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"edge_weight_centrality = [list(),list()]\n",
"for (i,j,attributes) in gigantic_g.edges_iter(data=True):\n",
" edge_weight_centrality[0].append(g_idc[j] - g_idc[i])\n",
" edge_weight_centrality[1].append(attributes['weight'])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 75
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.scatter(edge_weight_centrality[0],edge_weight_centrality[1])\n",
"plt.yscale('log')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
""
]
}
],
"prompt_number": 77
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Appendix - There be dragons here"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Get the links from neighboring articles"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Throughout this section, we've gotten the links for a single article. As we did with the user information in the previous section, we can wrap these queries in a function so that they're easier to run. Once we do this, we can do more interesting things like examine the hyperlink ego-network surrounding a single article. \n",
"\n",
"We take the lists of linked articles we extracted from Hillary's article and iterate over them, getting the lists of articles for each of them. We need to place the output of these into a larger data object that will hold everything. I'll use a dictionary keyed by article name that returns a dictionary containing the lists of links for that article. We'll put Hillary's data in there to start it up, but we'll add more.\n",
"\n",
"Next we come up with a list of articles we're going to iterate over. We could just add the `outlist` and `inlist` articles together, but there might be redundancies in there. Instead we'll cast these lists into `set` containing only unique article names and the union of these sets creates a master set of all unique article names. Then convert this joined set back into a list called `all_links` so we can iterate over it.\n",
"\n",
"This set of unique links has 2,646 articles in it, which will take some time to scrape all the data. ***This may take over an hour to run and will generate ~190MB of data: convert the cell below back to \"Code\" if you really want to execute it***"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"# Start up the data structure\n",
"link_data = {u'Hillary Rodham Clinton':\n",
" {'Out':hrc_alllink_outlist,\n",
" 'In':hrc_alllink_inlist}}\n",
"\n",
"# Set operations\n",
"all_links = list(set(hrc_alllink_outlist) | set(hrc_alllink_inlist))\n",
"\n",
"# Start the scrape\n",
"for article in all_links:\n",
" try:\n",
" _out_links,_in_links = get_article_links(article)\n",
" link_data[article] = {'Out':_out_links,\n",
" 'In':_in_links}\n",
" except:\n",
" print article\n",
" pass\n",
" \n",
"# Save the data\n",
"with open('link_data.json','wb') as f:\n",
" json.dump(link_data,f)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dtype_dict = {'page':unicode,\n",
" 'revision':np.int64,\n",
" 'anon':bool,\n",
" 'comment':unicode,\n",
" 'parentid':np.int64,\n",
" 'size':np.int64,\n",
" 'timestamp':unicode,\n",
" 'user':unicode,\n",
" 'userid':np.int64,\n",
" 'unique_users':np.int64,\n",
" 'date':unicode,\n",
" 'diff':np.float64,\n",
" 'latency':np.float64\n",
" }"
],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}