tda-networks/bitcoinalpha.ipynb
2018-06-20 12:47:48 +01:00

531 lines
47 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bitcoin Alpha network"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"autoscroll": false,
"collapsed": false,
"ein.tags": "worksheet-0",
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"autoscroll": false,
"collapsed": false,
"ein.tags": "worksheet-0",
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"import igraph as ig\n",
"import dionysus as d"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"plt.style.use(\"fivethirtyeight\")\n",
"plt.rcParams[\"figure.figsize\"] = 10, 6"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data import"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"autoscroll": false,
"collapsed": false,
"ein.tags": "worksheet-0",
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"G = ig.read(\"data/bitcoin/bitcoinalpha.graphml\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"autoscroll": false,
"collapsed": false,
"ein.tags": "worksheet-0",
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"G.to_undirected(combine_edges=\"first\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'IGRAPH U-W- 3783 14124 -- \\n+ attr: id (v), label (v), Edge Label (e), id (e), rating (e), time (e), weight (e)'"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"G.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Weight rank clique filtration and persistent homology"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"from filtration import wrcf"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def get_diagram(graph, weight=\"weight\"):\n",
" filt = wrcf(graph, weight=weight)\n",
" pers = d.homology_persistence(filt)\n",
" return(d.init_diagrams(pers, filt))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 10., 9., 8., 7., 6., 5., 4., 3., 2., 1., -1.,\n",
" -2., -3., -4., -5., -6., -7., -8., -9., -10.])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.unique(G.es[\"rating\"])[::-1]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"dgms = get_diagram(G, weight=\"rating\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Diagram with 3783 points,\n",
" Diagram with 29472 points,\n",
" Diagram with 1410 points,\n",
" Diagram with 175 points,\n",
" Diagram with 10 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dgms"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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WrVKEydOvLQzBwAAgJGabQ1sQUGB+vbtq5CQEP3617/WE088IbvdLkn65JNPdObMGY0aNcpbf/XVVysqKkp79+5VQkKC3G63oqKivOFVkhISEvT999/rk08+0YgRI+R2u332UV/z1ltv6cyZM+rcuXODYystLW2u02yX6I919Mo6emWdf3rFuj8Al6613q9cLlej25slwI4ePVp33HGHIiIi9MUXX2jx4sWaMGGCdu7cqS5duqiyslKBgYHq0aOHz/PsdrsqKyslSZWVld7AW69Hjx4KDAz0qRk5cuQF+zh79qyqq6sVGhra4PiaakJHVlpaSn8solfW0Svr6BUAk7SV96tmCbCTJ0/2/nvAgAEaNGiQBg4cqB07dmjChAnNcQgAAABAUgvdyKBXr14KCwvT559/LklyOBw6d+6cqqurfeqqqqrkcDi8NVVVVT7bq6urde7cuUZrqqqq1KlTpwtmdwEAANA+tUiAra6uVnl5ufdDXYMGDVLnzp2Vl5fnrfnqq69UUlKiuLg4SVJsbKxKSkp8Lq2Vl5enLl26aNCgQd6aH++jvubGG2+86PpXAAAAtC+WAmxNTY2KiopUVFSk8+fP68svv1RRUZGOHDmimpoaPf7443K73SorK1N+fr6mTZsmu92u22+/XZIUEhKie+65R0899ZR27typTz/9VDNmzNCAAQO8a1pHjRql6OhozZw5U59++ql27typJ598Uvfee6+6d+8uSUpKSlJ5ebkWLFigkpISvf7669qwYYNmz57dMt0BAABAm2NpDez+/ft1xx13eL9PT09Xenq67r77bi1btkzFxcV6++23dezYMTmdTg0fPlzr169Xt27dfJ4TGBiopKQk1dbWasSIEfrjH/+owMBASVJgYKDeeecdpaWl6bbbbtOVV16pxMREPfvss959REZGauPGjVq0aJGysrIUGhqqjIwMLqEFAADQgQR4PJ46fw8C/sMnoK2jV9bRK+v81SubLaTVjwnAbIWF+9rMe3uLrIEFAAAAWkqz3cgAAAAALc/jOeaX47al+9MQYAEAAAziryVAhYV+OWyDWEIAAAAAoxBgAQAAYBQCLAAAAIxCgAUAAIBRCLAAAAAwCgEWAAAARiHAAgAAwCgEWAAAABiFAAsAAACjEGABAABgFAIsAAAAjEKABQAAgFEIsAAAADAKARYAAABGIcAC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AACAUQiwAAAAMEqAx+Op8/cgAAAAAKuYgQUAAIBRCLAAAAAwCgEWAAAARiHAAgAAwCgEWAAAABiFAAsAAACjEGDbqWXLlik+Pl69e/fWtddeq6lTp6q4uLjR55SVlclms13w9cEHH7TSqP0jPT39gnO+7rrrGn3OgQMHNG7cOIWGhio6OloZGRmqq2v/V6QbOHBgg6+Ru+6666LPaag+KyurFUfdOj766CNNmzZN0dHRstlsevPNN32219XVKT09Xf369VNoaKjGjx+vgwcPNrnfLVu2KC4uTg6HQ3Fxcdq6dWtLnUKraaxXZ86c0VNPPaVhw4YpLCxMUVFRmj59uo4cOdLoPvPz8xt8rR06dKilT6dFNfW6SklJueCcR48e3eR+d+/erZtvvllOp1M33HBDu/iZbKpXDb0+bDab0tLSLrrP9vh70Uo+MOH9igDbTu3evVsPPvigduzYoZycHHXq1El33nmnvv322yaf++6776qkpMT7NWLEiFYYsX+5XC6fc/74448vWnv8+HFNmjRJDodDubm5WrJkiV566SWtWrWqFUfsH3l5eT59+vDDDxUQEKA777yz0ef94Q9/8Hne3Xff3Uojbj0nT55U//79tWTJEgUFBV2wfeXKlVq9erUyMjKUm5sru92uSZMm6cSJExfdp9vt1gMPPKDExETl5+crMTFR999/v/bt29eSp9LiGuvVd999p08//VRpaWn68MMPtWHDBn311VeaMmWKzp492+S+9+zZ4/Nau/baa1vqNFpFU68rSRo5cqTPOW/atKnRfR4+fFh33XWXYmNjtWvXLj366KOaN2+etmzZ0hKn0Gqa6tWPe1RSUqK3335bkpp8/5La1+9FK/nAhPerTi2yV/jd5s2bfb5/+eWXFR4erj179mjs2LGNPvcXv/iFnE5nSw6vzenUqZPlc960aZNOnTqlzMxMBQUFqX///jp06JDWrFmj2bNnKyAgoIVH6z89e/b0+f6NN95Qt27dNGnSpEafFxIS0u5fU2PGjNGYMWMkSampqT7b6urqlJmZqUceeUQTJ06UJGVmZsrlcik7O1tJSUkN7jMzM1PDhw/3zhBFRUUpPz9fmZmZWrduXQueTctqrFchISH685//7PPY8uXLNXToUJWUlGjAgAGN7ttut6tHjx7NO2A/aqxX9bp06XJJP1/r169XaGioli5dKumH19W+ffu0atUq7+vTRE316qc92rZtm/r27avf/OY3Te67Pf1ebCofmPJ+xQxsB1FTU6Pz58/LZrM1WXvPPfeob9++uvXWW43/H7lVhw8fVr9+/XT99dfrgQce0OHDhy9a63a7ddNNN/n8Dz8hIUHl5eUqKytrhdG2DXV1dXrjjTc0derUi84M1VuwYIH69Omj+Ph4ZWVl6fz58600yrahrKxMFRUVGjVqlPexoKAgDRs2THv37r3o8woLC32eI/3wWmvsOe1R/ayPlfevkSNHKioqShMmTNCuXbtaemhtQkFBgfr27avBgwfroYceUlVVVaP1bre7wdfV/v37debMmZYcaptRU1OjzZs367777rNU355/L/40H5jyfsUMbAexYMECDRw4ULGxsRet6dq1q5599lkNHTpUnTp10rZt25SUlKTMzExNnTq1FUfbumJiYrRmzRq5XC4dPXpUS5cu1ZgxY7Rnzx794he/uKC+srJSYWFhPo/Z7XbvtsjIyNYYtt/l5eWprKxM9957b6N1ixYt0vDhwxUcHKwPP/xQjz/+uKqrqzV37txWGqn/VVRUSPrX66Se3W5XeXl5o89r6DmVlZXNP8g26vTp03r88cd122236d///d8vWhcaGqply5bpV7/6lU6fPq133nlHEydO1F/+8hcNGzasFUfcukaPHq077rhDERER+uKLL7R48WJNmDBBO3fuVJcuXRp8TmVlpUaOHOnzmN1u19mzZ1VdXa3Q0NBWGLl/ZWdn6/Tp000uZ+oIvxd/mg9Meb8iwHYAixYt0p49e7R9+3YFBgZetK5Hjx76z//8T+/3N954o/75z39q5cqV7eYHtSG33HKLz/cxMTEaNGiQNmzYoNmzZ/tpVG3fa6+9pl/96lcaOHBgo3Xz5s3z/vv666/X+fPn9d///d8dKsDi5zl79qySk5N17NgxvfXWW43WulwuuVwu7/exsbH64osv9Ic//KFdB9jJkyd7/z1gwAANGjRIAwcO1I4dOzRhwgQ/jqxte+211zRu3LgLlkX9VHv/vWg1H7RFLCFo5xYuXKh3331XOTk5P2tmcPDgwfr888+bf2BtWNeuXdWvX7+LnrfD4bjgT3T13zscjhYfX1tQVVWlbdu2Wf7z248NHjxYx48f71CziPVr5xp63TT2mnE6nZf8nPbi7NmzevDBB3XgwAFt2bKlwb+GNKUjvn/16tVLYWFhjZ73xd7DOnXq1K7WD19MUVGR9u/f/7Pev6T287q6WD4w5f2KANuOzZ8/3/vibOqyUBfz2WeftZuF61bV1taqtLT0oucdGxurgoIC1dbWeh/Ly8tTr169FBER0VrD9KsNGzaoS5cuPrM/Vn322We68sorFRIS0gIja5siIiLkdDqVl5fnfay2tlYFBQWKi4u76POGDBni8xzph9daY89pD86cOaOkpCQdOHBAW7du/dnvQR3x/au6ulrl5eWNnndsbGyDr6sbb7xRnTt3bukh+t1rr72miIiIC5ZRWNUeXleN5QNT3q9YQtBOpaWl6Z133tGf/vQn2Ww275qW4OBgde3aVZL0zDPP6H/+53+Uk5Mj6YdQ0rlzZ11//fX6t3/7N23fvl1r167V008/7a/TaBX16+uuvvpq7xrY7777zrs26qd9mjJlijIyMpSamqq0tDT9/e9/14oVKzRv3rx2fQWCenV1dXr99df129/+1vtaqvfKK6/o1VdfVWFhoSTpr3/9qyorKzVkyBAFBQUpPz9f6enpuu+++y66Ps9UNTU13lmZ8+fP68svv1RRUZGuuuoq9e7dWykpKVq2bJlcLpf69u2rF198UcHBwZoyZYp3HxMmTNDgwYP11FNPSZJmzpypcePGafny5Ro/frzef/995efna/v27X45x+bSWK969eql++67T/v379dbb72lgIAA7/tX9+7dvR8YnDFjhqQfPkEtSWvWrFF4eLiio6N1+vRpbdy4UX/5y1/0+uuv++EMm09jvbrqqqu0ZMkSTZgwQU6nU1988YX+67/+S3a7Xbfffrt3Hz/tVVJSkl599VUtWLBASUlJ2rt3rzZs2KC1a9e2/gk2o6Z+BqUfLtO2adMmPfTQQw2+X3eE34tN5YOAgAAj3q8IsO1U/RvRTy+JMn/+fC1cuFCS9M033+gf//iHz/YXX3xRR44cUWBgoK699lqtWrWqXazzaczXX3+t6dOnq7q6Wj179lRMTIz+9re/KTw8XNKFfQoJCdF7772ntLQ0xcfHy2azadasWR1mvWx+fr7+7//+T6+88soF26qrq1VaWur9vnPnzlq7dq0ee+wxnT9/XpGRkVq4cKF+//vft+aQW8X+/ft1xx13eL9PT09Xenq67r77bmVmZurhhx/WqVOnNHfuXHk8Hg0ePFibN29Wt27dvM/5xz/+4fNBpbi4OGVlZWnx4sV6/vnndc011ygrK0sxMTGtem7NrbFeLViwQNu2bZOkC2bIVq9erd/97neSpC+//NJn25kzZ/Tkk0/q66+/1pVXXqno6Ght3LjRe1klUzXWq2XLlqm4uFhvv/22jh07JqfTqeHDh2v9+vU+r6uf9ioyMlIbN27UokWLlJWVpdDQUGVkZBh9CS2p6Z9B6YdLSJ08edL7OvqpjvB70Uo+MOH9KsDj8bT/2wcBAACg3WANLAAAAIxCgAUAAIBRCLAAAAAwCgEWAAAARiHAAgAAwCgEWAAAABiFAAsAAACjEGABAABglP8P+68WqQ1zjLsAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"d.plot.plot_bars(dgms[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Normalize the time scale"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1289192400.0, 1453438800.0)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"time_min = min(G.es[\"time\"])\n",
"time_max = max(G.es[\"time\"])\n",
"time_min, time_max"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"G.es[\"time\"] = (np.array(G.es[\"time\"]) - time_min) / (time_max - time_min)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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fZ2h24dTQJI2bdqkhQsXau3atQG/+A7+c+bMGT366KP62c9+pqFDh3Z1OeiACxcuyGKxaO3atfqbv/kbpaWlqbi4WJWVlXxDYBA5ePCgnnnmGeXn5+ujjz7Su+++q8bGRs2dO7erS0MQMe5WUp3tWm78b7fbLzu+R48erJXqIh35AodNmzZp9uzZeu2115SRkRHIMnEVvvbx+PHjqqur05NPPqknn3xS0rchx+12KzIyUu+8884lH0ki8K7l/RgVFaUBAwaoX79+nm0jRoyQJB09epQvYukC19LH5cuXa8yYMXr66aclSTfffLN69eqljIwMLVy4UIMGDQp43eiYK2Wci/s6Q7efOb2WG/8nJSVddvxtt92m6667LmC14squ9Qsc3nvvPc2aNUu/+MUvNGXKlECXiavwtY8DBw7UJ598ou3bt3t+Hn30UQ0bNkzbt29XUlJSZ5WOv3At78dx48bp+PHjXmtMv/jiC0lSTExM4IrFFV1LH0+dOnXJ8pqLv1+4cCEwhcKvkpKSVF1drdOnT3u2VVVVacCAARoyZEin1BA2f/78n3bKkQzWp08fFRUVKTo6Wt/73vdUXFysTz75RK+++qr69eunWbNm6V//9V91//33S5L++q//WqtWrZLT6VRMTIy2bNmin//851q8eLFGjhzZxWfTffnax3fffVc5OTl6/vnnNXHiRLW2tqq1tVXnzp1r1+02EBi+9DEsLEw2m83r549//KO++OILFRYW6vrrr+/q0+m2fH0/3nTTTdqwYYP27t2rkSNH6osvvlB+fr7uuOOO77yyGIHlax9PnTql1atXKzIyUjfccIMOHjyo+fPnKyoqSnPmzOnis+meWlpadPDgQTU2NurNN99UYmKi+vbtq7Nnz6pfv356/vnntXz5cj344IOSpOHDh+uNN97Qvn37FBcXp+rqai1cuFBz587ttG/r7PYf60vf3vj/f//3f1VcXKzGxkYlJCR43fj/6NGjXuOHDh2qt99+W88++6zWr1+v6OhoLV26lJm3LuZrH9evX6/z58+rsLBQhYWFnu133HGHPvjgg06tHf+fr32EmXztY+/evfX++++roKBAqampslqtmjx5crtvA4fA8LWPDz30kFpaWrR27Vo999xz6tu3r1JSUvTTn/60C6qHJO3Zs8fzjwdJKioqUlFRkR588EGVlpbq+PHj+q//+i/P/n79+um9997TvHnzNGHCBFmtVj355JN66qmnOq1m7nMKAAAAY3T7NacAAAAwB+EUAAAAxiCcAgAAwBiEUwAAABiDcAoAAABjEE4BAABgDMIpAAAAjEE4BQAAgDH+H9z1tm6WAZRLAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.hist(G.es[\"time\"], bins=50);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Discretize the time scale using non-overlapping windows"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [],
"source": [
"N = 8 # Number of windows"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [],
"source": [
"subgs = list(range(N))\n",
"for i in range(N):\n",
" subgs[i] = G.subgraph_edges(G.es(lambda e: (e[\"time\"] < (i+1)/N) & (e[\"time\"] > i/N)))"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'IGRAPH U-W- 3783 14124 -- \\n+ attr: id (v), label (v), Edge Label (e), id (e), rating (e), time (e), weight (e)'"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"G.summary()"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"IGRAPH U-W- 1203 3017 -- \n",
"+ attr: id (v), label (v), Edge Label (e), id (e), rating (e), time (e), weight (e)\n",
"IGRAPH U-W- 779 1714 -- \n",
"+ attr: id (v), label (v), Edge Label (e), id (e), rating (e), time (e), weight (e)\n",
"IGRAPH U-W- 999 2820 -- \n",
"+ attr: id (v), label (v), Edge Label (e), id (e), rating (e), time (e), weight (e)\n",
"IGRAPH U-W- 1201 2959 -- \n",
"+ attr: id (v), label (v), Edge Label (e), id (e), rating (e), time (e), weight (e)\n",
"IGRAPH U-W- 776 1721 -- \n",
"+ attr: id (v), label (v), Edge Label (e), id (e), rating (e), time (e), weight (e)\n",
"IGRAPH U-W- 562 1285 -- \n",
"+ attr: id (v), label (v), Edge Label (e), id (e), rating (e), time (e), weight (e)\n",
"IGRAPH U-W- 231 447 -- \n",
"+ attr: id (v), label (v), Edge Label (e), id (e), rating (e), time (e), weight (e)\n",
"IGRAPH U-W- 95 155 -- \n",
"+ attr: id (v), label (v), Edge Label (e), id (e), rating (e), time (e), weight (e)\n"
]
}
],
"source": [
"for g in subgs:\n",
" print(g.summary())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Apply persistent homology to each window"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [],
"source": [
"from dask.distributed import Client"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [],
"source": [
"client = Client(processes=False)"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [],
"source": [
"dgms = client.map(get_diagram, subgs)"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'inproc://129.67.184.177/6482/23': 32}"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"client.ncores()"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[[Diagram with 1203 points,\n",
" Diagram with 945 points,\n",
" Diagram with 8 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 779 points,\n",
" Diagram with 399 points,\n",
" Diagram with 7 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 999 points,\n",
" Diagram with 628 points,\n",
" Diagram with 107 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 1201 points,\n",
" Diagram with 647 points,\n",
" Diagram with 27 points,\n",
" Diagram with 1 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 776 points,\n",
" Diagram with 372 points,\n",
" Diagram with 16 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 562 points,\n",
" Diagram with 189 points,\n",
" Diagram with 11 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 231 points,\n",
" Diagram with 111 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 95 points,\n",
" Diagram with 31 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points]]"
]
},
"execution_count": 76,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dgms = client.gather(dgms)\n",
"dgms"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "plotting not available",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-86-c9bce81ae290>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msubgs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/.local/share/virtualenvs/tda-networks--KypeAmE/lib/python3.5/site-packages/igraph/drawing/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(obj, target, bbox, *args, **kwds)\u001b[0m\n\u001b[1;32m 444\u001b[0m \u001b[0mbbox\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mBoundingBox\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbbox\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 445\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 446\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPlot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtarget\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbbox\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbackground\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"background\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"white\"\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 447\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 448\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m\"margin\"\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.local/share/virtualenvs/tda-networks--KypeAmE/lib/python3.5/site-packages/igraph/drawing/__init__.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, target, bbox, palette, background)\u001b[0m\n\u001b[1;32m 115\u001b[0m \"\"\"\n\u001b[1;32m 116\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_filename\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 117\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_surface_was_created\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtarget\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcairo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSurface\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 118\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_need_tmpfile\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.local/share/virtualenvs/tda-networks--KypeAmE/lib/python3.5/site-packages/igraph/drawing/utils.py\u001b[0m in \u001b[0;36m__getattr__\u001b[0;34m(self, _)\u001b[0m\n\u001b[1;32m 394\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 395\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getattr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 396\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"plotting not available\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 397\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 398\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"plotting not available\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: plotting not available"
]
}
],
"source": [
"ig.plot(subgs[0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}