{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " \n", " \n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from bokeh.io import output_notebook, show\n", "output_notebook()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas as pd\n", "import networkx as nx\n", "\n", "from utils import GPG" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "220" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gpg = GPG()\n", "data = pd.DataFrame(gpg.to_dict())\n", "data = data.fillna('')\n", "len(data)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "g = nx.Graph()\n", "\n", "def add_node(row):\n", " key = row.keyid\n", " g.add_node(key)\n", " \n", "def add_edge(row):\n", " key = row.keyid\n", " for connection in row.signedbykeys:\n", " g.add_edge(key, connection)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Add nodes & edges to Graph and layout" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "220" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.apply(add_node, axis=1)\n", "len(g.nodes())" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "225" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.apply(add_edge, axis=1)\n", "len(g.edges())" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "pts = nx.spring_layout(g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Make data frames" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "225" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "start_keyids = []\n", "end_keyids = []\n", "xs = []\n", "ys = []\n", "for edge in g.edges():\n", " # Each edge is a tuple of start and end.\n", " start_id = edge[0]\n", " end_id = edge[1]\n", " start_keyids.append(start_id)\n", " end_keyids.append(end_id)\n", " \n", " # Get the xs and ys\n", " start_pt = pts[start_id]\n", " end_pt = pts[end_id]\n", " xs.append([start_pt[0], end_pt[0]])\n", " ys.append([start_pt[1], end_pt[1]])\n", "edges = pd.DataFrame(dict(keyid=start_keyids, end_keyids=end_keyids, xs=xs, ys=ys))\n", "len(edges)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "220" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "points = pd.DataFrame(pts)\n", "points = points.transpose()\n", "points = points.reset_index()\n", "points = points.rename(columns={\n", " 0: 'x',\n", " 1: 'y',\n", " 'index': 'keyid'\n", " })\n", "\n", "points = data.merge(points)\n", "def lookup_line_index(point_row):\n", " keyid = point_row.keyid\n", " dir_1 = tuple(edges[edges.keyid == keyid].index.get_values())\n", " dir_2 = tuple(edges[edges.end_keyids == keyid].index.get_values())\n", " selected_edges = dir_1 + dir_2\n", " return selected_edges\n", "\n", "points['line_indexes'] = points.apply(lookup_line_index, axis=1)\n", "points.line_indexes = points.line_indexes.apply(lambda x: list(x))\n", "points.uid = points.uid.str[0:60]\n", "len(points)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " | keyid | \n", "signedby | \n", "signedbykeys | \n", "timestamp | \n", "uid | \n", "x | \n", "y | \n", "line_indexes | \n", "
---|---|---|---|---|---|---|---|---|
0 | \n", "ED18B68D16194553 | \n", "[] | \n", "[] | \n", "Sat, 25 Jul 2015 23:56:19 -0000 | \n", "\n", " | 0.262829 | \n", "0.617023 | \n", "[0] | \n", "
1 | \n", "77EEDF0317F55690 | \n", "[] | \n", "[] | \n", "Sat, 25 Jul 2015 23:56:19 -0000 | \n", "\n", " | 0.495331 | \n", "0.371764 | \n", "[1] | \n", "
2 | \n", "3D533EC06F80F701 | \n", "[] | \n", "[] | \n", "Sat, 25 Jul 2015 23:56:19 -0000 | \n", "\n", " | 0.746342 | \n", "0.707128 | \n", "[2] | \n", "
3 | \n", "231CD035A9D1ACF9 | \n", "[] | \n", "[] | \n", "Sat, 25 Jul 2015 23:56:19 -0000 | \n", "\n", " | 0.491345 | \n", "0.897368 | \n", "[9] | \n", "
4 | \n", "DE24858541A53190 | \n", "[] | \n", "[] | \n", "Sat, 25 Jul 2015 23:56:19 -0000 | \n", "\n", " | 0.110171 | \n", "0.412812 | \n", "[4] | \n", "