{ "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unique_keycreated_dateagencyagency_namecomplaint_typedescriptorincident_zipincident_addressstreet_namecross_street_1...intersection_street_1intersection_street_2closed_dateresolution_descriptionresolution_action_updated_datelocation_typelandmarkfacility_typedue_dategeometry
0485422202020-12-31T15:41:00.000DEPDepartment of Environmental ProtectionSewerStreet Flooding (SJ)11420.0117-17 135 STREET135 STREETFOCH BLVD...NaNNaN2021-01-01T00:20:00.000Please call 311 for further information. If yo...2021-01-01T00:20:00.000NaNNaNNaNNaNPOINT (1038500.000 186000.014)
1485364302020-12-31T14:49:00.000DEPDepartment of Environmental ProtectionSewerStreet Flooding (SJ)11357.020-24 150 STREET150 STREET20 AVE...NaNNaN2021-01-04T10:15:00.000The Department of Environment Protection inspe...2021-01-04T10:15:00.000NaNNaNNaNNaNPOINT (1035682.000 223771.014)
2485393612020-12-31T14:03:00.000DEPDepartment of Environmental ProtectionSewerStreet Flooding (SJ)11228.07223 8 AVENUE8 AVENUE72 ST...NaNNaN2021-01-02T11:25:00.000The Department of Environmental Protection has...2021-01-02T11:25:00.000NaNNaNNaNNaNPOINT (979584.000 168255.014)
3485431322020-12-31T13:48:00.000DEPDepartment of Environmental ProtectionSewerStreet Flooding (SJ)10032.0NaNNaNNaN...RIVERSIDE DRIVEWEST 165 STREET2020-12-31T14:50:00.000Please call 311 for further information. If yo...2020-12-31T14:50:00.000NaNNaNNaNNaNPOINT (999557.000 245700.014)
4485364412020-12-31T13:10:00.000DEPDepartment of Environmental ProtectionSewerStreet Flooding (SJ)11234.03123 FILLMORE AVENUEFILLMORE AVENUEE 31 ST...NaNNaN2021-01-03T10:45:00.000The Department of Environmental Protection ins...2021-01-03T10:45:00.000NaNNaNNaNNaNPOINT (1001868.000 161232.014)
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BoroughBlockLotCDBCT2020BCTCB2020CT2010CB2010SchoolDistCouncil...FIRM07_FLAGPFIRM15_FLAGVersionDCPEditedLatitudeLongitudeNotesShape_LengShape_Areageometry
0MN11010110005001000500000351000021...1122v3.1None40.688766-74.018682None0.07.478663e+06MULTIPOLYGON (((980783.787 191526.763, 980898....
1MN11011011000100None11001021...None122v3.1None40.689920-74.045337None0.05.018973e+05MULTIPOLYGON (((972409.690 190685.560, 972428....
2MN120110110001001000100100011000021...None122v3.1None40.698188-74.041329None0.01.148539e+06MULTIPOLYGON (((973648.661 193712.461, 973648....
3MN2110110009001000900102291025021...1122v3.1t40.700369-74.012911None0.01.008250e+05MULTIPOLYGON (((980639.785 194217.691, 980609....
4MN2210110009001000900102291025021...1122v3.1None40.700550-74.011588None0.08.724425e+04MULTIPOLYGON (((980915.002 194319.141, 980795....
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
minxminymaxxmaxy
01.038300e+06185800.0143931.038700e+06186200.014393
11.035482e+06223571.0144171.035882e+06223971.014417
29.793840e+05168055.0143829.797840e+05168455.014382
39.993570e+05245500.0144319.997570e+05245900.014431
41.001668e+06161032.0143771.002068e+06161432.014377
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pt_idxline_i
0459128.0
1459145.0
2459137.0
3459139.0
4459140.0
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pt_idxline_iBoroughBlockLotCDBCT2020BCTCB2020CT2010CB2010...FIRM07_FLAGPFIRM15_FLAGVersionDCPEditedLatitudeLongitudeNotesShape_LengShape_Areageometry
0459128.0MN792710110015021001502100015.021000...NoneNone22v3.1None40.710322-74.008466None0.05670.917438MULTIPOLYGON (((981955.698 198099.048, 981894....
1459145.0MN922310110015011001501101115.011007...NoneNone22v3.1None40.710594-74.007185None0.01702.936740MULTIPOLYGON (((982289.308 198169.543, 982267....
2459137.0MN89310110015011001501101715.011005...NoneNone22v3.1None40.710635-74.007964None0.05632.008015MULTIPOLYGON (((982020.597 198116.096, 981985....
3459139.0MN902310110015011001501100915.011004...NoneNone22v3.1None40.710956-74.007773None0.01021.570578MULTIPOLYGON (((982110.692 198297.452, 982090....
4459140.0MN902410110015011001501100915.011004...NoneNone22v3.1None40.711005-74.007817None0.01242.680263MULTIPOLYGON (((982106.447 198327.138, 982072....
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pt_idxline_iBoroughBlockLotCDBCT2020BCTCB2020CT2010CB2010...PFIRM15_FLAGVersionDCPEditedLatitudeLongitudeNotesShape_LengShape_Areageometrypoint
0459128.0MN792710110015021001502100015.021000...None22v3.1None40.710322-74.008466None0.05670.917438MULTIPOLYGON (((981955.698 198099.048, 981894....POINT (982027.000 198304.014)
1459145.0MN922310110015011001501101115.011007...None22v3.1None40.710594-74.007185None0.01702.936740MULTIPOLYGON (((982289.308 198169.543, 982267....POINT (982027.000 198304.014)
2459137.0MN89310110015011001501101715.011005...None22v3.1None40.710635-74.007964None0.05632.008015MULTIPOLYGON (((982020.597 198116.096, 981985....POINT (982027.000 198304.014)
3459139.0MN902310110015011001501100915.011004...None22v3.1None40.710956-74.007773None0.01021.570578MULTIPOLYGON (((982110.692 198297.452, 982090....POINT (982027.000 198304.014)
4459140.0MN902410110015011001501100915.011004...None22v3.1None40.711005-74.007817None0.01242.680263MULTIPOLYGON (((982106.447 198327.138, 982072....POINT (982027.000 198304.014)
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pt_idxline_iBoroughBlockLotCDBCT2020BCTCB2020CT2010CB2010...VersionDCPEditedLatitudeLongitudeNotesShape_LengShape_Areageometrypointsnap_dist
0459128.0MN792710110015021001502100015.021000...22v3.1None40.710322-74.008466None0.05670.917438MULTIPOLYGON (((981955.698 198099.048, 981894....POINT (982027.000 198304.014)210.186017
1459145.0MN922310110015011001501101115.011007...22v3.1None40.710594-74.007185None0.01702.936740MULTIPOLYGON (((982289.308 198169.543, 982267....POINT (982027.000 198304.014)244.527951
2459137.0MN89310110015011001501101715.011005...22v3.1None40.710635-74.007964None0.05632.008015MULTIPOLYGON (((982020.597 198116.096, 981985....POINT (982027.000 198304.014)69.911787
3459139.0MN902310110015011001501100915.011004...22v3.1None40.710956-74.007773None0.01021.570578MULTIPOLYGON (((982110.692 198297.452, 982090....POINT (982027.000 198304.014)49.550503
4459140.0MN902410110015011001501100915.011004...22v3.1None40.711005-74.007817None0.01242.680263MULTIPOLYGON (((982106.447 198327.138, 982072....POINT (982027.000 198304.014)30.673000
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pt_idxline_iBoroughBlockLotCDBCT2020BCTCB2020CT2010CB2010...VersionDCPEditedLatitudeLongitudeNotesShape_LengShape_Areageometrypointsnap_dist
44819254340.0MN163101103170410317044000317.044001...22v3.1t40.712618-74.016586None0.02.052775e+06MULTIPOLYGON (((980584.841 200985.007, 980594....POINT (979355.000 197234.014)0.000000
48319475340.0MN163101103170410317044000317.044001...22v3.1t40.712618-74.016586None0.02.052775e+06MULTIPOLYGON (((980584.841 200985.007, 980594....POINT (979355.000 197234.014)0.000000
32415235340.0MN163101103170410317044000317.044001...22v3.1t40.712618-74.016586None0.02.052775e+06MULTIPOLYGON (((980584.841 200985.007, 980594....POINT (979759.000 199686.014)0.000000
51821495455.0MN25750210110009001000900100191000...22v3.1None40.705919-74.010766None0.02.585314e+04MULTIPOLYGON (((981284.442 196374.824, 981236....POINT (981399.000 196469.014)11.267715
5162149547.0MN252710110009001000900100091000...22v3.1None40.705686-74.010287None0.01.625568e+04MULTIPOLYGON (((981492.934 196409.111, 981478....POINT (981399.000 196469.014)11.310903
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
line_iBoroughBlockLotCDBCT2020BCTCB2020CT2010CB2010SchoolDist...VersionDCPEditedLatitudeLongitudeNotesShape_LengShape_Areageometrypointsnap_dist
pt_idx
459138.0MN90110110015011001501100915.01100402...22v3.1None40.711176-74.008123None0.06523.195602MULTIPOLYGON (((982041.663 198346.135, 982046....POINT (982027.000 198304.014)13.819315
1096353.0MN143750310110039001003900300739400702...22v3.1t40.717834-74.009967None0.05299.637906MULTIPOLYGON (((981511.400 200756.768, 981461....POINT (981500.000 200877.014)26.688052
1859356.0MN1443110110033001003300201833302202...22v3.1t40.716852-74.008459None0.01353.898306MULTIPOLYGON (((981934.351 200443.725, 981920....POINT (981942.000 200380.014)46.337050
2563386.0MN151110110033001003300300433101002...22v3.1t40.715820-74.005977None0.026217.794000MULTIPOLYGON (((982672.512 200047.743, 982690....POINT (982569.000 199967.014)26.450837
4135212.0MN38171011000700100070070027101202...22v3.1None40.705661-74.006168None0.028946.530441MULTIPOLYGON (((982494.655 196247.048, 982403....POINT (982649.000 196479.014)31.676819
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unique_keycreated_dateagencyagency_namecomplaint_typedescriptorincident_zipincident_addressstreet_namecross_street_1...PFIRM15_FLAGVersionDCPEditedLatitudeLongitudeNotesShape_LengShape_Areapointsnap_dist
0485422202020-12-31T15:41:00.000DEPDepartment of Environmental ProtectionSewerStreet Flooding (SJ)11420.0117-17 135 STREET135 STREETFOCH BLVD...NaNNaNNaNNaNNaNNaNNaNNaNNoneNaN
1485364302020-12-31T14:49:00.000DEPDepartment of Environmental ProtectionSewerStreet Flooding (SJ)11357.020-24 150 STREET150 STREET20 AVE...NaNNaNNaNNaNNaNNaNNaNNaNNoneNaN
2485393612020-12-31T14:03:00.000DEPDepartment of Environmental ProtectionSewerStreet Flooding (SJ)11228.07223 8 AVENUE8 AVENUE72 ST...NaNNaNNaNNaNNaNNaNNaNNaNNoneNaN
3485431322020-12-31T13:48:00.000DEPDepartment of Environmental ProtectionSewerStreet Flooding (SJ)10032.0NaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNoneNaN
4485364412020-12-31T13:10:00.000DEPDepartment of Environmental ProtectionSewerStreet Flooding (SJ)11234.03123 FILLMORE AVENUEFILLMORE AVENUEE 31 ST...NaNNaNNaNNaNNaNNaNNaNNaNNoneNaN
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unique_keyincident_zipbblx_coordinate_state_planey_coordinate_state_planelatitudelongitudelocation_typelandmarkfacility_type...BBLCondoNoXCoordYCoordAPPBBLLatitudeLongitudeShape_LengShape_Areasnap_dist
count2.695900e+0426959.0000001.615900e+042.695900e+0426959.00000026959.00000026959.0000000.00.00.0...8.600000e+0145.00000086.00000086.0000006.100000e+0186.00000086.00000086.08.600000e+0186.000000
mean3.254573e+0710969.3844363.699429e+091.005498e+06186184.60744140.677615-73.923323NaNNaNNaN...1.000691e+091692.355556981860.232558197816.5348841.000704e+0940.709637-74.0086200.01.464337e+0555.102735
std9.167418e+06536.3774701.075864e+093.505257e+0430576.1507500.0839240.126329NaNNaNNaN...4.924506e+05891.6785281349.5509901455.1571794.997937e+050.0039940.0048680.04.086507e+0541.886663
min1.563993e+0710001.0000000.000000e+009.133570e+05121032.00000040.498628-74.254937NaNNaNNaN...1.000078e+0965.000000979652.000000195554.0000001.000070e+0940.703427-74.0165860.06.592921e+020.000000
25%2.455603e+0710312.0000003.060255e+099.868870e+05161248.00000040.609123-73.990504NaNNaNNaN...1.000210e+09960.000000980937.250000196635.2500001.000250e+0940.706394-74.0119480.06.331987e+0328.184895
50%3.291181e+0711221.0000004.067910e+091.007480e+06183618.00000040.670610-73.916267NaNNaNNaN...1.000610e+091704.000000981720.000000197685.0000001.000710e+0940.709276-74.0091250.01.725629e+0438.098773
75%4.043790e+0711385.0000004.156250e+091.033980e+06206488.50000040.733373-73.820554NaNNaNNaN...1.001055e+092442.000000982535.000000198845.7500001.000970e+0940.712461-74.0061860.04.467984e+0475.728271
max4.854313e+0711697.0000005.080500e+091.067279e+06271876.00000040.912869-73.700384NaNNaNNaN...1.001620e+093035.000000984839.000000200803.0000001.001621e+0940.717834-73.9978750.02.052775e+06165.787876
\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 }