{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Spatial analysis"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import movekit as mkit\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from scipy.spatial import Voronoi, voronoi_plot_2d, convex_hull_plot_2d, delaunay_plot_2d"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Extracting all absolute features: 100%|██████████| 100.0/100 [00:01<00:00, 81.44it/s]\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" time | \n",
" animal_id | \n",
" x | \n",
" y | \n",
" distance | \n",
" direction | \n",
" turning | \n",
" average_speed | \n",
" average_acceleration | \n",
" stopped | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 312 | \n",
" 405.29 | \n",
" 417.76 | \n",
" 0.0 | \n",
" (0.0, 0.0) | \n",
" 0.0 | \n",
" 0.210217 | \n",
" -0.006079 | \n",
" 1 | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" 511 | \n",
" 369.99 | \n",
" 428.78 | \n",
" 0.0 | \n",
" (0.0, 0.0) | \n",
" 0.0 | \n",
" 0.020944 | \n",
" 0.000041 | \n",
" 1 | \n",
"
\n",
" \n",
" 2 | \n",
" 1 | \n",
" 607 | \n",
" 390.33 | \n",
" 405.89 | \n",
" 0.0 | \n",
" (0.0, 0.0) | \n",
" 0.0 | \n",
" 0.070235 | \n",
" 0.000344 | \n",
" 1 | \n",
"
\n",
" \n",
" 3 | \n",
" 1 | \n",
" 811 | \n",
" 445.15 | \n",
" 411.94 | \n",
" 0.0 | \n",
" (0.0, 0.0) | \n",
" 0.0 | \n",
" 0.370500 | \n",
" 0.007092 | \n",
" 1 | \n",
"
\n",
" \n",
" 4 | \n",
" 1 | \n",
" 905 | \n",
" 366.06 | \n",
" 451.76 | \n",
" 0.0 | \n",
" (0.0, 0.0) | \n",
" 0.0 | \n",
" 0.118000 | \n",
" -0.003975 | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" time animal_id x y distance direction turning \\\n",
"0 1 312 405.29 417.76 0.0 (0.0, 0.0) 0.0 \n",
"1 1 511 369.99 428.78 0.0 (0.0, 0.0) 0.0 \n",
"2 1 607 390.33 405.89 0.0 (0.0, 0.0) 0.0 \n",
"3 1 811 445.15 411.94 0.0 (0.0, 0.0) 0.0 \n",
"4 1 905 366.06 451.76 0.0 (0.0, 0.0) 0.0 \n",
"\n",
" average_speed average_acceleration stopped \n",
"0 0.210217 -0.006079 1 \n",
"1 0.020944 0.000041 1 \n",
"2 0.070235 0.000344 1 \n",
"3 0.370500 0.007092 1 \n",
"4 0.118000 -0.003975 1 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path = \"datasets/fish-5-cleaned.csv\"\n",
"data = mkit.read_data(path)\n",
"data = mkit.extract_features(data)\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Spatial Objects\n",
"The function below produces three types of spatial objects: Voronoi-Diagrams, Convex Hulls and Delaunay Triangles. Optionally, one may obtain only group-specific outputs - one object per time-capture. These spatial objects may be used for a set of attributes, which are described below in detail.\n",
"To get the full functionality of all attributes, please go to https://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/spatial.html."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating spatial objects: 100%|██████████| 1000/1000 [00:15<00:00, 63.51it/s]\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" time | \n",
" convex_hull_object | \n",
" voronoi_object | \n",
" delaunay_object | \n",
" convex_hull_volume | \n",
" voronoi_volume | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" <scipy.spatial.qhull.ConvexHull object at 0x7f... | \n",
" <scipy.spatial.qhull.Voronoi object at 0x7ff88... | \n",
" <scipy.spatial.qhull.Delaunay object at 0x7ff8... | \n",
" 1519.44120 | \n",
" inf | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" <scipy.spatial.qhull.ConvexHull object at 0x7f... | \n",
" <scipy.spatial.qhull.Voronoi object at 0x7ff88... | \n",
" <scipy.spatial.qhull.Delaunay object at 0x7ff8... | \n",
" 1528.95525 | \n",
" inf | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" <scipy.spatial.qhull.ConvexHull object at 0x7f... | \n",
" <scipy.spatial.qhull.Voronoi object at 0x7ff88... | \n",
" <scipy.spatial.qhull.Delaunay object at 0x7ff8... | \n",
" 1539.23800 | \n",
" inf | \n",
"
\n",
" \n",
" 3 | \n",
" 4 | \n",
" <scipy.spatial.qhull.ConvexHull object at 0x7f... | \n",
" <scipy.spatial.qhull.Voronoi object at 0x7ff88... | \n",
" <scipy.spatial.qhull.Delaunay object at 0x7ff8... | \n",
" 1549.61380 | \n",
" inf | \n",
"
\n",
" \n",
" 4 | \n",
" 5 | \n",
" <scipy.spatial.qhull.ConvexHull object at 0x7f... | \n",
" <scipy.spatial.qhull.Voronoi object at 0x7ff88... | \n",
" <scipy.spatial.qhull.Delaunay object at 0x7ff8... | \n",
" 1560.33905 | \n",
" inf | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" time convex_hull_object \\\n",
"0 1 "
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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eJTxKxI4dyllc9e5S1cYvyLBoopUWkqUKMH06dP5+eefqVmzJgMHDiQkJITPPvtMFzxOGu451EsvvUTbtm15+eWXWbdundXleIwjJ9O+ln5648palStX5ssvv2TlypUUKFCATp06UbNmTb7//nurS7OchnsOJSLMmjULm81Ghw4dOHr0qNUleYSShf0zNK7cQ8OGDdm6dSsffvghBw8epG7durRt25Y9e/ZYXZplNNxzsIIFC7J48WL++usvOnTooFfXywSDGlfEP1fKK1T75/JlUOOKFlWkXOXr68uTTz7Jnj17GDVqFCtXriQ0NJTnn3+eEydOWF1ettNwz+HCwsKYPn0633//PVFRUVaXk+O1qlqK19uEU6qwPwKUKuzP623CaVX1hgubKjd11113MXToUPbs2UPPnj2ZNm0aNpuNN954g/Pnz1tdXvZJ7+ym7HzoGap37rnnnjOAWbhwodWlKOVWdu7caZo1a2YAc++995q5c+eaK1euWF1WpkDPUPV8EydOpHr16jz11FMkJGhnh1LXhYaGsmzZMlavXk2xYsXo2rUr1atX57vvvrO6tCyl4e4hcufOzcKFC8mTJw9t2rTh77//trokpdxK/fr1iYmJ4eOPP+bYsWPUq1ePli1bsnv3bqtLyxIa7h6kdOnSzJ8/n927d9OrVy/t91UqFR8fH7p160ZiYiJjxoxh7dq1VK5cmb59+/Lrr79aXV6m0nD3MA0aNGDUqFHMmzePd955x+pylHJL/v7+REVF4XA46N27N++//z52u53XX3+dc+c845wGDXcP9Morr9C8eXNeeuklNm7caHU5SrmtwMBApk2bRlxcHPXr12fIkCFUrFiRTz75JMffu1jD3QP5+Pjw8ccfExQURLt27dAbkCt1c5UqVWLJkiV8++233H333XTv3p3IyEjWrFljdWm3TcPdQxUpUoTo6Gh+//13OnfuzJUrejMspW7l4Ycf5qeffmLu3Ln8/vvvNGjQgObNmxMfH291aRmm4e7BqlatyjvvvMPq1asZPny41eUolSP4+PjQpUsXEhISGDduHN9//z3h4eH8+9//5vjx41aX5zINdw/Xo0cPnn76aUaPHs0XX3xhdTlK5Rh58+Zl8ODBOBwOnnvuOWbOnIndbue1117j7NmzVpd3SxruXuDtt98mIiKCbt26sXfvXqvLUSpHKV68OFOmTCE+Pp5GjRoxbNgwgoOD+eijj9x6d6eGuxfImzcvixYtwsfHh7Zt23pMq5dS2Sk4OJjo6GjWr19PUFAQPXr0ICIigm+++cYt796l4e4lypUrx5w5c4iNjeW5556zuhylcqw6deqwceNG5s+fz19//UWrF0bz0rzNbnf3Lg13L9K0aVOGDRvGrFmzmDlzptXlKJVjiQitWrVi6dKllG7WF+OTK8Xr7nD3Lj9Lv7rKdsOHD2fjxo307duX+++/n2rVqlldklJu6/Tp0yQlJaX5OHDgAMYY7h38XySN91p99y5xh+uPREZGmpiYGKvL8BonTpwgIiICX19ftmzZQtGiRa0uSSlLGGM4fvx4muHtcDhuuMlH8eLFsdls2Gw27HY7NpuNt/YV58S5G3O0VGF/fnilfpbWLyJbjDGRab2mK3cvVLx4cRYtWkSdOnXo1q0bX3zxBT4+uodOeabLly9z4MCBNMN77969nDlz5p9tRYTSpUtjs9lo3br1P0F+/VGwYMEbPn/BbYeJWrwjxY3V3eHuXRruXurBBx9kypQp9OnThzFjxjB06FCrS1Lqtp09e5a9e/feEN5JSUns37+fy5cv/7Ntnjx5KFeuHHa7nfr166cI77Jly5InT54Mfe3rd+kavyKBIyfPUbKwP4MaV7T87l26W8aLGWPo3r07c+fO5euvv6ZRo0ZWl6RUmowx/PHHH2mGd1JS0g03iC9UqNA/u01SP0qVKuUxv6nebLeMhruXO3PmDDVq1ODo0aNs3bqVe++91+qSlJe6evUqhw8fTjO8k5KSOHXqVIrtS5YsmWZ422w2ihYtikhahzk9i+5zV+nKly8fixcvJjIykvbt27Nu3boM/1qqlKsuXLjAL7/8kmZ479u3jwsXLvyzrZ+fH2XLlsVms1GjRo0U4V2+fHnuuusuC78T9+dyuIuILxADHDbGNBeR9sAIIAR40BgTk2zbKKAncAV43hizIlOrVpnq+qnUbdq0oX///kybNs3qklQOdurUqXTbBw8ePJjiDmH58uXDZrMREhJC8+bNU3ShlC5dGj8/XX/erozM3AvALuD64eI4oA3wfvKNRCQU6ASEASWBVSJSwRjjvhdhULRu3ZpBgwYxfvx4atasyeOPP251ScpNXW8fTL3yvv5I3T4YEBCAzWajbt26N+wHDwwM9IrdJ1ZwKdxFJAhoBowG+gMYY3Y5X0u9eUtgvjHmArBPRBzAg8CGTKpZZZExY8awadMmevXqRZUqVQgPD7e6JGWRy5cvs3///jTDO3X7oI+Pzz/tg23atLlh90la7YMq67m6cn8TGAwUcGHbUkDye7sdco6lICK9gF6AHsRzE35+fsyfP5+IiAjatm3L5s2bKVSokNVlqSxy5syZG9oHrz/Sah8sX748drudBg0a3NA+mDt3bgu/E5WWW4a7iDQHfjXGbBGRei58zrR+x7qhJccY8wHwAVzrlnHh86pscM8997BgwQLq1atHjx49iI6O1l+bcyhjDL///nu6+79Ttw8WLlwYu91OZGQkHTt2TBHgJUuW9Jj2QW/hysq9NtBCRJoCeYGCIjLHGJPeTtlDQOlkHwcBR+6sTJWd6tSpw/jx4+nfvz8TJ05k4MCBVpek0nH16lUOHTqU7unzp0+fTrF9qVKlsNlsNGnSJM32QeU5MtTn7ly5DzTGNE829q1zLMb5cRjwKdf2s5cEVgPBNzugqn3u7scYQ4cOHfj8889ZvXo1Dz/8sNUlea0LFy6wb9++NMN73759XLx48Z9tc+XK9U/7YOpH+fLl8ff3t/A7UZktS/rcRaQ18DYQACwXkVhjTGNjzE4RWQDEA5eBvtopk/OICLNmzWLHjh107NiRrVu3UrJkSavL8lhptQ9e70Y5dOhQivbB/PnzY7PZCAsLo0WLFikuZFW6dGl8fX0t/E6Uu9AzVNVNxcfH8+CDD1K1alXWrFlDrly5bv0mdQNjDMeOHUv39Pnff/89xfaBgYE3rLyvtxEGBATocRAF6Bmq6g6EhoYyffp0unTpwiuvvMLEiROtLsltXbp0KcXVB5OH9969e1PcVNnHx4d7770Xm81G27ZtU4R3+fLlKVDAlcY0pdKn4a5uqXPnzmzYsIFJkyZRo0YN2rdvb3VJlrnePpjWCTz79+9PccPkvHnzUr58eWw2Gw0bNkyxCi9Tpoy2D6ospbtllEsuXrxIvXr12LFjB5s3b6ZSpUpWl5QlkrcPphXgx44dS7F9kSJF0r36YIkSJbR9UGUpvSqkyhSHDh0iIiKCgIAAfvrpJ/Lnz291SbflypUrHD58ON3T51O3DwYFBaV79cEiRYpY9F0opfvcVSYJCgpi3rx5NGrUiF69ejF37ly3PbB3/vz5NNsHr199MHX7YLly5bDZbNSuXTtFeJcrV07bB1WOpOGuMqRBgwa89tprDBkyhFq1avHcc89ZVsvJkyfTPfsydftggQIFsNlsVK5cmZYtW6boQAkKCtL2QeVxdLeMyrCrV6/SqlUrvv76a7777jtq1qyZJV/HGMPRo0fTDfDU7YN33313uu2DxYsXd9vfMpS6XbrPXWW6kydPUq1aNS5cuMDWrVsJDAy8rc9z6dKldK8+mJSUxLlz5/7Z1sfHhzJlyqQZ3uXLl8+xxwCUul26z11lusKFCxMdHc0jTwyi1uuruZKnYLo3Bj5z5ky61z45cOBAivZBf3//FO2DyTtRypQpoydRKeUiXbmr27Zk22EGLdjGJfO/3R25xFDLbx8ciPmnG+X48eMp3le0aNEUq+7U7YO6+0Qp1+jKXWWJ8SsSUgQ7wCUjrD6RH1mzBrvd/s+t05I/ChcubE3BSnkRDXd1246cPJfmeK5Cgew7eDCbq1FKJaenz6nbVrJw2v3f6Y0rpbKPhru6bYMaV8Q/V8r+cP9cvgxqXNGiipRS1+luGXXbrnfFjF+RwJGT59LtllFKZT8Nd3VHWlUtpWGulBvS3TJKKeWBNNyVUsoDabgrpZQH0nBXSikPpOGulFIeSMNdKaU8kIa7Ukp5IA13pZTyQBruSinlgTTclVLKA2m4K6WUB9JwV0opD6ThrpRSHsgt7qEqIr8B+2+ySXHgRDaVk5PovKRN5+VGOidpy+nzUsYYE5DWC24R7rciIjHp3QTWm+m8pE3n5UY6J2nz5HnR3TJKKeWBNNyVUsoD5ZRw/8DqAtyUzkvadF5upHOSNo+dlxyxz10ppVTG5JSVu1JKqQzQcFdKKQ/kFuEuInlFZJOI/CwiO0Xk/5K91k9EEpzjbyQbjxIRh/O1xtZUnnXSmxMRuV9ENopIrIjEiMiDyd7j0XOSnIj4isg2EVnm/LioiHwjInucfxZJtq1XzEsaczJeRHaLyHYR+VxECifb1ivmBG6cl2TjA0XEiEjxZGOeMy/GGMsfgAD5nc9zAT8BNYBHgFVAHudrgc4/Q4GfgTxAOSAJ8LX6+8imOVkJ/Ms53hT41lvmJNX89Ac+BZY5P34DeMX5/BVgnLfNSxpz0gjwcz4f541zkta8OMdKAyu4dvJkcU+cF7dYuZtr/nZ+mMv5MMCzwFhjzAXndr86t2kJzDfGXDDG7AMcwIN4kJvMiQEKOscLAUeczz1+Tq4TkSCgGTAj2XBLYLbz+WygVbJxj5+XtObEGLPSGHPZ+eFGIMj53CvmBNL9twIwGRjMtf9P13nUvLhFuMM/vzrFAr8C3xhjfgIqAHVF5CcR+U5EHnBuXgo4mOzth5xjHiWdOXkRGC8iB4EJQJRzc6+YE6c3ufYf82qysbuNMUcBnH8GOse9ZV7e5MY5Se4p4Cvnc2+ZE0hjXkSkBXDYGPNzqm09al7cJtyNMVeMMfdzbXXxoIhUBvyAIlzbHTEIWCAiwrVdFjd8iuyqNbukMyfPAi8ZY0oDLwEznZt7xZyISHPgV2PMFlffksaYR83LreZERF4FLgNzrw+lsZlHzQmkPS8ichfwKvCftN6SxliOnRc/qwtIzRhzUkS+BZpw7SfnYnNth9gmEbnKtQv9HOLaPrPrgvjf7gmPk2pOngBecL60kP/9uuktc1IbaCEiTYG8QEERmQMcF5ESxpijIlKCa7/tgHfMS5pzYox5XESeAJoDDZz/j8A75gTSmBfgE67tT//52jqRIGCrszHBs+bF6p3+zn9vAUBh53N/YD3X/kH+GxjpHK/AtV+ZBAgj5YGPveTgAx8ZnJNdQD3neANgi/O5x89JGnNUj/8dPBxPygOqb3jjvKSakyZAPBCQahuvmpPU85Jq/Bf+d0DVo+bFXVbuJYDZIuLLtV1FC4wxy0QkNzBLROKAi8AT5trfwk4RWcC1f7iXgb7GmCtWFZ9F0puTk8AUEfEDzgO9AIwx3jAnNzOWa7vtegIHgPbg9fMylWtB9Y1zlbrRGPNvL5+TdHnavOjlB5RSygO5zQFVpZRSmUfDXSmlPJCGu1JKeSANd6WU8kAa7kop5YE03JVSygNpuCullAf6f0VjSwS9LELsAAAAAElFTkSuQmCC\n",
"text/plain": [
"