{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from shapely.geometry import Polygon\n", "import numpy as np\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import geopandas as gpd\n", "from tobler import area_interpolate, area_tables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example: Two GeoDataFrames" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "polys1 = gpd.GeoSeries([Polygon([(0,0), (10,0), (10,5), (0,5)]),\n", " Polygon([(0,5), (0,10), (10,10), (10,5)])])\n", "\n", "polys2 = gpd.GeoSeries([Polygon([(0,0), (5,0), (5,7), (0,7)]),\n", " Polygon([(5,0), (5,10), (10,10), (10,0)]),\n", " Polygon([(0,7), (0,10), (5,10), (5,7) ])\n", " ])\n", "\n", "df1 = gpd.GeoDataFrame({'geometry': polys1})\n", "df2 = gpd.GeoDataFrame({'geometry': polys2})\n", "df1['population'] = [ 500, 200]\n", "df1['pci'] = [75, 100]\n", "df1['income'] = df1['population'] * df1['pci']\n", "\n", "df2['population'] = [ 500, 100, 200]\n", "df2['pci'] = [75, 80, 100]\n", "df2['income'] = df2['population'] * df2['pci']\n", "\n", "ax = df1.plot(color='red', edgecolor='k')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ax = df2.plot(color='green', alpha=0.5, edgecolor='k')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAD8CAYAAABXXhlaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAACuFJREFUeJzt3G+IXQeZx/Hvr4miqStWMoptmk0LpbsiLJHLUg3Ikqh0VzG+2JUKla4IedPV+gdK3Td9K4sUfVGE0FYLlorEgkXEbWkU2WUJO0kKto1SqdrGRjMiq+KbWvLsi7ld0mm6Ge45d+6Nz/cDYe49c+achyTfe86dOXNSVUjq5bJFDyBp6xm+1JDhSw0ZvtSQ4UsNGb7UkOFLDRm+1JDhSw1t38qd7dy5s/bs2bOVu5RaOX78+G+qauVi621p+Hv27GF1dXUrdym1kuQXm1nPU32pIcOXGjJ8qSHDlxoyfKmhi4af5L4kZ5M8cd6yNyd5NMnT049XzHdMSWPazBH/a8CNG5bdATxWVdcBj02fS7pEXDT8qvoh8NsNiw8C908f3w98eOS5JM3RrBfwvLWqzgBU1Zkkb3m1FZMcAg4B7N69e1Mbz2WXgfcClP5PEs6dOzfa9uZ+5V5VHQYOA0wmk83VXMW/PfP8PMfSJt1+7ZUcPXp00WO0t3///lG3N+t39X+d5G0A049nxxtJ0rzNGv7DwC3Tx7cA3x5nHElbYTM/znsQ+C/g+iSnk3wC+ALwviRPA++bPpd0ibjoe/yq+uirfOrAyLNI2iJeuSc1ZPhSQ4YvNWT4UkOGLzVk+FJDhi81ZPhSQ4YvNWT4UkOGLzVk+FJDhi81ZPhSQ4YvNWT4UkOGLzVk+FJDhi81ZPhSQ4YvNWT4UkOGLzVk+FJDhi81ZPhSQ4YvNWT4UkOGLzVk+FJDg8JP8pkkTyZ5IsmDSV431mCS5mfm8JNcBXwKmFTVO4BtwE1jDSZpfoae6m8HXp9kO7ADeH74SJLmbebwq+qXwBeBZ4EzwO+q6pGxBpM0P0NO9a8ADgLXAFcClye5+QLrHUqymmR1bW1t9kkljWbIqf57gZ9V1VpV/Ql4CHj3xpWq6nBVTapqsrKyMmB3ksYyJPxngRuS7EgS4ABwapyxJM3TkPf4x4AjwAngR9NtHR5pLklztH3IF1fVncCdI80iaYt45Z7UkOFLDRm+1JDhSw0ZvtSQ4UsNGb7UkOFLDRm+1JDhSw0ZvtSQ4UsNGb7UkOFLDRm+1NCg38efp9uvvXLRI0h/tpY2/LtP3r3oEQTcuvfWRY+gOfBUX2rI8KWGDF9qyPClhgxfasjwpYYMX2rI8KWGDF9qyPClhgxfasjwpYYMX2rI8KWGBoWf5E1JjiT5cZJTSd411mCS5mfo7+N/GfheVf1jktcCO0aYSdKczRx+kjcC7wH+GaCqXgBeGGcsSfM05FT/WmAN+GqSk0nuSXL5xpWSHEqymmR1bW1twO4kjWVI+NuBdwJfqaq9wB+BOzauVFWHq2pSVZOVlZUBu5M0liHhnwZOV9Wx6fMjrL8QSFpyM4dfVb8Cnkty/XTRAeCpUaaSNFdDv6v/SeCB6Xf0nwE+PnwkSfM2KPyqehyYjDSLpC3ilXtSQ4YvNWT4UkOGLzVk+FJDhi81ZPhSQ4YvNWT4UkOGLzVk+FJDhi81ZPhSQ4YvNZSq2rKdTSaTWl1dveh6SbZgGunSsplWkxyvqov+qvzQG3HMzV2P/GTRIwj47Puv5z+/+fVFj9Hevo/cPOr2PNWXGjJ8qSHDlxoyfKkhw5caMnypIcOXGjJ8qSHDlxoyfKkhw5caMnypIcOXGjJ8qaHB4SfZluRkku+MMZCk+RvjiH8bcGqE7UjaIoPCT7IL+ABwzzjjSNoKQ4/4XwJuB86NMIukLTJz+Ek+CJytquMXWe9QktUkq2tra7PuTtKIhhzx9wEfSvJz4BvA/iSvuDlbVR2uqklVTVZWVgbsTtJYZg6/qj5fVbuqag9wE3C0qsa9I6CkufDn+FJDo9xeu6p+APxgjG1Jmj+P+FJDhi81ZPhSQ4YvNWT4UkOGLzVk+FJDhi81ZPhSQ4YvNWT4UkOGLzVk+FJDhi81ZPhSQ4YvNWT4UkOGLzVk+FJDhi81ZPhSQ4YvNWT4UkOGLzVk+FJDhi81ZPhSQ4YvNWT4UkOGLzVk+FJDM4ef5Ook309yKsmTSW4bczBJ87N9wNe+CHyuqk4k+QvgeJJHq+qpkWaTNCczH/Gr6kxVnZg+/gNwCrhqrMEkzc8o7/GT7AH2Ascu8LlDSVaTrK6trY2xO0kDDQ4/yRuAbwGfrqrfb/x8VR2uqklVTVZWVobuTtIIBoWf5DWsR/9AVT00zkiS5m3Id/UD3Aucqqq7xhtJ0rwNOeLvAz4G7E/y+PTPP4w0l6Q5mvnHeVX1H0BGnEXSFvHKPakhw5caMnypIcOXGjJ8qSHDlxoyfKkhw5caMnypIcOXGjJ8qSHDlxoyfKkhw5caMnypIcOXGjJ8qSHDlxoyfKkhw5caMnypIcOXGjJ8qSHDlxoyfKkhw5caMnypIcOXGjJ8qSHDlxoaFH6SG5P8JMlPk9wx1lCS5mvm8JNsA+4G/h54O/DRJG8fazBJ8zPkiP+3wE+r6pmqegH4BnBwnLEkzdOQ8K8Cnjvv+enpMklLbvuAr80FltUrVkoOAYcAdu/evemNf/b91888mMa17yM3L3qE9pIL5Ta7IeGfBq4+7/ku4PmNK1XVYeAwwGQyecULw4VUbWo1STMacqr/38B1Sa5J8lrgJuDhccaSNE8zH/Gr6sUk/wL8O7ANuK+qnhxtMklzM+RUn6r6LvDdkWaRtEW8ck9qyPClhgxfasjwpYYMX2ooW3mxTJI14BebWHUn8Js5jzOrZZ4Nlnu+ZZ4Nlnu+zc72l1W1crGVtjT8zUqyWlWTRc9xIcs8Gyz3fMs8Gyz3fGPP5qm+1JDhSw0ta/iHFz3A/2OZZ4Plnm+ZZ4Plnm/U2ZbyPb6k+VrWI76kOVqq8Jf55p1Jrk7y/SSnkjyZ5LZFz7RRkm1JTib5zqJn2SjJm5IcSfLj6d/huxY900uSfGb6b/pEkgeTvG7B89yX5GySJ85b9uYkjyZ5evrxiiH7WJrwL4Gbd74IfK6q/hq4Abh1yeYDuA04teghXsWXge9V1V8Bf8OSzJnkKuBTwKSq3sH6r5jftNip+Bpw44ZldwCPVdV1wGPT5zNbmvBZ8pt3VtWZqjoxffwH1v/jLs09BpPsAj4A3LPoWTZK8kbgPcC9AFX1QlX9z2KnepntwOuTbAd2cIE7SW2lqvoh8NsNiw8C908f3w98eMg+lin8S+bmnUn2AHuBY4ud5GW+BNwOnFv0IBdwLbAGfHX6VuSeJJcveiiAqvol8EXgWeAM8LuqemSxU13QW6vqDKwfhIC3DNnYMoW/qZt3LlqSNwDfAj5dVb9f9DwAST4InK2q44ue5VVsB94JfKWq9gJ/ZOCp6lim75UPAtcAVwKXJ/mzv7voMoW/qZt3LlKS17Ae/QNV9dCi5znPPuBDSX7O+luk/Um+vtiRXuY0cLqqXjpDOsL6C8EyeC/ws6paq6o/AQ8B717wTBfy6yRvA5h+PDtkY8sU/lLfvDPr9ze+FzhVVXctep7zVdXnq2pXVe1h/e/taFUtzVGrqn4FPJfkpXumHwCeWuBI53sWuCHJjum/8QGW5BuPGzwM3DJ9fAvw7SEbG3TPvTFdAjfv3Ad8DPhRkseny/51et9BXdwngQemL+rPAB9f8DwAVNWxJEeAE6z/5OYkC76CL8mDwN8BO5OcBu4EvgB8M8knWH+x+qdB+/DKPamfZTrVl7RFDF9qyPClhgxfasjwpYYMX2rI8KWGDF9q6H8B0OZ/etQeuoMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "res_union = gpd.overlay(df1, df2, how='union')\n", "ax = res_union.plot(alpha=0.5, cmap='tab10')\n", "df1.plot(ax=ax, facecolor='none', edgecolor='k');\n", "df2.plot(ax=ax, facecolor='none', edgecolor='k');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Area Table" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[25., 0., 25., 0., 0.],\n", " [ 0., 10., 0., 25., 15.]]), array([[1., 0., 0.],\n", " [1., 0., 0.],\n", " [0., 1., 0.],\n", " [0., 1., 0.],\n", " [0., 0., 1.]]))" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "area_tables(df1, df2)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[25., 0., 10., 0., 0.],\n", " [ 0., 25., 0., 25., 0.],\n", " [ 0., 0., 0., 0., 15.]]), array([[1., 0.],\n", " [1., 0.],\n", " [0., 1.],\n", " [0., 1.],\n", " [0., 1.]]))" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "area_tables(df2, df1)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[ 290., 350., 60.],\n", " [22750., 28750., 6000.]]),\n", " array([[ 82.14285714, 87.5 , 100. ]]))" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "extensive_vars = ['population', 'income']\n", "intensive_vars = ['pci']\n", "estimates = area_interpolate(df1, df2, extensive_variables = extensive_vars,\n", " intensive_variables = intensive_vars)\n", "\n", "estimates" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[ 407.14285714, 392.85714286],\n", " [30785.71428571, 34714.28571429]]), array([[77.5, 85. ]]))" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "extensive_vars = ['population', 'income']\n", "intensive_vars = ['pci']\n", "estimates = area_interpolate(df2, df1, extensive_variables = extensive_vars,\n", " intensive_variables = intensive_vars)\n", "estimates" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Non-exhuastive case\n", "\n", "Here the first set of polygons have an envelope that does not coincide with that of the second dataframe.\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "polys1 = gpd.GeoSeries([Polygon([(0,0), (12,0), (12,5), (0,5)]),\n", " Polygon([(0,5), (0,10), (10,10), (10,5)])])\n", "\n", "polys2 = gpd.GeoSeries([Polygon([(0,0), (5,0), (5,7), (0,7)]),\n", " Polygon([(5,0), (5,10), (10,10), (10,0)]),\n", " Polygon([(0,7), (0,10), (5,10), (5,7) ])\n", " ])\n", "\n", "df1 = gpd.GeoDataFrame({'geometry': polys1})\n", "df2 = gpd.GeoDataFrame({'geometry': polys2})\n", "df1['population'] = [ 500, 200]\n", "df1['pci'] = [75, 100]\n", "df1['income'] = df1['population'] * df1['pci']\n", "\n", "df2['population'] = [ 500, 100, 200]\n", "df2['pci'] = [75, 80, 100]\n", "df2['income'] = df2['population'] * df2['pci']\n", "\n", "ax = df1.plot(color='red', edgecolor='k')\n", "df2.plot(ax=ax, color='green',edgecolor='k')\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[290., 350., 60.]]),\n", " array([[ 82.14285714, 87.5 , 100. ]]))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "extensive_vars = ['population']\n", "intensive_vars = ['pci']\n", "estimates = area_interpolate(df1, df2, extensive_variables = extensive_vars,\n", " intensive_variables = intensive_vars)\n", "estimates" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "700.0" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "estimates[0].sum()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[248.33333333, 308.33333333, 60. ]]),\n", " array([[ 82.14285714, 87.5 , 100. ]]))" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "extensive_vars = ['population']\n", "intensive_vars = ['pci']\n", "estimates = area_interpolate(df1, df2, extensive_variables = extensive_vars,\n", " intensive_variables = intensive_vars,\n", " allocate_total=False)\n", "estimates" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "616.6666666666667" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "estimates[0].sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When setting `allocate_total=False` the total population of a source zone is not completely allocated, but rather the proportion of total population is set to the area of intersection over the area of the source zone." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This will have no effect when the source df is df2 and the target df is df 1:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[407.14285714, 392.85714286]]), array([], dtype=float64))" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "extensive_vars = ['population']\n", "estimates = area_interpolate(df2, df1, extensive_variables = extensive_vars)\n", "estimates" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[407.14285714, 392.85714286]]), array([], dtype=float64))" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "extensive_vars = ['population']\n", "estimates = area_interpolate(df2, df1, extensive_variables = extensive_vars, allocate_total=False)\n", "estimates" ] } ], "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }