Skip to content

Instantly share code, notes, and snippets.

@zabop
Created October 4, 2023 10:04
Show Gist options
  • Save zabop/6667d56635e989fc8512823e1ee11618 to your computer and use it in GitHub Desktop.
Save zabop/6667d56635e989fc8512823e1ee11618 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 87,
"id": "78404992-87a7-49ac-855a-ac9dc4729362",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import geopandas as gpd\n",
"from shapely.geometry import Point"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "12ccd845-7e2e-4b2e-a8a6-34fa0222d017",
"metadata": {},
"outputs": [],
"source": [
"df = gpd.GeoDataFrame(geometry=gpd.GeoSeries([Point(np.random.uniform(-70,70,size=2))\n",
" for _ in range(10000)]))\n",
"df = df.assign(property0=[np.random.randint(0,1000) for _ in range(len(df))])"
]
},
{
"cell_type": "code",
"execution_count": 91,
"id": "c93ca38a-a6e6-4823-aa14-d7b42a093c95",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" geometry property0\n",
"0 POINT (-5.63292 26.22310) 802\n",
"1 POINT (58.49687 -39.66535) 761\n",
"2 POINT (-32.79031 64.25744) 904\n",
"3 POINT (-65.62557 61.95311) 993\n",
"4 POINT (56.99825 23.47068) 525\n"
]
}
],
"source": [
"print(df.head(5))"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "6febc3f3-8fc6-4e99-b5af-d73920f82cb0",
"metadata": {},
"outputs": [],
"source": [
"df.to_file(\"test.geojson\")"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "19be906b-4448-45c2-ab8c-a312415db393",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-rw-r--r-- 1 palszabo staff 1.4M Oct 4 09:24 test.geojson\n"
]
}
],
"source": [
"!ls -lrth test.geojson"
]
},
{
"cell_type": "markdown",
"id": "c0ebd77d-b503-4fa1-bf33-3b0463144ffb",
"metadata": {},
"source": [
"## Filter for 100 different properties"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "0c60c190-34a0-4e07-bf4b-1abda190caac",
"metadata": {},
"outputs": [],
"source": [
"proplist = \", \".join([f\"{e}\" for e in np.random.choice(range(1000), 100, replace=False)])"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "a5e322a1-c1a9-4130-8c84-2cdce7b86140",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"282 ms ± 3.09 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"!ogr2ogr -f GeoJSON \\\n",
" filtered_without_sqlite.geojson test.geojson \\\n",
" -sql \"select * from test where property0 in ({proplist})\""
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "c1de5ff3-af3c-423f-ae52-2dc02e2f70ca",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.08 s ± 9.79 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"!ogr2ogr -f GeoJSON \\\n",
" -dialect sqlite \\\n",
" filtered_with_sqlite.geojson test.geojson \\\n",
" -sql \"select * from test where property0 in ({proplist})\""
]
},
{
"cell_type": "markdown",
"id": "546d4563-92b3-4e9b-b406-f23a092b16a7",
"metadata": {},
"source": [
"## FIlter for 200 different properties"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "51d50a4e-b987-4774-96b1-2d83ca06a630",
"metadata": {},
"outputs": [],
"source": [
"proplist = \", \".join([f\"{e}\" for e in np.random.choice(range(1000), 200, replace=False)])"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "ce07e19e-f688-4609-8c9a-bc0d7f8bfbb3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"290 ms ± 3.55 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"!ogr2ogr -f GeoJSON \\\n",
" filtered_without_sqlite.geojson test.geojson \\\n",
" -sql \"select * from test where property0 in ({proplist})\""
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "16022867-e20c-42e9-b617-f85ddea3ba35",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5.9 s ± 16.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"!ogr2ogr -f GeoJSON \\\n",
" -dialect sqlite \\\n",
" filtered_with_sqlite.geojson test.geojson \\\n",
" -sql \"select * from test where property0 in ({proplist})\""
]
},
{
"cell_type": "markdown",
"id": "fab051a9-c7f7-4c9b-a7e6-2eb0ed9dc3c9",
"metadata": {},
"source": [
"## Filter for 300 different properties"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "bfa34aba-f570-4b84-be2d-cd4f51468196",
"metadata": {},
"outputs": [],
"source": [
"proplist = \", \".join([f\"{e}\" for e in np.random.choice(range(1000), 300, replace=False)])"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "2acd1358-ad41-47ed-b068-78302c1dad75",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"300 ms ± 3.61 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"!ogr2ogr -f GeoJSON \\\n",
" filtered_without_sqlite.geojson test.geojson \\\n",
" -sql \"select * from test where property0 in ({proplist})\""
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "547a7f02-83ec-46ec-bac3-32583e230f26",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"8.71 s ± 24.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"!ogr2ogr -f GeoJSON \\\n",
" -dialect sqlite \\\n",
" filtered_with_sqlite.geojson test.geojson \\\n",
" -sql \"select * from test where property0 in ({proplist})\""
]
},
{
"cell_type": "markdown",
"id": "d82f1f76-2577-45f9-b9b8-07f27e5b0803",
"metadata": {},
"source": [
"## Filter for 400 different properties"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "06595b9a-ca6e-44aa-8f55-1cd0f56ed1f7",
"metadata": {},
"outputs": [],
"source": [
"proplist = \", \".join([f\"{e}\" for e in np.random.choice(range(1000), 400, replace=False)])"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "d6ae96d8-e6ce-4b92-9a1a-a368136a7336",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"303 ms ± 3.15 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"!ogr2ogr -f GeoJSON \\\n",
" filtered_without_sqlite.geojson test.geojson \\\n",
" -sql \"select * from test where property0 in ({proplist})\""
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "8242b3fe-0220-4f96-9e04-6be24b98c43d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"11.5 s ± 91.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"!ogr2ogr -f GeoJSON \\\n",
" -dialect sqlite \\\n",
" filtered_with_sqlite.geojson test.geojson \\\n",
" -sql \"select * from test where property0 in ({proplist})\""
]
},
{
"cell_type": "markdown",
"id": "1fed865c-f78d-43a4-8f0a-dd675770c117",
"metadata": {},
"source": [
"## Filter for 500 different properties"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "9d0b8232-66c5-411c-aca6-4f5ea6c6550b",
"metadata": {},
"outputs": [],
"source": [
"proplist = \", \".join([f\"{e}\" for e in np.random.choice(range(1000), 500, replace=False)])"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "d21cd843-1cc3-49ed-9b7c-d844d3af094f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"318 ms ± 2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"!ogr2ogr -f GeoJSON \\\n",
" filtered_without_sqlite.geojson test.geojson \\\n",
" -sql \"select * from test where property0 in ({proplist})\""
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "f86c00fb-e8a5-47c8-bea1-f898dcdb9c4f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"14.3 s ± 88.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"!ogr2ogr -f GeoJSON \\\n",
" -dialect sqlite \\\n",
" filtered_with_sqlite.geojson test.geojson \\\n",
" -sql \"select * from test where property0 in ({proplist})\""
]
},
{
"cell_type": "markdown",
"id": "0ddab8ca-2126-4583-98b9-7c4556894b0d",
"metadata": {},
"source": [
"## Plot results"
]
},
{
"cell_type": "code",
"execution_count": 95,
"id": "19a53a6e-cead-411e-8393-caf9310e1e3d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Execution time')"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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mJgYdO3aFRMnTkRSUhISExMxadIkREdHa/16297eHpMnT0ZKSgr27NmDp59+GuPGjdNMIRUXF4f4+Hi89957OH36NI4fP47Vq1fj7bffrrXmkJAQFBYWYseOHbh69Wq12R0qa4yKisLo0aOxdetWnD9/Hvv378fzzz+PI0eO4NatW3jyySeRkJCA9PR07Nu3D4cPH641sNdXcHAwJEnCzz//jCtXrqCwsBDOzs549tlnMXfuXKxduxbnzp1DUlIS3n//faxdu7bGY+mz38yZM3HmzBk899xzSE1NxVdffYU1a9bUu259v75EZBgMrkRUo08//RTl5eXo3bs35syZg1dffdVgx540aRJu3bqFvn37Yvbs2XjmmWcwY8YMzfrVq1dj0qRJmD9/Pjp27IjRo0fj8OHD9RqTCgD+/v749ddfkZiYiO7du2PmzJmYNm1ag0K4o6MjFixYgEcffRQDBgyAk5MTvv3221r3kSQJP/74I9zc3DB48GDExMSgTZs21fZr164dxo4di3vvvRf33HMPunXrpjXd1fTp0/HJJ59g9erV6Nq1K6Kjo7FmzRqEhobWev7+/ftj5syZeOSRR+Dp6YnXX39dZ42//vorBg8ejKlTp6JDhw4YP3480tPT4e3tDWtra1y7dg2TJk1Chw4dMG7cOIwYMQJxcXH1uHq18/f3R1xcHBYuXAhvb288+eSTAIBXXnkFL774IuLj4xEWFobY2Fj88ssvdX7uuvYLCgrC+vXrsXHjRnTv3h0rV67E0qVL6123vl9fIjIMSVQdwEZERDrV9AYqQ1iyZAk2btxoUq8/JSIyRexxJSIiIiKzwOBKRERERGaBQwWIiIiIyCywx5WIiIiIzAKDKxERERGZBQZXIiIiIjILDK5EREREZBYYXImIiIjILDC4EhEREZFZYHAlIiIiIrPA4EpEREREZuH/ATsZIgpl4TzCAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 800x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"number_of_properties = [100,200,300,400,500]\n",
"time_without_sqlite = [0.282,0.29,0.3,0.303,0.318]\n",
"time_with_sqlite = [3.08,5.9,8.71,11.5,14.3]\n",
"\n",
"plt.figure(figsize=(8,5))\n",
"plt.scatter(number_of_properties,time_without_sqlite,label=\"without -dialect sqlite\")\n",
"plt.scatter(number_of_properties,time_with_sqlite,label=\"with -dialect sqlite\")\n",
"\n",
"plt.plot(number_of_properties,time_without_sqlite,alpha=0.5)\n",
"plt.plot(number_of_properties,time_with_sqlite,alpha=0.5)\n",
"\n",
"plt.legend()\n",
"plt.xlabel(\"number of properties filtered for\")\n",
"plt.ylabel(\"seconds\")\n",
"plt.title(\"Execution time\")\n",
"#plt.yscale(\"log\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "dev311_2",
"language": "python",
"name": "dev311_2"
},
"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.11.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment