{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import pandas\n",
    "import geopandas\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import sys\n",
    "from esda.adbscan import ADBSCAN, get_cluster_boundary, remap_lbls"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Set up three clusters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fe6a27c3e50>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEGCAYAAABsLkJ6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3de5RcVZX48e++tx55P0wikEcTNUQniSRAjwGDyGOchSGE+WlADRhHZ8hiLcI4o5KoDCKy1m+EqL9Rk9GJ6Gg0OvJQCQ8dGQmDyUDGhunEdEBoH+SFJLQk0CGp6rp1fn/Uo2/durdeXVW3qnt/1nKSrsetk5rmnHv22WcfMcaglFJq5LHCboBSSqlw6ACglFIjlA4ASik1QukAoJRSI5QOAEopNUJFwm5ANaZOnWpmz54ddjOUUqqtPPnkky8ZY6Z5H2+rAWD27Nl0dXWF3QyllGorIvK83+MaAlJKqRFKBwCllBqhdABQSqkRSgcApZQaoXQAUEqpEUoHAKVUKPr6E+zaf5S+/kTYTRmx2ioNVCk1PNzXfZB19+4malkMpNPc8d4zWb5oRtjNGnF0BqCUaqq+/gTr7t3NyYE0ryZSnBxIs/be3ToTCIEOAEqppjrw8gmiVmHXE7UsDrx8IqQWZdQakmrnUFbDQ0Ai8i1gGXDYGLPA89wngPXANGPMS41ui1IqfDMnj2YgnS54bCCdZubk0SG1qPaQVLuHspoxA/g2cKn3QRGZBbwL2NeENiilWsSUcXHueO+ZjIpajI9HGBW1uOO9ZzJlXDyU9tQakhoOoayGzwCMMY+JyGyfp/4fsBa4r9FtUEq1luWLZjDvtAl07z/KolmTmHPK+NDakgtJnWRwVpILSZUalGp9XysJJQtIRJYDB40xu0Sk3GtXA6sBOjo6mtA6pVSjtVLopNaQVCuGsqrV9EVgERkD3AR8ppLXG2M2GWM6jTGd06YVVTNVSrWZZoZOKlmgrTUk1WqhrFqEMQN4E/AGIHf3PxN4SkTeZoz5YwjtUUo1UbNCJ9XMMpYvmsGSOVM58PIJZk4eXXE7an1fq2j6AGCM+TXw+tzPIvIHoFOzgJQaGZoROnHPMnIDzdp7d7NkztTATnrKuHhNHXit72sFDQ8BicgPgMeBN4vIARH5m0Z/plKqdTUjdOK318C2hG3PHG6rLJ1GE2NM2G2oWGdnp9ETwZQKR19/YsihDvc1gIaFTvr6Eyy5/RFODhTONMbGbBxj2i5ff6hE5EljTKf3ca0FpJQqqx5ZO83M/MnNMtbeuxvbEo4nHACOJzN/lgsHedVj8GtFOgAopUqqJZ7eiGtU+jm5jjq3QLvtmcPcsrUn3/lDdYvOrZSyWm9aC0gpVVI9avc0o/7Pfd0HWXL7I1xz506W3P4IW7sPMmVcnIve8nocT6i70kXn4bDbtxQdAJRSJdUja6eRmT99/Qkee/Ywa+/Z5dtRD2XRuVUL19WLhoCUUiW54+nuMEg1oZt6XMNPLjxjiZBIFd7lu8M8tebrt8pu30atQegAoJQqqx4bniq5RlBH5/e4Ozzjx9tR15Kv36iBqxqNXIPQAUApVZF6bHgqdY2gji7ocb8dxQBjojZpzJA76tygs2TOVHasuziULKBGL57rAKCUaopSYYy+/gRr79lNIlXY0c07bUJRB3jjPZkO0C88E49YfP2D5zB/+oQhdZCtkvnT6LIZugislKpJNSdheTN0tux8vuC9W3buI5Eq7MyjlkX3/qNFi7CJVJrv79yXD8/EIxZjYjbxiMX6FWdywdxpQ77zb5XMn0avQegMQClVtWrukP3CGDf9eE9+V+7Ny+axcdtzRe9LOmlmTxlDIuUUPbdh23OsXNxBZtnXgJHMn/jPNHpffLXiswf87rotEXoOHeOCua8v8U5/Q1nAbfQahJaCUEpVJNeRjY3ZLNuwvWDxdVTUYse6i307pl37j3LNnTt5NZHyvW7EFmKW8JpnMXfpglN55DeHcdKGAaewnxofj7Dx6rO5dnNXwcwhYoFtWcTswc6y6w9/YvMTgwcPrjqvg89d8daCf5N3cfntn/9FUVZRzIYbLp7LysUdFS9g1yuUNNQsIC0FoZSqmbsjS6QcLKvwICdvXNrdYfmFMdxSjiHl6eBtgYf3/pGABB8G0mke/+1LRWGjVBpS6XT+8Ruz6wpumx/fx6pzZ9Pzwiu+nfP23pdI+9wXJx344sPPsmFbL+tXFHbkfh39kjlT67aA26iKo7oGoJQqyRsTTzqmKPXSHZf2xvt39L6U34g1Nm5X9JmOwbfzj1rCqKjFzcvm8a0dvy97nXRAhGN77xHfOH/vi6+y7t7dRTMOt0SqcE0gaM2g59ArLb+JTGcASqmS/GLicVswIsTtwrh0UNrijnUX51Mp9xw8xq3395As0ckGSWP4wUcWE43YRG2raH3AEgru3oM68qnjRvlm1+QWnb2ppV7uGU9Qpg6YlthEVooOAEqpkvxCOGIJD645n+NJpyAuXSptceGsSUwZF2fhrEksfsPrWPrV7SRTpTtaLycNK7/5P/zVoun0Jwo7/6iFb+jG67IFp3Lem6b4ds6LZk0qGa7KOTGQynfkQZk686dPDH0TWTkaAlJKlRRUS2fOKePznXrOzMmjOTFQuNj7WjLFsRPJgpDJ8aTDLZfPY1TUYlS0um4omUpzV9eBosfTCJaIzzsGRSz4h3fNLflv8j7+6aVvIeJZ8xDX55SqNbR80Qx2rLuY7/3tYnasu7jlqog2PAtIRL4FLAMOG2MWZB9bD1wOJIHfAh82xhwtdy3NAlIqPJVkovT1Jzj3n35RFHoZF7dJpQ1Xdc7krq4D+Tvij71rLrf/7Bmc6iYCNcsNNrkF30pKTxx4+URRFtP4eITv/e1iFs6a5PueVrrLh3CzgL4NbAA2ux57GPiUMSYlIrcDnwLWNaEtSqkaVZKJcuDlE4yK2Aw4hbOAXLhm8+OZdMxciGj9f/ymbOcftQQkOJ5fjdzi9Sfu2c30iaOIRmzfDtv7b60klt+OZwM3PARkjHkM+JPnsZ8bY3K/IU8AMxvdDqVU442N2b4bt4JU0qnHIhZXnTOLeETyIZZV53UQj5QO95SSTKVZ8a9P8L5Nj+fPDgjSjDOMw9KUjWAiMht4IBcC8jx3P/BDY8z3At67GlgN0NHRcc7zzz/fwJYqpWqVy4WHzJ12zJaaMn38jIvbDDiGNRfNyW/E6utP8P2d+9iwrbco179apTay5bRyiKecoBBQqIvAInITkAK2BL3GGLPJGNNpjOmcNm1a8xqnlKpYQfpnLoFfhE8vfUvBnfNlC06t6fr9CYdEKs3GR3vzj00ZF+eGS87gwRvO5+q3dRCzhdElFpS9C7luleTn5zKY2q3zLyW0NFAR+RCZxeFLTDvVo1BKFfHfK2Cx+A1TCkopv3w8yYN7/ljz53h3HLt34IrA0reeyr1PHfJ9ryWGqC2+YadWy89vllBmACJyKZlF3+XGmNfCaINSqn5KVa103zkfTzrE7SHE7h0n31F7d+AmUoat3YcC7/TjkQh/d/EZjIpa+Tbk0lCHS0y/Wg2fAYjID4ALgakicgC4hUzWTxx4OJtP+4Qx5rpGt0Up1Rjlqla6C8mJJZlaDwGu6pzJ1l2Zu3hvyYm0gR29L+UPhDFp72HvYIshYgmpoufSrFzcwcrFHfm25DayQaZoXTvG94ei4QOAMeYDPg9/s9Gfq5RqrqAjH72F0nJ7ASyE1wYKM4ZGRy2WnXkaV50zk/ffubPoMwYcw8fv3sWSOVMzGUc+A4ljIGYZ/vrtp7Nl5z5iEQsnXXhCmLuTb5XDX8KgpSCUUnXjzYX3qw10V9cBHlhzPoeOnSwq53xiIM2H/+1XIATuDxhwDD2HjjFxdIxRUcv3TOCkA999/HlGRW0GUmluuXy+78avRh+52Op0AFBKDVlQimRQbaDjSYcL5k5j/Yozi0o2O4bc2S4lSNlFW8fA8WRmhnHbg3vzf7rv9E+fMrahRy62Oq0FpJQaEm/5Z/emqnJHGi5fNINvrOpkTLSyMtGQqeeTO/M3t0GrXDkhW4RbH9hbVLJ5bMxu+YqdjaQDgFKqJn39CR579jBr79kVeH6uu5MeG7eJRTK1/N131/OnT8AxwRu5bIGYnTkHIGoLt16xIP/+XLG1b/7124hHgruzASezMc0tNxMZrrt8K6EhIKVU1XILp5ZI0dGJ3hDK8kUzePVkilvv7yFqW9z2wF7GxyP5hdYp4+Jc8pZTeMhnf0DMFr5w5cL8+2MB779g7jTe9+cz87WGAAQYF48wkE5z82Xz8mGgnNyd/sJZk3wXr8tp553BOToAKKWq4l449eMNofT1J7jtwb0kHUPSycTk3Qutff0JfvHM4aLrRG3hob97B5PHxlhy+yOB7899hrdEdCxisfHqs/PhovGjIoFpqtUWchsumUM6ACilquK3sAswJmqTxhSFUPxeb4nQc+gYF8x9PQdePkHMtorq+fzdxWcw55Tx7PI5pcs7y/D7jJhtMXF0tGAmUsudvtdwyhzSAUApVRW/hd14xOLrHzwnf7dd7vWvJR2u3dzF+hULWTJnqu/1Vi7uCHy/d5ZRyWugPiWbS5161m4DgC4CK6Wq4lceef2KM7lg7jTfDjD3eu8ibSJlWJutHup3PXd4ptxCrfszxsRs4pHGLeZWOti0A50BKKWqVm04ZfmiGUwaE+O67z5ZsPs3d+dc7nqVfJ7J/V8jVLCRoGblyl60Ex0AlFI1qTac4pfu6b5zzl2vrz/hW5en1Ofl4vKZjCT/heJ6qtd6Qth0AFBK1UW5tMjtvS/hrs8WsSi6c641u6aSuHy90zbb8QhILx0AlFJDVq7jzt2hu2vx25bFkjlTi15TS3ZNubj8cEnbrDddBFZKDYm3Lr93NzAM3qG7xezCU7j8XlPJSV1QeqG4kvYF/bt27T9a9nXtTGcASqkhqST8Us9UziBBcfla0jZHyoxBZwBKqSGppOOuJpWz2ro87jt1v3N7qx1Yap0xtCOdASilhqTStMhKMmeqza6p5E692rTN4bTRq5xmHAn5LTKHvx82xizIPvY64IfAbOAPwFXGmJcb3RalVGNU2nFXkjlTaXZNNYvG1Qwsw2mjVznNCAF9G7jU89gngV8YY84AfpH9WalQjYRFv0byC780UrWLxpW2r9ZQVDtqxpnAj4nIbM/DV5A5KB7gO8CjwLpGt0WpICNl0W84aeSd+nDZ6FVOWIvApxhjXgDI/vn6oBeKyGoR6RKRriNHjjStgWrkGEmLfu3Kb3bW6Dv1Zs9owtDyi8DGmE3AJoDOzs7GFfhQI9ZIWvRrR6VmZyPlTr1RwpoBvCgipwFk/yw+DUKpJhlJi37tppLZ2Ui4U2+UsAaArcCHsn//EHBfSO1QakQt+rWboewOVuU1Iw30B2QWfKeKyAHgFuDzwF0i8jfAPuDKRrdDqVI0lNCadHbWWM3IAvpAwFOXNPqzlarGcKjuONwMp9r7rajlF4GVUiObzs4aRwcApVTL09lZY2gxOKWUGqF0AFBKNYyW12htGgJSSjWEltdofToDUErVnZbXaA86ACil6k43cLUHHQCUUnWnG7jagw4Aqm3ogmL70PIa7UEXgVVb0AXF9qMbuFqfDgCq5VVz9J9qLbqBq7VpCEi1PF1QVKoxdABQLU8XFJVqDB0AVMvTBUWlGkPXAFTL6+tPcPqUsTyw5nyOJx1dUFSqTnQAUC3NL/tn4axJYTdLqWEh1BCQiPyDiPSIyB4R+YGIjAqzPaq1NLKcgO4pUCrEGYCIzAD+DphnjDkhIncB7we+HVabVGvJZf/kUj9hMPtnKCEg3VOgVEbYi8ARYLSIRIAxwKGQ26NaSCOyf7RImVKDQhsAjDEHgS+QORT+BeCYMebn3teJyGoR6RKRriNHjjS7mSpEjcj+0T0FSg0KMwQ0GbgCeANwFLhbRK4xxnzP/TpjzCZgE0BnZ6dpekNVqOpdTkD3FCg1KMwQ0F8AvzfGHDHGDAA/At4eYntUi5oyLs7CWZPqkvqpewqUGhRmGug+4FwRGQOcAC4BukJsj2pDff2JqmcHWqRMqYzQBgBjzE4RuQd4CkgB/0s21KNUKblOf8/BY9z24F7N5lGqRqFuBDPG3ALcEmYbVHvJpXDaIhxPOgAFFULnnTah7G7hMNJAa5mpDOV9SlVCdwKrtuFO4fRj0oalX91O3A7u2HtffJUb795F0jFNKy1d64Cj+xVUo4W9D0CpivmlcLolHEMyVZjf3/viq/kdv/d1H2TpV7eTdAqTyaKWRc+hVxqyM7jWfQe6X0E1g84A1JA1K0zhl8IJMDZuM5BKY4ABV+fupA1Lv/JL4hGbpOOQNoXP55wYSHHt5i5iJWYOtap1N3OjdkEr5aYDgBqSZoYpcimca12fd/Nl81gwYyIDKYcV//pEwetznX3SSQVeM2oDCIlUmkSqfEio98VX6d5/lEWzJjHnlPFl21zrvgPdr6CaQQcAVbMwjmoMSuHctf8ocVtI+NzhB4lFLL505Zl86kd7GHANEkF32p/5ya/Z/MS+/M+rzuvgc1e8teznXH/hHDZse46YbecHyXLfj99gp/sVVL3pAKBqFlaYwu+c2ZmTRyOWQIkBwBaI2FZBqOe8N02t6E6798VXCzp/gM2P72PVubMLZgLucNj23pfysyMQVl/wRlYu7tD9Cqpl6ACgahZWmMJvzcHvjvmqzpnc1XUAkzYkHEM0YpFOp1m+cCYfXjLYcVdyp929/6hvW7r3H81fxx0Oc6855AbIjY/2snJxR1X/Vj1UXTWSDgCqZmGEKUqtOfjdMa86dzZLv7odMPn00S3/s497njrA+hWZ91Zyp70o4BCa3ON+4TAvXcRVrUYHADUkzQxTVLLm4L1jPp50iNsWyVRhp5xIpbnxnt1MGhNj/vQJZe+055wynlXndbD58cI1gNzdv184zEsXcVWr0QFADVkzwhR9/Qm2PXMYW6Tg8UwO/zFAAMP86RML2hKUOgqZQeC67z5JGlNR9tLnrngrq86d7ZsFFPQ5UVsYFRlc/IXMgrXG9FUrEGPap8JyZ2en6erSenEjTS7sE7GE/oRT8FzUFtJpk1/7jdrCF69cWNCZb9n5PJ/d2uO7ByBnVNRix7qLh9Qpb3nieW76yZ6Cx+IR4RurOpk/fWLBonDScVhz0RlVLQorVSsRedIY0+l9PHBbpYg8JCKzG9kopcpxh33cnf/YmE08YhV0/pBZdL3xnsEds/d1H+Rz9/cQ8cwcvOpxKMyCGRMZF7cLHovZNhNHxwAKdvYmUoYvPvwsb//8I2ztPjikz1WqVqVKQXwb+LmI3CQi0Sa1R6kCfp1yPGJx6/L5fGNVJ1G7+FfYtoQDL5+grz/Bx+/qJpEynEgFx+YBTqacIcfnZ04eTSpdOMvIxf2DylgkUlriQYUncAAwxtwFnAVMALpE5BMi8rHc/5rWQjWijY3ZRcXfEqk0o6I2T7/wCid9OnYnbZg5eTQ9h16hTL+fl04PPRRa6rCZUmsReiSlCku5ReAB4DgQB8ZDiRQHNaI1qh5QJouneIfvjXfvCryr/8zl85gyLs4rJ5IVf048YvumaFb77wrKisoNDjfes4tEyn+WoFSzBQ4AInIp8CVgK3C2Mea1prVKtZVG1gMK2uEb1PmPjlgsmD4RgAmjK49cOqa4E3afPTDgpLnl8vlcfe7pVf4LBuUGh+/v3MeGbb0FO5JLDS56JoBqlFIzgJuAK40xPY36cBGZBNwJLAAM8BFjzOON+jxVf42uB+TebGaJ8FrSKfn6NCbfke//U3BYJWJJPl5vC6y56IyC5/3OHrjpJ3tA4OrFwYNAucFwyrg4N1ySyf6ppFPXMwFUI5VaA3hHIzv/rC8DPzPGvAVYCDzd4M9Tdea3uFnPmHZff4LTp4zlgTXn8/VrziYeCc7miViwfsVCpoyL09ef4LYH9wa+9p/ft4jNH/lzrnvnG4nYwqbHfseS2wczcg68fKJozwHArffvDVywraaGfyUH3euZAKrRQtsIJiITgAuAvwYwxiSByoO2qiWMjdkknMbUA/K7+12/YmFROehZrxsNCNMnjuJ40smHTErtzJ0wOsL86RNZ/d0nSaQMiVSmGmhu9jJz8mgGHP+NXUHlHPw+0xZh2zOHuegtr696RtRz6BiWz8Y3LSeh6iXMncBvBI4A/yYiC4EngY8aY467XyQiq4HVAB0d1RXSUo2V66Alu5lwVDQzE6hHPaCg0NKOdRezY93FReGT+7oPsvq7XQUDQ2DWjS3Mnz4xsMM+8PIJFs6axF+dNZ27ugpz9AdSacbGbO8lAf/dwMeTDp+9v4d/vG9PVeGb+7oPslYXjFWDhXkkZAQ4G/iaMeYsMtlGn/S+yBizyRjTaYzpnDZtWrPbqAK4O+hchk46bXhgzfl1iVGXCi15wyd+oZLbHtzLzcvmMSpqEbczd9Ex2yIesfjilQsDUzOPJx32HDpGX3+CrbteKGpX2sCyDdt9N2+500Ddg0R/wqkqfJP793g7/3jE0jMBVF2FOQM4ABwwxuzM/nwPPgOAak1+d8/xiM3xMou0laqm1HTQuQQLpk/MzxYGUg5/6HutqIbPh98+m6/91+8KrvfZrT3MmjwG22e5IZU2pNKGT9yzm3mnTSg6FSyX6bPtmcPc9JM9+VPG3G0t14H7/XvGRG2+/sFzuGCu3gSp+gltADDG/FFE9ovIm40xvwEuAYJX7VRLafRZAJWWmu7rT3DsRJKkUzjw5NoyZVy8oAZP7jqGTGkGvyXlAcfw4O5DHE8Gb3tJptIs/cov+YKn7lCu7YtmTSrq/E8OBIeP3Py+2zSG+dMnlH2vUtUIuxroDcAWEYkBvwM+HHJ7VIWacRZAuVLT7kXitMlkAY2ORgra4reWcOM9u0kbU7I43A+7DpRtX9IxgSmvfhvY4rZUNEPS4yBVs4Q6ABhjuoGiCnWqPTTjLICgUtN+HXs8YrHx6rPz9f3BP5zivTMfCr+snMysZAAkU6I6RyypeIakx0GqZgh7BqDaXFhHFvp17DHbYuLoaMXnAVQjYoEgDHhqBiWdTBG5XOrpnoPHuO3BvUQtCyedLjoPoJrvSo+DVI2mA4BqS0FrEGNjdsGBK4M1eHYH3vnbAqvf+Ua+89/PB+40vmbx6dz71EEGEqmCx9dcdEZ+jcF9XsHgrAQ2Xn1W0UE1SrWCMNNAlapKX3+CXfuP0tef8K28edU5M1m2YTvX3LmzYFfv8kUz+MaqTkZF/H/dI7bFe8+aSTrgcKSYBRf/2SlFA048YvHuBaf6nleQf2/2PADt/FUr0hmAanl9/Qm27NzHxm3PEbPtgpo4uTj52JjNsg3bfWsSZRgMAR28bXHo2Amuv3AOG7b1Fs0ULNti/vQJ3PHeM/n43bvyi8dOOs1P9/yx5I5j3bilWpkOAKquhlK50u+9mR2xg+Ebb8mGl48nee7FVxkVtXz3AmzZuY9/ebQ3nynk52TK4drNXcRsGzAsfesp/OLpwwWDzZRxcZbMmYrlyhtNpWHDtl7wGVjGxmwcYzR7R7U0HQBU3QylcqXfe5fMmZrdEetTk8ey+Mef7OGne/6Yf8zyJPUnHYeN2Tv6oDt0yOxgHjCDg8sjzxzhwRvewfGkUzAYHXj5BDHbzr8OMrOH1Re8kY3ZQSbpOHzk/Ddw3hunFmQjaUln1Yp0DUDVxVAqVwa9t+fQK77HKEKms3Z3/pAp0xCzJb8msOaiM4j5HBnpZgOxSHHJieNJp6ha58zJo0n6FL5794JT2fTBc3jP2TNIG9j838+z+rtd7Oh9CcgMbktuf6RobUKpsOkMQNVFUDmGWksfZDp+45vCGY8IK86exZb/2Vf03KeX/hlndUzOx903Ptpb8HzUloKD5B3gxEDwjmb3nfv23pdwXO2J2sJVnZmFZ5M2+U1fA9ldyWvvzZSLaOR5CUoNhQ4Aqi6GUhoi6L3zp08s2BGbdNKsuWgOKxd38PLxpO8AcP6cqQX1ebw7am9eNo/P3b8XJyAlNB6RfNzeHZZKOg5pQ8EZwwL88Ff7i4q25dgidO8/WvPAqFSj6QCg6mIo5QtKvbfUGburzutg8+ODg8Cq8zoCi7Pl3p+J41u+6wpjYjZfv+ZsLpj7et+dxl4R28qu//rvHRhw0iyaNSmwTlGOrg+osOgAoOpmKOULSr03aEfs5654K6vOnU33/qNFVT7dvO8P2hnspA0gFR0oM/j64HpCt1w+n54XXinIPopYhecl6JGPKkw6AKi6Gkr5glreO+eU8YEdf9Bn5GYbkKnQGbeFNJm8/uu3PJUPFXkHiogFtmUVHOYOmZh+bg0gHrEwwC2Xz+PS+aey5PZHCorO2ZaV35vgX6hul64PqKbRAUCNON4NZIeOneDazV0kHHg1W+rhtgf2cvNl8/J1fdypqd5Zivta7tTRXT7x/5g9GP/3L1Rn+P7OfdxwSeEh9Uo1gg4Aqq3VGj93zzaOJ52i/P6oZbFgxkTf4ye9nxM0cym3MJ5JKy1eP9iwrZeVizt0FqAaTvcBqLZVr/z6Uh219/jJavjVK3LH/6eMi7PmouI7/dwsQalG0xmAakt9/Yl8iYih5tc38gCWcgvjKxd3FNUf0vpBqll0AFBtacvOfUWpnEPJr2/kASylFrenjIuzfoWe/qXCEfoAICI20AUcNMYsC7s9qvX19SfYuO25oseTztDunMM6gEVP/1JhCX0AAD4KPA3oideqIn5F2QDWXDSnbTtPPf1LhSHURWARmQlcBtwZZjtUe/FbtI1HhJWLO0JqkVLtKewsoH8G1kLwdksRWS0iXSLSdeTIkea1TLUsv+ya9SsWtuwdtPskM6VaSWghIBFZBhw2xjwpIhcGvc4YswnYBNDZ2Rm8716NKO0SN9dSD6qVhTkDWAIsF5E/AP8OXCwi3wuxParNlMrRb4W77qGckaBUM4Q2AzDGfAr4FEB2BvAJY8w1YbVHDR+tctc9lDMSlGqGsNcAlKqrVrrrHsoZCUo1Q0sMAMaYR3UPgKqH3F23W+6uu9nKlYJQKmytsA9AqbpptbvudlmsViNTS8wAVLBWWMxsJ6141z2UgnJKNec2NO0AABSzSURBVJLOAFpYqyxmthu961aqMjoAuIR9Nqv784Gi06JqrXY5EmlpBaXK0wEgK+y7be/nX3/hHE0hVEo1lK4BEH7qoN/nb9jWW3RalKYQKqXqSQcA6ps6WMuird/nx2yLNRedMaTFTF1AVkqVoiEg6pc6WGsYKejzVy7uYOXijprWJcIOaSmlWp/OAKhP6uBQwkilPr+WFMKwQ1pKqfagM4CsoaYOlqv7Ui7DqJ6pi1qDRilVCR0AXIaSOugXxkk4acbG7IrDMfVKXWy13bBKqdakIaA6cYdxRkUzX6sYw2Vf3c7H7+puajim3rthdTFZqeFJZwB1tHzRDOadNoGlX/klAAnHAMVn2JQLxwSFi6rZqFavkJIuJis1fOkAUGfHkw6WJeAEH14WFI7p60+wZec+Nm57jphtF3S4lXTE3gHCG1KqdqezezFZdyMrNfzoAFBnY2M2JweKjziO2RCPRPKdt7cDva/7IGvv2U0ilXlvIpUCMh3uvNMmlO2Iyw0QtdzJ62KyUsObDgBVKncXfTzpELclG/7JiNvCNz7UycTRsfz7/Or+5Dp/t6hl0b3/aNkMo1IDRK138rqYrNTwFuah8LOAzcCpQBrYZIz5cljtqUQld9EzJ49GPCEgsYT50ycG3q371f3JGUinWTRrUsmOuNydes+hY1giBe/3u5P3CyHd8d4zWev5N+vdv1LDQ5gzgBTwcWPMUyIyHnhSRB42xuwNsU2BKr2LLtdp+l1nw7bnACn6TICrOmcy55TxJa85c/LowLpBmdDSLhKpwjWJpJPm2IkB+voTTBkXDxzctLSyUsNXmIfCvwC8kP37qyLyNDADaMkBoJqNXqU6Tb/riAgDPuEfgLu6DvDRS+aWvOb23pdIu/r3iAV3vPdMIBdaKuz8o7bgpNNcv+UpBtJpbr5sHrc9uDdwcNPSykoNTy2xBiAis4GzgJ0+z60GVgN0dHQ0tV1upeLhQXfPfp2m33X8Fo1z3IOMX0ecm1EMuEJOtmXlBwvvYDMqauE4aVJpeDWRWWi+9f4eYpHgYnh696/U8BT6RjARGQfcC/y9MeYV7/PGmE3GmE5jTOe0adOa38CsoM1VQGDdHb8NVN7rxCIWcds//APwWjKVj/X7XS+okmiu0/YONmkDsYhd8FjUtkh60lYH0mn2HDzGktsf4Zo7d7Lk9kfY2n2wim9MKdXqQp0BiEiUTOe/xRjzozDbUgm/MMyugAydLTv38S+P9vouGLuvMzZms2zD9sB9A46Bn+35I+NGRXxnGTMnj+ZkqjD+fzLl5NvnXTu4edk8bntgr+czDLdcnnk8/7oyYSGlVPsLMwtIgG8CTxtjvhRWO6rlDcP41gBKOWx4pJekE9x55v488PKJfGdrIbw2UNiZA3x26x4syyKRGrzeJ+7exbzTJrDz938qCP8AGDP4s9+gNT4eKVpQXr5oBpfOPzX/Ot0DoNTwF+YMYAnwQeDXItKdfezTxpiHQmxT1bx32SdTDk7a4BjPwqtl8fhv+zg54LBo1iR6Xnglf0efdNJ8ZMls5k+fwMfu2k3S8awJCEV7BJKO4d1f+SXGZ+IQtSx6Dr3CBXOn5dvo7rSDFpS9r9M9AEoNb2L8epAW1dnZabq6usJuhq++/gQ9h45x7eauoqwbANsSnLQJ/BkgHhGuWDSDu7oODLk98YjF+hVDq9uztfug70xBKdVeRORJY0yn9/GWyAJqN94NU7mfQYjZdr6MQ07UlqIwjbfzB0ikDFt3HeLTS9/C+v/4DZHsICFQsLO4EolUesgxe90DoNTwpgNAlbwpn1d1zuSurgP5UI7jCZtELFj9jjew8dHfVXT9qGVxciCNYEinBWMMRoKzhCJWJu3TEjjhSSc1aeMbs6+mKJzuAVBq+NIBoAp+u3g3P74PIP9z1BbiEcBk7tojtsU3fvl73+vFbKso3p90HL78n89mk4JyzxXe/duWMCZq57N6Zk0ew8GXX+NTP95T8LqEYxgbK0z51PLOSqkcHQDKcN8t5zZGlTIqYvNP71nAx+7eDZjATV6rzuvgo5fM5fs797HBVf75w2+fzdf+q/RsIWLBxqvPYv+fTuRTNxMppyjUNCpqcTw5mFWk5Z2VUm46AJTgvVv+2F/MLblrFzKZMhNGR4nbFsmA8g62wNtmTwFg5eIOFs6aCAjzp0+g59CxsgNAzLYBKcrT9zKGgqwdTe1USrnpABDA7275Cw8/S8yCpKu/tQVs2yJuD4ZU5k+fWJRC6eYYWPOD/0WAiC1EbQsnbVi/4kyWzJnqu2jslrm2KerM47bgGEhlF5iddJodvS/lQzxa3lkp5RZ6KYhmqOVMW78SC1FbwFtWOWLx0A3n872/XcyOdRfnawDlyj2MjRfG4N0MMOAYXks6JFJpPn73LgC+eOVC4hGLMTGbeMTiqs4ZxGxhbMzOl6DwHWREsGRw4EilKTh/uN5nBSul2tuwnwHUuujpd7fspA23XD6f2x7cW3C9OaeML3q/O4Vyz8Fj3Hp/T1G9Ha8Bx9Bz6FjRe297cC+xSKZezy2Xz8u331vm4foL57Dpsd+RdAbTUL0VS0+fMpYH1pzP8aSjqZ1KjXDDegCoZNEzKCUyqK7/8kUzuHTBqRWlUeZSKBfOmsSbTxnHVZuewCf930Py7wV436bHC9YdbntgL5fOP5Up4+JFefoAGx/tLbhaqYqlC2dNquh7VEoNT8N6ACi36FludlBpyQQonVuf+5yIJSVnAREL5k+fUNB+u8xJXt62+A1aQNFA+Il7MmcNu2cv1R4ar5Rqb8N6ACi16FnNCV9+naG7s9ze+1LgQOL+nCBx2wIxrF+xsOCz9hw8VpDG6W5/EG+l0eNJh55Dx4oGwmQqzdKv/JIvXLmQ5Ytm6P4ApUagYT0AlDqeMaiMc7lzcqFwXSG3+zeVxncg8ZuFuMUjFt9Y1cn86ROKPvdzDxQfjnbzZfMA2LX/aOCd+pRx8YJBKek4vqGnpGNYe29mJqD7A5QaeYb1AADBYZxKUiL97oqXzJla1Fl62SL5gcTvcyDT8YtkQja5qp1uW3buK6oAOjZu03c8yZLbH8mHk265fB5XLz4dGBysxsbsojZGLIjZxSGoqGXRXeFg6KbhIqXa37AfAMA/jFPL4e1r793Npg+eU/KOHuB40mHPoWP53cMfe9dc/u9DzxS8xhjDgze8wzeDqK8/wcZtzxU9PpBKs3Fbb8HAcNOP94Ch4MCYRMrBsgrXDkZHI/zTe97Kx+7qLhgEBtJpFs2aVNX+AA0XKTU8jIgBIEi1h7dn9gVIUWcZsTI5926f+ckePnf/XqK2kEiliVrgXgaIR+yi+L77szPn5RTerXee/jr++3d9Ra//7P09WJKpJppvr88Rj+e9aQpfuHJh0aA355TxJQdDNy0nodTwMaIHAAhe5A0KEc2fPsE3//5fH/st/YnBDt0x4KTSJFLeKw9ey+8Ou68/wf4/HfddNP7VH4o7f4CIJdmxYrDTj9uCESnYoZxLHZ132gS69x9l0axJ+RlIpaWftZyEUsNH2GcCXwp8GbCBO40xnw+zPW65ENGN9+zOH97i7kS9+fcbtvWWuWJGzBYsS3zvsHOhFcun/HPUluyAUzxrSKbSxUcKCzx0Q/GGr1Lhm0pKP2s5CaWGj9BKQYiIDWwE3g3MAz4gIvPCao8fk/u/nrtrIL/BK9dprrloTsXXfGDN+UUxc3do5TWf0JAlgmOKZwW5AcXLSRv2vvBKvo3ez3g1keLkQLqgVEQlGlFOopZSHUqpoQtzBvA2oNcY8zsAEfl34AqgOPcxBLnOMnO8Y6ZDLhXrXrm4gw3bnvM9DtItFrF8Y/9B6aKjopkxOreha60rtXPNRWewcNZErt/yvww4hbGmXB0gd3vrFb6p50lhuqCsVHjCHABmAPtdPx8AFntfJCKrgdUAHR0dQ/rAalIXq+0sp4yLs35F4QLrX847ha27Xih4nZM2vuGSoHRRx0nz2eUL8p2it+Pt608EVh71tree4Zt6nBSmC8pKhSvMaqB+5xwW3T4bYzYZYzqNMZ3TphXny1fqvu6DLLn9Ea65cydLbn+Erd0HS76+ls5y+aIZ7Fh3cb4y6Fc+cDZXdc4seM1VnTMDB5A73nsm8Ujh/0sG0nDbg3sLKnq6wzpB7wNIOmmOnRho2WqgvhVXs4OWUqrxwpwBHABmuX6eCRxqxAfVcqdZbp9AEPedcV9/gq27Cv9Jd3Ud4KOXzPW9zvJFM5g0JsZ1332S1wYGw0TlwjS5kIz7dLGTKQcnneb6LU8VhFZa6aB3XVBWKlxhDgC/As4QkTcAB4H3Aysb8UG1xr6r6Sz9wku1fO786RNIU5zDX65TnDIuzg2XnMHKxR30HDrGtZu7SDjwajYP1T3gtcpB77UOskqp+ghtADDGpERkDfAfZNJAv2WM6WnEZw3lTrOSzjJoIbOWzx1qpzhlXJyJo2PEbJtEyv9cgFbSSjMSpUaaUPcBGGMeAh5q9Oc08k6zXHipls8t1ymWW8yeOXk0Sae6KqJhapUZiVIjzYjZCdyoO81yYZ5Sn1uqIw/qFIMK1Lmvs733pYLqnxELDa0opYqMmAEAGnOnWUmYx+9za8l/95ttfPzuXVgCMdtmIJ3m5mXzuO2BvQWHytuWxZI5U4f6T1VKDTN6KPwQrwlUnVpZ645cv7TJAceQSJn8dW69f2/RKWIxW1MrlVLFhv0MoBE7Tf2uuWPdxQ3bZJYTtFnMLWoLAylNrVRKlTesZwD1qH1T6TWBgg1apdSaleTdyBWPWHj3fzlpwy2Xz2+ZzV5KqdY1rGcAjShdXI9rDiUrybuovKP3paLrLF80g0sXnKqplUqpkob1ANCInab1uuZQspLci8pB19HUSqVUOcM6BNSI2jf1vKa3rs9Q2lSP6yilRhYxpnT54lbS2dlpurq6qn5fIw4wb9Sh6HrYulKq3kTkSWNMp/fxYR0CymlEOKQR19Ta+EqpZhrWIaB20oiMJaWUKkUHgBahtfGVUs2mA0CL0Nr4Sqlm0wGgRbTaaV1KqeFvRCwCtwutja+UaiYdAFqMbuBSSjWLhoCUUmqECmUAEJH1IvKMiOwWkR+LyKQw2qGUUiNZWDOAh4EFxpgzgWeBT4XUDqWUGrFCGQCMMT83xuROLH8CmBlGO5RSaiRrhTWAjwA/DXpSRFaLSJeIdB05cqSJzVJKqeGtYcXgROQ/gVN9nrrJGHNf9jU3AZ3Ae0wFDRGRI8DzdW1ofU0FXgq7ETXQdjeXtru5tN1wujFmmvfB0KqBisiHgOuAS4wxr4XSiDoTkS6/inutTtvdXNru5tJ2BwtlH4CIXAqsA945XDp/pZRqN2GtAWwAxgMPi0i3iHw9pHYopdSIFcoMwBgzJ4zPbYJNYTegRtru5tJ2N5e2O0BbnQimlFKqflohDVQppVQIdABQSqkRSgeAGojIpSLyGxHpFZFP+jwvIvKV7PO7ReTsMNrpadMsEdkmIk+LSI+IfNTnNReKyLHswny3iHwmjLZ6icgfROTX2TZ1+Tzfit/3m13fY7eIvCIif+95TUt83yLyLRE5LCJ7XI+9TkQeFpHnsn9ODnhvyf8WGimg3RXVGSv3O9VIAe3+rIgcdP0uLA14b32/b2OM/q+K/wE28FvgjUAM2AXM87xmKZndzQKcC+xsgXafBpyd/ft4MjWYvO2+EHgg7Lb6tP0PwNQSz7fc9+3zO/NHMptxWu77Bi4Azgb2uB67A/hk9u+fBG4P+HeV/G8hhHb/JRDJ/v12v3ZX8jsVQrs/C3yigt+jun7fOgOo3tuAXmPM74wxSeDfgSs8r7kC2GwyngAmichpzW6omzHmBWPMU9m/vwo8DcwIs0111HLft8clwG+NMS25i90Y8xjwJ8/DVwDfyf79O8Bf+by1kv8WGsav3aYN6owFfN+VqPv3rQNA9WYA+10/H6C4I63kNaERkdnAWcBOn6fPE5FdIvJTEZnf1IYFM8DPReRJEVnt83xLf9/A+4EfBDzXit83wCnGmBcgc/MAvN7nNa3+vZeqM1budyoMa7Khq28FhNzq/n3rAFA98XnMm0tbyWtCISLjgHuBvzfGvOJ5+ikyYYqFwFeBnzS7fQGWGGPOBt4NXC8iF3ieb+XvOwYsB+72ebpVv+9KtfL3fhOQArYEvKTc71SzfQ14E7AIeAH4os9r6v596wBQvQPALNfPM4FDNbym6UQkSqbz32KM+ZH3eWPMK8aY/uzfHwKiIjK1yc0sYow5lP3zMPBjMlNht5b8vrPeDTxljHnR+0Srft9ZL+bCaNk/D/u8piW/92ydsWXA1SYbPPeq4HeqqYwxLxpjHGNMGvhGQHvq/n3rAFC9XwFniMgbsnd37we2el6zFViVzU45FziWm06HRUQE+CbwtDHmSwGvOTX7OkTkbWR+P/qa10rfNo0VkfG5v5NZ5NvjeVnLfd8uHyAg/NOK37fLVuBD2b9/CLjP5zWV/LfQVDJYZ2y5CagzVuHvVFN51qz+D/7tqf/3HcYqeLv/j0zWybNkVuRvyj52HXBd9u8CbMw+/2ugswXafD6Z6eJuoDv7v6Wedq8BeshkFzwBvL0F2v3GbHt2ZdvWFt93tl1jyHToE12Ptdz3TWaAegEYIHOX+TfAFOAXwHPZP1+Xfe104CHXe4v+Wwi53b1k4uS53/Gve9sd9DsVcru/m/3d3U2mUz+tGd+3loJQSqkRSkNASik1QukAoJRSI5QOAEopNULpAKCUUiOUDgBKKTVC6QCgVI0kU2H19yLyuuzPk7M/nx5225SqhA4AStXIGLOfzBb+z2cf+jywybRo0TelvHQfgFJDkC2v8STwLeBa4CyTqdSoVMsL5VB4pYYLY8yAiNwI/Az4S+38VTvREJBSQ/duMlv7F4TdEKWqoQOAUkMgIouAd5E5iewfWuwgGqVK0gFAqRplK3l+jczZCvuA9cAXwm2VUpXTAUCp2l0L7DPGPJz9+V+At4jIO0Nsk1IV0ywgpZQaoXQGoJRSI5QOAEopNULpAKCUUiOUDgBKKTVC6QCglFIjlA4ASik1QukAoJRSI9T/B3AwbdOsOVoIAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 100\n",
    "np.random.seed(12345)\n",
    "c1 = np.random.normal(1, 1, (n, 2))\n",
    "c2 = np.random.normal(6, 1, (n, 2))\n",
    "c3 = np.random.normal(12, 1, (n, 2))\n",
    "db = pandas.concat(map(pandas.DataFrame, \n",
    "                       [c1, c2, c3])\n",
    "                  ).rename(columns={0: \"X\", 1: \"Y\"})\\\n",
    "                   .reset_index()\\\n",
    "                   .drop(\"index\", axis=1)\n",
    "db.plot.scatter(\"X\", \"Y\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Run A-DBSCAN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Min. samples: 10\n",
      "['2' '0' '1']\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fe69adaad10>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ms = int(n/10)\n",
    "print(f\"Min. samples: {ms}\")\n",
    "ad = ADBSCAN(2.5, ms, reps=100, keep_solus=True)\n",
    "np.random.seed(1234)\n",
    "ad.fit(db)\n",
    "solus_rl = remap_lbls(ad.solus, db)\n",
    "\n",
    "ls = list(map(int, ad.labels_))\n",
    "ls = pandas.Series(ls) / max(ls)\n",
    "print(ad.votes[\"lbls\"].unique())\n",
    "db.assign(lbls=ls).plot.scatter(\"X\", \"Y\", c=\"lbls\", cmap=\"viridis\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Create boundary of clusters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "polys = get_cluster_boundary(ad.votes[\"lbls\"], db)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fe695e82410>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax = polys.plot(color='0.5')\n",
    "db.assign(lbls=ls).plot.scatter(\"X\", \n",
    "                                \"Y\", \n",
    "                                c=\"lbls\", \n",
    "                                cmap=\"viridis\",\n",
    "                                s=2,\n",
    "                                ax=ax\n",
    "                               )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Explore boundary stability"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "IllegalArgumentException: Operation not supported by GeometryCollection\n",
      "\n"
     ]
    },
    {
     "ename": "ValueError",
     "evalue": "No Shapely geometry can be created from null value",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<timed exec>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/analytical/lib/python3.7/site-packages/geopandas/base.py\u001b[0m in \u001b[0;36mboundary\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    210\u001b[0m         \"\"\"Returns a ``GeoSeries`` of lower dimensional objects representing\n\u001b[1;32m    211\u001b[0m         each geometries's set-theoretic `boundary`.\"\"\"\n\u001b[0;32m--> 212\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0m_delegate_property\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"boundary\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\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    213\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    214\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/analytical/lib/python3.7/site-packages/geopandas/base.py\u001b[0m in \u001b[0;36m_delegate_property\u001b[0;34m(op, this)\u001b[0m\n\u001b[1;32m     77\u001b[0m     \u001b[0;31m# type: (str, GeoSeries) -> GeoSeries/Series\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     78\u001b[0m     \u001b[0ma_this\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mGeometryArray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mthis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgeometry\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 79\u001b[0;31m     \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma_this\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop\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     80\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mGeometryArray\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     81\u001b[0m         \u001b[0;32mfrom\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0mgeoseries\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mGeoSeries\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/analytical/lib/python3.7/site-packages/geopandas/array.py\u001b[0m in \u001b[0;36mboundary\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    540\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    541\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mboundary\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\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[0;32m--> 542\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0m_unary_geo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"boundary\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\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    543\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    544\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/analytical/lib/python3.7/site-packages/geopandas/array.py\u001b[0m in \u001b[0;36m_unary_geo\u001b[0;34m(op, left, *args, **kwargs)\u001b[0m\n\u001b[1;32m    384\u001b[0m     \u001b[0;31m# ensure 1D output, see note above\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    385\u001b[0m     \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 386\u001b[0;31m     \u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgeom\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mgeom\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\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    387\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mGeometryArray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    388\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/analytical/lib/python3.7/site-packages/geopandas/array.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    384\u001b[0m     \u001b[0;31m# ensure 1D output, see note above\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    385\u001b[0m     \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 386\u001b[0;31m     \u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgeom\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mgeom\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\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    387\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mGeometryArray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    388\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/analytical/lib/python3.7/site-packages/shapely/geometry/base.py\u001b[0m in \u001b[0;36mboundary\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    462\u001b[0m         \u001b[0mcollection\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    463\u001b[0m         \"\"\"\n\u001b[0;32m--> 464\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mgeom_factory\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimpl\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'boundary'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\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[0m\u001b[1;32m    465\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    466\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/analytical/lib/python3.7/site-packages/shapely/geometry/base.py\u001b[0m in \u001b[0;36mgeom_factory\u001b[0;34m(g, parent)\u001b[0m\n\u001b[1;32m     74\u001b[0m     \u001b[0;31m# Abstract geometry factory for use with topological methods below\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     75\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 76\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No Shapely geometry can be created from null value\"\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     77\u001b[0m     \u001b[0mob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mBaseGeometry\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     78\u001b[0m     \u001b[0mgeom_type\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgeometry_type_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: No Shapely geometry can be created from null value"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "lines = []\n",
    "for rep in solus_rl:\n",
    "    line = get_cluster_boundary(solus_rl[rep], \n",
    "                                db, \n",
    "                                n_jobs=-1\n",
    "                               )\n",
    "    line = line.boundary\n",
    "    line = line.reset_index()\\\n",
    "               .rename(columns={0: \"geometry\", \n",
    "                                \"index\": \"cluster_id\"}\n",
    "                      )\\\n",
    "               .assign(rep=rep)\n",
    "    lines.append(line)\n",
    "lines = pandas.concat(lines)\n",
    "lines = geopandas.GeoDataFrame(lines)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f92c28aa3d0>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "lines.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Interactive widget to explore different solutions across replications"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from ipywidgets import interact, IntSlider"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "list indices must be integers or slices, not str",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-10-9a5f9efadf11>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     16\u001b[0m                )\n\u001b[1;32m     17\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0mreps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlines\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"rep\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munique\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\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[0m\u001b[1;32m     19\u001b[0m \u001b[0mslider\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mIntSlider\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     20\u001b[0m \u001b[0minteract\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplot_rep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mslider\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[0;31mTypeError\u001b[0m: list indices must be integers or slices, not str"
     ]
    }
   ],
   "source": [
    "def plot_rep(rep):\n",
    "    f, ax = plt.subplots(1, figsize=(9, 9))\n",
    "    ax.set_facecolor(\"k\")\n",
    "    # Background points\n",
    "    db[[\"X\", \"Y\"]].plot.scatter(\"X\", \"Y\", ax=ax, color=\"0.25\", s=0.5)\n",
    "    # Boundaries\n",
    "    cs = lines.query(f\"rep == 'rep-{str(rep).zfill(3)}'\")\n",
    "    cs.plot(ax=ax, color=\"red\")\n",
    "    # Cluster IDs\n",
    "    for s, row in cs.iterrows():\n",
    "        ax.text(row.geometry.centroid.x, \n",
    "                row.geometry.centroid.y, \n",
    "                s,\n",
    "                size=20,\n",
    "                c=\"w\"\n",
    "               )\n",
    "    return None\n",
    "reps = range(len(lines[\"rep\"].unique()))\n",
    "slider = IntSlider(min=min(reps), max=max(reps), step=1)\n",
    "interact(plot_rep, rep=slider);"
   ]
  },
  {
   "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.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
