{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"id": "7bc558f7",
"metadata": {},
"source": [
"# Join Tutorial\n",
"\n",
"Join points to closest BBL shapes tutorial."
]
},
{
"cell_type": "markdown",
"id": "difficult-princeton",
"metadata": {},
"source": [
"# Importing Libraries"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "sexual-hungary",
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-12T12:26:47.337270Z",
"start_time": "2021-01-12T12:26:40.878024Z"
}
},
"outputs": [],
"source": [
"import os\n",
"import glob\n",
"import pandas as pd\n",
"import numpy as np\n",
"import seaborn as sns\n",
"import geopandas as gpd\n",
"import fiona\n",
"from fiona.crs import from_epsg\n",
"import geoplot\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"import matplotlib.dates as mdates\n",
"from matplotlib.ticker import FuncFormatter\n",
"from mpl_toolkits.axes_grid1 import make_axes_locatable\n",
"import datetime\n",
"import statsmodels.api as sm\n",
"\n",
"plt.rcParams['savefig.facecolor'] = 'white'\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"id": "israeli-surname",
"metadata": {},
"source": [
"Printing versions of Python modules and packages with **watermark** - the IPython magic extension."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "driving-interstate",
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-12T12:26:47.373246Z",
"start_time": "2021-01-12T12:26:47.340252Z"
}
},
"outputs": [],
"source": [
"%load_ext watermark"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "undefined-polyester",
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-12T12:26:47.487466Z",
"start_time": "2021-01-12T12:26:47.377365Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python implementation: CPython\n",
"Python version : 3.8.13\n",
"IPython version : 8.4.0\n",
"\n",
"numpy : 1.23.1\n",
"pandas : 1.4.3\n",
"geopandas : 0.11.1\n",
"geoplot : 0.5.1\n",
"fiona : 1.8.21\n",
"matplotlib.pyplot: unknown\n",
"seaborn : 0.11.2\n",
"\n"
]
}
],
"source": [
"%watermark -v -p numpy,pandas,geopandas,geoplot,fiona,matplotlib.pyplot,seaborn"
]
},
{
"cell_type": "markdown",
"id": "legitimate-gross",
"metadata": {},
"source": [
"Documention for installing watermark: https://github.com/rasbt/watermark"
]
},
{
"cell_type": "markdown",
"id": "drawn-sponsorship",
"metadata": {},
"source": [
"# Retrieve Data"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "0cb3b300",
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(26959, 35)\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" unique_key \n",
" created_date \n",
" agency \n",
" agency_name \n",
" complaint_type \n",
" descriptor \n",
" incident_zip \n",
" incident_address \n",
" street_name \n",
" cross_street_1 \n",
" ... \n",
" intersection_street_1 \n",
" intersection_street_2 \n",
" closed_date \n",
" resolution_description \n",
" resolution_action_updated_date \n",
" location_type \n",
" landmark \n",
" facility_type \n",
" due_date \n",
" geometry \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 48542220 \n",
" 2020-12-31T15:41:00.000 \n",
" DEP \n",
" Department of Environmental Protection \n",
" Sewer \n",
" Street Flooding (SJ) \n",
" 11420.0 \n",
" 117-17 135 STREET \n",
" 135 STREET \n",
" FOCH BLVD \n",
" ... \n",
" NaN \n",
" NaN \n",
" 2021-01-01T00:20:00.000 \n",
" Please call 311 for further information. If yo... \n",
" 2021-01-01T00:20:00.000 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" POINT (1038500.000 186000.014) \n",
" \n",
" \n",
" 1 \n",
" 48536430 \n",
" 2020-12-31T14:49:00.000 \n",
" DEP \n",
" Department of Environmental Protection \n",
" Sewer \n",
" Street Flooding (SJ) \n",
" 11357.0 \n",
" 20-24 150 STREET \n",
" 150 STREET \n",
" 20 AVE \n",
" ... \n",
" NaN \n",
" NaN \n",
" 2021-01-04T10:15:00.000 \n",
" The Department of Environment Protection inspe... \n",
" 2021-01-04T10:15:00.000 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" POINT (1035682.000 223771.014) \n",
" \n",
" \n",
" 2 \n",
" 48539361 \n",
" 2020-12-31T14:03:00.000 \n",
" DEP \n",
" Department of Environmental Protection \n",
" Sewer \n",
" Street Flooding (SJ) \n",
" 11228.0 \n",
" 7223 8 AVENUE \n",
" 8 AVENUE \n",
" 72 ST \n",
" ... \n",
" NaN \n",
" NaN \n",
" 2021-01-02T11:25:00.000 \n",
" The Department of Environmental Protection has... \n",
" 2021-01-02T11:25:00.000 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" POINT (979584.000 168255.014) \n",
" \n",
" \n",
" 3 \n",
" 48543132 \n",
" 2020-12-31T13:48:00.000 \n",
" DEP \n",
" Department of Environmental Protection \n",
" Sewer \n",
" Street Flooding (SJ) \n",
" 10032.0 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" ... \n",
" RIVERSIDE DRIVE \n",
" WEST 165 STREET \n",
" 2020-12-31T14:50:00.000 \n",
" Please call 311 for further information. If yo... \n",
" 2020-12-31T14:50:00.000 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" POINT (999557.000 245700.014) \n",
" \n",
" \n",
" 4 \n",
" 48536441 \n",
" 2020-12-31T13:10:00.000 \n",
" DEP \n",
" Department of Environmental Protection \n",
" Sewer \n",
" Street Flooding (SJ) \n",
" 11234.0 \n",
" 3123 FILLMORE AVENUE \n",
" FILLMORE AVENUE \n",
" E 31 ST \n",
" ... \n",
" NaN \n",
" NaN \n",
" 2021-01-03T10:45:00.000 \n",
" The Department of Environmental Protection ins... \n",
" 2021-01-03T10:45:00.000 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" POINT (1001868.000 161232.014) \n",
" \n",
" \n",
"
\n",
"
5 rows × 35 columns
\n",
"
"
],
"text/plain": [
" unique_key created_date agency \\\n",
"0 48542220 2020-12-31T15:41:00.000 DEP \n",
"1 48536430 2020-12-31T14:49:00.000 DEP \n",
"2 48539361 2020-12-31T14:03:00.000 DEP \n",
"3 48543132 2020-12-31T13:48:00.000 DEP \n",
"4 48536441 2020-12-31T13:10:00.000 DEP \n",
"\n",
" agency_name complaint_type \\\n",
"0 Department of Environmental Protection Sewer \n",
"1 Department of Environmental Protection Sewer \n",
"2 Department of Environmental Protection Sewer \n",
"3 Department of Environmental Protection Sewer \n",
"4 Department of Environmental Protection Sewer \n",
"\n",
" descriptor incident_zip incident_address street_name \\\n",
"0 Street Flooding (SJ) 11420.0 117-17 135 STREET 135 STREET \n",
"1 Street Flooding (SJ) 11357.0 20-24 150 STREET 150 STREET \n",
"2 Street Flooding (SJ) 11228.0 7223 8 AVENUE 8 AVENUE \n",
"3 Street Flooding (SJ) 10032.0 NaN NaN \n",
"4 Street Flooding (SJ) 11234.0 3123 FILLMORE AVENUE FILLMORE AVENUE \n",
"\n",
" cross_street_1 ... intersection_street_1 intersection_street_2 \\\n",
"0 FOCH BLVD ... NaN NaN \n",
"1 20 AVE ... NaN NaN \n",
"2 72 ST ... NaN NaN \n",
"3 NaN ... RIVERSIDE DRIVE WEST 165 STREET \n",
"4 E 31 ST ... NaN NaN \n",
"\n",
" closed_date resolution_description \\\n",
"0 2021-01-01T00:20:00.000 Please call 311 for further information. If yo... \n",
"1 2021-01-04T10:15:00.000 The Department of Environment Protection inspe... \n",
"2 2021-01-02T11:25:00.000 The Department of Environmental Protection has... \n",
"3 2020-12-31T14:50:00.000 Please call 311 for further information. If yo... \n",
"4 2021-01-03T10:45:00.000 The Department of Environmental Protection ins... \n",
"\n",
" resolution_action_updated_date location_type landmark facility_type \\\n",
"0 2021-01-01T00:20:00.000 NaN NaN NaN \n",
"1 2021-01-04T10:15:00.000 NaN NaN NaN \n",
"2 2021-01-02T11:25:00.000 NaN NaN NaN \n",
"3 2020-12-31T14:50:00.000 NaN NaN NaN \n",
"4 2021-01-03T10:45:00.000 NaN NaN NaN \n",
"\n",
" due_date geometry \n",
"0 NaN POINT (1038500.000 186000.014) \n",
"1 NaN POINT (1035682.000 223771.014) \n",
"2 NaN POINT (979584.000 168255.014) \n",
"3 NaN POINT (999557.000 245700.014) \n",
"4 NaN POINT (1001868.000 161232.014) \n",
"\n",
"[5 rows x 35 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path = 'https://raw.githubusercontent.com/mebauer/nyc-311-street-flooding/main/data/\\\n",
"street-flooding-complaints.csv'\n",
"\n",
"df = pd.read_csv(path, low_memory=False)\n",
"gdf = gpd.GeoDataFrame(\n",
" df, geometry=gpd.points_from_xy(df.longitude, df.latitude, crs=4263))\n",
"\n",
"gdf = gdf.dropna(subset=['longitude']).reset_index(drop=True)\n",
"gdf = gdf.to_crs(2263)\n",
"\n",
"print(gdf.shape)\n",
"gdf.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "29f15d9c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"gdf.plot()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "0adc2eb0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(500, 95)\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Borough \n",
" Block \n",
" Lot \n",
" CD \n",
" BCT2020 \n",
" BCTCB2020 \n",
" CT2010 \n",
" CB2010 \n",
" SchoolDist \n",
" Council \n",
" ... \n",
" FIRM07_FLAG \n",
" PFIRM15_FLAG \n",
" Version \n",
" DCPEdited \n",
" Latitude \n",
" Longitude \n",
" Notes \n",
" Shape_Leng \n",
" Shape_Area \n",
" geometry \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" MN \n",
" 1 \n",
" 10 \n",
" 101 \n",
" 1000500 \n",
" 10005000003 \n",
" 5 \n",
" 1000 \n",
" 02 \n",
" 1 \n",
" ... \n",
" 1 \n",
" 1 \n",
" 22v3.1 \n",
" None \n",
" 40.688766 \n",
" -74.018682 \n",
" None \n",
" 0.0 \n",
" 7.478663e+06 \n",
" MULTIPOLYGON (((980783.787 191526.763, 980898.... \n",
" \n",
" \n",
" 1 \n",
" MN \n",
" 1 \n",
" 101 \n",
" 101 \n",
" 1000100 \n",
" None \n",
" 1 \n",
" 1001 \n",
" 02 \n",
" 1 \n",
" ... \n",
" None \n",
" 1 \n",
" 22v3.1 \n",
" None \n",
" 40.689920 \n",
" -74.045337 \n",
" None \n",
" 0.0 \n",
" 5.018973e+05 \n",
" MULTIPOLYGON (((972409.690 190685.560, 972428.... \n",
" \n",
" \n",
" 2 \n",
" MN \n",
" 1 \n",
" 201 \n",
" 101 \n",
" 1000100 \n",
" 10001001000 \n",
" 1 \n",
" 1000 \n",
" 02 \n",
" 1 \n",
" ... \n",
" None \n",
" 1 \n",
" 22v3.1 \n",
" None \n",
" 40.698188 \n",
" -74.041329 \n",
" None \n",
" 0.0 \n",
" 1.148539e+06 \n",
" MULTIPOLYGON (((973648.661 193712.461, 973648.... \n",
" \n",
" \n",
" 3 \n",
" MN \n",
" 2 \n",
" 1 \n",
" 101 \n",
" 1000900 \n",
" 10009001022 \n",
" 9 \n",
" 1025 \n",
" 02 \n",
" 1 \n",
" ... \n",
" 1 \n",
" 1 \n",
" 22v3.1 \n",
" t \n",
" 40.700369 \n",
" -74.012911 \n",
" None \n",
" 0.0 \n",
" 1.008250e+05 \n",
" MULTIPOLYGON (((980639.785 194217.691, 980609.... \n",
" \n",
" \n",
" 4 \n",
" MN \n",
" 2 \n",
" 2 \n",
" 101 \n",
" 1000900 \n",
" 10009001022 \n",
" 9 \n",
" 1025 \n",
" 02 \n",
" 1 \n",
" ... \n",
" 1 \n",
" 1 \n",
" 22v3.1 \n",
" None \n",
" 40.700550 \n",
" -74.011588 \n",
" None \n",
" 0.0 \n",
" 8.724425e+04 \n",
" MULTIPOLYGON (((980915.002 194319.141, 980795.... \n",
" \n",
" \n",
"
\n",
"
5 rows × 95 columns
\n",
"
"
],
"text/plain": [
" Borough Block Lot CD BCT2020 BCTCB2020 CT2010 CB2010 SchoolDist \\\n",
"0 MN 1 10 101 1000500 10005000003 5 1000 02 \n",
"1 MN 1 101 101 1000100 None 1 1001 02 \n",
"2 MN 1 201 101 1000100 10001001000 1 1000 02 \n",
"3 MN 2 1 101 1000900 10009001022 9 1025 02 \n",
"4 MN 2 2 101 1000900 10009001022 9 1025 02 \n",
"\n",
" Council ... FIRM07_FLAG PFIRM15_FLAG Version DCPEdited Latitude \\\n",
"0 1 ... 1 1 22v3.1 None 40.688766 \n",
"1 1 ... None 1 22v3.1 None 40.689920 \n",
"2 1 ... None 1 22v3.1 None 40.698188 \n",
"3 1 ... 1 1 22v3.1 t 40.700369 \n",
"4 1 ... 1 1 22v3.1 None 40.700550 \n",
"\n",
" Longitude Notes Shape_Leng Shape_Area \\\n",
"0 -74.018682 None 0.0 7.478663e+06 \n",
"1 -74.045337 None 0.0 5.018973e+05 \n",
"2 -74.041329 None 0.0 1.148539e+06 \n",
"3 -74.012911 None 0.0 1.008250e+05 \n",
"4 -74.011588 None 0.0 8.724425e+04 \n",
"\n",
" geometry \n",
"0 MULTIPOLYGON (((980783.787 191526.763, 980898.... \n",
"1 MULTIPOLYGON (((972409.690 190685.560, 972428.... \n",
"2 MULTIPOLYGON (((973648.661 193712.461, 973648.... \n",
"3 MULTIPOLYGON (((980639.785 194217.691, 980609.... \n",
"4 MULTIPOLYGON (((980915.002 194319.141, 980795.... \n",
"\n",
"[5 rows x 95 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path = '~/Downloads/nyc_mappluto_22v3_1_fgdb/MapPLUTO_22v3_1.gdb'\n",
"pluto_gdf = gpd.read_file(path, rows=500)\n",
"\n",
"pluto_gdf = pluto_gdf.to_crs(2263)\n",
"\n",
"print(pluto_gdf.shape)\n",
"pluto_gdf.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "1c8d087c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"pluto_gdf.plot()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "7ec1828c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"rtree.index.Index(bounds=[971045.2731347084, 188447.4288892746, 985249.228328228, 201211.1846499443], size=70)"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pluto_gdf.sindex"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "addbb9e5",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" minx \n",
" miny \n",
" maxx \n",
" maxy \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1.038300e+06 \n",
" 185800.014393 \n",
" 1.038700e+06 \n",
" 186200.014393 \n",
" \n",
" \n",
" 1 \n",
" 1.035482e+06 \n",
" 223571.014417 \n",
" 1.035882e+06 \n",
" 223971.014417 \n",
" \n",
" \n",
" 2 \n",
" 9.793840e+05 \n",
" 168055.014382 \n",
" 9.797840e+05 \n",
" 168455.014382 \n",
" \n",
" \n",
" 3 \n",
" 9.993570e+05 \n",
" 245500.014431 \n",
" 9.997570e+05 \n",
" 245900.014431 \n",
" \n",
" \n",
" 4 \n",
" 1.001668e+06 \n",
" 161032.014377 \n",
" 1.002068e+06 \n",
" 161432.014377 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" minx miny maxx maxy\n",
"0 1.038300e+06 185800.014393 1.038700e+06 186200.014393\n",
"1 1.035482e+06 223571.014417 1.035882e+06 223971.014417\n",
"2 9.793840e+05 168055.014382 9.797840e+05 168455.014382\n",
"3 9.993570e+05 245500.014431 9.997570e+05 245900.014431\n",
"4 1.001668e+06 161032.014377 1.002068e+06 161432.014377"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"offset = 200\n",
"bbox = gdf.bounds + [-offset, -offset, offset, offset]\n",
"\n",
"bbox.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "72dee2c9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(26959,)\n"
]
},
{
"data": {
"text/plain": [
"0 []\n",
"1 []\n",
"2 []\n",
"3 []\n",
"4 []\n",
"dtype: object"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hits = bbox.apply(lambda row: list(pluto_gdf.sindex.intersection(row)), axis=1)\n",
"\n",
"print(hits.shape)\n",
"hits.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "d44174b0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(721, 2)\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" pt_idx \n",
" line_i \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 459 \n",
" 128.0 \n",
" \n",
" \n",
" 1 \n",
" 459 \n",
" 145.0 \n",
" \n",
" \n",
" 2 \n",
" 459 \n",
" 137.0 \n",
" \n",
" \n",
" 3 \n",
" 459 \n",
" 139.0 \n",
" \n",
" \n",
" 4 \n",
" 459 \n",
" 140.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" pt_idx line_i\n",
"0 459 128.0\n",
"1 459 145.0\n",
"2 459 137.0\n",
"3 459 139.0\n",
"4 459 140.0"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tmp = pd.DataFrame(\n",
" {\n",
" # index of points table\n",
" \"pt_idx\": np.repeat(hits.index, hits.apply(len)),\n",
"\n",
" # ordinal position of line - access via iloc later\n",
" \"line_i\": np.concatenate(hits.values)\n",
" }\n",
")\n",
"\n",
"print(tmp.shape)\n",
"tmp.head()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "bc450473",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" pt_idx \n",
" line_i \n",
" Borough \n",
" Block \n",
" Lot \n",
" CD \n",
" BCT2020 \n",
" BCTCB2020 \n",
" CT2010 \n",
" CB2010 \n",
" ... \n",
" FIRM07_FLAG \n",
" PFIRM15_FLAG \n",
" Version \n",
" DCPEdited \n",
" Latitude \n",
" Longitude \n",
" Notes \n",
" Shape_Leng \n",
" Shape_Area \n",
" geometry \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 459 \n",
" 128.0 \n",
" MN \n",
" 79 \n",
" 27 \n",
" 101 \n",
" 1001502 \n",
" 10015021000 \n",
" 15.02 \n",
" 1000 \n",
" ... \n",
" None \n",
" None \n",
" 22v3.1 \n",
" None \n",
" 40.710322 \n",
" -74.008466 \n",
" None \n",
" 0.0 \n",
" 5670.917438 \n",
" MULTIPOLYGON (((981955.698 198099.048, 981894.... \n",
" \n",
" \n",
" 1 \n",
" 459 \n",
" 145.0 \n",
" MN \n",
" 92 \n",
" 23 \n",
" 101 \n",
" 1001501 \n",
" 10015011011 \n",
" 15.01 \n",
" 1007 \n",
" ... \n",
" None \n",
" None \n",
" 22v3.1 \n",
" None \n",
" 40.710594 \n",
" -74.007185 \n",
" None \n",
" 0.0 \n",
" 1702.936740 \n",
" MULTIPOLYGON (((982289.308 198169.543, 982267.... \n",
" \n",
" \n",
" 2 \n",
" 459 \n",
" 137.0 \n",
" MN \n",
" 89 \n",
" 3 \n",
" 101 \n",
" 1001501 \n",
" 10015011017 \n",
" 15.01 \n",
" 1005 \n",
" ... \n",
" None \n",
" None \n",
" 22v3.1 \n",
" None \n",
" 40.710635 \n",
" -74.007964 \n",
" None \n",
" 0.0 \n",
" 5632.008015 \n",
" MULTIPOLYGON (((982020.597 198116.096, 981985.... \n",
" \n",
" \n",
" 3 \n",
" 459 \n",
" 139.0 \n",
" MN \n",
" 90 \n",
" 23 \n",
" 101 \n",
" 1001501 \n",
" 10015011009 \n",
" 15.01 \n",
" 1004 \n",
" ... \n",
" None \n",
" None \n",
" 22v3.1 \n",
" None \n",
" 40.710956 \n",
" -74.007773 \n",
" None \n",
" 0.0 \n",
" 1021.570578 \n",
" MULTIPOLYGON (((982110.692 198297.452, 982090.... \n",
" \n",
" \n",
" 4 \n",
" 459 \n",
" 140.0 \n",
" MN \n",
" 90 \n",
" 24 \n",
" 101 \n",
" 1001501 \n",
" 10015011009 \n",
" 15.01 \n",
" 1004 \n",
" ... \n",
" None \n",
" None \n",
" 22v3.1 \n",
" None \n",
" 40.711005 \n",
" -74.007817 \n",
" None \n",
" 0.0 \n",
" 1242.680263 \n",
" MULTIPOLYGON (((982106.447 198327.138, 982072.... \n",
" \n",
" \n",
"
\n",
"
5 rows × 97 columns
\n",
"
"
],
"text/plain": [
" pt_idx line_i Borough Block Lot CD BCT2020 BCTCB2020 CT2010 \\\n",
"0 459 128.0 MN 79 27 101 1001502 10015021000 15.02 \n",
"1 459 145.0 MN 92 23 101 1001501 10015011011 15.01 \n",
"2 459 137.0 MN 89 3 101 1001501 10015011017 15.01 \n",
"3 459 139.0 MN 90 23 101 1001501 10015011009 15.01 \n",
"4 459 140.0 MN 90 24 101 1001501 10015011009 15.01 \n",
"\n",
" CB2010 ... FIRM07_FLAG PFIRM15_FLAG Version DCPEdited Latitude \\\n",
"0 1000 ... None None 22v3.1 None 40.710322 \n",
"1 1007 ... None None 22v3.1 None 40.710594 \n",
"2 1005 ... None None 22v3.1 None 40.710635 \n",
"3 1004 ... None None 22v3.1 None 40.710956 \n",
"4 1004 ... None None 22v3.1 None 40.711005 \n",
"\n",
" Longitude Notes Shape_Leng Shape_Area \\\n",
"0 -74.008466 None 0.0 5670.917438 \n",
"1 -74.007185 None 0.0 1702.936740 \n",
"2 -74.007964 None 0.0 5632.008015 \n",
"3 -74.007773 None 0.0 1021.570578 \n",
"4 -74.007817 None 0.0 1242.680263 \n",
"\n",
" geometry \n",
"0 MULTIPOLYGON (((981955.698 198099.048, 981894.... \n",
"1 MULTIPOLYGON (((982289.308 198169.543, 982267.... \n",
"2 MULTIPOLYGON (((982020.597 198116.096, 981985.... \n",
"3 MULTIPOLYGON (((982110.692 198297.452, 982090.... \n",
"4 MULTIPOLYGON (((982106.447 198327.138, 982072.... \n",
"\n",
"[5 rows x 97 columns]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Join back to the lines on line_i; we use reset_index() to \n",
"# give us the ordinal position of each line\n",
"tmp = tmp.join(pluto_gdf.reset_index(drop=True), on=\"line_i\")\n",
"\n",
"tmp.head()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "70023ecf",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" pt_idx \n",
" line_i \n",
" Borough \n",
" Block \n",
" Lot \n",
" CD \n",
" BCT2020 \n",
" BCTCB2020 \n",
" CT2010 \n",
" CB2010 \n",
" ... \n",
" PFIRM15_FLAG \n",
" Version \n",
" DCPEdited \n",
" Latitude \n",
" Longitude \n",
" Notes \n",
" Shape_Leng \n",
" Shape_Area \n",
" geometry \n",
" point \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 459 \n",
" 128.0 \n",
" MN \n",
" 79 \n",
" 27 \n",
" 101 \n",
" 1001502 \n",
" 10015021000 \n",
" 15.02 \n",
" 1000 \n",
" ... \n",
" None \n",
" 22v3.1 \n",
" None \n",
" 40.710322 \n",
" -74.008466 \n",
" None \n",
" 0.0 \n",
" 5670.917438 \n",
" MULTIPOLYGON (((981955.698 198099.048, 981894.... \n",
" POINT (982027.000 198304.014) \n",
" \n",
" \n",
" 1 \n",
" 459 \n",
" 145.0 \n",
" MN \n",
" 92 \n",
" 23 \n",
" 101 \n",
" 1001501 \n",
" 10015011011 \n",
" 15.01 \n",
" 1007 \n",
" ... \n",
" None \n",
" 22v3.1 \n",
" None \n",
" 40.710594 \n",
" -74.007185 \n",
" None \n",
" 0.0 \n",
" 1702.936740 \n",
" MULTIPOLYGON (((982289.308 198169.543, 982267.... \n",
" POINT (982027.000 198304.014) \n",
" \n",
" \n",
" 2 \n",
" 459 \n",
" 137.0 \n",
" MN \n",
" 89 \n",
" 3 \n",
" 101 \n",
" 1001501 \n",
" 10015011017 \n",
" 15.01 \n",
" 1005 \n",
" ... \n",
" None \n",
" 22v3.1 \n",
" None \n",
" 40.710635 \n",
" -74.007964 \n",
" None \n",
" 0.0 \n",
" 5632.008015 \n",
" MULTIPOLYGON (((982020.597 198116.096, 981985.... \n",
" POINT (982027.000 198304.014) \n",
" \n",
" \n",
" 3 \n",
" 459 \n",
" 139.0 \n",
" MN \n",
" 90 \n",
" 23 \n",
" 101 \n",
" 1001501 \n",
" 10015011009 \n",
" 15.01 \n",
" 1004 \n",
" ... \n",
" None \n",
" 22v3.1 \n",
" None \n",
" 40.710956 \n",
" -74.007773 \n",
" None \n",
" 0.0 \n",
" 1021.570578 \n",
" MULTIPOLYGON (((982110.692 198297.452, 982090.... \n",
" POINT (982027.000 198304.014) \n",
" \n",
" \n",
" 4 \n",
" 459 \n",
" 140.0 \n",
" MN \n",
" 90 \n",
" 24 \n",
" 101 \n",
" 1001501 \n",
" 10015011009 \n",
" 15.01 \n",
" 1004 \n",
" ... \n",
" None \n",
" 22v3.1 \n",
" None \n",
" 40.711005 \n",
" -74.007817 \n",
" None \n",
" 0.0 \n",
" 1242.680263 \n",
" MULTIPOLYGON (((982106.447 198327.138, 982072.... \n",
" POINT (982027.000 198304.014) \n",
" \n",
" \n",
"
\n",
"
5 rows × 98 columns
\n",
"
"
],
"text/plain": [
" pt_idx line_i Borough Block Lot CD BCT2020 BCTCB2020 CT2010 \\\n",
"0 459 128.0 MN 79 27 101 1001502 10015021000 15.02 \n",
"1 459 145.0 MN 92 23 101 1001501 10015011011 15.01 \n",
"2 459 137.0 MN 89 3 101 1001501 10015011017 15.01 \n",
"3 459 139.0 MN 90 23 101 1001501 10015011009 15.01 \n",
"4 459 140.0 MN 90 24 101 1001501 10015011009 15.01 \n",
"\n",
" CB2010 ... PFIRM15_FLAG Version DCPEdited Latitude Longitude Notes \\\n",
"0 1000 ... None 22v3.1 None 40.710322 -74.008466 None \n",
"1 1007 ... None 22v3.1 None 40.710594 -74.007185 None \n",
"2 1005 ... None 22v3.1 None 40.710635 -74.007964 None \n",
"3 1004 ... None 22v3.1 None 40.710956 -74.007773 None \n",
"4 1004 ... None 22v3.1 None 40.711005 -74.007817 None \n",
"\n",
" Shape_Leng Shape_Area geometry \\\n",
"0 0.0 5670.917438 MULTIPOLYGON (((981955.698 198099.048, 981894.... \n",
"1 0.0 1702.936740 MULTIPOLYGON (((982289.308 198169.543, 982267.... \n",
"2 0.0 5632.008015 MULTIPOLYGON (((982020.597 198116.096, 981985.... \n",
"3 0.0 1021.570578 MULTIPOLYGON (((982110.692 198297.452, 982090.... \n",
"4 0.0 1242.680263 MULTIPOLYGON (((982106.447 198327.138, 982072.... \n",
"\n",
" point \n",
"0 POINT (982027.000 198304.014) \n",
"1 POINT (982027.000 198304.014) \n",
"2 POINT (982027.000 198304.014) \n",
"3 POINT (982027.000 198304.014) \n",
"4 POINT (982027.000 198304.014) \n",
"\n",
"[5 rows x 98 columns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Join back to the original points to get their geometry\n",
"# rename the point geometry as \"point\"\n",
"tmp = tmp.join(gdf.geometry.rename(\"point\"), on=\"pt_idx\")\n",
"\n",
"# Convert back to a GeoDataFrame, so we can do spatial ops\n",
"tmp = gpd.GeoDataFrame(tmp, geometry=\"geometry\", crs=gdf.crs)\n",
"\n",
"tmp.head()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "01b72539",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" pt_idx \n",
" line_i \n",
" Borough \n",
" Block \n",
" Lot \n",
" CD \n",
" BCT2020 \n",
" BCTCB2020 \n",
" CT2010 \n",
" CB2010 \n",
" ... \n",
" Version \n",
" DCPEdited \n",
" Latitude \n",
" Longitude \n",
" Notes \n",
" Shape_Leng \n",
" Shape_Area \n",
" geometry \n",
" point \n",
" snap_dist \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 459 \n",
" 128.0 \n",
" MN \n",
" 79 \n",
" 27 \n",
" 101 \n",
" 1001502 \n",
" 10015021000 \n",
" 15.02 \n",
" 1000 \n",
" ... \n",
" 22v3.1 \n",
" None \n",
" 40.710322 \n",
" -74.008466 \n",
" None \n",
" 0.0 \n",
" 5670.917438 \n",
" MULTIPOLYGON (((981955.698 198099.048, 981894.... \n",
" POINT (982027.000 198304.014) \n",
" 210.186017 \n",
" \n",
" \n",
" 1 \n",
" 459 \n",
" 145.0 \n",
" MN \n",
" 92 \n",
" 23 \n",
" 101 \n",
" 1001501 \n",
" 10015011011 \n",
" 15.01 \n",
" 1007 \n",
" ... \n",
" 22v3.1 \n",
" None \n",
" 40.710594 \n",
" -74.007185 \n",
" None \n",
" 0.0 \n",
" 1702.936740 \n",
" MULTIPOLYGON (((982289.308 198169.543, 982267.... \n",
" POINT (982027.000 198304.014) \n",
" 244.527951 \n",
" \n",
" \n",
" 2 \n",
" 459 \n",
" 137.0 \n",
" MN \n",
" 89 \n",
" 3 \n",
" 101 \n",
" 1001501 \n",
" 10015011017 \n",
" 15.01 \n",
" 1005 \n",
" ... \n",
" 22v3.1 \n",
" None \n",
" 40.710635 \n",
" -74.007964 \n",
" None \n",
" 0.0 \n",
" 5632.008015 \n",
" MULTIPOLYGON (((982020.597 198116.096, 981985.... \n",
" POINT (982027.000 198304.014) \n",
" 69.911787 \n",
" \n",
" \n",
" 3 \n",
" 459 \n",
" 139.0 \n",
" MN \n",
" 90 \n",
" 23 \n",
" 101 \n",
" 1001501 \n",
" 10015011009 \n",
" 15.01 \n",
" 1004 \n",
" ... \n",
" 22v3.1 \n",
" None \n",
" 40.710956 \n",
" -74.007773 \n",
" None \n",
" 0.0 \n",
" 1021.570578 \n",
" MULTIPOLYGON (((982110.692 198297.452, 982090.... \n",
" POINT (982027.000 198304.014) \n",
" 49.550503 \n",
" \n",
" \n",
" 4 \n",
" 459 \n",
" 140.0 \n",
" MN \n",
" 90 \n",
" 24 \n",
" 101 \n",
" 1001501 \n",
" 10015011009 \n",
" 15.01 \n",
" 1004 \n",
" ... \n",
" 22v3.1 \n",
" None \n",
" 40.711005 \n",
" -74.007817 \n",
" None \n",
" 0.0 \n",
" 1242.680263 \n",
" MULTIPOLYGON (((982106.447 198327.138, 982072.... \n",
" POINT (982027.000 198304.014) \n",
" 30.673000 \n",
" \n",
" \n",
"
\n",
"
5 rows × 99 columns
\n",
"
"
],
"text/plain": [
" pt_idx line_i Borough Block Lot CD BCT2020 BCTCB2020 CT2010 \\\n",
"0 459 128.0 MN 79 27 101 1001502 10015021000 15.02 \n",
"1 459 145.0 MN 92 23 101 1001501 10015011011 15.01 \n",
"2 459 137.0 MN 89 3 101 1001501 10015011017 15.01 \n",
"3 459 139.0 MN 90 23 101 1001501 10015011009 15.01 \n",
"4 459 140.0 MN 90 24 101 1001501 10015011009 15.01 \n",
"\n",
" CB2010 ... Version DCPEdited Latitude Longitude Notes Shape_Leng \\\n",
"0 1000 ... 22v3.1 None 40.710322 -74.008466 None 0.0 \n",
"1 1007 ... 22v3.1 None 40.710594 -74.007185 None 0.0 \n",
"2 1005 ... 22v3.1 None 40.710635 -74.007964 None 0.0 \n",
"3 1004 ... 22v3.1 None 40.710956 -74.007773 None 0.0 \n",
"4 1004 ... 22v3.1 None 40.711005 -74.007817 None 0.0 \n",
"\n",
" Shape_Area geometry \\\n",
"0 5670.917438 MULTIPOLYGON (((981955.698 198099.048, 981894.... \n",
"1 1702.936740 MULTIPOLYGON (((982289.308 198169.543, 982267.... \n",
"2 5632.008015 MULTIPOLYGON (((982020.597 198116.096, 981985.... \n",
"3 1021.570578 MULTIPOLYGON (((982110.692 198297.452, 982090.... \n",
"4 1242.680263 MULTIPOLYGON (((982106.447 198327.138, 982072.... \n",
"\n",
" point snap_dist \n",
"0 POINT (982027.000 198304.014) 210.186017 \n",
"1 POINT (982027.000 198304.014) 244.527951 \n",
"2 POINT (982027.000 198304.014) 69.911787 \n",
"3 POINT (982027.000 198304.014) 49.550503 \n",
"4 POINT (982027.000 198304.014) 30.673000 \n",
"\n",
"[5 rows x 99 columns]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tmp[\"snap_dist\"] = tmp.geometry.distance(gpd.GeoSeries(tmp.point))\n",
"\n",
"tmp.head()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "22559048",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" pt_idx \n",
" line_i \n",
" Borough \n",
" Block \n",
" Lot \n",
" CD \n",
" BCT2020 \n",
" BCTCB2020 \n",
" CT2010 \n",
" CB2010 \n",
" ... \n",
" Version \n",
" DCPEdited \n",
" Latitude \n",
" Longitude \n",
" Notes \n",
" Shape_Leng \n",
" Shape_Area \n",
" geometry \n",
" point \n",
" snap_dist \n",
" \n",
" \n",
" \n",
" \n",
" 448 \n",
" 19254 \n",
" 340.0 \n",
" MN \n",
" 16 \n",
" 3 \n",
" 101 \n",
" 1031704 \n",
" 10317044000 \n",
" 317.04 \n",
" 4001 \n",
" ... \n",
" 22v3.1 \n",
" t \n",
" 40.712618 \n",
" -74.016586 \n",
" None \n",
" 0.0 \n",
" 2.052775e+06 \n",
" MULTIPOLYGON (((980584.841 200985.007, 980594.... \n",
" POINT (979355.000 197234.014) \n",
" 0.000000 \n",
" \n",
" \n",
" 483 \n",
" 19475 \n",
" 340.0 \n",
" MN \n",
" 16 \n",
" 3 \n",
" 101 \n",
" 1031704 \n",
" 10317044000 \n",
" 317.04 \n",
" 4001 \n",
" ... \n",
" 22v3.1 \n",
" t \n",
" 40.712618 \n",
" -74.016586 \n",
" None \n",
" 0.0 \n",
" 2.052775e+06 \n",
" MULTIPOLYGON (((980584.841 200985.007, 980594.... \n",
" POINT (979355.000 197234.014) \n",
" 0.000000 \n",
" \n",
" \n",
" 324 \n",
" 15235 \n",
" 340.0 \n",
" MN \n",
" 16 \n",
" 3 \n",
" 101 \n",
" 1031704 \n",
" 10317044000 \n",
" 317.04 \n",
" 4001 \n",
" ... \n",
" 22v3.1 \n",
" t \n",
" 40.712618 \n",
" -74.016586 \n",
" None \n",
" 0.0 \n",
" 2.052775e+06 \n",
" MULTIPOLYGON (((980584.841 200985.007, 980594.... \n",
" POINT (979759.000 199686.014) \n",
" 0.000000 \n",
" \n",
" \n",
" 518 \n",
" 21495 \n",
" 455.0 \n",
" MN \n",
" 25 \n",
" 7502 \n",
" 101 \n",
" 1000900 \n",
" 10009001001 \n",
" 9 \n",
" 1000 \n",
" ... \n",
" 22v3.1 \n",
" None \n",
" 40.705919 \n",
" -74.010766 \n",
" None \n",
" 0.0 \n",
" 2.585314e+04 \n",
" MULTIPOLYGON (((981284.442 196374.824, 981236.... \n",
" POINT (981399.000 196469.014) \n",
" 11.267715 \n",
" \n",
" \n",
" 516 \n",
" 21495 \n",
" 47.0 \n",
" MN \n",
" 25 \n",
" 27 \n",
" 101 \n",
" 1000900 \n",
" 10009001000 \n",
" 9 \n",
" 1000 \n",
" ... \n",
" 22v3.1 \n",
" None \n",
" 40.705686 \n",
" -74.010287 \n",
" None \n",
" 0.0 \n",
" 1.625568e+04 \n",
" MULTIPOLYGON (((981492.934 196409.111, 981478.... \n",
" POINT (981399.000 196469.014) \n",
" 11.310903 \n",
" \n",
" \n",
"
\n",
"
5 rows × 99 columns
\n",
"
"
],
"text/plain": [
" pt_idx line_i Borough Block Lot CD BCT2020 BCTCB2020 CT2010 \\\n",
"448 19254 340.0 MN 16 3 101 1031704 10317044000 317.04 \n",
"483 19475 340.0 MN 16 3 101 1031704 10317044000 317.04 \n",
"324 15235 340.0 MN 16 3 101 1031704 10317044000 317.04 \n",
"518 21495 455.0 MN 25 7502 101 1000900 10009001001 9 \n",
"516 21495 47.0 MN 25 27 101 1000900 10009001000 9 \n",
"\n",
" CB2010 ... Version DCPEdited Latitude Longitude Notes Shape_Leng \\\n",
"448 4001 ... 22v3.1 t 40.712618 -74.016586 None 0.0 \n",
"483 4001 ... 22v3.1 t 40.712618 -74.016586 None 0.0 \n",
"324 4001 ... 22v3.1 t 40.712618 -74.016586 None 0.0 \n",
"518 1000 ... 22v3.1 None 40.705919 -74.010766 None 0.0 \n",
"516 1000 ... 22v3.1 None 40.705686 -74.010287 None 0.0 \n",
"\n",
" Shape_Area geometry \\\n",
"448 2.052775e+06 MULTIPOLYGON (((980584.841 200985.007, 980594.... \n",
"483 2.052775e+06 MULTIPOLYGON (((980584.841 200985.007, 980594.... \n",
"324 2.052775e+06 MULTIPOLYGON (((980584.841 200985.007, 980594.... \n",
"518 2.585314e+04 MULTIPOLYGON (((981284.442 196374.824, 981236.... \n",
"516 1.625568e+04 MULTIPOLYGON (((981492.934 196409.111, 981478.... \n",
"\n",
" point snap_dist \n",
"448 POINT (979355.000 197234.014) 0.000000 \n",
"483 POINT (979355.000 197234.014) 0.000000 \n",
"324 POINT (979759.000 199686.014) 0.000000 \n",
"518 POINT (981399.000 196469.014) 11.267715 \n",
"516 POINT (981399.000 196469.014) 11.310903 \n",
"\n",
"[5 rows x 99 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Discard any lines that are greater than tolerance from points\n",
"tmp = tmp.loc[tmp.snap_dist <= offset]\n",
"\n",
"# Sort on ascending snap distance, so that closest goes to top\n",
"tmp = tmp.sort_values(by=[\"snap_dist\"])\n",
"\n",
"tmp.head()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "0e02b9ae",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" line_i \n",
" Borough \n",
" Block \n",
" Lot \n",
" CD \n",
" BCT2020 \n",
" BCTCB2020 \n",
" CT2010 \n",
" CB2010 \n",
" SchoolDist \n",
" ... \n",
" Version \n",
" DCPEdited \n",
" Latitude \n",
" Longitude \n",
" Notes \n",
" Shape_Leng \n",
" Shape_Area \n",
" geometry \n",
" point \n",
" snap_dist \n",
" \n",
" \n",
" pt_idx \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" 459 \n",
" 138.0 \n",
" MN \n",
" 90 \n",
" 1 \n",
" 101 \n",
" 1001501 \n",
" 10015011009 \n",
" 15.01 \n",
" 1004 \n",
" 02 \n",
" ... \n",
" 22v3.1 \n",
" None \n",
" 40.711176 \n",
" -74.008123 \n",
" None \n",
" 0.0 \n",
" 6523.195602 \n",
" MULTIPOLYGON (((982041.663 198346.135, 982046.... \n",
" POINT (982027.000 198304.014) \n",
" 13.819315 \n",
" \n",
" \n",
" 1096 \n",
" 353.0 \n",
" MN \n",
" 143 \n",
" 7503 \n",
" 101 \n",
" 1003900 \n",
" 10039003007 \n",
" 39 \n",
" 4007 \n",
" 02 \n",
" ... \n",
" 22v3.1 \n",
" t \n",
" 40.717834 \n",
" -74.009967 \n",
" None \n",
" 0.0 \n",
" 5299.637906 \n",
" MULTIPOLYGON (((981511.400 200756.768, 981461.... \n",
" POINT (981500.000 200877.014) \n",
" 26.688052 \n",
" \n",
" \n",
" 1859 \n",
" 356.0 \n",
" MN \n",
" 144 \n",
" 31 \n",
" 101 \n",
" 1003300 \n",
" 10033002018 \n",
" 33 \n",
" 3022 \n",
" 02 \n",
" ... \n",
" 22v3.1 \n",
" t \n",
" 40.716852 \n",
" -74.008459 \n",
" None \n",
" 0.0 \n",
" 1353.898306 \n",
" MULTIPOLYGON (((981934.351 200443.725, 981920.... \n",
" POINT (981942.000 200380.014) \n",
" 46.337050 \n",
" \n",
" \n",
" 2563 \n",
" 386.0 \n",
" MN \n",
" 151 \n",
" 1 \n",
" 101 \n",
" 1003300 \n",
" 10033003004 \n",
" 33 \n",
" 1010 \n",
" 02 \n",
" ... \n",
" 22v3.1 \n",
" t \n",
" 40.715820 \n",
" -74.005977 \n",
" None \n",
" 0.0 \n",
" 26217.794000 \n",
" MULTIPOLYGON (((982672.512 200047.743, 982690.... \n",
" POINT (982569.000 199967.014) \n",
" 26.450837 \n",
" \n",
" \n",
" 4135 \n",
" 212.0 \n",
" MN \n",
" 38 \n",
" 17 \n",
" 101 \n",
" 1000700 \n",
" 10007007002 \n",
" 7 \n",
" 1012 \n",
" 02 \n",
" ... \n",
" 22v3.1 \n",
" None \n",
" 40.705661 \n",
" -74.006168 \n",
" None \n",
" 0.0 \n",
" 28946.530441 \n",
" MULTIPOLYGON (((982494.655 196247.048, 982403.... \n",
" POINT (982649.000 196479.014) \n",
" 31.676819 \n",
" \n",
" \n",
"
\n",
"
5 rows × 98 columns
\n",
"
"
],
"text/plain": [
" line_i Borough Block Lot CD BCT2020 BCTCB2020 CT2010 CB2010 \\\n",
"pt_idx \n",
"459 138.0 MN 90 1 101 1001501 10015011009 15.01 1004 \n",
"1096 353.0 MN 143 7503 101 1003900 10039003007 39 4007 \n",
"1859 356.0 MN 144 31 101 1003300 10033002018 33 3022 \n",
"2563 386.0 MN 151 1 101 1003300 10033003004 33 1010 \n",
"4135 212.0 MN 38 17 101 1000700 10007007002 7 1012 \n",
"\n",
" SchoolDist ... Version DCPEdited Latitude Longitude Notes \\\n",
"pt_idx ... \n",
"459 02 ... 22v3.1 None 40.711176 -74.008123 None \n",
"1096 02 ... 22v3.1 t 40.717834 -74.009967 None \n",
"1859 02 ... 22v3.1 t 40.716852 -74.008459 None \n",
"2563 02 ... 22v3.1 t 40.715820 -74.005977 None \n",
"4135 02 ... 22v3.1 None 40.705661 -74.006168 None \n",
"\n",
" Shape_Leng Shape_Area \\\n",
"pt_idx \n",
"459 0.0 6523.195602 \n",
"1096 0.0 5299.637906 \n",
"1859 0.0 1353.898306 \n",
"2563 0.0 26217.794000 \n",
"4135 0.0 28946.530441 \n",
"\n",
" geometry \\\n",
"pt_idx \n",
"459 MULTIPOLYGON (((982041.663 198346.135, 982046.... \n",
"1096 MULTIPOLYGON (((981511.400 200756.768, 981461.... \n",
"1859 MULTIPOLYGON (((981934.351 200443.725, 981920.... \n",
"2563 MULTIPOLYGON (((982672.512 200047.743, 982690.... \n",
"4135 MULTIPOLYGON (((982494.655 196247.048, 982403.... \n",
"\n",
" point snap_dist \n",
"pt_idx \n",
"459 POINT (982027.000 198304.014) 13.819315 \n",
"1096 POINT (981500.000 200877.014) 26.688052 \n",
"1859 POINT (981942.000 200380.014) 46.337050 \n",
"2563 POINT (982569.000 199967.014) 26.450837 \n",
"4135 POINT (982649.000 196479.014) 31.676819 \n",
"\n",
"[5 rows x 98 columns]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# group by the index of the points and take the first, which is the\n",
"# closest line \n",
"closest = tmp.groupby(\"pt_idx\").first()\n",
"\n",
"# construct a GeoDataFrame of the closest lines\n",
"closest = gpd.GeoDataFrame(closest, geometry=\"geometry\")\n",
"\n",
"closest.head()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "e4d24365",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" unique_key \n",
" created_date \n",
" agency \n",
" agency_name \n",
" complaint_type \n",
" descriptor \n",
" incident_zip \n",
" incident_address \n",
" street_name \n",
" cross_street_1 \n",
" ... \n",
" PFIRM15_FLAG \n",
" Version \n",
" DCPEdited \n",
" Latitude \n",
" Longitude \n",
" Notes \n",
" Shape_Leng \n",
" Shape_Area \n",
" point \n",
" snap_dist \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 48542220 \n",
" 2020-12-31T15:41:00.000 \n",
" DEP \n",
" Department of Environmental Protection \n",
" Sewer \n",
" Street Flooding (SJ) \n",
" 11420.0 \n",
" 117-17 135 STREET \n",
" 135 STREET \n",
" FOCH BLVD \n",
" ... \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" None \n",
" NaN \n",
" \n",
" \n",
" 1 \n",
" 48536430 \n",
" 2020-12-31T14:49:00.000 \n",
" DEP \n",
" Department of Environmental Protection \n",
" Sewer \n",
" Street Flooding (SJ) \n",
" 11357.0 \n",
" 20-24 150 STREET \n",
" 150 STREET \n",
" 20 AVE \n",
" ... \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" None \n",
" NaN \n",
" \n",
" \n",
" 2 \n",
" 48539361 \n",
" 2020-12-31T14:03:00.000 \n",
" DEP \n",
" Department of Environmental Protection \n",
" Sewer \n",
" Street Flooding (SJ) \n",
" 11228.0 \n",
" 7223 8 AVENUE \n",
" 8 AVENUE \n",
" 72 ST \n",
" ... \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" None \n",
" NaN \n",
" \n",
" \n",
" 3 \n",
" 48543132 \n",
" 2020-12-31T13:48:00.000 \n",
" DEP \n",
" Department of Environmental Protection \n",
" Sewer \n",
" Street Flooding (SJ) \n",
" 10032.0 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" ... \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" None \n",
" NaN \n",
" \n",
" \n",
" 4 \n",
" 48536441 \n",
" 2020-12-31T13:10:00.000 \n",
" DEP \n",
" Department of Environmental Protection \n",
" Sewer \n",
" Street Flooding (SJ) \n",
" 11234.0 \n",
" 3123 FILLMORE AVENUE \n",
" FILLMORE AVENUE \n",
" E 31 ST \n",
" ... \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" None \n",
" NaN \n",
" \n",
" \n",
"
\n",
"
5 rows × 132 columns
\n",
"
"
],
"text/plain": [
" unique_key created_date agency \\\n",
"0 48542220 2020-12-31T15:41:00.000 DEP \n",
"1 48536430 2020-12-31T14:49:00.000 DEP \n",
"2 48539361 2020-12-31T14:03:00.000 DEP \n",
"3 48543132 2020-12-31T13:48:00.000 DEP \n",
"4 48536441 2020-12-31T13:10:00.000 DEP \n",
"\n",
" agency_name complaint_type \\\n",
"0 Department of Environmental Protection Sewer \n",
"1 Department of Environmental Protection Sewer \n",
"2 Department of Environmental Protection Sewer \n",
"3 Department of Environmental Protection Sewer \n",
"4 Department of Environmental Protection Sewer \n",
"\n",
" descriptor incident_zip incident_address street_name \\\n",
"0 Street Flooding (SJ) 11420.0 117-17 135 STREET 135 STREET \n",
"1 Street Flooding (SJ) 11357.0 20-24 150 STREET 150 STREET \n",
"2 Street Flooding (SJ) 11228.0 7223 8 AVENUE 8 AVENUE \n",
"3 Street Flooding (SJ) 10032.0 NaN NaN \n",
"4 Street Flooding (SJ) 11234.0 3123 FILLMORE AVENUE FILLMORE AVENUE \n",
"\n",
" cross_street_1 ... PFIRM15_FLAG Version DCPEdited Latitude Longitude \\\n",
"0 FOCH BLVD ... NaN NaN NaN NaN NaN \n",
"1 20 AVE ... NaN NaN NaN NaN NaN \n",
"2 72 ST ... NaN NaN NaN NaN NaN \n",
"3 NaN ... NaN NaN NaN NaN NaN \n",
"4 E 31 ST ... NaN NaN NaN NaN NaN \n",
"\n",
" Notes Shape_Leng Shape_Area point snap_dist \n",
"0 NaN NaN NaN None NaN \n",
"1 NaN NaN NaN None NaN \n",
"2 NaN NaN NaN None NaN \n",
"3 NaN NaN NaN None NaN \n",
"4 NaN NaN NaN None NaN \n",
"\n",
"[5 rows x 132 columns]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Join back to the original points:\n",
"updated_points = gdf.join(closest.drop(columns=['geometry']))\n",
"\n",
"updated_points.head()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "b0ef4791",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" unique_key \n",
" incident_zip \n",
" bbl \n",
" x_coordinate_state_plane \n",
" y_coordinate_state_plane \n",
" latitude \n",
" longitude \n",
" location_type \n",
" landmark \n",
" facility_type \n",
" ... \n",
" BBL \n",
" CondoNo \n",
" XCoord \n",
" YCoord \n",
" APPBBL \n",
" Latitude \n",
" Longitude \n",
" Shape_Leng \n",
" Shape_Area \n",
" snap_dist \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 2.695900e+04 \n",
" 26959.000000 \n",
" 1.615900e+04 \n",
" 2.695900e+04 \n",
" 26959.000000 \n",
" 26959.000000 \n",
" 26959.000000 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" ... \n",
" 8.600000e+01 \n",
" 45.000000 \n",
" 86.000000 \n",
" 86.000000 \n",
" 6.100000e+01 \n",
" 86.000000 \n",
" 86.000000 \n",
" 86.0 \n",
" 8.600000e+01 \n",
" 86.000000 \n",
" \n",
" \n",
" mean \n",
" 3.254573e+07 \n",
" 10969.384436 \n",
" 3.699429e+09 \n",
" 1.005498e+06 \n",
" 186184.607441 \n",
" 40.677615 \n",
" -73.923323 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" ... \n",
" 1.000691e+09 \n",
" 1692.355556 \n",
" 981860.232558 \n",
" 197816.534884 \n",
" 1.000704e+09 \n",
" 40.709637 \n",
" -74.008620 \n",
" 0.0 \n",
" 1.464337e+05 \n",
" 55.102735 \n",
" \n",
" \n",
" std \n",
" 9.167418e+06 \n",
" 536.377470 \n",
" 1.075864e+09 \n",
" 3.505257e+04 \n",
" 30576.150750 \n",
" 0.083924 \n",
" 0.126329 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" ... \n",
" 4.924506e+05 \n",
" 891.678528 \n",
" 1349.550990 \n",
" 1455.157179 \n",
" 4.997937e+05 \n",
" 0.003994 \n",
" 0.004868 \n",
" 0.0 \n",
" 4.086507e+05 \n",
" 41.886663 \n",
" \n",
" \n",
" min \n",
" 1.563993e+07 \n",
" 10001.000000 \n",
" 0.000000e+00 \n",
" 9.133570e+05 \n",
" 121032.000000 \n",
" 40.498628 \n",
" -74.254937 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" ... \n",
" 1.000078e+09 \n",
" 65.000000 \n",
" 979652.000000 \n",
" 195554.000000 \n",
" 1.000070e+09 \n",
" 40.703427 \n",
" -74.016586 \n",
" 0.0 \n",
" 6.592921e+02 \n",
" 0.000000 \n",
" \n",
" \n",
" 25% \n",
" 2.455603e+07 \n",
" 10312.000000 \n",
" 3.060255e+09 \n",
" 9.868870e+05 \n",
" 161248.000000 \n",
" 40.609123 \n",
" -73.990504 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" ... \n",
" 1.000210e+09 \n",
" 960.000000 \n",
" 980937.250000 \n",
" 196635.250000 \n",
" 1.000250e+09 \n",
" 40.706394 \n",
" -74.011948 \n",
" 0.0 \n",
" 6.331987e+03 \n",
" 28.184895 \n",
" \n",
" \n",
" 50% \n",
" 3.291181e+07 \n",
" 11221.000000 \n",
" 4.067910e+09 \n",
" 1.007480e+06 \n",
" 183618.000000 \n",
" 40.670610 \n",
" -73.916267 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" ... \n",
" 1.000610e+09 \n",
" 1704.000000 \n",
" 981720.000000 \n",
" 197685.000000 \n",
" 1.000710e+09 \n",
" 40.709276 \n",
" -74.009125 \n",
" 0.0 \n",
" 1.725629e+04 \n",
" 38.098773 \n",
" \n",
" \n",
" 75% \n",
" 4.043790e+07 \n",
" 11385.000000 \n",
" 4.156250e+09 \n",
" 1.033980e+06 \n",
" 206488.500000 \n",
" 40.733373 \n",
" -73.820554 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" ... \n",
" 1.001055e+09 \n",
" 2442.000000 \n",
" 982535.000000 \n",
" 198845.750000 \n",
" 1.000970e+09 \n",
" 40.712461 \n",
" -74.006186 \n",
" 0.0 \n",
" 4.467984e+04 \n",
" 75.728271 \n",
" \n",
" \n",
" max \n",
" 4.854313e+07 \n",
" 11697.000000 \n",
" 5.080500e+09 \n",
" 1.067279e+06 \n",
" 271876.000000 \n",
" 40.912869 \n",
" -73.700384 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" ... \n",
" 1.001620e+09 \n",
" 3035.000000 \n",
" 984839.000000 \n",
" 200803.000000 \n",
" 1.001621e+09 \n",
" 40.717834 \n",
" -73.997875 \n",
" 0.0 \n",
" 2.052775e+06 \n",
" 165.787876 \n",
" \n",
" \n",
"
\n",
"
8 rows × 59 columns
\n",
"
"
],
"text/plain": [
" unique_key incident_zip bbl x_coordinate_state_plane \\\n",
"count 2.695900e+04 26959.000000 1.615900e+04 2.695900e+04 \n",
"mean 3.254573e+07 10969.384436 3.699429e+09 1.005498e+06 \n",
"std 9.167418e+06 536.377470 1.075864e+09 3.505257e+04 \n",
"min 1.563993e+07 10001.000000 0.000000e+00 9.133570e+05 \n",
"25% 2.455603e+07 10312.000000 3.060255e+09 9.868870e+05 \n",
"50% 3.291181e+07 11221.000000 4.067910e+09 1.007480e+06 \n",
"75% 4.043790e+07 11385.000000 4.156250e+09 1.033980e+06 \n",
"max 4.854313e+07 11697.000000 5.080500e+09 1.067279e+06 \n",
"\n",
" y_coordinate_state_plane latitude longitude location_type \\\n",
"count 26959.000000 26959.000000 26959.000000 0.0 \n",
"mean 186184.607441 40.677615 -73.923323 NaN \n",
"std 30576.150750 0.083924 0.126329 NaN \n",
"min 121032.000000 40.498628 -74.254937 NaN \n",
"25% 161248.000000 40.609123 -73.990504 NaN \n",
"50% 183618.000000 40.670610 -73.916267 NaN \n",
"75% 206488.500000 40.733373 -73.820554 NaN \n",
"max 271876.000000 40.912869 -73.700384 NaN \n",
"\n",
" landmark facility_type ... BBL CondoNo XCoord \\\n",
"count 0.0 0.0 ... 8.600000e+01 45.000000 86.000000 \n",
"mean NaN NaN ... 1.000691e+09 1692.355556 981860.232558 \n",
"std NaN NaN ... 4.924506e+05 891.678528 1349.550990 \n",
"min NaN NaN ... 1.000078e+09 65.000000 979652.000000 \n",
"25% NaN NaN ... 1.000210e+09 960.000000 980937.250000 \n",
"50% NaN NaN ... 1.000610e+09 1704.000000 981720.000000 \n",
"75% NaN NaN ... 1.001055e+09 2442.000000 982535.000000 \n",
"max NaN NaN ... 1.001620e+09 3035.000000 984839.000000 \n",
"\n",
" YCoord APPBBL Latitude Longitude Shape_Leng \\\n",
"count 86.000000 6.100000e+01 86.000000 86.000000 86.0 \n",
"mean 197816.534884 1.000704e+09 40.709637 -74.008620 0.0 \n",
"std 1455.157179 4.997937e+05 0.003994 0.004868 0.0 \n",
"min 195554.000000 1.000070e+09 40.703427 -74.016586 0.0 \n",
"25% 196635.250000 1.000250e+09 40.706394 -74.011948 0.0 \n",
"50% 197685.000000 1.000710e+09 40.709276 -74.009125 0.0 \n",
"75% 198845.750000 1.000970e+09 40.712461 -74.006186 0.0 \n",
"max 200803.000000 1.001621e+09 40.717834 -73.997875 0.0 \n",
"\n",
" Shape_Area snap_dist \n",
"count 8.600000e+01 86.000000 \n",
"mean 1.464337e+05 55.102735 \n",
"std 4.086507e+05 41.886663 \n",
"min 6.592921e+02 0.000000 \n",
"25% 6.331987e+03 28.184895 \n",
"50% 1.725629e+04 38.098773 \n",
"75% 4.467984e+04 75.728271 \n",
"max 2.052775e+06 165.787876 \n",
"\n",
"[8 rows x 59 columns]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"updated_points.describe()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "de00c266",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"updated_points['unique_key'].is_unique"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "371499a7",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.11.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}