diff --git a/examples/Corr between centrality and community 0.1.ipynb b/examples/Corr between centrality and community 0.1.ipynb new file mode 100644 index 00000000..afa094c3 --- /dev/null +++ b/examples/Corr between centrality and community 0.1.ipynb @@ -0,0 +1,443 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:f30bcb8447c34a58dffd10145e37b50436f94fe8d64d987f8aa9a7a773526bc4" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An IPython notebook that explores the relationship(correlation) between betweenness centrality and community membership of a number of mailing-lists in a given time period." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%matplotlib inline" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from bigbang.archive import Archive\n", + "import bigbang.parse as parse\n", + "import bigbang.graph as graph\n", + "import bigbang.mailman as mailman\n", + "import bigbang.process as process\n", + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "from pprint import pprint as pp\n", + "import pytz\n", + "import numpy as np\n", + "import math\n", + "from itertools import repeat" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "urls = [\"http://mail.scipy.org/pipermail/ipython-dev/\",\n", + " \"http://mail.scipy.org/pipermail/ipython-user/\",\n", + " \"http://mail.scipy.org/pipermail/scipy-dev/\",\n", + " \"http://mail.scipy.org/pipermail/scipy-user/\",\n", + " \"http://mail.scipy.org/pipermail/numpy-discussion/\"]\n", + "\n", + "\n", + "archives= [Archive(url,archive_dir=\"../archives\") for url in urls]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Opening 138 archive files\n", + "Opening 139 archive files" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "Opening 160 archive files" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "Opening 159 archive files" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "Date parsing error on: " + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "pon, 4 stu 2002 16:22:52\n", + "Opening 177 archive files" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "Date parsing error on: " + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "Wed, 01 Nov 2006 15:46:73 +0800\n", + "Date parsing error on: " + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "Wed, 01 Nov 2006 15:46:73 +0800\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following sets start month and end month, both inclusive." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "date_from_whole = [2010,1] #Include June(Start month)\n", + "date_to_whole = [2012,12] #Include December(End month)\n", + "total_month = (date_to_whole[0] - date_from_whole[0])*12 + (date_to_whole[1]-date_from_whole[1]+1)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "date_from = []\n", + "date_to = []\n", + "temp_year = date_from_whole[0]\n", + "temp_month = date_from_whole[1]\n", + "\n", + "for i in range(total_month):\n", + " date_from.append(pd.datetime(temp_year,temp_month,1,tzinfo=pytz.utc))\n", + " if temp_month == 12:\n", + " temp_year += 1\n", + " temp_month = 0\n", + " date_to.append(pd.datetime(temp_year,temp_month+1,1,tzinfo=pytz.utc))\n", + " temp_month += 1\n", + " " + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def filter_by_date(df,d_from,d_to):\n", + " return df[(df['Date'] > d_from) & (df['Date'] < d_to)]" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "IG = []\n", + "for k in range(total_month):\n", + " dfs = [filter_by_date(arx.data,\n", + " date_from[k],\n", + " date_to[k]) for arx in archives]\n", + " bdf = pd.concat(dfs)\n", + " IG.append(graph.messages_to_interaction_graph(bdf))\n", + "\n", + "#RG = graph.messages_to_reply_graph(messages)\n", + "\n", + "#IG = graph.messages_to_interaction_graph(bdf)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 8 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "bc = []\n", + "for j in range(total_month):\n", + " bc.append(pd.Series(nx.betweenness_centrality(IG[j])))" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 9 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "len(bc)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 10, + "text": [ + "36" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "new_dict is a dictionary with keys as users' names, and values of their community membership(can have different interpretation)\n", + "Here the community membership for a user is defined as sum of log(Ni + 1), with Ni corresponds to the number of emails a user sent to Mailing list i." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "new_dict = [{} for i in repeat(None, total_month)]\n", + "new_dict1 = [{} for i in repeat(None, total_month)]\n", + "for t in range(total_month):\n", + " filtered_activity = []\n", + " for i in range(5):\n", + " df = archives[i].data\n", + " fdf = filter_by_date(df,date_from[t],date_to[t])\n", + " filtered_activity.append(Archive(fdf).get_activity().sum())\n", + " for k in range(len(filtered_activity)):\n", + " for g in range(len(filtered_activity[k])):\n", + " original_key = filtered_activity[k].keys()[g]\n", + " new_key = (original_key[original_key.index(\"(\") + 1:original_key.rindex(\")\")])\n", + " if new_key not in new_dict[t]:\n", + " new_dict[t][new_key] = 0\n", + " new_dict1[t][new_key] = 0\n", + " new_dict[t][new_key] += math.log(filtered_activity[k].get_values()[g]+1)\n", + " #can define community membership by changing the above line.\n", + " #example, direct sum of emails would be \n", + " new_dict1[t][new_key] += filtered_activity[k].get_values()[g]\n" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 31 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for i in range(len(new_dict1)):\n", + " [x+1 for x in new_dict1[i].values()]\n", + " [np.log(x) for x in new_dict1[i].values()]" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 47 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#check if there's name difference, return nothing if perfect.\n", + "for i in range(total_month):\n", + " set(new_dict[i].keys()).difference(bc[i].index.values)\n", + " set(bc[i].index.values).difference(new_dict[i].keys())\n", + " set(new_dict1[i].keys()).difference(bc[i].index.values)\n", + " set(bc[i].index.values).difference(new_dict1[i].keys())" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 49 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#A list of corresponding betweenness centrality and community membership for all users, monthly\n", + "comparison = []\n", + "comparison1 = []\n", + "for i in range(len(new_dict)):\n", + " comparison.append(pd.DataFrame([new_dict[i], bc[i]]))\n", + " comparison1.append(pd.DataFrame([new_dict1[i], bc[i]]))" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 53 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "corr = []\n", + "corr1 = []\n", + "for i in range(len(new_dict)):\n", + " corr.append(np.corrcoef(comparison[i].get_values()[0],comparison[i].get_values()[1])[0,1])\n", + " corr1.append(np.corrcoef(comparison1[i].get_values()[0],comparison1[i].get_values()[1])[0,1])" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 54 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "corr1" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 56, + "text": [ + "[0.96037411067096634,\n", + " 0.9290138698150141,\n", + " 0.89425367964646685,\n", + " 0.89917617005470662,\n", + " 0.92991018321441909,\n", + " 0.82147285776944867,\n", + " 0.87427839105054217,\n", + " 0.90600460345005496,\n", + " 0.88271122203671915,\n", + " 0.88553587680879164,\n", + " 0.85441186827144266,\n", + " 0.93719201756052384,\n", + " 0.83104612834996139,\n", + " 0.774586996595649,\n", + " 0.84519537229516306,\n", + " 0.85677539808041736,\n", + " 0.88870809362997261,\n", + " 0.8167283158671691,\n", + " 0.90511019084905298,\n", + " 0.89887965432552719,\n", + " 0.86415159226754346,\n", + " 0.87402695037197142,\n", + " 0.76063235325679746,\n", + " 0.90447740840444568,\n", + " 0.91035098143920701,\n", + " 0.9221783659392957,\n", + " 0.94070862509041964,\n", + " 0.95431393892826144,\n", + " 0.93629494205905239,\n", + " 0.90463638705091931,\n", + " 0.86892862334827548,\n", + " 0.8758045601354455,\n", + " 0.92942914877260052,\n", + " 0.92685099851158981,\n", + " 0.88117423471033274,\n", + " 0.86581332777478748]" + ] + } + ], + "prompt_number": 56 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#Blue as sum of log, red as log of sum, respect to community membership\n", + "x = range(1,total_month+1)\n", + "y = corr\n", + "plt.plot(x, y, marker='o')\n", + "z = corr1\n", + "plt.plot(x, z, marker='o', linestyle='--', color='r')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 57, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nA6UubPu4WOP7AAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 57 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file