Skip to content

Instantly share code, notes, and snippets.

@lucyb
Created November 8, 2018 21:10
Show Gist options
  • Save lucyb/d18d7cd13cf247cc94b24a0e484cfb35 to your computer and use it in GitHub Desktop.
Save lucyb/d18d7cd13cf247cc94b24a0e484cfb35 to your computer and use it in GitHub Desktop.
Retrieve postcodes for a list of longitudes and latitudes
import csv
import json
import requests
import pandas as pd
from pandas.io.json import json_normalize
url = "https://api.postcodes.io/postcodes"
api_limit = 99
def _construct_csv(result):
output_csv = []
for row in result["result"]:
print(row)
output = {}
output["longitude"] = row["query"]["longitude"]
output["latitude"] = row["query"]["latitude"]
if (row["result"]):
output["postcode"] = row["result"][0]["postcode"]
output["region"] = row["result"][0]["region"]
output["parish"] = row["result"][0]["parish"]
output_csv.append(output)
return output_csv
def _construct_json(input_csv):
geocodes = []
# Limit to 100, as this is the max for postcodes.io
for _, row in input_csv.iterrows():
g = {}
g["longitude"] = row['long']
g["latitude"] = row['lat']
geocodes.append(g)
request_json = {}
request_json["geolocations"] = geocodes
return request_json
def _api_request(request_json):
response = requests.post(url, json=request_json)
result = json.loads(response.content)
return result
df = pd.read_csv("geocodes.csv", header=None, names=['id', 'long', 'lat'])
df.dropna(inplace=True)
total_rows = df.shape[0]
iterations = total_rows/api_limit
result_list = []
for i in range(0, round(iterations)):
start = i * api_limit
stop = start + api_limit
df_slice = df.iloc[start:stop]
request_json = _construct_json(df_slice)
result = _api_request(request_json)
result_list = result_list + _construct_csv(result)
output_df = json_normalize(result_list)
output_df.to_csv("output.csv", index=None, quoting=csv.QUOTE_NONNUMERIC)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment