{ "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3" }, "name": "", "signature": "sha256:937e32e3f410d7af554f55ac3312d693b57347b96d979339eeefac3cc589b7a7" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "In this notebook, we describe how to retrieve our browsing history from Safari (Part 1) and produce some simple plots (Part 2) in order to see what websites we visit most often.\n", "\n", "(Note: this was run on Mac OS X 10.10.2)." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Part 1: Retrieving our Safari Browsing History" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To access our browsing history, we go to ~/Library/Safari and look for the database *History.db*. We make a copy of it in a folder in our workspace, e.g. to *~/Workspace/web_browsing/hs.db*." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%bash\n", "cp ~/Library/Safari/History.db ~/Workspace/web_browsing/hs.db" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let us fire up sqlite3 and see what tables are inside the database." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%script sqlite3 hs.db\n", ".tables" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "history_items history_tombstones history_visits metadata \n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Among the four (4) tables above, we'll be using 'history_items' and 'history_visits'. Let's take a look at their schemata." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%script sqlite3 hs.db\n", ".schema history_items" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CREATE TABLE history_items (id INTEGER PRIMARY KEY AUTOINCREMENT,url TEXT NOT NULL UNIQUE,domain_expansion TEXT NULL,visit_count INTEGER NOT NULL,daily_visit_counts BLOB NOT NULL,weekly_visit_counts BLOB NULL,autocomplete_triggers BLOB NULL,should_recompute_derived_visit_counts INTEGER NOT NULL);\n", "CREATE INDEX history_items__domain_expansion ON history_items (domain_expansion);\n" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "%%script sqlite3 hs.db\n", ".schema history_visits " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CREATE TABLE history_visits (id INTEGER PRIMARY KEY AUTOINCREMENT,history_item INTEGER NOT NULL REFERENCES history_items(id) ON DELETE CASCADE,visit_time REAL NOT NULL,title TEXT NULL,load_successful BOOLEAN NOT NULL DEFAULT 1,http_non_get BOOLEAN NOT NULL DEFAULT 0,synthesized BOOLEAN NOT NULL DEFAULT 0,redirect_source INTEGER NULL UNIQUE REFERENCES history_visits(id) ON DELETE CASCADE,redirect_destination INTEGER NULL UNIQUE REFERENCES history_visits(id) ON DELETE CASCADE,origin INTEGER NOT NULL DEFAULT 0,generation INTEGER NOT NULL DEFAULT 0);\n", "CREATE INDEX history_visits__last_visit ON history_visits (history_item, visit_time DESC, synthesized ASC);\n", "CREATE INDEX history_visits__origin ON history_visits (origin, generation);\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first thing to note is that each *history visit* table is associated with one *history item*, as we can tell from 'history_item' column in 'history_visits' table.\n", "\n", "`history_item INTEGER NOT NULL REFERENCES history_items(id) ON DELETE CASCADE`\n", "\n", "Moreover, as we can tell from the columns of the two tables, 'history_visits' contains information about individual visits to websites, like the *time* of the visit and the *title* of the website, while *history_items* contains general and aggregate information about the websites we visit, such as their url and number of visits.\n", "\n", "Let's take a look now at the addresses that we visit most often (and despair later)..." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%script sqlite3 hs.db\n", "SELECT id, url, visit_count FROM history_items ORDER BY visit_count DESC LIMIT 5;" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "491|https://twitter.com/|4048\n", "9252|https://www.facebook.com/|2380\n", "17706|http://international.nytimes.com/|1225\n", "18|http://www.theverge.com/|1211\n", "23141|https://mail.google.com/mail/u/0/#inbox|1134\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "...As well as our most recent visits." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%script sqlite3 hs.db\n", "SELECT V.title, I.url, V.visit_time\n", "FROM history_items as I,\n", "(SELECT history_item, title, visit_time FROM history_visits ORDER BY visit_time DESC LIMIT 5) as V\n", "WHERE I.id = V.history_item;" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Sanja Scepanovic and 2 others - Messages|https://www.facebook.com/messages/conversation-1680195825528863|462218817.510182\n", "Facebook|https://www.facebook.com/login.php?login_attempt=1&lwv=111|462218817.412889\n", "Espoo Cine 2015|http://boxoffice.espoocine.fi/ewt/?lang=fin&tctpage=cart|462218724.79521\n", "Espoo Cine 2015: bikes vs cars|http://www.espoocine.fi/2015/fi/ohjelmisto/elokuvat/bikes-vs-cars|462218707.2001\n", "Espoo Cine 2015: bikes vs cars|http://www.espoocine.fi/2015/en/programme/movies/bikes-vs-cars|462218641.31604\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that, from what I can tell at least, time is expressed as the number of seconds since the beginning of 2001-01-01." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, let's dump to text files ('visits.csv') only the information that interests us: for now, that's only the web address visited (url) and the associated timestamp." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%bash --out visits\n", "sqlite3 hs.db \\\n", "\"SELECT I.url, V.visit_time \\\n", "FROM history_items as I, \\\n", "(SELECT history_item, title, visit_time FROM history_visits) as V \\\n", "WHERE I.id = V.history_item;\" \n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "f = open('visits.txt', 'w')\n", "f.write(visits)\n", "f.close()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "That was it, our browsing history is in file 'visits.txt'." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%bash\n", "head -5 visits.txt\n", "echo \"... ... ...\"\n", "tail -5 visits.txt" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "http://www.apple.com/iphone/|431973567.3\n", "http://live.arstechnica.com/apples-september-9-2014-event/|431975282.8\n", "http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDAQFjAA&url=http%3A%2F%2Fwww.stevens.edu%2F&ei=NofoU56VCMeP0AW6rYCIBg&usg=AFQjCNFN7sE7yPBglg-N1stqD034Ifa_pQ&bvm=bv.72676100,d.d2k|429440704.7\n", "http://www.theverge.com/2014/9/9/6122731/iphone-6-apple-4-7-inch-display-announced|431982335.9\n", "http://www.apple.com/live/2014-sept-event/|431919219.233333\n", "... ... ...\n", "http://www.espoocine.fi/2015/en/programme/movies/bikes-vs-cars|462218641.31604\n", "http://www.espoocine.fi/2015/fi/ohjelmisto/elokuvat/bikes-vs-cars|462218707.2001\n", "http://boxoffice.espoocine.fi/ewt/?lang=fin&tctpage=cart|462218724.79521\n", "https://www.facebook.com/login.php?login_attempt=1&lwv=111|462218817.412889\n", "https://www.facebook.com/messages/conversation-1680195825528863|462218817.510182\n" ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Part 2: Plots" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "import sys\n", "import matplotlib.pyplot as plt\n", "import time\n", "import datetime" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us parse the text file we created and extract the timestamps of our visits." ] }, { "cell_type": "code", "collapsed": false, "input": [ "f = open('visits.txt')\n", "tt = [] # stores timestamps of our visits\n", "for line in f:\n", " try:\n", " tokens = line.rstrip().split('|')\n", " time_sec = float(tokens[-1])\n", " tt.append(time_sec)\n", " except:\n", " sys.stderr.write(line)\n", " sys.stderr.write('\\n')\n", "f.close()\n", "# sort the timestamps\n", "tt.sort()\n", "\n", "# turn into standard POSIX by adding\n", "# the first second of 2001-1-1 UTC\n", "zero_sec = time.mktime(datetime.datetime(2001, 1, 1).timetuple())\n", "for i in range(len(tt)): tt[i] += zero_sec" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us plot the daily number of pages we've visited for that period of time." ] }, { "cell_type": "code", "collapsed": false, "input": [ "bin_size = 24 * 3600 # have one bin per 24 hours\n", "num_of_bins = (tt[-1] - tt[0]) / bin_size\n", "# figure out intervals to accomodate number of labels on x-axis\n", "num_of_xlabels = 10\n", "label_bin = (tt[-1] - tt[0]) / (num_of_xlabels - 1)\n", "locs = [tt[0] + label_bin * (i) for i in range(num_of_xlabels)]\n", "labels = map(lambda x: str(datetime.datetime.fromtimestamp(x)).split()[0], locs)\n", "# plot the histogram\n", "plt.figure(figsize=(15, 5))\n", "plt.hist(tt, num_of_bins, range = (tt[0], tt[-1]))\n", "plt.xticks(locs, labels)\n", "plt.ylabel(\"Daily Visits\")\n" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAA34AAAE4CAYAAAAEtyFMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xu0ZGd53/nvD8ncYkAWOEI3W2CkQZ2AwYolEsfmQLCs\nYFtS4jUIJwbZ1mTs6cEmJJlYysyyelYSLPAV20vMim1AkKBEviwGLRNZzeWs0QxGsrk2NLIkxrLV\nTdQYDAaHmaFlPfNH7aOuPl1Vp06d2lW7dn0/a/Xqffat3npqX95nv+/eO1WFJEmSJKm/HrfsAkiS\nJEmS2mXiJ0mSJEk9Z+InSZIkST1n4idJkiRJPWfiJ0mSJEk9Z+InSZIkST3XWuKX5C1JjiU5tG38\nTyT5dJJPJnnD0Pgbktyf5N4klw+NvyTJoWbam9oqryRJkiT1VZstfm8FrhgekeQlwJXA86vqbwI/\n14zfB1wD7GuWuTlJmsXeDFxXVRcCFyY5aZ2SJEmSpMlaS/yq6i7gi9tG/w/Az1TV8WaeP2vGXwXc\nWlXHq+pB4AHgsiRnA0+pqnua+d4OXN1WmSVJkiSpjxZ9j9+FwHcl+VCSzSR/qxl/DnBkaL4jwLkj\nxh9txkuSJEmSpnT6Ej7vG6rqRUm+HbgNePaCyyBJkiRJa2XRid8R4HcAquoPkjya5BkMWvLOH5rv\nvGbeo83w8Pijo1acpFopsSRJkiStiKrKqPGL7ur5LuClAEkuAh5fVZ8H3g28MsnjkzyLQZfQe6rq\nYeDLSS5rHvbyqmYdI1XVxH833njjjvP4b+d/xtFYdvGfsTSWXftnHI1lF/8ZS2PZtX/Gcb7/Jmmt\nxS/JrcCLgacneQj4aeAtwFuaVzx8DXh1k7AdTnIbcBh4BNhfJ0q+H3gb8CTgPVV1R1tlliRJkqQ+\nai3xq6ofHDPpVWPmfz3w+hHjPww8b45FkyRJkqS1suiunku1sbGx7CL0gnGcH2M5P8ZyfozlfBjH\n+TGW82Ms58dYzodxXJzs1Bd0VSSpvnwXSZIkSdqtJFRHHu4iSZIkSVowEz9JkiRJ6jkTP0mSJEnq\nORM/SZIkSeo5Ez9JkiRJ6jkTP0mSJEnqORM/SZIkSeo5Ez9JkiRJ6jkTP0mSJEnqORM/SZIkSeo5\nEz9JkiRJ6jkTP0mSJEnqORM/SZIkSeo5Ez9JkiRJ6rnTl10ASZKkeUjy2HBVLbEkktQ9tvhJkqQe\nMeGTpFFM/CRJkiSp50z8JEmSJKnnTPwkSZIkqedM/CRJkiSp50z8JEmSJKnnTPwkSZIkqedM/CRJ\nkiSp50z8JEmSJKnnWkv8krwlybEkh0ZM++dJHk1y5tC4G5Lcn+TeJJcPjb8kyaFm2pvaKq8kSZIk\n9VWbLX5vBa7YPjLJ+cB3A38yNG4fcA2wr1nm5iRpJr8ZuK6qLgQuTHLKOiVJkiRJ47WW+FXVXcAX\nR0z6BeBfbht3FXBrVR2vqgeBB4DLkpwNPKWq7mnmeztwdUtFliRJkqReWug9fkmuAo5U1Se2TToH\nODL09xHg3BHjjzbjJUmSJElTOn1RH5TkycC/YtDN87HRi/p8SZIkSVpXC0v8gG8BLgA+3ty+dx7w\n4SSXMWjJO39o3vMYtPQdbYaHxx8d9wEHDhx4bHhjY4ONjY25FFySJEmSumZzc5PNzc2p5k1VtVaQ\nJBcAt1fV80ZM+2Pgkqr68+bhLu8ELmXQlfO9wHOqqpLcDfwkcA/wu8AvV9UdI9ZXbX4XSZLUbYML\nywUE6wSS1lESqmpkr8o2X+dwK/BB4KIkDyX5kW2zPHZErqrDwG3AYeA/A/uHsrj9wK8D9wMPjEr6\nJEmSJEnjtdrit0i2+EmStN5s8ZO07pbS4idJkiRJ6gYTP0mSJEnqORM/SZIkSeo5Ez9JkiRJ6jkT\nP0mSJEnqORM/SZIkSeo5Ez9JkiRJ6jkTP0mSJEnqORM/SZIkSeo5Ez9JkiRJ6jkTP0mSJEnqORM/\nSZIkSeo5Ez9JkiRJ6jkTP0mSJEnqORM/SZIkSeo5Ez9JkiRJ6jkTP0mSJEnqORM/SZIkSeo5Ez9J\nkiRJ6jkTP0mSJEnqORM/SZIkSeo5Ez9JkiRJ6jkTP0mSJEnqORM/SZIkSeo5Ez9JkiRJ6jkTP0mS\nJEnqudYSvyRvSXIsyaGhcT+b5NNJPp7kd5I8bWjaDUnuT3JvksuHxl+S5FAz7U1tlVeSJEmS+qrN\nFr+3AldsG3cn8Deq6luB+4AbAJLsA64B9jXL3JwkzTJvBq6rqguBC5NsX6ckSZIkaYLWEr+qugv4\n4rZxB6vq0ebPu4HzmuGrgFur6nhVPQg8AFyW5GzgKVV1TzPf24Gr2yqzJEmSJPXRMu/x+1HgPc3w\nOcCRoWlHgHNHjD/ajJckSZIkTWkpiV+S/xn4WlW9cxmfL0mSJEnr5PRFf2CSHwZeDvy9odFHgfOH\n/j6PQUvfUU50B90af3Tcug8cOPDY8MbGBhsbG3striRJkiR10ubmJpubm1PNm6pqrSBJLgBur6rn\nNX9fAfw88OKq+vzQfPuAdwKXMujK+V7gOVVVSe4GfhK4B/hd4Jer6o4Rn1VtfhdJktRtg+fCFRCs\nE0haR0moqoya1lqLX5JbgRcDz0jyEHAjg6d4Ph442Dy08/eran9VHU5yG3AYeATYP5TF7QfeBjwJ\neM+opE+SJEmSNF6rLX6LZIufJEnrzRY/SetuUovfMp/qKUmSJElaABM/SZIkSeo5Ez9JkiRJ6jkT\nP0mSJEnqORM/SZIkSeo5Ez9JkiRJ6jkTP0mSJEnqORM/SZIkSeo5Ez9JkiRJ6jkTP0mSJEnqORM/\nSZIkSeo5Ez9JkiRJ6jkTP0mStJaSkGTZxZCkhTDxkyRJkqSeM/GTJEmSpJ4z8ZMkSZKknjPxkyRJ\nkqSeM/GTJEmSpJ4z8ZMkSZKknjPxkyRJkqSeM/GTJEmSpJ4z8ZMkSZKknjPxkyRJkqSeM/GTJEmS\npJ4z8ZMkSZKknjPxkyRJkqSeay3xS/KWJMeSHBoad2aSg0nuS3JnkjOGpt2Q5P4k9ya5fGj8JUkO\nNdPe1FZ5JUmSJKmv2mzxeytwxbZx1wMHq+oi4H3N3yTZB1wD7GuWuTlJmmXeDFxXVRcCFybZvk5J\nkiRJ0gStJX5VdRfwxW2jrwRuaYZvAa5uhq8Cbq2q41X1IPAAcFmSs4GnVNU9zXxvH1pGkiRJkjSF\nRd/jd1ZVHWuGjwFnNcPnAEeG5jsCnDti/NFmvCRJkiRpSqcv64OrqpLUPNd54MCBx4Y3NjbY2NiY\n5+olSZIkqTM2NzfZ3Nycat5UzTX3OnnlyQXA7VX1vObve4GNqnq46cb5gap6bpLrAarqpma+O4Ab\ngT9p5rm4Gf+DwIur6sdHfFa1+V0kSVK3DR4PUECYpk6w9TgB6w+S+iIJVZVR0xbd1fPdwLXN8LXA\nu4bGvzLJ45M8C7gQuKeqHga+nOSy5mEvrxpaRpIkSZI0hda6eia5FXgx8IwkDwE/DdwE3JbkOuBB\n4BUAVXU4yW3AYeARYP9Q891+4G3Ak4D3VNUdbZVZkiRJkvqo1a6ei2RXT0mS1ptdPSWtuy519ZQk\nSZIkLZiJnyRJkiT1nImfJEmSJPWciZ8kSZIk9dyOiV+Sf5rkaRn4jSQfTfI9iyicJEmSJGnvpmnx\n+9Gq+gvgcuBMBu/Su6nVUkmSJEmS5maaxG/rcaDfC7yjqj7ZYnkkSZIkSXM2TeL34SR3Ai8H7kjy\nVODRdoslSZIkSZqXHV/gnuRxwAuBz1TVl5I8HTi3qj6xiAJOyxe4S5K03nyBu6R1t9cXuB+sqg9X\n1ZcAquoLwC/Os4CSJEmSpPacPm5CkicBTwa+McmZQ5OeCpzbdsEkSZIkSfMxNvEDfgx4LXAO8OGh\n8V8BfrXNQkmSJEmS5meae/x+oqp+ZUHlmZn3+EmStN68x0/Supt0j9+krp4vrar3A59N8g+3T6+q\n35ljGSVJkiRJLZnU1fPFwPuB72dw+Ww7Ez9JkiRJWgE7dvVcFXb1lCRpvdnVU9K629PrHJK8NslT\nM/AbST6S5HvmX0xJkiRJUhumeY/fdVX1ZeBy4Ezg1cBNrZZKkiRJkjQ30yR+W02F3wu8o6o+2WJ5\nJEmSJElzNk3i9+EkdwIvB34vyVOBR9stliRJ0uySPHYPnyRpuvf4PQ54IfCZqvpSkqcD51bVJxZR\nwGn5cBdJktbb8MNdpnnIiw93kdQ3s77H7+Kq+jTwAgZHz2c3B8ito6kkSVJrTMwkaX7Gtvgl+bWq\n+idJNhmR6FXVS1ou267Y4idJUr/sNvGzxU/SupvU4jcp8bu0qu5ptWRzZOInSVK/mPhJ0u7M+h6/\nf5fkgST/Osm+lsomSZIkSWrZ2MSvql4AfB/wV8BvJflEkuuTXLCgskmSJEmS5mDi6xyq6t6qOlBV\n+xi8uP1pwPuTfHAvH5rkhiSfSnIoyTuTPCHJmUkOJrkvyZ1Jztg2//1J7k1y+V4+W5Kkedt6dYCv\nD5AkddU07/HbeqXDXwfOAv4acGzWD2xaDP8J8G1V9TzgNOCVwPXAwaq6CHhf8zdNN9NrgH3AFcDN\nTXkkSdrR4hIy7xOTJHXXxAQqyXcluRk4AvwL4C7goqr6B3v4zC8Dx4EnJzkdeDLwWeBK4JZmnluA\nq5vhq4Bbq+p4VT0IPABcuofPlyRJkqS1Muk9fg8BfwrcCvyvVTVzK9+wqvrzJD/frPv/AX6vqg4m\nOWvoM44xaF0EOAf40NAqjgDnzqMskiRJkrQOxiZ+wHc2LWxzleRbgH8KXAD8BfCbSX5oeJ6qqiST\n+syMnHbgwIHHhjc2NtjY2NhjaSVJkiSpmzY3N9nc3Jxq3rHv8WtLkmuA766q/675+1XAi4CXAi+p\nqoeTnA18oKqem+R6gKq6qZn/DuDGqrp723p9j58k6RSLeFfb8PvjPBfNj+/xk6TdmfU9fm25F3hR\nkidlcMR9GXAYuB24tpnnWuBdzfC7gVcmeXySZwEXAivzYnlJktQ+n6gqSZNN6uoJQJKnV9UX5vWB\nVfXxJG8H/hB4FPgI8O+ApwC3JbkOeBB4RTP/4SS3MUgOHwH227QnSZIkSdPbsatnkvuBjwFvBf5z\nV5Muu3pKkkaxq+fq2s1vd6LFz66ektbXXrt6/jfArzF4gfsDSX4myUXzLKAkSdKyLO5dj5K0PLt6\nuEuSlwL/nsFL3D8G3FBVH2ypbLtii58kaRRb/FbXolr8/O0k9cWkFr9p7vF7BvCPGbT4HQNew+BB\nLN8K/BaD1zJIkiRJkjpqx8QP+CCDVr6rqurI0Pg/TPK/tVMsSZIkSdK8TPNwl5XoQ7kixZQkLZhd\nPVeXXT0laXdm6uqZ5PbhFWxTVXXlfIonSZIkSWrTpK6eP7+wUkiSJEmSWrOrp3p2mV09JUmj2NVz\nddnVU5J2Z9aunr9ZVf9tkkMjJldVPX9uJZQkSZIktWZsi1+Sc6rqs0kuGDW9qh5sr1i7Z4ufJGkU\nW/xW1zS/3anPIbDFT9L6mtTiZ1dPSVKvmfitrukTv61kD0z8JK2zSYnf46ZY+G8n+YMk/zXJ8SSP\nJvny/IspSZIkSWrDjokf8KvAPwLuA54IXAfc3GahJEmSJEnzM03iR1XdD5xWVX9VVW8Frmi3WJIk\nSZKkeZn0Hr8t/zXJE4CPJ3kj8DAnOtJLkiRJkjpumha/VzfzvQb4KnAe8ANtFkqSJEmSND9TPdUz\nyTcCVNWftV6iGflUT0nSKD7Vc3X5VE9J2p2ZnuqZgQNJPs/gwS73Jfl8khtz6ktzJEmSJEkdNamr\n5+uA7wC+vaq+oaq+Abi0Gfe6RRROkiRJkrR3Y7t6JvkY8N3bu3c23T4PVtULFlC+qdnVU5I0il09\nV5ddPSVpd2Z9gfvpo+7pa8ZN8zRQSZLUUUke+ydJ6r9JCdzxGadJkqSVMNxSJvXT8MUNW3W1ziYl\nfs9P8pUx057URmEkSZKk+fMihzQ28auq0xZZEEmSJElSO6Z5gbskSZIkaYWZ+EmSJElSzy0l8Uty\nRpLfSvLpJIeTXJbkzCQHk9yX5M4kZwzNf0OS+5Pcm+TyZZRZkiRJklbVslr83gS8p6ouBp4P3Atc\n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\n", "text": [ "" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "What are websites we've visited most often?\n", "We've already had an idea about this, but now let us do more elaborate processing." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import re\n", "import numpy as np\n", "website_pattern = re.compile('http(s)?://(\\w+\\.)?(\\w+?)\\.\\w+?/')\n", "\n", "verbose = False\n", "\n", "f = open('visits.txt')\n", "website_counts = {} # stores counts for each website\n", "addresses = {} # stores the different addresses (base-urls) for each website\n", "for line in f:\n", " try:\n", " # keep only the url, ignore the timestamp\n", " tokens = line.rstrip().split('|')\n", " m = website_pattern.search(\"\".join(tokens[:-1]))\n", " try:\n", " # parse the url to extract the website name\n", " # for example, if the url is http://www.facebook.com/ab238ub\n", " # the website name is 'facebook'\n", " website = m.group(3)\n", " # update count\n", " website_counts[website] = website_counts.get(website, 0) + 1\n", " # keep track of the different base urls that match this website\n", " # for example, if the url is http://www.facebook.com/ab238ub\n", " # the base url is http://www.facebook.com/\n", " if website not in addresses:\n", " addresses[website] = {}\n", " addresses[website][m.group(0)] = addresses[website].get(m.group(0), 0) + 1\n", " except Exception, e:\n", " if verbose:\n", " sys.stderr.write(str(e))\n", " sys.stderr.write('\\n')\n", " except:\n", " sys.stderr.write(line)\n", " sys.stderr.write('\\n')\n", "f.close()\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the number of visits to the websites we visit most frequently" ] }, { "cell_type": "code", "collapsed": false, "input": [ "k = 5 # The number of top websites to present\n", "\n", "# Keep the top-k websites\n", "k = min(k, len(website_counts))\n", "top_websites = sorted(website_counts.items(),\n", " key = lambda x: x[1], reverse = True)[:k]\n", "# The number of visits to websites that are not among the top-k\n", "other_visits = sum(x[1] for x in top_websites[k:])\n", "\n", "# Let's make a histogram for the top-k websites\n", "plt.figure(figsize = (10, 5)) # create new figure\n", "bar_width = 0.5\n", "xpos = np.arange(len(top_websites)) + bar_width # bar positions on the x-axis\n", "plt.bar(xpos, [w[1] for w in top_websites], bar_width) # places the bars\n", "plt.xticks(xpos+bar_width/2, [w[0] for w in top_websites]) # ticks on x-axis\n", "\n" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "([,\n", " ,\n", " ,\n", " ,\n", " ],\n", " )" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nKcakxUnymt394e0kJybZvJd9/nK/Jrk4ySn7Ok7ttNjjJsmWJKv2R9972v++MnjpYPNU4Nw9Xbiq\nXtaazwH+9chDJwG/uTdP3K5V1P7zNuBVVXX2EvW3VNP9njYYs6q6fvTDWEvV7Uj/F1XVTUvc/6Rb\n7HGzJ+vtyzG534/niQheSd7T/h3RzUk+meRdSV6U5JYktyf5qyQr27Lz1V+c5I4ktyX54Fy/PSV5\nSpKPJ7k1yd8kOa33tor3A/+g7aePJ3kNQJLPJrm8td+c5D+09o9H1nt5W+8PgYuBM9v9fzXfvk3y\npiTXJbkJ2Nh7YydFkv8C/CpwY5I/TPLNth++keR5bZlDkvxpks3t+H1Hq69ts1vfSnJjkmeMdH12\n28ebk7y4Lb8qyedaH/8nyQt3V2+qLfOWJDckeVKP12UStNmqe5J8IsnfJvnLJKe2ff/d9rP5TUk+\n2pY/ph3v3263l7auDknyF0nuTPKlmX3U9tmmtuynkxw+xxiuSPIvW/v9Se5q3wcf7PZCHASS/Pu2\nD28G/mGrfTVt5jnJ05Pc39qzj+e3z+rr8CRfTLJ+nr5njsnpJep/lxzR6nNmht2qqoP6BrwYuA14\nInAE8F3gXcDtwMvbMhcDH2rtO+ap3wmc3Np/AtzR2lPA9a39PuB3Wnslwyc1nzzu12CSbsAJwObW\nPhP4QGtvAr7Z2p8A/nlrP9a+vmJmP7b75wAfGbk/574F3sTwx39XjnvbD/YbcD+wCjgSOKTVXgV8\nurXfBlwLPKHdfypwKPBN4Gkj3xOXt/Y08F9b++Uj3zcfBd7T2q8EblugflH7mfIO4LPAoeN+rQ6m\nG3Ai8DjwAiDAt0b24WntNT8H+GirfQo4r7WfABw10sevjSwzczyvGnmu9wLvGN2vrf0J4LeBpwH3\njCx/1LhfnwPlBqxleH99UjuG723HzVeBf9yWeTpwf2vvcjy3r/cz/JzfCLxxN33/fntsKfqfK0fM\n9D9nZtjdbRJOjbwM+FxV/Qz4WYbrsZ7C8EZ5c1vmSuB/JjkKOHqO+tHAEVV1a6t/EvgXczzXqcBr\nkvxBu38YcDzDm7T6GP2bKV8Hfi/D//28C1jZZjteyvAmOd96M/dHa3Pt22cz/Fa1saoeWaLxa2Er\ngauSPJfh9Z/5OXYKcFlV/QKgqn6Y5B8xvGF/JQkMn5p+sC1fwDVt2ZuTHNWO9ZcxvMlSVV9N8rQk\nR+6mHuDfMATw06vq5/t38yfS/VV1F0CSu4CvtPqdDKFq1CuBNwK074UfZbhm5/6quqMt89cj670w\nwwz40QxvqjfuZhyPAD/NMHv+v9pNe+blwF9V1U8ZXsPrFlh+l+O51QN8Hrikqq5ZZN972/9cOYL5\nMsNCTzwJwavY9U11tvke39s6wG9X1b0Ljkr7XVVta9O+64CvMcyWnAn8uKp+stDqc9R22bdJTgYW\n6ktLJwyzEjdV1WuTnMjwG+3o47OXv6uq/tke9j+z3/fm2C9gM/DrDL9obdnD59Ke+/uR9i+An420\n53ofm2s/jfbxc4bZEYArgNOqanOScxjOYswY/TmQqvp5kpcwvGm/juEXOC+63zPzvRfvYPiFCHbu\nkxnzHW9fB15N+8Vpjr5H2zvYeVnV/uh/of52MQnXeH2DYabisCRHMMxU/QT4YZLfaMucDUxX1Y/m\nqT8KPNYOOICz5nmuLwHnzdxJctISb4sW9hjDVPOMW4DfA/43cDPwBwwhbKH1Zt+fb9/u0YGmJXUU\nO2et3jRS3wi8NckhAEmeCtwD/MrMdT5JDk2ypi0fhiBOO+YfaT8DbgZ+p9WngL+rqsd2Uw/DaYh/\nC1yX5Nil32TthZsYTiPNXMdz1BzLjM5oHwE8lORQhpmymmMZWn8zZ0u+CPw+Q9jWnvkacEaSJ7WZ\n4te0+haGU4UwhNkZcx3PM/6I4b36P8/T9+gZqS3AP9nH/mfniN8CmC8zLPRCHPTBq6q+BVzHcB72\nBobfTB9huCbgg0luB34N+OO2ynz19cB/S3Ibw7U9j44+Tfv6XuDQDBfh38lwvlcdVdXDwDfaBZMf\nYHizPKSq/i/Dm+NTW+2Xq7SvtwM/bxfYns8wi7Im7eJ65t+3RYdPwQjY+Vp/APiTJH/D8JvyzOv/\nMeD/AXck+TbDf794nOGH7SWtdhvwT0f6+2nr51KGYxxgA7C2/Qx4H8PPhN3VC6iq+gZDsP9C9vPH\n0SfQ7GNsrmNupnY+8MokdzBcD/b8OdYZPW7fA9zKMMvxnXmWmbl/JHB9+x64GXjn3m3G5Kqq2xiu\nrbud4b14E8Nr+qfA29px+DR2czzP6u984PAk75+n7xlL0f9cOWImA8yXGeY1EX9ANclTquonSZ7M\nMPPxlqr69mL6aO0LgGOqyoNOkqSD3FLkiBmTcI0XwF+00wtPAq5Y5Iv1Wxn+efcKhqnLNy3d8CRJ\n0jK2FDkCmJAZL0mSpOXgoL/GS5IkabkweEmSJHVi8JIkSerE4CVJktSJwUuSJKkTg5ckSVIn/x9m\nRStyf39RXgAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "## For each of the top-k websites, show the most popular\n", "## addresses (base urls)\n", "\n", "m = 3 # Show at most m addresses...\n", "pct = 0.90 # ... or stop at 90% of visits\n", "\n", "# For each of the top-k websites...\n", "for website_name, website_visits in top_websites:\n", "\n", " # ... store the most frequently visited base urls ...\n", " website_addresses = sorted(addresses[website_name].items(),\n", " key = lambda x: x[1], reverse = True)\n", " top_addresses = []; visits = 0.\n", " for address, address_count in website_addresses:\n", " visits += address_count\n", " top_addresses.append((address, address_count))\n", " if len(top_addresses) > m or visits / website_visits >= pct:\n", " break\n", " \n", " # ... and the number of visits to addresses that are not among the top\n", " other_num = website_visits - visits\n", "\n", " # make a pie-chart for this website\n", " # if it is associated with many addresses\n", " if len(top_addresses) >= m: # TODO change this condition if you want\n", " plt.figure(figsize = (7,7))\n", " labels = [x[0] for x in top_addresses] + [\"other\"]\n", " sizes = [x[1] for x in top_addresses] + [other_num] \n", " # arbitrary choice of colors -- I like blue\n", " n = float(len(sizes))\n", " colors = [( p / (n + 1.), 0., (1. - p / (n + 1.)))\\\n", " for p in xrange(len(sizes))]\n", " colors[-1] = 'grey'\n", " plt.pie(sizes, labels=labels, colors=colors,\n", " labeldistance = 1.1, autopct='%1.1f%%', startangle = 90)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 16 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Resources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For more information on the tools we used in this session, check the following websites.\n", "1. Tutorial on the [sqlite3 command line tool](http://zetcode.com/db/sqlite/tool/)\n", "2. Python's documentation for the [sqlite3 module](https://docs.python.org/2/library/sqlite3.html)\n", "3. [Running scripts in iPython]( http://nbviewer.ipython.org/github/ipython/ipython/blob/d835d46dcc50043971b4a9915398bad1b5d63648/docs/examples/notebooks/Script%20Magics.ipynb)\n", "4. [Markdown syntax](http://daringfireball.net/projects/markdown/syntax)" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": null } ], "metadata": {} } ] }