Created
May 24, 2023 23:39
-
-
Save zhik/557bbe24007053a1a53a980c1089a4f6 to your computer and use it in GitHub Desktop.
Geocoding NYC Intersections using Geoclient
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 50, | |
"id": "ffa2348c", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import pandas as pd\n", | |
"import requests\n", | |
"import re\n", | |
"from time import sleep\n", | |
"\n", | |
"#https://maps.nyc.gov/geoclient/v1/doc\n", | |
"#get the api here https://api-portal.nyc.gov/api-details#api=geoclient&operation=geoclient\n", | |
"API_KEY = ''\n", | |
"\n", | |
"def geocode_intersection(boro1, street1, street2, compass = None):\n", | |
" headers = {\n", | |
" 'Ocp-Apim-Subscription-Key': API_KEY\n", | |
" }\n", | |
" url = f'https://api.nyc.gov/geo/geoclient/v1/intersection.json?crossStreetOne={street1}&crossStreetTwo={street2}&borough={boro1}'\n", | |
" \n", | |
" \n", | |
" r = requests.get(url, headers = headers)\n", | |
" sleep(0.01)\n", | |
" return r.json()\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"id": "697d9128", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Borough</th>\n", | |
" <th>Closest Intersection</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>52</th>\n", | |
" <td>Staten Island</td>\n", | |
" <td>CLOVE RD AT CASTLETON AV</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>38</th>\n", | |
" <td>Manhattan</td>\n", | |
" <td>MANHATTAN BR AT BOWERY/CANAL ST</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>86</th>\n", | |
" <td>Staten Island</td>\n", | |
" <td>HYLAN BOULEVARD AT RICHARD AVENUE</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>42</th>\n", | |
" <td>Bronx</td>\n", | |
" <td>E 215 ST 163 FT W BARNES AV</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>15</th>\n", | |
" <td>Manhattan</td>\n", | |
" <td>7 AV 60 FT S 150 ST</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>54</th>\n", | |
" <td>Brooklyn</td>\n", | |
" <td>OCEAN AV 90 FT N AVENUE L</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>70</th>\n", | |
" <td>Queens</td>\n", | |
" <td>COLLEGE POINT BL 115 FT N 18 AV</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>97</th>\n", | |
" <td>Queens</td>\n", | |
" <td>N Conduit Ave and 160th St</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Borough Closest Intersection\n", | |
"52 Staten Island CLOVE RD AT CASTLETON AV\n", | |
"38 Manhattan MANHATTAN BR AT BOWERY/CANAL ST\n", | |
"86 Staten Island HYLAN BOULEVARD AT RICHARD AVENUE\n", | |
"42 Bronx E 215 ST 163 FT W BARNES AV\n", | |
"15 Manhattan 7 AV 60 FT S 150 ST\n", | |
"54 Brooklyn OCEAN AV 90 FT N AVENUE L\n", | |
"70 Queens COLLEGE POINT BL 115 FT N 18 AV\n", | |
"97 Queens N Conduit Ave and 160th St" | |
] | |
}, | |
"execution_count": 31, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df = pd.read_csv('./98 intersections.csv')\n", | |
"df.sample(8)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"id": "cd17544c", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Borough</th>\n", | |
" <th>Closest Intersection</th>\n", | |
" <th>Street1</th>\n", | |
" <th>sep</th>\n", | |
" <th>Street2</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>95</th>\n", | |
" <td>Queens</td>\n", | |
" <td>Newtown Rd and 45th St</td>\n", | |
" <td>Newtown Rd</td>\n", | |
" <td>None</td>\n", | |
" <td>45th St</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>39</th>\n", | |
" <td>Brooklyn</td>\n", | |
" <td>LEWIS AV AT JEFFERSON AV</td>\n", | |
" <td>LEWIS AV</td>\n", | |
" <td>None</td>\n", | |
" <td>JEFFERSON AV</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>42</th>\n", | |
" <td>Bronx</td>\n", | |
" <td>E 215 ST 163 FT W BARNES AV</td>\n", | |
" <td>E 215 ST</td>\n", | |
" <td>W</td>\n", | |
" <td>BARNES AV</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>68</th>\n", | |
" <td>Queens</td>\n", | |
" <td>80 AV 50 FT W 265 ST</td>\n", | |
" <td>80 AV</td>\n", | |
" <td>W</td>\n", | |
" <td>265 ST</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>13</th>\n", | |
" <td>Bronx</td>\n", | |
" <td>GRAND CONCOURSE 126 FT N E 170 ST</td>\n", | |
" <td>GRAND CONCOURSE</td>\n", | |
" <td>N</td>\n", | |
" <td>E 170 ST</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Borough Closest Intersection Street1 sep \\\n", | |
"95 Queens Newtown Rd and 45th St Newtown Rd None \n", | |
"39 Brooklyn LEWIS AV AT JEFFERSON AV LEWIS AV None \n", | |
"42 Bronx E 215 ST 163 FT W BARNES AV E 215 ST W \n", | |
"68 Queens 80 AV 50 FT W 265 ST 80 AV W \n", | |
"13 Bronx GRAND CONCOURSE 126 FT N E 170 ST GRAND CONCOURSE N \n", | |
"\n", | |
" Street2 \n", | |
"95 45th St \n", | |
"39 JEFFERSON AV \n", | |
"42 BARNES AV \n", | |
"68 265 ST \n", | |
"13 E 170 ST " | |
] | |
}, | |
"execution_count": 34, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"def getStreets(text):\n", | |
" #try spliting using AT, 'and', and '(0-9) AT (direction)'\n", | |
" streets_list = re.split(r\" and | AT | \\d+ FT (N|S|W|E) \", text)\n", | |
" if len(streets_list) == 3:\n", | |
" return pd.Series(streets_list)\n", | |
" else:\n", | |
" return pd.Series([text, ''])\n", | |
" \n", | |
"df[[\"Street1\",\"sep\",\"Street2\"]] = df[\"Closest Intersection\"].apply(getStreets)\n", | |
"df.sample(5)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 53, | |
"id": "2331d6cd", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<AxesSubplot: xlabel='longitude', ylabel='latitude'>" | |
] | |
}, | |
"execution_count": 53, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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3t4eVVVVmDBhgtbh5+cn6Z6IyLTY00REsqdWq7F48WL813/9F9588004Ozvj2Wefha+vLxYvXiy5nrVr1yIzMxMTJkzALbfcgi1btqCxsbFH71N348aNw5EjR7B06VLY29vD3d0dUVFRuHjxIjZt2oRf//rX+OSTT/D3v/8dLi4u4ucSEhLwhz/8AWq1GkFBQcjKykJTU5N43tnZGevWrcMzzzyDzs5OzJw5ExqNBsePH8fw4cPx6KOP6vWsiMh42NNERIqwc+dOhIaG4p577kF4eDgEQcChQ4d6DMn1Z/369YiJiUFcXBzCw8MxfPhwLFiwAA4ODn1+ZuPGjTh37hzGjx8PDw8PAEBQUBC2bduG119/HbfddhtOnDihtUoPAH77298iLi4Ojz32GMLDw+Hs7CxOQO/y4osv4ve//z0yMzMRFBSEBQsW4H/+538QEBCgw5MhIlNRCfoM6BMRWYDOzk4EBQXhoYcewosvvmju5hCRzHF4joisxvnz55GXl4fZs2ejra0NW7duRWVlJZYtW2buphGRAnB4joisho2NDXbt2oU777wTkZGRKC0txWeffSZ5MjkRWTcOzxERERFJwJ4mIiIiIgkYNBERERFJwKCJiIiISAIGTUREREQSMGgiIiIikoBBExEREZEEDJqIiIiIJGDQRERERCQBgyYiIiIiCf4fRLekAsJrAR4AAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<Figure size 640x480 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"def getLatLng(row):\n", | |
" json = geocode_intersection(row['Borough'], row['Street1'], row['Street2'])\n", | |
" d = json['intersection']\n", | |
" try:\n", | |
" return pd.Series([d['longitude'], d['latitude']])\n", | |
" except:\n", | |
" if row['sep'] and 'STREETS INTERSECT TWICE' in d['message'] and row['sep'] in ('N','S','W','E'): \n", | |
" # this can probably be fixed if we have a compass direction\n", | |
" try: \n", | |
" json = geocode_intersection(row['Borough'], row['Street1'], row['Street2'], row['sep'])\n", | |
" d = json['intersection']\n", | |
" return pd.Series([d['longitude'], d['latitude']])\n", | |
" except:\n", | |
" return pd.Series([None, None])\n", | |
" return pd.Series([None, None])\n", | |
" else:\n", | |
" return pd.Series([None, None])\n", | |
" #print(d['message'], '\\n---\\t' , row['sep'], row['Closest Intersection'])\n", | |
" \n", | |
"df[['longitude','latitude']] = df.apply(getLatLng, axis = 1)\n", | |
"df.plot.scatter(x='longitude', y='latitude')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 56, | |
"id": "8a5b7f2d", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Borough</th>\n", | |
" <th>Closest Intersection</th>\n", | |
" <th>Street1</th>\n", | |
" <th>sep</th>\n", | |
" <th>Street2</th>\n", | |
" <th>longitude</th>\n", | |
" <th>latitude</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Queens</td>\n", | |
" <td>LONG ISLAND EP AT 169 ST</td>\n", | |
" <td>LONG ISLAND EP</td>\n", | |
" <td>None</td>\n", | |
" <td>169 ST</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Brooklyn</td>\n", | |
" <td>AT 289 EMPIRE BL</td>\n", | |
" <td>AT 289 EMPIRE BL</td>\n", | |
" <td></td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>Brooklyn</td>\n", | |
" <td>FLATLANDS AVE 120 T W SCHENECTADY AV</td>\n", | |
" <td>FLATLANDS AVE 120 T W SCHENECTADY AV</td>\n", | |
" <td></td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>18</th>\n", | |
" <td>Queens</td>\n", | |
" <td>210 ST 90 AT N 64 AV</td>\n", | |
" <td>210 ST 90</td>\n", | |
" <td>None</td>\n", | |
" <td>N 64 AV</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>19</th>\n", | |
" <td>Queens</td>\n", | |
" <td>210 ST 90 AT N 64 AV</td>\n", | |
" <td>210 ST 90</td>\n", | |
" <td>None</td>\n", | |
" <td>N 64 AV</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>20</th>\n", | |
" <td>Brooklyn</td>\n", | |
" <td>E 22 ST 158 AT N DITMAS AV</td>\n", | |
" <td>E 22 ST 158</td>\n", | |
" <td>None</td>\n", | |
" <td>N DITMAS AV</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>21</th>\n", | |
" <td>Staten Island</td>\n", | |
" <td>HYLAN BL 270 AT S ARDEN AV</td>\n", | |
" <td>HYLAN BL 270</td>\n", | |
" <td>None</td>\n", | |
" <td>S ARDEN AV</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>32</th>\n", | |
" <td>Manhattan</td>\n", | |
" <td>AT I-95N UPPER EXPY EAST LANE 2</td>\n", | |
" <td>AT I-95N UPPER EXPY EAST LANE 2</td>\n", | |
" <td></td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>34</th>\n", | |
" <td>Queens</td>\n", | |
" <td>GRAND CENTRAL PY AT 188 ST</td>\n", | |
" <td>GRAND CENTRAL PY</td>\n", | |
" <td>None</td>\n", | |
" <td>188 ST</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>38</th>\n", | |
" <td>Manhattan</td>\n", | |
" <td>MANHATTAN BR AT BOWERY/CANAL ST</td>\n", | |
" <td>MANHATTAN BR</td>\n", | |
" <td>None</td>\n", | |
" <td>BOWERY/CANAL ST</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>47</th>\n", | |
" <td>Queens</td>\n", | |
" <td>AT 10-62 GIPSON ST</td>\n", | |
" <td>AT 10-62 GIPSON ST</td>\n", | |
" <td></td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>51</th>\n", | |
" <td>Bronx</td>\n", | |
" <td>MAJOR DEEGAN EP 500 FT N EXIT 7 RAMP (CBX)</td>\n", | |
" <td>MAJOR DEEGAN EP</td>\n", | |
" <td>N</td>\n", | |
" <td>EXIT 7 RAMP (CBX)</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>57</th>\n", | |
" <td>Brooklyn</td>\n", | |
" <td>SETON PL AT FOSTER AV</td>\n", | |
" <td>SETON PL</td>\n", | |
" <td>None</td>\n", | |
" <td>FOSTER AV</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>64</th>\n", | |
" <td>Queens</td>\n", | |
" <td>SEAGIRT AV AT BEACH 19 ST</td>\n", | |
" <td>SEAGIRT AV</td>\n", | |
" <td>None</td>\n", | |
" <td>BEACH 19 ST</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>73</th>\n", | |
" <td>Brooklyn</td>\n", | |
" <td>GATES AV AT VANDEBILT ST</td>\n", | |
" <td>GATES AV</td>\n", | |
" <td>None</td>\n", | |
" <td>VANDEBILT ST</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>74</th>\n", | |
" <td>Bronx</td>\n", | |
" <td>NEW ENGLAND THRUWAY AT GUN HILL RD</td>\n", | |
" <td>NEW ENGLAND THRUWAY</td>\n", | |
" <td>None</td>\n", | |
" <td>GUN HILL RD</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>77</th>\n", | |
" <td>Manhattan</td>\n", | |
" <td>HENRY HUDSON PY AT W 134 ST</td>\n", | |
" <td>HENRY HUDSON PY</td>\n", | |
" <td>None</td>\n", | |
" <td>W 134 ST</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>81</th>\n", | |
" <td>Brooklyn</td>\n", | |
" <td>KINGS HIGHWAY 147 FT W AVENUE K</td>\n", | |
" <td>KINGS HIGHWAY</td>\n", | |
" <td>W</td>\n", | |
" <td>AVENUE K</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>85</th>\n", | |
" <td>Brooklyn</td>\n", | |
" <td>BELT PARKWAY 625 FT W BAY PARKWAY</td>\n", | |
" <td>BELT PARKWAY</td>\n", | |
" <td>W</td>\n", | |
" <td>BAY PARKWAY</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>94</th>\n", | |
" <td>Queens</td>\n", | |
" <td>JFK Expy and 150th St</td>\n", | |
" <td>JFK Expy</td>\n", | |
" <td>None</td>\n", | |
" <td>150th St</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Borough Closest Intersection \\\n", | |
"1 Queens LONG ISLAND EP AT 169 ST \n", | |
"2 Brooklyn AT 289 EMPIRE BL \n", | |
"5 Brooklyn FLATLANDS AVE 120 T W SCHENECTADY AV \n", | |
"18 Queens 210 ST 90 AT N 64 AV \n", | |
"19 Queens 210 ST 90 AT N 64 AV \n", | |
"20 Brooklyn E 22 ST 158 AT N DITMAS AV \n", | |
"21 Staten Island HYLAN BL 270 AT S ARDEN AV \n", | |
"32 Manhattan AT I-95N UPPER EXPY EAST LANE 2 \n", | |
"34 Queens GRAND CENTRAL PY AT 188 ST \n", | |
"38 Manhattan MANHATTAN BR AT BOWERY/CANAL ST \n", | |
"47 Queens AT 10-62 GIPSON ST \n", | |
"51 Bronx MAJOR DEEGAN EP 500 FT N EXIT 7 RAMP (CBX) \n", | |
"57 Brooklyn SETON PL AT FOSTER AV \n", | |
"64 Queens SEAGIRT AV AT BEACH 19 ST \n", | |
"73 Brooklyn GATES AV AT VANDEBILT ST \n", | |
"74 Bronx NEW ENGLAND THRUWAY AT GUN HILL RD \n", | |
"77 Manhattan HENRY HUDSON PY AT W 134 ST \n", | |
"81 Brooklyn KINGS HIGHWAY 147 FT W AVENUE K \n", | |
"85 Brooklyn BELT PARKWAY 625 FT W BAY PARKWAY \n", | |
"94 Queens JFK Expy and 150th St \n", | |
"\n", | |
" Street1 sep Street2 longitude \\\n", | |
"1 LONG ISLAND EP None 169 ST NaN \n", | |
"2 AT 289 EMPIRE BL NaN NaN \n", | |
"5 FLATLANDS AVE 120 T W SCHENECTADY AV NaN NaN \n", | |
"18 210 ST 90 None N 64 AV NaN \n", | |
"19 210 ST 90 None N 64 AV NaN \n", | |
"20 E 22 ST 158 None N DITMAS AV NaN \n", | |
"21 HYLAN BL 270 None S ARDEN AV NaN \n", | |
"32 AT I-95N UPPER EXPY EAST LANE 2 NaN NaN \n", | |
"34 GRAND CENTRAL PY None 188 ST NaN \n", | |
"38 MANHATTAN BR None BOWERY/CANAL ST NaN \n", | |
"47 AT 10-62 GIPSON ST NaN NaN \n", | |
"51 MAJOR DEEGAN EP N EXIT 7 RAMP (CBX) NaN \n", | |
"57 SETON PL None FOSTER AV NaN \n", | |
"64 SEAGIRT AV None BEACH 19 ST NaN \n", | |
"73 GATES AV None VANDEBILT ST NaN \n", | |
"74 NEW ENGLAND THRUWAY None GUN HILL RD NaN \n", | |
"77 HENRY HUDSON PY None W 134 ST NaN \n", | |
"81 KINGS HIGHWAY W AVENUE K NaN \n", | |
"85 BELT PARKWAY W BAY PARKWAY NaN \n", | |
"94 JFK Expy None 150th St NaN \n", | |
"\n", | |
" latitude \n", | |
"1 NaN \n", | |
"2 NaN \n", | |
"5 NaN \n", | |
"18 NaN \n", | |
"19 NaN \n", | |
"20 NaN \n", | |
"21 NaN \n", | |
"32 NaN \n", | |
"34 NaN \n", | |
"38 NaN \n", | |
"47 NaN \n", | |
"51 NaN \n", | |
"57 NaN \n", | |
"64 NaN \n", | |
"73 NaN \n", | |
"74 NaN \n", | |
"77 NaN \n", | |
"81 NaN \n", | |
"85 NaN \n", | |
"94 NaN " | |
] | |
}, | |
"execution_count": 56, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"#manual geocode those who didn't work\n", | |
"df[pd.isna(df['longitude'])]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 57, | |
"id": "f78a3ba5", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df.to_csv('./98 intersections_geocoded.csv', index = False)" | |
] | |
} | |
], | |
"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 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment