{ "cells": [ { "cell_type": "code", "execution_count": 248, "id": "initial_id", "metadata": { "collapsed": true, "ExecuteTime": { "end_time": "2023-11-06T00:18:48.861074Z", "start_time": "2023-11-06T00:18:48.853531Z" } }, "outputs": [], "source": [ "import folium\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "from scipy.cluster.hierarchy import dendrogram, linkage\n", "from scipy.cluster.hierarchy import fcluster\n", "from sklearn.metrics import silhouette_score\n", "from sklearn.cluster import KMeans\n", "import utils" ] }, { "cell_type": "code", "execution_count": 249, "outputs": [], "source": [ "# Load the data\n", "ListA = pd.read_csv('List A.csv')\n", "ListB = pd.read_csv('List B.csv')\n", "ListC = pd.read_csv('List C.csv')\n", "ListD = pd.read_csv('List D.csv')" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:49.113478Z", "start_time": "2023-11-06T00:18:49.101708Z" } }, "id": "bb6f57eef695cf76" }, { "cell_type": "code", "execution_count": 250, "outputs": [ { "data": { "text/plain": " name gps \\\n0 521 Commercial Street #525 42.3688272,-71.0553792 \n1 Acorn St 42.3576234,-71.0688746 \n2 Arlington's Great Meadows 42.4299758,-71.2038948 \n3 Arthur Fiedler Statue 42.3565057,-71.0754527 \n4 BU Beach 42.3511927,-71.1060828 \n.. ... ... \n33 The Quiet Few 42.3670906,-71.0359889 \n34 The Tall Ship Boston 42.3649544,-71.0414523 \n35 Toasted Flats 42.3711266,-71.0371343 \n36 Vega Market 42.3891835,-71.033703 \n37 Winthrop High School 42.3803348,-70.9799864 \n\n googleUrl \\\n0 https://maps.google.com/maps?q=+%4042.3688272,... \n1 https://maps.google.com/maps?q=+%4042.3576234,... \n2 https://maps.google.com/maps?q=+%4042.4299758,... \n3 https://maps.google.com/maps?q=+%4042.3565057,... \n4 https://maps.google.com/maps?q=+%4042.3511927,... \n.. ... \n33 https://maps.google.com/maps?q=+%4042.3670906,... \n34 https://maps.google.com/maps?q=+%4042.3649544,... \n35 https://maps.google.com/maps?q=+%4042.3711266,... \n36 https://maps.google.com/maps?q=+%4042.3891835,... \n37 https://maps.google.com/maps?q=+%4042.3803348,... \n\n originalUrl info types \\\n0 https://www.google.com/maps/place/521+Commerci... NaN NaN \n1 https://www.google.com/maps/place/Acorn+St/dat... NaN NaN \n2 https://www.google.com/maps/place/Arlington's+... NaN NaN \n3 https://www.google.com/maps/place/Arthur+Fiedl... NaN NaN \n4 https://www.google.com/maps/place/BU+Beach/dat... NaN NaN \n.. ... ... ... \n33 https://www.google.com/maps/place/The+Quiet+Fe... NaN NaN \n34 https://www.google.com/maps/place/The+Tall+Shi... NaN NaN \n35 https://www.google.com/maps/place/Toasted+Flat... NaN NaN \n36 https://www.google.com/maps/place/Vega+Market/... NaN NaN \n37 https://www.google.com/maps/place/Winthrop+Hig... NaN NaN \n\n address \\\n0 NaN \n1 NaN \n2 Minuteman Commuter Bikeway, Lexington, MA 0242... \n3 Charles River Esplanades, Boston, MA 02114, Un... \n4 270 Bay State Rd, Boston, MA 02215, United States \n.. ... \n33 331 Sumner St, East Boston, MA 02128, United S... \n34 1 E Pier Dr, Boston, MA 02128, United States \n35 53 Chelsea St, Boston, MA 02128, United States \n36 29 Maverick St, Chelsea, MA 02150, United States \n37 400 Main St, Winthrop, MA 02152, United States \n\n description type \\\n0 NaN NaN \n1 NaN NaN \n2 183-acres of wet meadows & uplands with trails... Nature preserve \n3 NaN Sculpture \n4 A sloping, grassy plaza on the university grou... Park \n.. ... ... \n33 NaN Bar \n34 Laid-back waterside tall ship with tables doli... Lounge \n35 Snug eatery whipping up health-conscious flatb... Sandwich shop \n36 NaN Grocery store \n37 NaN High school \n\n phone website \\\n0 NaN NaN \n1 NaN NaN \n2 +1 781-863-5385 http://www.foagm.org/ \n3 +1 617-332-2433 http://helmicksculpture.com/portfolio/arthur-f... \n4 NaN https://www.bu.edu/today/2009/icons-among-us-t... \n.. ... ... \n33 +1 617-561-1061 https://www.thequietfew.com/ \n34 +1 617-307-7714 https://www.tallshipboston.com/ \n35 +1 857-264-8531 https://toastedflats.com/ \n36 NaN NaN \n37 +1 617-846-5505 https://www.winthrop.k12.ma.us/Domain/99 \n\n ratingsAverage ratingsTotal plusCode list \n0 NaN NaN NaN A \n1 NaN NaN NaN A \n2 4.6 171.0 CQHW+XC Lexington, Massachusetts, USA A \n3 4.6 14.0 9W4F+JR Boston, Massachusetts, USA A \n4 4.5 133.0 9V2V+FH Boston, Massachusetts, USA A \n.. ... ... ... ... \n33 4.7 257.0 9X87+RJ East Boston, Boston, MA, USA D \n34 4.2 549.0 9X75+XC Boston, Massachusetts, USA D \n35 4.7 372.0 9XC7+F4 Boston, Massachusetts, USA D \n36 4.8 5.0 9XQ8+MG Chelsea, Massachusetts, USA D \n37 NaN NaN 92JC+42 Winthrop, Massachusetts, USA D \n\n[169 rows x 15 columns]", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
namegpsgoogleUrloriginalUrlinfotypesaddressdescriptiontypephonewebsiteratingsAverageratingsTotalplusCodelist
0521 Commercial Street #52542.3688272,-71.0553792https://maps.google.com/maps?q=+%4042.3688272,...https://www.google.com/maps/place/521+Commerci...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNA
1Acorn St42.3576234,-71.0688746https://maps.google.com/maps?q=+%4042.3576234,...https://www.google.com/maps/place/Acorn+St/dat...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNA
2Arlington's Great Meadows42.4299758,-71.2038948https://maps.google.com/maps?q=+%4042.4299758,...https://www.google.com/maps/place/Arlington's+...NaNNaNMinuteman Commuter Bikeway, Lexington, MA 0242...183-acres of wet meadows & uplands with trails...Nature preserve+1 781-863-5385http://www.foagm.org/4.6171.0CQHW+XC Lexington, Massachusetts, USAA
3Arthur Fiedler Statue42.3565057,-71.0754527https://maps.google.com/maps?q=+%4042.3565057,...https://www.google.com/maps/place/Arthur+Fiedl...NaNNaNCharles River Esplanades, Boston, MA 02114, Un...NaNSculpture+1 617-332-2433http://helmicksculpture.com/portfolio/arthur-f...4.614.09W4F+JR Boston, Massachusetts, USAA
4BU Beach42.3511927,-71.1060828https://maps.google.com/maps?q=+%4042.3511927,...https://www.google.com/maps/place/BU+Beach/dat...NaNNaN270 Bay State Rd, Boston, MA 02215, United StatesA sloping, grassy plaza on the university grou...ParkNaNhttps://www.bu.edu/today/2009/icons-among-us-t...4.5133.09V2V+FH Boston, Massachusetts, USAA
................................................
33The Quiet Few42.3670906,-71.0359889https://maps.google.com/maps?q=+%4042.3670906,...https://www.google.com/maps/place/The+Quiet+Fe...NaNNaN331 Sumner St, East Boston, MA 02128, United S...NaNBar+1 617-561-1061https://www.thequietfew.com/4.7257.09X87+RJ East Boston, Boston, MA, USAD
34The Tall Ship Boston42.3649544,-71.0414523https://maps.google.com/maps?q=+%4042.3649544,...https://www.google.com/maps/place/The+Tall+Shi...NaNNaN1 E Pier Dr, Boston, MA 02128, United StatesLaid-back waterside tall ship with tables doli...Lounge+1 617-307-7714https://www.tallshipboston.com/4.2549.09X75+XC Boston, Massachusetts, USAD
35Toasted Flats42.3711266,-71.0371343https://maps.google.com/maps?q=+%4042.3711266,...https://www.google.com/maps/place/Toasted+Flat...NaNNaN53 Chelsea St, Boston, MA 02128, United StatesSnug eatery whipping up health-conscious flatb...Sandwich shop+1 857-264-8531https://toastedflats.com/4.7372.09XC7+F4 Boston, Massachusetts, USAD
36Vega Market42.3891835,-71.033703https://maps.google.com/maps?q=+%4042.3891835,...https://www.google.com/maps/place/Vega+Market/...NaNNaN29 Maverick St, Chelsea, MA 02150, United StatesNaNGrocery storeNaNNaN4.85.09XQ8+MG Chelsea, Massachusetts, USAD
37Winthrop High School42.3803348,-70.9799864https://maps.google.com/maps?q=+%4042.3803348,...https://www.google.com/maps/place/Winthrop+Hig...NaNNaN400 Main St, Winthrop, MA 02152, United StatesNaNHigh school+1 617-846-5505https://www.winthrop.k12.ma.us/Domain/99NaNNaN92JC+42 Winthrop, Massachusetts, USAD
\n

169 rows × 15 columns

\n
" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Combine the two lists and add a column to indicate the list\n", "ListA['list'] = 'A'\n", "ListB['list'] = 'B'\n", "ListC['list'] = 'C'\n", "ListD['list'] = 'D'\n", "\n", "TotalList = pd.concat([ListA, ListB, ListC, ListD])\n", "display(TotalList)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:49.364284Z", "start_time": "2023-11-06T00:18:49.351342Z" } }, "id": "dc434958d5e4a3a8" }, { "cell_type": "code", "execution_count": 251, "outputs": [], "source": [ "# Remove all columns but name and gps\n", "TotalList = TotalList[['name', 'gps', 'list']]" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:49.785140Z", "start_time": "2023-11-06T00:18:49.779600Z" } }, "id": "2873c16423fe3119" }, { "cell_type": "code", "execution_count": 252, "outputs": [], "source": [ "# Convert the gps column to a list of lists for k-means\n", "TotalList['gps'] = TotalList['gps'].apply(lambda x: x.strip('[]').split(','))\n", "TotalList['gps'] = TotalList['gps'].apply(lambda x: [float(i) for i in x])" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:50.022174Z", "start_time": "2023-11-06T00:18:50.008422Z" } }, "id": "29f9155ef8d75fda" }, { "cell_type": "code", "execution_count": 253, "outputs": [ { "data": { "text/plain": " name gps list\n0 521 Commercial Street #525 [42.3688272, -71.0553792] A\n1 Acorn St [42.3576234, -71.0688746] A\n2 Arlington's Great Meadows [42.4299758, -71.2038948] A\n3 Arthur Fiedler Statue [42.3565057, -71.0754527] A\n4 BU Beach [42.3511927, -71.1060828] A\n.. ... ... ...\n33 The Quiet Few [42.3670906, -71.0359889] D\n34 The Tall Ship Boston [42.3649544, -71.0414523] D\n35 Toasted Flats [42.3711266, -71.0371343] D\n36 Vega Market [42.3891835, -71.033703] D\n37 Winthrop High School [42.3803348, -70.9799864] D\n\n[169 rows x 3 columns]", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
namegpslist
0521 Commercial Street #525[42.3688272, -71.0553792]A
1Acorn St[42.3576234, -71.0688746]A
2Arlington's Great Meadows[42.4299758, -71.2038948]A
3Arthur Fiedler Statue[42.3565057, -71.0754527]A
4BU Beach[42.3511927, -71.1060828]A
............
33The Quiet Few[42.3670906, -71.0359889]D
34The Tall Ship Boston[42.3649544, -71.0414523]D
35Toasted Flats[42.3711266, -71.0371343]D
36Vega Market[42.3891835, -71.033703]D
37Winthrop High School[42.3803348, -70.9799864]D
\n

169 rows × 3 columns

\n
" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(TotalList)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:50.242086Z", "start_time": "2023-11-06T00:18:50.237892Z" } }, "id": "a03a7c5dacebddd0" }, { "cell_type": "markdown", "source": [ "# Dendrogram" ], "metadata": { "collapsed": false }, "id": "72e85d219be8c635" }, { "cell_type": "code", "execution_count": 254, "outputs": [ { "data": { "text/plain": "
", "image/png": "iVBORw0KGgoAAAANSUhEUgAAB9gAAANcCAYAAAAU0nQ9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACaPUlEQVR4nOzdfZzVdZ3//+fAMMOAOl4loiGSJaJoIlSC60Wl5GXbuptslmZh6Y2yJfNboqVIFqaGWhtelIZuqVSaqaHGlpgmVhJ2oeamqSCCKCmYjMDA+f3hjfk5cuGbYeAMzP1+u53bjfnM5/M5r3OYaWsfvN+nplKpVAIAAAAAAAAArFWXag8AAAAAAAAAAJsCgR0AAAAAAAAACgjsAAAAAAAAAFBAYAcAAAAAAACAAgI7AAAAAAAAABQQ2AEAAAAAAACggMAOAAAAAAAAAAUEdgAAAAAAAAAoILADAAAAAAAAQAGBHQAAYBMyadKk1NTU5MEHH1zt948++ujsuuuurY7tuuuuOemkkzb8cBvAtGnTUlNTk5/85Cdveu5JJ520ymtvT2PHjk1NTU3x+ffee2+OO+647Lzzzqmrq0tjY2OGDRuWyy+/PK+88krLeRv67+frX/96brnllg1y76eeeio1NTWZNGnSBrl/yXOvfHTr1i3bbbdd3vWud+Xzn/98Hn744Y0+0+tt6J9HAAAAqkNgBwAA2Mz99Kc/zVe+8pVqj7HBfeUrX8lPf/rTao+RJDn33HNz0EEHZc6cOfnqV7+aqVOn5sYbb8z73//+jB07Nl/+8pc32iwbMrD37t0706dPz1FHHbVB7l/itNNOy/Tp03PPPffkf/7nf/KhD30ot956a975znfmoosuqtpcAAAAbJ5qqz0AAAAAG9agQYPa7V6VSiWvvvpqGhoa1us+TU1N632PN9ptt93a9X5t9eMf/zjjxo3LyJEj893vfrfVqvcjjjgiX/ziFzN9+vQqTrj+li9fnubm5tTX12f//fev6iy77LJLqxmOPPLInH766Tn22GPzxS9+MQMHDswRRxxRxQnX7PXv44bWXr+7AAAAnZ0V7AAAAJu51W1BvmjRopxxxhnp169f6urqsvPOO2f06NGtti5Pkpqamnz2s5/NFVdckQEDBqS+vj7XXnttkuS8887Le97znmy77bbZaqutst9+++Xqq69OpVJZ5fmPPvro3HzzzRk0aFC6d++e8847L0kyZ86cfPrTn06fPn1SV1eXnXbaKf/xH/+R5557rtU9li1blrPPPjs77bRTttpqqxx66KF57LHHWp2zui25V6xYkW9/+9vZd99909DQkK233jr7779/br311pZzJk+enOHDh6d3795paGjIgAEDcuaZZ67yXpQaN25cttlmm3zrW99a7ZbyW265ZYYPH77G61d+DMBTTz3V6vjK7fKnTZvWcmzmzJk5+uijs8MOO6S+vj477bRTjjrqqDzzzDNJXvv7e+WVV3Lttde2bKV+yCGHtFw/b968nHLKKXnrW9+aurq69OvXL+edd16am5tbzlm5FfuFF16Y888/P/369Ut9fX3uvvvu1W4Rv3Ir/Ycffjgf+chH0tjYmF69euWTn/xkFi5c2Oo1vfTSSxk5cmS23XbbbLHFFjnqqKPy97//PTU1NRk7duybv9lr0NDQkKuvvjrdunVbZRX7urzmiy++OBMmTEi/fv2yxRZbZOjQoXnggQdWeb5Jkyalf//+qa+vz4ABA3Ldddetcs7a3sckufXWWzN06ND06NEjW265ZQ477LDV/kOMn/3sZ9lnn31SX1+ft73tbbnssstW+/EF7fm7e/vtt2fQoEEtvx+33357y+seMGBAevbsmXe/+91r/OgKAACAzYkV7AAAAJuglStf3+iNgWx1Fi9enIMPPjjPPPNMzjrrrOyzzz55+OGHc8455+TPf/5z/vd//7dVrLvlllty77335pxzzsmOO+6YHXbYIclrwfCUU07JLrvskiR54IEHctppp2XOnDk555xzWj3nH/7whzz66KP58pe/nH79+qVnz56ZM2dO3vWud2XZsmUtcyxYsCB33XVXXnzxxfTq1avl+rPOOisHHHBAvve972XRokX50pe+lGOOOSaPPvpounbtusbXetJJJ+UHP/hBRo4cmXHjxqWuri5/+MMfWsXrv/3tbznyyCMzevTo9OzZM3/961/zjW98I7/73e/yq1/96k3fz9ebO3du/vKXv2TEiBHp0aPHOl27rl555ZUcdthh6devX77zne+kV69emTdvXu6+++68/PLLSZLp06fnfe97X9773ve2fEzAVlttleS10Pzud787Xbp0yTnnnJPddtst06dPz/nnn5+nnnoq3//+91s937e+9a3svvvuufjii7PVVlvlHe94x1rn+/d///eMGDEiI0eOzJ///OeMGTMmSXLNNdckee0fPxxzzDF58MEHM3bs2Oy3336ZPn16Dj/88HZ5f3baaacMHjw4999/f5qbm1NbW7vOr/k73/lO9thjj1x66aVJXvsYgiOPPDJPPvlkGhsbk7wWmT/xiU/kX//1X/PNb34zCxcuzNixY7NkyZJ06bLquobVvY/XX399PvrRj2b48OG54YYbsmTJklx44YU55JBD8stf/jL/8i//kiS58847c+yxx+aggw7K5MmT09zcnIsvvniVf5CyUnv87v7xj3/MmDFjcvbZZ6exsTHnnXdejj322IwZMya//OUv8/Wvfz01NTX50pe+lKOPPjpPPvmkVfIAAMDmrQIAAMAm4/vf/34lyVofffv2bXVN3759Kx//+Mdbvh4/fnylS5culd///vetzvvJT35SSVKZMmVKy7EklcbGxso//vGPtc61fPnyyrJlyyrjxo2rbLfddpUVK1a0ev6uXbtWHnvssVbXfPKTn6x069at8sgjj6zxvnfffXclSeXII49sdfxHP/pRJUll+vTpLcc+/vGPt3rtv/71rytJKmefffZaZ3+9FStWVJYtW1a55557Kkkqf/zjH1u+d+6551be7H9GP/DAA5UklTPPPLP4Od/497Py7/jJJ59sdd7K9+Luu++uVCqVyoMPPlhJUrnlllvWev+ePXu2uv9Kp5xySmWLLbaoPP30062OX3zxxZUklYcffrhSqVQqTz75ZCVJZbfddqssXbq01bkrv/f973+/5djK9+nCCy9sde6oUaMq3bt3b/nZ+PnPf15JUrn88stbnTd+/PhKksq555671te18rkvuuiiNZ4zYsSISpLKc88916bXvPfee1eam5tbzvvd735XSVK54YYbKpXKaz/3O+20U2W//fZr9TP/1FNPVbp169bq53FN7+PKe+y9996V5cuXtxx/+eWXKzvssENl2LBhLcfe9a53Vfr06VNZsmRJq/O22267VX422+t3t6GhofLMM8+0HHvooYcqSSq9e/euvPLKKy3Hb7nllkqSyq233rrW5wMAANjU2SIeAABgE3Tdddfl97///SqPlStd1+b222/PwIEDs++++6a5ubnl8YEPfGCVLciT5H3ve1+22WabVe7zq1/9KoceemgaGxvTtWvXdOvWLeecc04WLFiQ+fPntzp3n332ye67797q2B133JH3vve9GTBgwJvO/MEPfnCV+yXJ008/vcZr7rjjjiTJZz7zmbXe++9//3uOP/747Ljjji2v4+CDD06SPProo286W7W8/e1vzzbbbJMvfelLueKKK/LII4+s0/W333573vve92annXZq9XOw8vPK77nnnlbnf/CDH0y3bt2K77+6v7NXX3215Wdj5f2PO+64Vud95CMfWafXsTaVN+zosK6v+aijjmq1Q8Ibf+4ee+yxPPvsszn++ONb7frQt2/fDBs2bLUzvfF9XHmPE044odWK9y222CL//u//ngceeCCLFy/OK6+8kgcffDAf+tCHUldX1+q8Y445ZrXP1R6/u/vuu2923nnnlq9X/r4ecsghrXZpWHl8bb+TAAAAmwNbxAMAAGyCBgwYkCFDhqxyvLGxMbNnz17rtc8991wef/zxNcbSF154odXXvXv3XuWc3/3udxk+fHgOOeSQfPe73235POtbbrklX/va19LU1PSm93j++efz1re+da2zrrTddtu1+rq+vj5JVnmeN96/a9eu2XHHHdd4zj//+c8ceOCB6d69e84///zsvvvu6dGjR2bPnp1jjz12rfdfnZVbbj/55JPrdF1bNDY25p577snXvva1nHXWWXnxxRfTu3fvfOpTn8qXv/zlN43hzz33XG677bb1+jlYmzf7O1uwYEFqa2uz7bbbtjrv9R8NsL6efvrp1NfXtzzHur7mkteQZLU/YzvuuGOrjyJY6Y3v48p7rO793WmnnbJixYq8+OKLqVQqqVQqq31/1vSetcfv7hv/flbG/TUdf/XVV1c7CwAAwOZCYAcAAOhktt9++zQ0NLR8Fvbqvv96r1+Zu9KNN96Ybt265fbbb0/37t1bjt9yyy2rvefq7vGWt7wlzzzzzDpMvm7e8pa3ZPny5Zk3b94a4/CvfvWrPPvss5k2bVrLqvUkeemll9r0nL17987ee++dX/ziF1m8eHGbPod95fu5ZMmSVsffGH+TZO+9986NN96YSqWSP/3pT5k0aVLGjRuXhoaGnHnmmWt9nu233z777LNPvva1r632+zvttFOrr1f3d7g+tttuuzQ3N+cf//hHq1g7b968drn/nDlzMmPGjBx88MGprX3t//2xrq/5zawM8KubeU2v443v48p7zJ07d5Vzn3322XTp0iXbbLNNKpVKampqVvt566XPlaz77y4AAACt2SIeAACgkzn66KPzxBNPZLvttsuQIUNWeey6665veo+amprU1ta22j67qakp//M//1M8xxFHHJG77747jz32WFteRtH9k+Tyyy9f4zkrA+TKlckrXXnllW1+3q985St58cUX87nPfW6VLcqT11bN/+IXv1jj9Svf/z/96U+tjt96661rvKampibvfOc7c8kll2TrrbfOH/7wh5bv1dfXr3Yl/tFHH52//OUv2W233Vb7c7CusXldrfwHDZMnT251/MYbb1zvezc1NeXkk09Oc3NzvvjFL7Ycb+/X3L9///Tu3Ts33HBDq7/rp59+Ovfff3/xPXbeeedcf/31re7xyiuv5KabbsrQoUPTo0eP9OzZM0OGDMktt9ySpUuXtpz3z3/+M7fffnvxzO3xuwsAANCZWcEOAADQyYwePTo33XRTDjrooHz+85/PPvvskxUrVmTWrFn5xS9+kS984Qt5z3ves9Z7HHXUUZkwYUKOP/74fPrTn86CBQty8cUXrxKq12bcuHG54447ctBBB+Wss87K3nvvnZdeeil33nlnTj/99Oyxxx7r9ToPPPDAnHDCCTn//PPz3HPP5eijj059fX1mzpyZHj165LTTTsuwYcOyzTbb5NRTT825556bbt265Yc//GH++Mc/tvl5P/zhD+crX/lKvvrVr+avf/1rRo4cmd122y2LFy/Ob3/721x55ZUZMWJEhg8fvtrr3/Wud6V///4544wz0tzcnG222SY//elPc99997U67/bbb8/EiRPzoQ99KG9729tSqVRy880356WXXsphhx3Wct7ee++dadOm5bbbbkvv3r2z5ZZbpn///hk3blymTp2aYcOG5XOf+1z69++fV199NU899VSmTJmSK664ongL/7Y4/PDDc8ABB+QLX/hCFi1alMGDB2f69Om57rrrkqTV55GvzaxZs/LAAw9kxYoVWbhwYWbOnJlrrrkmTz/9dL75zW+2ep/b+zV36dIlX/3qV3PyySfn3/7t3/KpT30qL730UsaOHbvWjyZ44z0uvPDCfPSjH83RRx+dU045JUuWLMlFF12Ul156KRdccEGr+Y866qh84AMfyH/9139l+fLlueiii7LFFlvkH//4R9HztcfvLgAAQGcmsAMAAHQyPXv2zL333psLLrggV111VZ588sk0NDRkl112yaGHHlq0gv1973tfrrnmmnzjG9/IMccck5133jmf+tSnssMOO2TkyJFFc+y888753e9+l3PPPTcXXHBBFixYkLe85S35l3/5l1U+37mtJk2alP322y9XX311Jk2alIaGhuy5554566yzkry2PffPf/7zfOELX8jHPvax9OzZM//6r/+ayZMnZ7/99mvz844bNy6HHnpovv3tb+fss8/OCy+8kIaGhuy11145/fTTc8opp6zx2q5du+a2227LZz/72Zx66qmpr6/Pf/7nf+a///u/c9RRR7Wc9453vCNbb711Lrzwwjz77LOpq6tL//79M2nSpHz84x9vOe+yyy7LZz7zmfznf/5nFi9enIMPPjjTpk1L79698+CDD+arX/1qLrroojzzzDPZcsst069fvxx++OHZZptt2vz6S3Tp0iW33XZbvvCFL+SCCy7I0qVLc8ABB+QHP/hB9t9//2y99dZF9/n2t7+db3/72+natWu22mqrvO1tb8sxxxyTT33qU9lzzz1bnbshXvPKn/dvfOMbOfbYY7PrrrvmrLPOyj333JNp06YV3eP4449Pz549M378+IwYMSJdu3bN/vvvn7vvvjvDhg1rOe/www/PTTfdlHPOOScjRozIjjvumFGjRuXZZ58tXoHeHr+7AAAAnVlNZXX71QEAAABUwfXXX5+PfvSj+c1vftMqLrN6y5Yty7777pudd955rR89AAAAQPuwgh0AAACoihtuuCFz5szJ3nvvnS5duuSBBx7IRRddlIMOOkhcX4ORI0fmsMMOS+/evTNv3rxcccUVefTRR3PZZZdVezQAAIBOQWAHAAAAqmLLLbfMjTfemPPPPz+vvPJKevfunZNOOinnn39+tUfrsF5++eWcccYZef7559OtW7fst99+mTJlSg499NBqjwYAANAp2CIeAAAAAAAAAAp0qfYAAAAAAAAAALApENgBAAAAAAAAoECn+wz2FStW5Nlnn82WW26Zmpqaao8DAAAAAAAAQJVVKpW8/PLL2WmnndKly5rXqVc9sE+cODEXXXRR5s6dm7322iuXXnppDjzwwNWee9JJJ+Xaa69d5fiee+6Zhx9+uOj5nn322fTp02e9ZgYAAAAAAABg8zN79uy89a1vXeP3ayqVSmUjztPK5MmTc8IJJ2TixIk54IADcuWVV+Z73/teHnnkkeyyyy6r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OCKPPPJIdtlll9Vec9xxx+W5557L1Vdfnbe//e2ZP39+mpubN/LkAAAAAAAAAHQ2VQ3sEyZMyMiRI3PyyScnSS699NLcddddufzyyzN+/PhVzr/zzjtzzz335O9//3u23XbbJMmuu+66MUcGAAAAAAAAoJOq2hbxS5cuzYwZMzJ8+PBWx4cPH577779/tdfceuutGTJkSC688MLsvPPO2X333XPGGWekqalpjc+zZMmSLFq0qNUDAAAAAAAAANZV1Vawv/DCC1m+fHl69erV6nivXr0yb9681V7z97//Pffdd1+6d++en/70p3nhhRcyatSo/OMf/1jj57CPHz8+5513XrvPDwAAAAAAAEDnUrUV7CvV1NS0+rpSqaxybKUVK1akpqYmP/zhD/Pud787Rx55ZCZMmJBJkyatcRX7mDFjsnDhwpbH7Nmz2/01AAAAAAAAALD5q9oK9u233z5du3ZdZbX6/PnzV1nVvlLv3r2z8847p7GxseXYgAEDUqlU8swzz+Qd73jHKtfU19envr6+fYcHAAAAAAAAoNOp2gr2urq6DB48OFOnTm11fOrUqRk2bNhqrznggAPy7LPP5p///GfLsf/7v/9Lly5d8ta3vnWDzgsAAAAAAABA51bVLeJPP/30fO9738s111yTRx99NJ///Ocza9asnHrqqUle2979xBNPbDn/+OOPz3bbbZdPfOITeeSRR/LrX/86/+///b988pOfTENDQ7VeBgAAAAAAAACdQNW2iE+SESNGZMGCBRk3blzmzp2bgQMHZsqUKenbt2+SZO7cuZk1a1bL+VtssUWmTp2a0047LUOGDMl2222X4447Lueff361XgIAAAAAAAAAnURVA3uSjBo1KqNGjVrt9yZNmrTKsT322GOVbeUBAAAAAAAAYEOr6hbxAAAAAAAAALCpENgBAAAAAAAAoIDADgAAAAAAAAAFBHYAAAAAAAAAKCCwAwAAAAAAAEABgR0AAAAAAAAACgjsAAAAAAAAAFBAYAcAAAAAAACAAgI7AAAAAAAAABQQ2AEAAAAAAACggMAOAAAAAAAAAAUEdgAAAAAAAAAoILADAAAAAAAAQAGBHQAAAAAAAAAKCOwAAAAAAAAAUEBgBwAAAAAAAIACAjsAAAAAAAAAFBDYAQAAAAAAAKCAwA4AAAAAAAAABQR2AAAAAAAAACggsAMA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AABAAYEdAAAAAAAAAAoI7AAAAAAAAABQQGAHAAAAAAAAgAICOwAAAAAAAAAUENgBAAAAAAAAoMB6BfalS5fmscceS3Nzc3vNAwAAAAAAAAAdUpsC++LFizNy5Mj06NEje+21V2bNmpUk+dznPpcLLrigXQcEAAAAAAAAgI6gTYF9zJgx+eMf/5hp06ale/fuLccPPfTQTJ48ud2GAwAAAAAAAICOorYtF91yyy2ZPHly9t9//9TU1LQc33PPPfPEE0+023AAAAAAAAAA0FG0aQX7888/nx122GGV46+88kqr4A4AAAAAAAAAm4s2BfZ3vetd+fnPf97y9cqo/t3vfjdDhw5tn8kAAAAAAAAAoANp0xbx48ePz+GHH55HHnkkzc3Nueyyy/Lwww9n+vTpueeee9p7RgAAAAAAAACoujatYB82bFh+85vfZPHixdltt93yi1/8Ir169cr06dMzePDg9p4RAAAAAAAAAKquTSvYk2TvvffOtdde256zAAAAAAAAAECH1aYV7FOmTMldd921yvG77rord9xxx3oPBQAAAAAAAAAdTZsC+5lnnpnly5evcrxSqeTMM89c76EAAAAAAAAAoKNpU2D/29/+lj333HOV43vssUcef/zx9R4KAAAAAAAAADqaNgX2xsbG/P3vf1/l+OOPP56ePXuu91AAAAAAAAAA0NG0KbB/8IMfzOjRo/PEE0+0HHv88cfzhS98IR/84AfbbTgAAAAAAAAA6CjaFNgvuuii9OzZM3vssUf69euXfv36ZcCAAdluu+1y8cUXt/eMAAAAAAAAAFB1tW25qLGxMffff3+mTp2aP/7xj2loaMg+++yTgw46qL3nAwAAAAAAAIAOoU2BPUlqamoyfPjwDB8+vD3nAQAAAAAAAIAOqc2B/Ze//GV++ctfZv78+VmxYkWr711zzTXrPRgAAAAAAAAAdCRtCuznnXdexo0blyFDhqR3796pqalp77kAAAAAAAAAoENpU2C/4oorMmnSpJxwwgntPQ8AAAAAAAAAdEhd2nLR0qVLM2zYsPaeBQAAAAAAAAA6rDYF9pNPPjnXX399e88CAAAAAAAAAB1Wm7aIf/XVV3PVVVflf//3f7PPPvukW7durb4/YcKEdhkOAAAAAAAAADqKNgX2P/3pT9l3332TJH/5y19afa+mpma9hwIAAAAAAACAjqZN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4MGDZeDAgfL9739fbr75Zhk4cKAMHjxYVq1alRDe0o54qTdBPnPy4xmVVXz/Yfny5VJZWSlDhgyRSy65RG6//XY5/fTTZfTo0bJr166M/1622pJs9HVFgn02nm+CmoPKKi1Sr7zySsK/jh07NnwdbfLkyQ1fr127Vk899VRt3ry5VlRU6PLlyxPirqmp0W7dumnz5s314osv1i1btjT8rG/fvjFhf/nLX2qHDh20c+fOOn36dO3SpYuOHj1aO3furA8++GBW020JX1JSor1799Zf//rXum3btoS44s2dO1fbtWunHTp00Orqau3fv7+ecsop2rZtW50/f35M2Hnz5mnnzp21srJSmzVrpuecc4726NFD+/fvr59++qlj/Hv37tWXXnpJf/WrX+lDDz2k8+bNS5umeDU1NZ7TrGrLE2vclvDWcrdcU9aysaTbkg5V1bfeekvLy8t14MCBOmbMGB09erQOGDBAy8vL9c0334wJO2zYMP3iiy9UVXXGjBl6/PHH65gxY7SiokJ/97vfJcRtqZclJSVaUVER869x48ZaUVGhJ5xwQkLcyXTu3Dnhe9Y8scRvyZORI0fqQw89pIsWLdKxY8fq4MGDddeuXaqq+pWvfCWjdESsWrVKN23apKqq//znP/Xpp5/WRYsWJYSztK9ODhw4oEuWLNGdO3cm/Owf//iH249hvqYs9bKyslLXrVuny5Yt0zZt2uh7772nqqqrV6/WPn36uE6jqur27dtdh3UqG0u71qtXr4avhwwZosuWLVNV1XXr1iWUjaX+qtrqgvUasaTF0jZkeq1GTJo0KenPXn311YZ71+uvv66TJk3SF154wVW8tbW1umTJkoa6HG/fvn362WefJXz//fffT/jezp07dcqUKXr33Xfr3XffrVOmTNEdO3Yk/duff/65/upXv9IbbrhBb7nlFn3qqad07969rtIdEX/PjrDkiSXds2bN0v3795vSGC1VOe7bt08PHToU8xnuuusunTlzZsbpsMStejhPIu3G9u3b9cUXX9QPPvggafzWso+WLk/cXn+pJLtOLGEteWJJt7VsoqWrv9Z0Z9KWqKYuy2TclE2qz+mlTgZVltY2zW06gq7vfrTFqs5laYnbSzvltt0Jup65vU6CHgu7zRNr/9UaPlqq/Mu0j5Qqbutziui/N2HCBJ04caJu3LhRH3jgAb3ooovS/n6EUz/aUpbWvrF1zG9JtzVuyz3EkifWsrT00y35bR2TW65va12w1Elr/nm5r7ote0vZdOvWTe+//37t2bOnHnvssTpx4kT98MMPk6bBS5sZsWLFCp0yZYouXbrU8edBPYezPgceMmSIzpw5U59++mnt0qWLTp06VVVVX3zxRT333HNTfsZ4J598csz/g3yOaW3XnDzxxBOuP1uyZx9e7jlBjXHiuelrOEnWj3bbL8mkfxRh+Zxexgqqqlu3bo35v6UNHDhwoGN79Pzzz2v//v1jvmdtR6zta1DPnLyEz3TcFxHff6iqqtLq6mpVPdw23Xjjjbpv3z694447dOzYsY5xHDx4UKurq3XatGk6bdo0ra6u1oMHDyaE89KWuB2LeOnr+pGHyZ6Nh2EMaglr7TsEOQdlTUsm7Xy8op1gLykp0cGDB+vQoUMb/jVv3lyHDh2qw4YNiwkbfcP91re+pQ899JCqqr7wwgt6zjnnJMR91lln6csvv6xbt27VO++8U0855ZSGgo+fjDr11FN1+/btun79ei0rK9O1a9eqquqWLVu0Z8+eWU23JXyvXr30hRde0FGjRmmLFi30sssu09deey0hzogBAwZoTU2Nvv7669q2bVudO3euqqouXLhQzzjjjIR0RCrtO++8o1deeaWqqj7++ON64YUXJsSdSYc6WnzjZkmzNU+scVvzL8JNuVuvKUvZWNJtSYfq4UnIyMRjtHfffTdmok81duKvqqpK169fr6qHbxKVlZUJcVjq5aRJk3TkyJG6bt26hu9VVFQkxKnqfCOJ/Gvfvn1CeGueWOK35En8oOOnP/2p9u/fX3fu3Ok4ILF+TkuH0NK+qtoGgV4nk91cU5Z6GR22vLw85mdOn9EyYLSWjaVdix6sn3766TE/i88TS/1VtdUF6zViSYulbbCmQ1X14YcfTvjXrl27hq+j3XLLLVpZWak9evTQe++9V3v16qW33nqr9uvXT++4446EuG+77baGr2tqavTYY4/V7t27a/v27RsGQhHz5s3To446Stu0aaOnnXaarl69uuFn8dfUiy++qB07dtTLLrtMb7vtNr311lt1zJgx2rFjR33xxRcT0jFjxgzt0qWLXnDBBdq2bVv91re+peedd56Wl5frypUrHfPFidOAxJIn1nQ3atRI27dvrzfddFPaSV5LOaqq9unTp6He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/IsfVDgN5i156PXaVk19/anarpNMrql0eWJNt9dyT1d/M0m3m7bEUpbW/LZ8TmtdCKosLW2aNR1B1ndrui1laY3bkm5r252teqaa+joJcixsyRNr/9US3pJ/1j6S17YhWrLnFOXl5TETURs2bFBVdTypy9qPtpSltW9sGVtY022J23oPseSJtSwt/XRrflvH5G6vb2td8FonoyXLv0zuq+nK3lI21lfQWa4p60RKUM/hrM+bhg8frv/6178Svv/555/rgAEDEr5fUVHheMSwamKdD/I5prWeBbWhzFrPghrjqNruZ5mMW1RT90ss/SPr57TmiWUS0tIGrl69Ws8++2w96qijtGfPntqrVy898sgjddiwYQmvnbD2vazta1DPnKzhrfdsS//h1Vdf1Xbt2mnPnj21Q4cODbvQN27cqFdddVXC71smza1tiWUsYu0bW/LQ2v8Kyxg0yPGqanBzUJa0WMeU6RT1BHvEo48+qqeddlrCUTkRZ511VkwDH9kZuGnTpoRjcFVVx48fr7NmzUr4/owZMxJWC7733nvat29fPe2007Smpka/853vaFlZWcxOy2yl2xLeaRV/KuPGjXPsEK5evTphF+m7776rnTp10rKyMj3xxBMbVut88cUXjivBLBWusrIy6fsl4hs3S5pVbXlijdsS3lru0dJdU5GyadGihauysX5Ot+lQVd28ebOOGzdOW7ZsqS1atNCWLVtqy5Ytddy4cQ2ruKJNnjxZO3XqpM2aNdOSkhJt3bq1Xn311Qnv9FHNrF4uWLBAf/7znzv+7Gc/+1nMYCHavffemzJeN3lijd9tnuzduzfpe1ycXsNgTYelQ2hpX1Vtg0BrJzk+/1q1apX0msqkXtbX1+uiRYscr2tV24DRWjbWtl718A6D5cuX6+LFix3zQvVw/R0/fnxD/Y3U4WT1N1q6umC9RuLTkqotsbQN1nRE7N69WydMmKBjxozRLVu2JO1sfu1rX9MHH3xQ77nnHu3du7fef//9umXLFp0yZYpj+9qpU6eGFe/xi03iH0r06NEjoc7Pnz9fu3Tpoh07doz5/re//W0dN26cLlq0SLds2aJbt27VRYsW6bhx4/Syyy5LSMe5556rU6dO1S1btuivfvUrHT16dMPP4juylnu2NU+s6U7WPqxdu1Z/9KMfJXzfbTmqHt6d8NWvflXnzp2rP//5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2bKlrF69uiH8ddddJ926dWsIAwAAAABANjHBDgAAAACADzZu3Cjf/va3Zfz48bJq1SqZP3++XHzxxaKqIiKye/duueKKK+TNN9+Ud955R04++WQZNWqU7N69Oyaeu+++W8aOHSs1NTVyyimnyH/8x3/I1VdfLT/4wQ9k0aJFIiLyve99L+Z31qxZI88995zMmjVL5syZIzU1NXLttdcmTeudd94pv//97+XRRx+VFStWyE033ST/+Z//KdXV1abPfNddd8mYMWNk+fLlMmrUKPnOd74j27dvFxGRDRs2yMUXXyyjRo2Smpoaueqqq+T222+P+f1//OMfMmLECLn44otl+fLlMmPGDHnrrbcaPt/YsWMb4q2vr5c5c+bIY489Jn/4wx84rh4AAAAAkBMlGhnpAwAAAAAAz5YsWSL9+vWTdevWSXl5edrwBw8elKOOOkqeeeYZ+frXvy4ih3eF33nnnXL33XeLiMg777wjVVVV8uSTT8r48eNFROTZZ5+VcePGyZ49e0Tk8A72e+65R9atWyedOnUSEZE5c+bI+eefL5999pl07NhRrrzyStm5c6fMnDlTamtrpV27djJv3jypqqpqSM9VV10ldXV18swzzzimt6KiQm688Ua58cYbHdNaW1srrVq1ktmzZ8t5550nP/zhD2XmzJmyYsUKKSkpERGR22+/XX7xi1/Ijh075Mgjj5SxY8dKaWmpPPbYYw1/56233pKzzjpLamtrpXnz5rJjxw7p3bu3XHDBBfLiiy/KddddJ3fccYfrcgEAAAAAwE+8gx0AAAAAAB/06dNHvva1r0llZaWMGDFChg8fLpdeeqkcddRRIiKyefNm+fGPfyzz5s2TTZs2ycGDB6Wurk7Wr18fE0/v3r0bvj7mmGNERKSysjLme3v37pVdu3ZJ69atRUSkS5cuDZPrIiJVVVVy6NAh+fDDD6Vjx44x8a9cuVL27t0r5557bsz39+/fL3379jV95ui0tmjRQlq1aiWbN28WEZFVq1bJoEGDGibXI+mKtnjxYlmzZo384Q9/aPieqsqhQ4fk448/lh49eshRRx0lTz75pIwYMUIGDx6csAseAAAAAIBsYoIdAAAAAAAfHHHEEfLaa6/J22+/LX/729/kwQcflDvuuEMWLlwoJ5xwglx55ZWyZcsWmTx5spSXl0uzZs2kqqpK9u/fHxNPkyZNGr6OTE47fe/QoUNJ0xIJEz25HRH5vVdeeUWOP/74mJ81a9bM8pFj0hX5e5H43RyYd+jQIbn66qvl+uuvT/hZly5dGr5+44035IgjjpDPP/9camtrGxYWAAAAAACQbbyDHQAAAAAAn5SUlMgZZ5whd911lyxdulSaNm0qL730koiIvPnmm3L99dfLqFGjpGfPntKsWTPZunWrL393/fr18vnnnzf8f8GCBdKoUSPp1q1bQthTTz1VmjVrJuvXr5euXbvG/OvcubMv6Yn8nXfeeSfme/H/P+2002TFihUJ6ejatas0bdpURETefvtt+eUvfymzZs2S1q1by3XXXedbGgEAAAAAsGIHOwAAAAAAPli4cKHMnTtXhg8fLh06dJCFCxfKli1bpEePHiIi0rVrV5k2bZqcfvrpsmvXLrn11lultLTUl7/dvHlzueKKK+T++++XXbt2yfXXXy9jxoxJOB5eRKRVq1Zyyy23yE033SSHDh2Sr371q7Jr1y55++23pWXLlnLFFVf4kqZrrrlGHnjgAbn55pvl6quvlsWLF8vTTz8dE2bixIkyaNAgufbaa2XChAnSokULWbVqlbz22mvy4IMPyu7du+Xyyy+X6667TkaOHCldunSR008/Xb7+9a/L6NGjfUknAAAAAAAW7GAHAAAAAMAHrVu3ljfeeENGjRol3bp1kzvvvFMeeOABGTlypIiIPPXUU7Jjxw7p27evXH755XL99ddLhw4dfPnbXbt2lYsvvlhGjRolw4cPl169eskjjzySNPzdd98tP/7xj+Xee++VHj16yIgRI2TWrFlywgkn+JIekcNHvP/pT3+SWbNmSZ8+feS3v/2t/OxnP4sJ07t3b6murpbVq1fLmWeeKX379pUf/ehHcuyxx4qIyA033CAtWrRo+L2ePXvKL37xC7nmmmvks88+8y2tAAAAAAC4VaJuXooGAAAAAABCadKkSTJz5kypqanJdVIAAAAAACh47GAHAAAAAAAAAAAAAMAFJtgBAAAAAAAAAAAAAHCBI+IBAAAAAAAAAAAAAHCBHewAAAAAAAAAAAAAALjABDsAAAAAAAAAAAAAAC4wwQ4AAAAAAAAAAAAAgAtMsAMAAAAAAAAAAAAA4AIT7AAAAAAAAAAAAAAAuMAEOwAAAAAAAAAAAAAALjDBDgAAAAAAAAAAAACAC0ywAwAAAAAAAAAAAADgwv8HFUg2ZH0eMrsAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Create the linkage matrix\n", "linkage_matrix = linkage(TotalList['gps'].values.tolist(), 'ward')\n", "\n", "# Plot the dendrogram\n", "plt.figure(figsize=(25, 10))\n", "plt.title('Hierarchical Clustering Dendrogram')\n", "plt.xlabel('sample index')\n", "plt.ylabel('distance')\n", "dendrogram(linkage_matrix, leaf_rotation=90., leaf_font_size=8.)\n", "plt.show()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:51.214742Z", "start_time": "2023-11-06T00:18:50.736378Z" } }, "id": "9e215df3a350e3cf" }, { "cell_type": "code", "execution_count": 255, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of clusters: 10\n", "Silhouette score: 0.4218177237729999\n" ] } ], "source": [ "# Set the threshold distance\n", "threshold_distance = 0.15\n", "\n", "# Cut the dendrogram to get cluster labels\n", "cluster_labels_hc = fcluster(linkage_matrix, t=threshold_distance, criterion='distance')\n", "\n", "# Now, you have the number of clusters determined by the dendrogram\n", "num_clusters = len(np.unique(cluster_labels_hc))\n", "print(\"Number of clusters:\", num_clusters)\n", "\n", "# Calculate the silhouette score to evaluate the clustering\n", "silhouette_avg = silhouette_score(TotalList['gps'].values.tolist(), cluster_labels_hc)\n", "print(\"Silhouette score:\", silhouette_avg)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:51.241741Z", "start_time": "2023-11-06T00:18:51.217906Z" } }, "id": "2f52d83746e670d" }, { "cell_type": "markdown", "source": [ "# K-means" ], "metadata": { "collapsed": false }, "id": "bc97c258908ac38a" }, { "cell_type": "code", "execution_count": 256, "outputs": [], "source": [ "# Cluster the data using Gaussian Mixture Models\n", "# Create two centroids, one in the North End and one in the Financial District\n", "centroids = [[42.364506, -71.054733], [42.358894, -71.056742]]" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:54.543675Z", "start_time": "2023-11-06T00:18:54.540819Z" } }, "id": "45b59d81ae2de84e" }, { "cell_type": "code", "execution_count": 257, "outputs": [ { "data": { "text/plain": " name gps list weights\n0 521 Commercial Street #525 [42.3688272, -71.0553792] A 0.016268\n1 Acorn St [42.3576234, -71.0688746] A 0.007206\n2 Arlington's Great Meadows [42.4299758, -71.2038948] A 0.000607\n3 Arthur Fiedler Statue [42.3565057, -71.0754527] A 0.004854\n4 BU Beach [42.3511927, -71.1060828] A 0.001925\n.. ... ... ... ...\n33 The Quiet Few [42.3670906, -71.0359889] D 0.004835\n34 The Tall Ship Boston [42.3649544, -71.0414523] D 0.006736\n35 Toasted Flats [42.3711266, -71.0371343] D 0.004775\n36 Vega Market [42.3891835, -71.033703] D 0.002828\n37 Winthrop High School [42.3803348, -70.9799864] D 0.001269\n\n[169 rows x 4 columns]", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
namegpslistweights
0521 Commercial Street #525[42.3688272, -71.0553792]A0.016268
1Acorn St[42.3576234, -71.0688746]A0.007206
2Arlington's Great Meadows[42.4299758, -71.2038948]A0.000607
3Arthur Fiedler Statue[42.3565057, -71.0754527]A0.004854
4BU Beach[42.3511927, -71.1060828]A0.001925
...............
33The Quiet Few[42.3670906, -71.0359889]D0.004835
34The Tall Ship Boston[42.3649544, -71.0414523]D0.006736
35Toasted Flats[42.3711266, -71.0371343]D0.004775
36Vega Market[42.3891835, -71.033703]D0.002828
37Winthrop High School[42.3803348, -70.9799864]D0.001269
\n

169 rows × 4 columns

\n
" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Create a weights column that increases as the location gets closer to the centroids\n", "\n", "# Compute the distance from each point to each centroid\n", "TotalList['weights'] = TotalList['gps'].apply(lambda x: [np.linalg.norm(np.array(x) - np.array(centroids[0])), np.linalg.norm(np.array(x) - np.array(centroids[1]))])\n", "\n", "# Invert the weights so that the locations closest to the centroids have the highest weights\n", "TotalList['weights'] = TotalList['weights'].apply(lambda x: [1/i for i in x])\n", "\n", "# Sum the weights\n", "TotalList['weights'] = TotalList['weights'].apply(lambda x: sum(x))\n", "\n", "# Normalize the weights\n", "TotalList['weights'] = TotalList['weights'].apply(lambda x: x/sum(TotalList['weights']))\n", "\n", "display(TotalList)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:54.970160Z", "start_time": "2023-11-06T00:18:54.956075Z" } }, "id": "2f2975484d00129c" }, { "cell_type": "code", "execution_count": 258, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/garrinshieh/anaconda3/lib/python3.11/site-packages/sklearn/cluster/_kmeans.py:1412: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", " super()._check_params_vs_input(X, default_n_init=10)\n", "/Users/garrinshieh/anaconda3/lib/python3.11/site-packages/sklearn/cluster/_kmeans.py:1412: RuntimeWarning: Explicit initial center position passed: performing only one init in KMeans instead of n_init=10.\n", " super()._check_params_vs_input(X, default_n_init=10)\n" ] } ], "source": [ "kmeans = KMeans(n_clusters=2, init=centroids).fit(TotalList['gps'].values.tolist())" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:56.312805Z", "start_time": "2023-11-06T00:18:56.299246Z" } }, "id": "db1ef4b14a1da5f5" }, { "cell_type": "code", "execution_count": 259, "outputs": [], "source": [ "# Add the cluster labels to the dataframe\n", "TotalList['cluster'] = kmeans.labels_" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:58.475575Z", "start_time": "2023-11-06T00:18:58.468594Z" } }, "id": "99891fae96a2fff7" }, { "cell_type": "code", "execution_count": 260, "outputs": [ { "data": { "text/plain": " name gps list weights \\\n0 521 Commercial Street #525 [42.3688272, -71.0553792] A 0.016268 \n1 Acorn St [42.3576234, -71.0688746] A 0.007206 \n2 Arlington's Great Meadows [42.4299758, -71.2038948] A 0.000607 \n3 Arthur Fiedler Statue [42.3565057, -71.0754527] A 0.004854 \n4 BU Beach [42.3511927, -71.1060828] A 0.001925 \n.. ... ... ... ... \n33 The Quiet Few [42.3670906, -71.0359889] D 0.004835 \n34 The Tall Ship Boston [42.3649544, -71.0414523] D 0.006736 \n35 Toasted Flats [42.3711266, -71.0371343] D 0.004775 \n36 Vega Market [42.3891835, -71.033703] D 0.002828 \n37 Winthrop High School [42.3803348, -70.9799864] D 0.001269 \n\n cluster \n0 0 \n1 0 \n2 1 \n3 0 \n4 1 \n.. ... \n33 0 \n34 0 \n35 0 \n36 0 \n37 0 \n\n[169 rows x 5 columns]", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
namegpslistweightscluster
0521 Commercial Street #525[42.3688272, -71.0553792]A0.0162680
1Acorn St[42.3576234, -71.0688746]A0.0072060
2Arlington's Great Meadows[42.4299758, -71.2038948]A0.0006071
3Arthur Fiedler Statue[42.3565057, -71.0754527]A0.0048540
4BU Beach[42.3511927, -71.1060828]A0.0019251
..................
33The Quiet Few[42.3670906, -71.0359889]D0.0048350
34The Tall Ship Boston[42.3649544, -71.0414523]D0.0067360
35Toasted Flats[42.3711266, -71.0371343]D0.0047750
36Vega Market[42.3891835, -71.033703]D0.0028280
37Winthrop High School[42.3803348, -70.9799864]D0.0012690
\n

169 rows × 5 columns

\n
" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Display the dataframe\n", "display(TotalList)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:18:58.847605Z", "start_time": "2023-11-06T00:18:58.843691Z" } }, "id": "49fc751352022ad1" }, { "cell_type": "markdown", "source": [ "# Map" ], "metadata": { "collapsed": false }, "id": "8c46f8ae30caa721" }, { "cell_type": "code", "execution_count": 261, "outputs": [], "source": [ "# Create a map in Boston\n", "m = folium.Map(location=[42.3601, -71.0589], zoom_start=12)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:19:00.620249Z", "start_time": "2023-11-06T00:19:00.612951Z" } }, "id": "48d76bd40c44cc61" }, { "cell_type": "code", "execution_count": 262, "outputs": [], "source": [ "# Plot the centroids on the map\n", "for i in range(len(centroids)):\n", " folium.Marker(centroids[i], popup='Centroid ' + str(i), icon=folium.Icon(color='black')).add_to(m)\n", " \n", "# Add the points to the map with different colors for each cluster\n", "for i, row in TotalList.iterrows():\n", " if row['cluster'] == 0:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='red')).add_to(m)\n", " elif row['cluster'] == 1:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='blue')).add_to(m)\n", " elif row['cluster'] == 2:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='green')).add_to(m)\n", " elif row['cluster'] == 3:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='purple')).add_to(m)\n", " elif row['cluster'] == 4:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='orange')).add_to(m)\n", " elif row['cluster'] == 5:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='darkred')).add_to(m)\n", " elif row['cluster'] == 6:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='lightred')).add_to(m)\n", " elif row['cluster'] == 7:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='beige')).add_to(m)\n", " elif row['cluster'] == 8:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='darkblue')).add_to(m)\n", " elif row['cluster'] == 9:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='lightblue')).add_to(m)\n", " elif row['cluster'] == 10:\n", " folium.Marker([row['gps'][0], row['gps'][1]], popup=row['name'], icon=folium.Icon(color='cadet')).add_to(m)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:19:01.125434Z", "start_time": "2023-11-06T00:19:01.109369Z" } }, "id": "3c8a7d2b34d4f22d" }, { "cell_type": "code", "execution_count": 263, "outputs": [ { "data": { "text/plain": "", "text/html": "
Make this Notebook Trusted to load map: File -> Trust Notebook
" }, "execution_count": 263, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display the map\n", "m" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:19:02.155307Z", "start_time": "2023-11-06T00:19:02.145235Z" } }, "id": "d6941d1f0a203ee7" }, { "cell_type": "code", "execution_count": 264, "outputs": [ { "data": { "text/plain": "0 106\n1 63\nName: cluster, dtype: int64" }, "execution_count": 264, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display the number of locations in each cluster\n", "TotalList['cluster'].value_counts()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:19:05.516139Z", "start_time": "2023-11-06T00:19:05.510902Z" } }, "id": "479ba8f36cdafbf8" }, { "cell_type": "code", "execution_count": 244, "outputs": [], "source": [ "# create a method to move n number of locations from the largest cluster to the smallest cluster, taking distance into account\n", "def equalize_clusters(df, n):\n", " # Get the number of locations in each cluster\n", " cluster_counts = df['cluster'].value_counts()\n", " \n", " # Get the largest and smallest clusters\n", " largest_cluster = cluster_counts.index[0]\n", " smallest_cluster = cluster_counts.index[-1]\n", " \n", " # Get the locations in the largest cluster\n", " largest_cluster_locations = df[df['cluster'] == largest_cluster]\n", " \n", " # Get the locations in the smallest cluster\n", " smallest_cluster_locations = df[df['cluster'] == smallest_cluster]\n", " \n", " # Create a list of distances from each location in the largest cluster to each location in the smallest cluster\n", " distances = []\n", " for i, row in largest_cluster_locations.iterrows():\n", " for j, row2 in smallest_cluster_locations.iterrows():\n", " distances.append([i, j, np.linalg.norm(np.array(row['gps']) - np.array(row2['gps']))])\n", " \n", " # Sort the distances by distance\n", " distances.sort(key=lambda x: x[2])\n", " \n", " # Move the n closest locations from the largest cluster to the smallest cluster\n", " for i in range(n):\n", " df.loc[distances[i][0], 'cluster'] = smallest_cluster\n", " df.loc[distances[i][1], 'cluster'] = largest_cluster\n", " \n", " return df" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-05T23:51:40.761645Z", "start_time": "2023-11-05T23:51:40.752184Z" } }, "id": "4b79215a12bf36e2" }, { "cell_type": "code", "execution_count": 245, "outputs": [ { "data": { "text/plain": "0 97\n1 72\nName: cluster, dtype: int64" }, "execution_count": 245, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Equalize the clusters\n", "TotalList = equalize_clusters(TotalList, 20)\n", "\n", "# Display the number of locations in each cluster\n", "TotalList['cluster'].value_counts()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-05T23:51:41.510095Z", "start_time": "2023-11-05T23:51:41.434643Z" } }, "id": "176d5f92130c67b8" }, { "cell_type": "code", "execution_count": 267, "outputs": [ { "data": { "text/plain": "0 106\n1 63\nName: cluster, dtype: int64" }, "execution_count": 267, "metadata": {}, "output_type": "execute_result" } ], "source": [ "TotalList['cluster'].value_counts()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:20:43.543111Z", "start_time": "2023-11-06T00:20:43.529364Z" } }, "id": "1b8e5c1793fb2feb" }, { "cell_type": "code", "execution_count": 265, "outputs": [ { "data": { "text/plain": "'-71.0553792,42.3688272;-71.0688746,42.3576234;-71.2038948,42.4299758;-71.0754527,42.3565057;-71.1060828,42.3511927;-71.0969274,42.3446263;-71.130887,42.35304;-71.0620802,42.3579151;-71.1459593,42.3501823;-71.0586014,42.357357;-71.0572023,42.3587627;-71.0556268,42.36521;-71.1460435,42.3495825;-71.1217152,42.3426377;-71.0720926,42.3489004;-71.067859,42.3500079;-71.0632036,42.3556154;-71.1258765,42.331864;-71.1095021,42.3364675;-71.133103,42.3890049;-71.0620134,42.3248471;-71.0851891,42.3500031;-71.1123834,42.3360385;-71.066414,42.354296;-71.2273649,42.3145041;-71.0834061,42.341987;-71.0992038,42.3306454;-71.0990577,42.3381442;-71.0569649,42.3604952;-71.0949218,42.3419564;-71.0942861,42.3413301;-71.0498714,42.3256817;-71.0908104,42.329969;-71.0616035,42.3537983;-71.0359433,42.3485465;-71.0913583,42.3490205;-71.1000217,42.3323776;-71.1241295,42.3518397;-71.1618052,42.3245965;-71.0638101,42.3587772;-71.1625829,42.340795;-71.167854,42.4107892;-71.155555,42.3317473;-71.1227278,42.3965778;-71.3598149,42.3140229;-71.1126695,42.3836229;-71.0555003,42.3640137;-71.119149,42.3884;-71.0712561,42.3407613;-71.0561781,42.3668968;-71.0664019,42.3554589;-71.059228,42.359349;-71.0668408,42.3524116;-71.0872846,42.2961434;-71.062146,42.366198;-71.1427371,42.3433772;-71.1438455,42.3569102;-71.0651214,42.3553972;-71.0596124,42.3509517;-71.0359354,42.3478381;-71.1313443,42.3525708;-71.1284677,42.3631904;-71.061757,42.3691906;-71.119301,42.388547;-71.097883,42.381008;-71.1107166,42.3741209;-71.0609962,42.3803747;-71.0516339,42.3609921;-71.1194344,42.3754427;-71.0809932,42.3675275;-71.0545357,42.3597994;-71.1013044,42.3627462;-71.1108423,42.3838224;-71.1026937,42.3820702;-71.1189467,42.373465;-71.1208817,42.3732344;-71.0342146,42.316274;-71.0756902,42.3695046;-71.0678704,42.3701829;-71.0968274,42.3799095;-71.0656594,42.3718401;-71.094048,42.339381;-71.1854722,42.3621177;-71.1146697,42.3782386;-71.0935443,42.3817274;-71.0611749,42.3551807;-71.0906355,42.3616095;-71.1161887,42.3766442;-71.0962734,42.3627993;-71.1155576,42.3784629;-71.0949101,42.3797674;-71.1087411,42.3640287;-71.0554239,42.3739796;-71.09476,42.37736;-71.1014951,42.3614115;-71.1024769,42.3822934;-71.1011111,42.3636597;-71.0631664,42.3741694;-71.056823,42.361531;-71.0632852,42.2857047;-71.0637877,42.2845163;-71.0496839,42.3519736;-71.0454645,42.3162356;-71.0336324,42.3441918;-71.0487437,42.3508756;-71.0512911,42.3521821;-71.0013637,42.2075316;-71.0607764,42.3763541;-71.0374911,42.316031;-71.0125206,42.3378699;-71.0672898,42.3523158;-71.02832,42.2576602;-71.0502126,42.3516479;-71.0331956,42.3639107;-71.0432778,42.3528151;-71.0035279,42.2392354;-71.0470633,42.3537343;-71.0352443,42.3291218;-71.0898829,42.3463992;-71.0240951,42.2743442;-71.0234949,42.3358743;-70.985881,42.420226;-71.0005483,42.2454086;-71.0096371,42.3367603;-71.0447796,42.3509709;-71.0983169,42.3319001;-71.0092883,42.2763168;-71.0404428,42.3478375;-71.056908,42.361288;-71.0667744,42.3270498;-71.0119933,42.2806539;-71.0618764,42.4074484;-71.0612182,42.3986053;-71.0392667,42.3855456;-71.0515875,42.4025721;-70.9903023,42.3917606;-71.055873,42.4206339;-71.0433886,42.4222989;-71.06088,42.3761612;-71.0412802,42.3936888;-71.0714924,42.3968978;-71.0282154,42.3778389;-71.0350852,42.3809511;-71.0331398,42.3734483;-70.9693867,42.3895122;-71.0945712,42.3253252;-71.0280157,42.398422;-71.0155516,42.4114215;-70.993656,42.4110462;-71.0355621,42.3976519;-71.0056995,42.390191;-71.0589219,42.403759;-71.037937,42.3698284;-71.0386285,42.3903823;-71.0316196,42.4122481;-71.0328839,42.3861321;-71.0270609,42.4213082;-71.0366491,42.391236;-71.0361399,42.3649623;-71.0116946,42.3827415;-70.9973058,42.4183123;-71.1122037,42.4008442;-70.997123,42.390501;-71.0506461,42.41826;-71.0359889,42.3670906;-71.0414523,42.3649544;-71.0371343,42.3711266;-71.033703,42.3891835;-70.9799864,42.3803348;'" }, "execution_count": 265, "metadata": {}, "output_type": "execute_result" } ], "source": [ "utils.list_to_string(TotalList['gps'].values.tolist())" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:19:09.317992Z", "start_time": "2023-11-06T00:19:09.308541Z" } }, "id": "2d83e5db093608d2" }, { "cell_type": "code", "execution_count": 268, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "106\n" ] }, { "data": { "text/plain": "'-71.0553792,42.3688272;-71.0688746,42.3576234;-71.0754527,42.3565057;-71.0620802,42.3579151;-71.0586014,42.357357;-71.0572023,42.3587627;-71.0556268,42.36521;-71.0720926,42.3489004;-71.067859,42.3500079;-71.0632036,42.3556154;-71.0620134,42.3248471;-71.066414,42.354296;-71.0569649,42.3604952;-71.0498714,42.3256817;-71.0616035,42.3537983;-71.0359433,42.3485465;-71.0638101,42.3587772;-71.0555003,42.3640137;-71.0712561,42.3407613;-71.0561781,42.3668968;-71.0664019,42.3554589;-71.059228,42.359349;-71.0668408,42.3524116;-71.062146,42.366198;-71.0651214,42.3553972;-71.0596124,42.3509517;-71.0359354,42.3478381;-71.061757,42.3691906;-71.0609962,42.3803747;-71.0516339,42.3609921;-71.0809932,42.3675275;-71.0545357,42.3597994;-71.0342146,42.316274;-71.0756902,42.3695046;-71.0678704,42.3701829;-71.0656594,42.3718401;-71.0611749,42.3551807;-71.0554239,42.3739796;-71.0631664,42.3741694;-71.056823,42.361531;-71.0632852,42.2857047;-71.0637877,42.2845163;-71.0496839,42.3519736;-71.0454645,42.3162356;-71.0336324,42.3441918;-71.0487437,42.3508756;-71.0512911,42.3521821;-71.0013637,42.2075316;-71.0607764,42.3763541;-71.0374911,42.316031;-71.0125206,42.3378699;-71.0672898,42.3523158;-71.02832,42.2576602;-71.0502126,42.3516479;-71.0331956,42.3639107;-71.0432778,42.3528151;-71.0035279,42.2392354;-71.0470633,42.3537343;-71.0352443,42.3291218;-71.0240951,42.2743442;-71.0234949,42.3358743;-70.985881,42.420226;-71.0005483,42.2454086;-71.0096371,42.3367603;-71.0447796,42.3509709;-71.0092883,42.2763168;-71.0404428,42.3478375;-71.056908,42.361288;-71.0667744,42.3270498;-71.0119933,42.2806539;-71.0618764,42.4074484;-71.0612182,42.3986053;-71.0392667,42.3855456;-71.0515875,42.4025721;-70.9903023,42.3917606;-71.055873,42.4206339;-71.0433886,42.4222989;-71.06088,42.3761612;-71.0412802,42.3936888;-71.0714924,42.3968978;-71.0282154,42.3778389;-71.0350852,42.3809511;-71.0331398,42.3734483;-70.9693867,42.3895122;-71.0280157,42.398422;-71.0155516,42.4114215;-70.993656,42.4110462;-71.0355621,42.3976519;-71.0056995,42.390191;-71.0589219,42.403759;-71.037937,42.3698284;-71.0386285,42.3903823;-71.0316196,42.4122481;-71.0328839,42.3861321;-71.0270609,42.4213082;-71.0366491,42.391236;-71.0361399,42.3649623;-71.0116946,42.3827415;-70.9973058,42.4183123;-70.997123,42.390501;-71.0506461,42.41826;-71.0359889,42.3670906;-71.0414523,42.3649544;-71.0371343,42.3711266;-71.033703,42.3891835;-70.9799864,42.3803348;'" }, "execution_count": 268, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Return the list of locations in each cluster\n", "print(len(TotalList[TotalList['cluster'] == 0]['gps'].values.tolist()))\n", "utils.list_to_string(TotalList[TotalList['cluster'] == 0]['gps'].values.tolist())" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:25:20.703565Z", "start_time": "2023-11-06T00:25:20.690483Z" } }, "id": "89297f77828e8ed8" }, { "cell_type": "code", "execution_count": 269, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "63\n" ] }, { "data": { "text/plain": "'-71.2038948,42.4299758;-71.1060828,42.3511927;-71.0969274,42.3446263;-71.130887,42.35304;-71.1459593,42.3501823;-71.1460435,42.3495825;-71.1217152,42.3426377;-71.1258765,42.331864;-71.1095021,42.3364675;-71.133103,42.3890049;-71.0851891,42.3500031;-71.1123834,42.3360385;-71.2273649,42.3145041;-71.0834061,42.341987;-71.0992038,42.3306454;-71.0990577,42.3381442;-71.0949218,42.3419564;-71.0942861,42.3413301;-71.0908104,42.329969;-71.0913583,42.3490205;-71.1000217,42.3323776;-71.1241295,42.3518397;-71.1618052,42.3245965;-71.1625829,42.340795;-71.167854,42.4107892;-71.155555,42.3317473;-71.1227278,42.3965778;-71.3598149,42.3140229;-71.1126695,42.3836229;-71.119149,42.3884;-71.0872846,42.2961434;-71.1427371,42.3433772;-71.1438455,42.3569102;-71.1313443,42.3525708;-71.1284677,42.3631904;-71.119301,42.388547;-71.097883,42.381008;-71.1107166,42.3741209;-71.1194344,42.3754427;-71.1013044,42.3627462;-71.1108423,42.3838224;-71.1026937,42.3820702;-71.1189467,42.373465;-71.1208817,42.3732344;-71.0968274,42.3799095;-71.094048,42.339381;-71.1854722,42.3621177;-71.1146697,42.3782386;-71.0935443,42.3817274;-71.0906355,42.3616095;-71.1161887,42.3766442;-71.0962734,42.3627993;-71.1155576,42.3784629;-71.0949101,42.3797674;-71.1087411,42.3640287;-71.09476,42.37736;-71.1014951,42.3614115;-71.1024769,42.3822934;-71.1011111,42.3636597;-71.0898829,42.3463992;-71.0983169,42.3319001;-71.0945712,42.3253252;-71.1122037,42.4008442;'" }, "execution_count": 269, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(len(TotalList[TotalList['cluster'] == 1]['gps'].values.tolist()))\n", "utils.list_to_string(TotalList[TotalList['cluster'] == 1]['gps'].values.tolist())" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-11-06T00:25:30.097229Z", "start_time": "2023-11-06T00:25:30.070409Z" } }, "id": "6ff82e29a0366d9e" }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [], "metadata": { "collapsed": false }, "id": "7949bddd34b6731" } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 5 }