I am trying to create a .csv file of parsed information of geocoded data from the google API geocoding service. I want to parse out the address information to be in separate columns. My script runs fine till location data where I get Type error. Can anyone help me and modify my script so that I can include this data into my table?
import pandas as pd import requests import geocoderimport time import json df = pd.read_csv('/Users/albertgonzalobautista/Desktop/workingbook.csv') # define CSV to be read to be geocdoed # create new columns for the output CSV df['geocode_data'] = '' df['address']='' df['street_number']='' df['street_name']='' df['postalcode']='' df['city']='' df['st_pr_mn']='' df['country']='' df['location_lat']='' df['location_lon']='' # Create function that handles the geocoding requests average = 0 def reverseGeocode(latlng): #defines reverse geocoding function #Set parameters start = time.time() result = {} #create empty list url = 'https://maps.googleapis.com/maps/api/geocode/json?latlng={0}&key={1}' #Access URL for Google Geocoder API apikey = 'XXX' # Set you API Key taken from Google API website and your Google Developers Account request = url.format(latlng, apikey) #delays responses so that it does not over data = json.loads(requests.get(request).text) if len(data['results']) > 0: result = data['results'][0] #global average #if not work delete first char(uncomment) average = time.time() - start return result for i, row in df.iterrows(): if average < 0.3 : time.sleep(0.3 - average) #0.3 is period time (min= 0.2 max = free) df['geocode_data'] = reverseGeocode(df['lat'].astype(str) + ',' + df['lon'].astype(str)) for i, row in df.iterrows(): if 'address_components' in row['geocode_data']: for component in row['geocode_data']['address_components']: df['address'] = row['geocode_data']['formatted_address'] for component in row['geocode_data']['address_components']: if 'street_number' in component['types']: df['street_number'] = component['long_name'] for component in row['geocode_data']['address_components']: if 'route' in component ['types']: df['street_name'] = component['long_name'] break for component in row['geocode_data']['address_components']: if 'route' in component ['types']: df['street_name'] = component['long_name'] for component in row['geocode_data']['address_components']: if 'postal_code' in component ['types']: df['postalcode'] = component['short_name'] break for component in row['geocode_data']['address_components']: if 'locality' in component ['types']: df['city']= component['short_name'] break for component in row['geocode_data']['address_components']: if 'administrative_area_level_1' in component ['types']: df['st_pr_mn'] = component ['long_name'] break for component in row['geocode_data']['address_components']: if 'country' in component ['types']: df['country'] = component ['long_name'] break for component in row['geocode_data']['geometry']: if component['location']: df['location_lng'] = int(component['location']['lng']) df['location_lat'] = int(component['location']['lat']) df.to_csv('test10.csv', encoding='utf-8', index=False)#sample data that I am trying to parse{'geometry': {'viewport': {'southwest': {'lng': 4.947849719708499, 'lat': 52.36571761970851}, 'northeast': {'lng': 4.950547680291502, 'lat': 52.3684155802915}}, 'location': {'lng': 4.9491987, 'lat': 52.3670666}, 'location_type': 'ROOFTOP'}, 'address_components': [{'long_name': '114', 'types': ['street_number'], 'short_name': '114'}, {'long_name': 'Zeeburgerpad', 'types': ['route'], 'short_name': 'Zeeburgerpad'}, {'long_name': 'Amsterdam-Oost', 'types': ['sublocality_level_1', 'sublocality', 'political'], 'short_name': 'Amsterdam-Oost'}, {'long_name': 'Amsterdam', 'types': ['locality', 'political'], 'short_name': 'Amsterdam'}, {'long_name': 'Amsterdam', 'types': ['administrative_area_level_2', 'political'], 'short_name': 'Amsterdam'}, {'long_name': 'Noord-Holland', 'types': ['administrative_area_level_1', 'political'], 'short_name': 'NH'}, {'long_name': 'Netherlands', 'types': ['country', 'political'], 'short_name': 'NL'}, {'long_name': '1019 AE', 'types': ['postal_code'], 'short_name': '1019 AE'}], 'place_id': 'ChIJD14pyz8JxkcRF1Kpg8opql4', 'formatted_address': 'Zeeburgerpad 114, 1019 AE Amsterdam, Netherlands', 'types': ['street_address']}
أكثر...
import pandas as pd import requests import geocoderimport time import json df = pd.read_csv('/Users/albertgonzalobautista/Desktop/workingbook.csv') # define CSV to be read to be geocdoed # create new columns for the output CSV df['geocode_data'] = '' df['address']='' df['street_number']='' df['street_name']='' df['postalcode']='' df['city']='' df['st_pr_mn']='' df['country']='' df['location_lat']='' df['location_lon']='' # Create function that handles the geocoding requests average = 0 def reverseGeocode(latlng): #defines reverse geocoding function #Set parameters start = time.time() result = {} #create empty list url = 'https://maps.googleapis.com/maps/api/geocode/json?latlng={0}&key={1}' #Access URL for Google Geocoder API apikey = 'XXX' # Set you API Key taken from Google API website and your Google Developers Account request = url.format(latlng, apikey) #delays responses so that it does not over data = json.loads(requests.get(request).text) if len(data['results']) > 0: result = data['results'][0] #global average #if not work delete first char(uncomment) average = time.time() - start return result for i, row in df.iterrows(): if average < 0.3 : time.sleep(0.3 - average) #0.3 is period time (min= 0.2 max = free) df['geocode_data'] = reverseGeocode(df['lat'].astype(str) + ',' + df['lon'].astype(str)) for i, row in df.iterrows(): if 'address_components' in row['geocode_data']: for component in row['geocode_data']['address_components']: df['address'] = row['geocode_data']['formatted_address'] for component in row['geocode_data']['address_components']: if 'street_number' in component['types']: df['street_number'] = component['long_name'] for component in row['geocode_data']['address_components']: if 'route' in component ['types']: df['street_name'] = component['long_name'] break for component in row['geocode_data']['address_components']: if 'route' in component ['types']: df['street_name'] = component['long_name'] for component in row['geocode_data']['address_components']: if 'postal_code' in component ['types']: df['postalcode'] = component['short_name'] break for component in row['geocode_data']['address_components']: if 'locality' in component ['types']: df['city']= component['short_name'] break for component in row['geocode_data']['address_components']: if 'administrative_area_level_1' in component ['types']: df['st_pr_mn'] = component ['long_name'] break for component in row['geocode_data']['address_components']: if 'country' in component ['types']: df['country'] = component ['long_name'] break for component in row['geocode_data']['geometry']: if component['location']: df['location_lng'] = int(component['location']['lng']) df['location_lat'] = int(component['location']['lat']) df.to_csv('test10.csv', encoding='utf-8', index=False)#sample data that I am trying to parse{'geometry': {'viewport': {'southwest': {'lng': 4.947849719708499, 'lat': 52.36571761970851}, 'northeast': {'lng': 4.950547680291502, 'lat': 52.3684155802915}}, 'location': {'lng': 4.9491987, 'lat': 52.3670666}, 'location_type': 'ROOFTOP'}, 'address_components': [{'long_name': '114', 'types': ['street_number'], 'short_name': '114'}, {'long_name': 'Zeeburgerpad', 'types': ['route'], 'short_name': 'Zeeburgerpad'}, {'long_name': 'Amsterdam-Oost', 'types': ['sublocality_level_1', 'sublocality', 'political'], 'short_name': 'Amsterdam-Oost'}, {'long_name': 'Amsterdam', 'types': ['locality', 'political'], 'short_name': 'Amsterdam'}, {'long_name': 'Amsterdam', 'types': ['administrative_area_level_2', 'political'], 'short_name': 'Amsterdam'}, {'long_name': 'Noord-Holland', 'types': ['administrative_area_level_1', 'political'], 'short_name': 'NH'}, {'long_name': 'Netherlands', 'types': ['country', 'political'], 'short_name': 'NL'}, {'long_name': '1019 AE', 'types': ['postal_code'], 'short_name': '1019 AE'}], 'place_id': 'ChIJD14pyz8JxkcRF1Kpg8opql4', 'formatted_address': 'Zeeburgerpad 114, 1019 AE Amsterdam, Netherlands', 'types': ['street_address']}
أكثر...