From 7f9b4da56f49f2a3f94dd9b028ed6c2194ce98f7 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Fri, 29 Dec 2023 17:12:15 +0000 Subject: [PATCH 01/32] working on the estimate epc method --- backend/OrdnanceSurvey.py | 48 + backend/SearchEpc.py | 1751 ++++++++++++++++++++++++++++++++ backend/requirements/base.txt | 3 +- etl/epc/property_change_app.py | 7 - 4 files changed, 1801 insertions(+), 8 deletions(-) create mode 100644 backend/OrdnanceSurvey.py diff --git a/backend/OrdnanceSurvey.py b/backend/OrdnanceSurvey.py new file mode 100644 index 00000000..774fbaaa --- /dev/null +++ b/backend/OrdnanceSurvey.py @@ -0,0 +1,48 @@ +class OrdnanceSuveyClient: + + def __init__(self, address, postcode): + """ + This class is tasked with interaction with the ordnance survey API. + :param address: + :param postcode: + """ + + self.address = address + self.postcode = postcode + + def get_places_api(self): + """ + This method is tasked with getting the places api from the Ordnance Survey. + :return: + """ + pass + + @staticmethod + def parse_classification_code(classification_code: str): + """ + This function will convert the classification code, returned by the OS places api, to a property type that is + compatible with the EPC database. + + The various classifications cane be found here: + https://osdatahub.os.uk/docs/places/technicalSpecification + + Under LPI Output, CLASSIFICATION_CODE is described, and a link is provided to the full table of classifications + For these purposes, we do not need the full classification as this includes non-residential properties. We only + parse the ones of interest to us + :return: + """ + + value_map = { + # In the OS api, "RD" is a "Dwelling" however this is not valid property type in the EPC database + 'RD': {}, + 'RD02': {'property_type': 'House', 'built_form': 'Detatched'}, + 'RD03': {'property_type': 'House', 'built_form': 'Semi-Detatched'}, + 'RD04': {'property_type': 'House', 'built_form': 'Mid-Terrace'}, + 'RD06': {'property_type': 'Flat'}, + } + + mapped = value_map.get(classification_code, {}) + property_type = mapped.get("property_type", "") + built_form = mapped.get("built_form", "") + + return property_type, built_form diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 238ae465..75fac93f 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -1,5 +1,9 @@ import os import time +import re + +import usaddress +import pandas as pd from epc_api.client import EpcClient from utils.logger import setup_logger from typing import List @@ -65,6 +69,8 @@ class SearchEpc: self.address3 = address3 self.address4 = address4 self.uprn = uprn + self.house_number = self.get_house_number(self.address1) + self.numeric_house_number = self.extract_numeric_housenumber_part(self.house_number) self.max_retries = max_retries if max_retries is not None else self.MAX_RETRIES @@ -74,6 +80,50 @@ class SearchEpc: self.size = size if size is not None else 25 + @classmethod + def get_house_number(cls, address: str) -> str | None: + """ + This method will use the usaddress library to parse an address and extract the house number + :return: + """ + + parsed = usaddress.parse(address) + parsed_house_number = [x for x in parsed if (x[1] == "AddressNumber")] + parsed_house_number = parsed_house_number[0][0] if parsed_house_number else None + + if parsed_house_number is None: + # Because usaddress isn't optimal for parsing addresses with 'Flat' as a prefix, we also add a custom + # approach + # Pattern to look for 'Flat' followed by a number, or just a number at the beginning + pattern = r'(?i)(?:flat\s*(\d+))|^\s*(\d+)' + + match = re.search(pattern, address) + + if match: + # Return the first non-None group found + return next(g for g in match.groups() if g is not None) + else: + return None + + # Remove training commas + parsed_house_number = parsed_house_number.replace(",", "") + + return parsed_house_number + + @staticmethod + def extract_numeric_housenumber_part(house_number: str | None) -> int | None: + # Regular expression to find the first occurrence of one or more digits + + if house_number is None: + return None + + match = re.search(r'\d+', house_number) + + if match: + return int(match.group()) + else: + return None + def search(self): # Get the EPC data with retries @@ -208,3 +258,1704 @@ class SearchEpc: older_epcs = [epc for epc in list_of_epcs if epc["lmk-key"] != newest_response[0]["lmk-key"]] return newest_response[0], older_epcs + + @staticmethod + def _get_epc_mode(col: str, epc_data: pd.DataFrame): + """ + Simple method to extract the mode value from the EPC data + :param col: name of the column to take the mode of + :param epc_data: pandas dataframe of epc data + """ + + mode_value = epc_data[[col]].mode(dropna=True) + if len(mode_value) != 1: + raise NotImplementedError("TODO: Handle multiple modes") + mode_value = mode_value.iloc[0][col] + + return mode_value + + def estimate_epc(self): + """ + For a property that does not have an EPC, we retrieve the EPC data for the closest properties + and estimate the EPC for the property in question. + + Note - do we have postcodes with just a single address? We would need to use a different approach + to find the closest homes + :return: + """ + + address1 = "23 Butler House" + postcode = "e2 0pn" + os_data = [ + {'DPA': {'UPRN': '6037833', 'UDPRN': '7844379', + 'ADDRESS': 'FLAT 23, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.5, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '6037829', 'UDPRN': '7844375', + 'ADDRESS': 'FLAT 2, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 2', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182832.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.5, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Q'}}, { + 'DPA': {'UPRN': '6037843', 'UDPRN': '7844389', + 'ADDRESS': 'FLAT 32, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 32', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2G'}}, { + 'DPA': {'UPRN': '100120810104', 'UDPRN': '18054741', + 'ADDRESS': '23, BUTLER CLOSE, OXFORD, OX2 6JG', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER CLOSE', 'POST_TOWN': 'OXFORD', 'POSTCODE': 'OX2 6JG', + 'RPC': '1', 'X_COORDINATE': 450777.0, 'Y_COORDINATE': 207585.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 3110, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'OXFORD', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000017505469', 'LAST_UPDATE_DATE': '27/06/2022', + 'ENTRY_DATE': '23/04/2003', 'BLPU_STATE_DATE': '28/04/2001', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '6037832', 'UDPRN': '7844378', + 'ADDRESS': 'FLAT 22, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 22', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1T'}}, { + 'DPA': {'UPRN': '6037840', 'UDPRN': '7844386', + 'ADDRESS': 'FLAT 3, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 3', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2D'}}, { + 'DPA': {'UPRN': '6037821', 'UDPRN': '7844367', + 'ADDRESS': 'FLAT 12, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 12', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1E'}}, { + 'DPA': {'UPRN': '6037822', 'UDPRN': '7844368', + 'ADDRESS': 'FLAT 13, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 13', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1F'}}, { + 'DPA': {'UPRN': '6037830', 'UDPRN': '7844376', + 'ADDRESS': 'FLAT 20, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 20', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1R'}}, { + 'DPA': {'UPRN': '6037831', 'UDPRN': '7844377', + 'ADDRESS': 'FLAT 21, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 21', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1S'}}, { + 'DPA': {'UPRN': '6037834', 'UDPRN': '7844380', + 'ADDRESS': 'FLAT 24, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 24', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1W'}}, { + 'DPA': {'UPRN': '6037835', 'UDPRN': '7844381', + 'ADDRESS': 'FLAT 25, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 25', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1X'}}, { + 'DPA': {'UPRN': '6037836', 'UDPRN': '7844382', + 'ADDRESS': 'FLAT 26, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 26', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Y'}}, { + 'DPA': {'UPRN': '6037837', 'UDPRN': '7844383', + 'ADDRESS': 'FLAT 27, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 27', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Z'}}, { + 'DPA': {'UPRN': '6037838', 'UDPRN': '7844384', + 'ADDRESS': 'FLAT 28, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 28', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2A'}}, { + 'DPA': {'UPRN': '6037839', 'UDPRN': '7844385', + 'ADDRESS': 'FLAT 29, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 29', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2B'}}, { + 'DPA': {'UPRN': '6037841', 'UDPRN': '7844387', + 'ADDRESS': 'FLAT 30, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 30', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2E'}}, { + 'DPA': {'UPRN': '6037842', 'UDPRN': '7844388', + 'ADDRESS': 'FLAT 31, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 31', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2F'}}, { + 'DPA': {'UPRN': '6037844', 'UDPRN': '7844390', + 'ADDRESS': 'FLAT 33, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 33', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2H'}}, { + 'DPA': {'UPRN': '6037845', 'UDPRN': '7844391', + 'ADDRESS': 'FLAT 34, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 34', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2J'}}, { + 'DPA': {'UPRN': '6037846', 'UDPRN': '7844392', + 'ADDRESS': 'FLAT 35, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 35', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2L'}}, { + 'DPA': {'UPRN': '6037847', 'UDPRN': '7844393', + 'ADDRESS': 'FLAT 36, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 36', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2N'}}, { + 'DPA': {'UPRN': '6037848', 'UDPRN': '7844394', + 'ADDRESS': 'FLAT 37, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 37', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2P'}}, { + 'DPA': {'UPRN': '6037849', 'UDPRN': '7844395', + 'ADDRESS': 'FLAT 38, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 38', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2Q'}}, { + 'DPA': {'UPRN': '6037850', 'UDPRN': '7844396', + 'ADDRESS': 'FLAT 39, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 39', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2R'}}, { + 'DPA': {'UPRN': '6037818', 'UDPRN': '7844364', + 'ADDRESS': 'FLAT 1, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 1', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1A'}}, { + 'DPA': {'UPRN': '6037851', 'UDPRN': '7844397', + 'ADDRESS': 'FLAT 4, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 4', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2S'}}, { + 'DPA': {'UPRN': '6037853', 'UDPRN': '7844399', + 'ADDRESS': 'FLAT 5, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 5', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2U'}}, { + 'DPA': {'UPRN': '6037854', 'UDPRN': '7844400', + 'ADDRESS': 'FLAT 6, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 6', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2W'}}, { + 'DPA': {'UPRN': '6037855', 'UDPRN': '7844401', + 'ADDRESS': 'FLAT 7, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 7', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2X'}}, { + 'DPA': {'UPRN': '6037856', 'UDPRN': '7844402', + 'ADDRESS': 'FLAT 8, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 8', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2Y'}}, { + 'DPA': {'UPRN': '6037857', 'UDPRN': '7844403', + 'ADDRESS': 'FLAT 9, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 9', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535439.0, 'Y_COORDINATE': 182828.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2Z'}}, { + 'DPA': {'UPRN': '6037819', 'UDPRN': '7844365', + 'ADDRESS': 'FLAT 10, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 10', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1B'}}, { + 'DPA': {'UPRN': '6037820', 'UDPRN': '7844366', + 'ADDRESS': 'FLAT 11, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 11', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1D'}}, { + 'DPA': {'UPRN': '6037823', 'UDPRN': '7844369', + 'ADDRESS': 'FLAT 14, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 14', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1G'}}, { + 'DPA': {'UPRN': '6037824', 'UDPRN': '7844370', + 'ADDRESS': 'FLAT 15, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 15', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1H'}}, { + 'DPA': {'UPRN': '6037825', 'UDPRN': '7844371', + 'ADDRESS': 'FLAT 16, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 16', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1J'}}, { + 'DPA': {'UPRN': '6037826', 'UDPRN': '7844372', + 'ADDRESS': 'FLAT 17, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 17', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1L'}}, { + 'DPA': {'UPRN': '6037827', 'UDPRN': '7844373', + 'ADDRESS': 'FLAT 18, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 18', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1N'}}, { + 'DPA': {'UPRN': '6037828', 'UDPRN': '7844374', + 'ADDRESS': 'FLAT 19, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', + 'SUB_BUILDING_NAME': 'FLAT 19', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', + 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1P'}}, { + 'DPA': {'UPRN': '100005484', 'UDPRN': '20364558', + 'ADDRESS': '23, BUTLER ROAD, DAGENHAM, RM8 2DT', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'DAGENHAM', 'POSTCODE': 'RM8 2DT', + 'RPC': '2', 'X_COORDINATE': 546681.0, 'Y_COORDINATE': 185956.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 5060, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BARKING AND DAGENHAM', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000007465373', 'LAST_UPDATE_DATE': '12/11/2018', + 'ENTRY_DATE': '01/01/1923', 'BLPU_STATE_DATE': '19/10/2009', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1S'}}, { + 'DPA': {'UPRN': '90215506', 'UDPRN': '54323251', 'ADDRESS': '23, BUTLER CLOSE, DUDLEY, DY1 4ST', + 'BUILDING_NUMBER': '23', 'THOROUGHFARE_NAME': 'BUTLER CLOSE', 'POST_TOWN': 'DUDLEY', + 'POSTCODE': 'DY1 4ST', 'RPC': '1', 'X_COORDINATE': 395277.0, 'Y_COORDINATE': 291399.0, + 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 4615, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'DUDLEY', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb5000005208567956', 'LAST_UPDATE_DATE': '12/04/2022', + 'ENTRY_DATE': '19/10/2016', 'BLPU_STATE_DATE': '19/10/2016', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1P'}}, { + 'DPA': {'UPRN': '6038165', 'UDPRN': '7845424', + 'ADDRESS': 'FLAT 23, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '100091297768', 'UDPRN': '20489790', + 'ADDRESS': '23, BUTLER HOUSE, ARGENT STREET, GRAYS, RM17 6LS', 'SUB_BUILDING_NAME': '23', + 'BUILDING_NAME': 'BUTLER HOUSE', 'THOROUGHFARE_NAME': 'ARGENT STREET', + 'POST_TOWN': 'GRAYS', 'POSTCODE': 'RM17 6LS', 'RPC': '2', 'X_COORDINATE': 561539.0, + 'Y_COORDINATE': 177535.0, 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', + 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 1595, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'THURROCK', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000000743609', 'PARENT_UPRN': '100091660367', + 'LAST_UPDATE_DATE': '12/11/2018', 'ENTRY_DATE': '22/04/2002', + 'BLPU_STATE_DATE': '22/04/2002', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '2465123670', 'UDPRN': '13173788', + 'ADDRESS': '23, BUTLER CLOSE, LEICESTER, LE4 7TP', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER CLOSE', 'POST_TOWN': 'LEICESTER', 'POSTCODE': 'LE4 7TP', + 'RPC': '1', 'X_COORDINATE': 461288.0, 'Y_COORDINATE': 307985.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 2465, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'LEICESTER CITY', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000023348951', 'LAST_UPDATE_DATE': '10/02/2016', + 'ENTRY_DATE': '10/04/2003', 'BLPU_STATE_DATE': '10/04/2003', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '100070981622', 'UDPRN': '1054333', + 'ADDRESS': '23, BUTLER ROAD, SOLIHULL, B92 7QL', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'SOLIHULL', 'POSTCODE': 'B92 7QL', + 'RPC': '1', 'X_COORDINATE': 413831.0, 'Y_COORDINATE': 283269.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 4625, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'SOLIHULL', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000021354544', 'LAST_UPDATE_DATE': '10/02/2016', + 'ENTRY_DATE': '14/11/2002', 'BLPU_STATE_DATE': '06/11/2009', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1T'}}, { + 'DPA': {'UPRN': '100090315357', 'UDPRN': '5239798', + 'ADDRESS': '23, BUTLER ROAD, HALSTEAD, CO9 1LL', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'HALSTEAD', 'POSTCODE': 'CO9 1LL', + 'RPC': '1', 'X_COORDINATE': 581028.0, 'Y_COORDINATE': 230625.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 1510, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BRAINTREE', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000004753569', 'LAST_UPDATE_DATE': '24/04/2019', + 'ENTRY_DATE': '16/04/2001', 'BLPU_STATE_DATE': '16/04/2001', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1L'}}, { + 'DPA': {'UPRN': '91966', 'UDPRN': '2741519', + 'ADDRESS': '23 BUTLER HOUSE, SUMMERHILL ROAD, BRISTOL, BS5 8HQ', + 'BUILDING_NAME': '23 BUTLER HOUSE', 'THOROUGHFARE_NAME': 'SUMMERHILL ROAD', + 'POST_TOWN': 'BRISTOL', 'POSTCODE': 'BS5 8HQ', 'RPC': '2', 'X_COORDINATE': 362679.0, + 'Y_COORDINATE': 173636.0, 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', + 'CLASSIFICATION_CODE': 'RD08', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Sheltered Accommodation', + 'LOCAL_CUSTODIAN_CODE': 116, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BRISTOL', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000015134420', 'PARENT_UPRN': '91963', + 'LAST_UPDATE_DATE': '28/07/2020', 'ENTRY_DATE': '16/01/1997', + 'BLPU_STATE_DATE': '16/01/1997', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '2630183449', 'UDPRN': '53937961', + 'ADDRESS': '23, BUTLER GARDENS, WYMONDHAM, NR18 0GE', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER GARDENS', 'POST_TOWN': 'WYMONDHAM', 'POSTCODE': 'NR18 0GE', + 'RPC': '1', 'X_COORDINATE': 612795.66, 'Y_COORDINATE': 303429.68, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 2630, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'SOUTH NORFOLK', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb5000005229788403', 'LAST_UPDATE_DATE': '24/04/2019', + 'ENTRY_DATE': '08/06/2015', 'BLPU_STATE_DATE': '21/11/2018', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2D'}}, { + 'DPA': {'UPRN': '100050385845', 'UDPRN': '10711132', + 'ADDRESS': '23, BUTLER ROAD, HARROGATE, HG1 4PF', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'HARROGATE', 'POSTCODE': 'HG1 4PF', + 'RPC': '1', 'X_COORDINATE': 430998.0, 'Y_COORDINATE': 456935.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 2745, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'NORTH YORKSHIRE', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000032665633', 'LAST_UPDATE_DATE': '30/03/2023', + 'ENTRY_DATE': '05/04/2001', 'BLPU_STATE_DATE': '05/04/2001', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2D'}}, { + 'DPA': {'UPRN': '100060219201', 'UDPRN': '19958031', + 'ADDRESS': '23, BUTLER CLOSE, BASINGSTOKE, RG22 6UF', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER CLOSE', 'POST_TOWN': 'BASINGSTOKE', 'POSTCODE': 'RG22 6UF', + 'RPC': '1', 'X_COORDINATE': 461229.0, 'Y_COORDINATE': 151529.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 1705, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BASINGSTOKE AND DEANE', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000013815926', 'LAST_UPDATE_DATE': '01/05/2021', + 'ENTRY_DATE': '03/05/2001', 'BLPU_STATE_DATE': '28/03/2009', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '100021255372', 'UDPRN': '10435391', + 'ADDRESS': '23, BUTLER AVENUE, HARROW, HA1 4EJ', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER AVENUE', 'POST_TOWN': 'HARROW', 'POSTCODE': 'HA1 4EJ', + 'RPC': '1', 'X_COORDINATE': 514794.44, 'Y_COORDINATE': 187933.1, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD02', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Detached', 'LOCAL_CUSTODIAN_CODE': 5450, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'HARROW', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000003018602', 'LAST_UPDATE_DATE': '10/02/2016', + 'ENTRY_DATE': '09/08/2004', 'BLPU_STATE_DATE': '17/08/2007', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1J'}}, { + 'DPA': {'UPRN': '100010537312', 'UDPRN': '19537132', + 'ADDRESS': '23, BUTLER PLACE, PRESTON, PR1 6BS', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER PLACE', 'POST_TOWN': 'PRESTON', 'POSTCODE': 'PR1 6BS', + 'RPC': '1', 'X_COORDINATE': 353907.0, 'Y_COORDINATE': 430681.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 2345, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'PRESTON', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000037964267', 'LAST_UPDATE_DATE': '24/04/2019', + 'ENTRY_DATE': '01/01/2004', 'BLPU_STATE_DATE': '03/12/2007', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1T'}}, { + 'DPA': {'UPRN': '10090793888', 'UDPRN': '53380797', + 'ADDRESS': '23, BUTLER DRIVE, ERITH, DA8 3AQ', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER DRIVE', 'POST_TOWN': 'ERITH', 'POSTCODE': 'DA8 3AQ', + 'RPC': '1', 'X_COORDINATE': 551416.62, 'Y_COORDINATE': 177160.6, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 5120, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BEXLEY', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb5000005152984756', 'LAST_UPDATE_DATE': '10/02/2016', + 'ENTRY_DATE': '14/01/2014', 'BLPU_STATE_DATE': '04/06/2015', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Q'}}, { + 'DPA': {'UPRN': '10022828895', 'UDPRN': '51566826', + 'ADDRESS': '23, BUTLER DRIVE, BRACKNELL, RG12 8DA', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER DRIVE', 'POST_TOWN': 'BRACKNELL', 'POSTCODE': 'RG12 8DA', + 'RPC': '1', 'X_COORDINATE': 484943.0, 'Y_COORDINATE': 168743.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 335, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BRACKNELL FOREST', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000002490438229', 'LAST_UPDATE_DATE': '10/02/2016', + 'ENTRY_DATE': '23/01/2009', 'BLPU_STATE_DATE': '23/01/2009', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '4Y'}}, { + 'DPA': {'UPRN': '100021255418', 'UDPRN': '10434913', + 'ADDRESS': '23, BUTLER ROAD, HARROW, HA1 4DS', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'HARROW', 'POSTCODE': 'HA1 4DS', + 'RPC': '1', 'X_COORDINATE': 514647.66, 'Y_COORDINATE': 187939.99, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 5450, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'HARROW', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000003018457', 'LAST_UPDATE_DATE': '10/02/2016', + 'ENTRY_DATE': '09/08/2004', 'BLPU_STATE_DATE': '17/08/2007', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1H'}}, { + 'DPA': {'UPRN': '10095848542', 'UDPRN': '56772037', + 'ADDRESS': '23, BUTLER STREET, MANCHESTER, M40 7SW', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'MANCHESTER', 'POSTCODE': 'M40 7SW', + 'RPC': '1', 'X_COORDINATE': 385363.25, 'Y_COORDINATE': 399029.33, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 4215, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'MANCHESTER', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '3', 'BLPU_STATE_CODE_DESCRIPTION': 'Unoccupied', + 'TOPOGRAPHY_LAYER_TOID': 'osgb5000005305734312', 'LAST_UPDATE_DATE': '08/12/2023', + 'ENTRY_DATE': '20/12/2021', 'BLPU_STATE_DATE': '06/12/2023', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Q'}}, { + 'DPA': {'UPRN': '14053961', 'UDPRN': '20066824', + 'ADDRESS': '23, BUTLER ROAD, CROWTHORNE, RG45 6QZ', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'CROWTHORNE', 'POSTCODE': 'RG45 6QZ', + 'RPC': '1', 'X_COORDINATE': 483577.0, 'Y_COORDINATE': 164784.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 360, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'WOKINGHAM', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000014499560', 'LAST_UPDATE_DATE': '10/02/2016', + 'ENTRY_DATE': '08/07/2000', 'BLPU_STATE_DATE': '01/02/2010', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1J'}}, { + 'DPA': {'UPRN': '38174349', 'UDPRN': '12536271', + 'ADDRESS': '23, BUTLER CRESCENT, LIVERPOOL, L6 9HS', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER CRESCENT', 'POST_TOWN': 'LIVERPOOL', 'POSTCODE': 'L6 9HS', + 'RPC': '1', 'X_COORDINATE': 336692.0, 'Y_COORDINATE': 391293.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 4310, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'LIVERPOOL', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000035036984', 'LAST_UPDATE_DATE': '23/03/2022', + 'ENTRY_DATE': '30/09/1999', 'BLPU_STATE_DATE': '30/09/1999', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1T'}}, { + 'DPA': {'UPRN': '63197467', 'UDPRN': '55267616', 'ADDRESS': '23, BUTLER WAY, WAKEFIELD, WF1 3DQ', + 'BUILDING_NUMBER': '23', 'THOROUGHFARE_NAME': 'BUTLER WAY', 'POST_TOWN': 'WAKEFIELD', + 'POSTCODE': 'WF1 3DQ', 'RPC': '1', 'X_COORDINATE': 433059.56, 'Y_COORDINATE': 421601.59, + 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 4725, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'WAKEFIELD', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb5000005255059772', 'LAST_UPDATE_DATE': '13/06/2022', + 'ENTRY_DATE': '04/06/2018', 'BLPU_STATE_DATE': '05/06/2018', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1P'}}, { + 'DPA': {'UPRN': '100010789959', 'UDPRN': '9117199', + 'ADDRESS': '23, BUTLER STREET, BLACKPOOL, FY1 3HR', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'BLACKPOOL', 'POSTCODE': 'FY1 3HR', + 'RPC': '1', 'X_COORDINATE': 331287.0, 'Y_COORDINATE': 436773.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 2373, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BLACKPOOL', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000037423291', 'LAST_UPDATE_DATE': '10/02/2016', + 'ENTRY_DATE': '18/04/2001', 'BLPU_STATE_DATE': '12/06/2007', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1H'}}, { + 'DPA': {'UPRN': '6038175', 'UDPRN': '7845434', + 'ADDRESS': 'FLAT 32, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 32', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2G'}}, { + 'DPA': {'UPRN': '100031395259', 'UDPRN': '16684081', + 'ADDRESS': '23, BUTLER CRESCENT, MANSFIELD, NG19 7LU', 'BUILDING_NUMBER': '23', + 'THOROUGHFARE_NAME': 'BUTLER CRESCENT', 'POST_TOWN': 'MANSFIELD', 'POSTCODE': 'NG19 7LU', + 'RPC': '1', 'X_COORDINATE': 451759.0, 'Y_COORDINATE': 362615.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 3025, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'MANSFIELD', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000022624910', 'LAST_UPDATE_DATE': '10/02/2016', + 'ENTRY_DATE': '07/11/2002', 'BLPU_STATE_DATE': '07/11/2002', 'LANGUAGE': 'EN', + 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1J'}}, { + 'DPA': {'UPRN': '6038172', 'UDPRN': '7845431', + 'ADDRESS': 'FLAT 3, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 3', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2D'}}, { + 'DPA': {'UPRN': '6045644', 'UDPRN': '8071046', + 'ADDRESS': 'FLAT 23, BUTLER HOUSE, BURDETT ROAD, LONDON, E14 7AB', + 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'BURDETT ROAD', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E14 7AB', + 'RPC': '2', 'X_COORDINATE': 536908.0, 'Y_COORDINATE': 181460.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041732860', 'PARENT_UPRN': '6128774', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '6038164', 'UDPRN': '7845423', + 'ADDRESS': 'FLAT 22, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 22', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1T'}}, { + 'DPA': {'UPRN': '6038153', 'UDPRN': '7845412', + 'ADDRESS': 'FLAT 12, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 12', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1E'}}, { + 'DPA': {'UPRN': '6038154', 'UDPRN': '7845413', + 'ADDRESS': 'FLAT 13, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 13', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1F'}}, { + 'DPA': {'UPRN': '6038162', 'UDPRN': '7845421', + 'ADDRESS': 'FLAT 20, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 20', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1R'}}, { + 'DPA': {'UPRN': '6038163', 'UDPRN': '7845422', + 'ADDRESS': 'FLAT 21, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 21', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1S'}}, { + 'DPA': {'UPRN': '6038166', 'UDPRN': '7845425', + 'ADDRESS': 'FLAT 24, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 24', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1W'}}, { + 'DPA': {'UPRN': '6038167', 'UDPRN': '7845426', + 'ADDRESS': 'FLAT 25, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 25', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1X'}}, { + 'DPA': {'UPRN': '6038168', 'UDPRN': '7845427', + 'ADDRESS': 'FLAT 26, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 26', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Y'}}, { + 'DPA': {'UPRN': '6038169', 'UDPRN': '7845428', + 'ADDRESS': 'FLAT 27, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 27', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Z'}}, { + 'DPA': {'UPRN': '6038170', 'UDPRN': '7845429', + 'ADDRESS': 'FLAT 28, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 28', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2A'}}, { + 'DPA': {'UPRN': '6038171', 'UDPRN': '7845430', + 'ADDRESS': 'FLAT 29, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 29', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2B'}}, { + 'DPA': {'UPRN': '6038173', 'UDPRN': '7845432', + 'ADDRESS': 'FLAT 30, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 30', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2E'}}, { + 'DPA': {'UPRN': '6038174', 'UDPRN': '7845433', + 'ADDRESS': 'FLAT 31, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 31', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2F'}}, { + 'DPA': {'UPRN': '6038150', 'UDPRN': '7845409', + 'ADDRESS': 'FLAT 1, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 1', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1A'}}, { + 'DPA': {'UPRN': '6038176', 'UDPRN': '7845435', + 'ADDRESS': 'FLAT 4, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 4', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2H'}}, { + 'DPA': {'UPRN': '6038177', 'UDPRN': '7845436', + 'ADDRESS': 'FLAT 5, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 5', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2J'}}, { + 'DPA': {'UPRN': '6038178', 'UDPRN': '7845437', + 'ADDRESS': 'FLAT 6, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 6', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2L'}}, { + 'DPA': {'UPRN': '6038179', 'UDPRN': '7845438', + 'ADDRESS': 'FLAT 7, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 7', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2N'}}, { + 'DPA': {'UPRN': '6038180', 'UDPRN': '7845439', + 'ADDRESS': 'FLAT 8, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 8', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2P'}}, { + 'DPA': {'UPRN': '6038181', 'UDPRN': '7845440', + 'ADDRESS': 'FLAT 9, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 9', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2Q'}}, { + 'DPA': {'UPRN': '6038151', 'UDPRN': '7845410', + 'ADDRESS': 'FLAT 10, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 10', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1B'}}, { + 'DPA': {'UPRN': '6038152', 'UDPRN': '7845411', + 'ADDRESS': 'FLAT 11, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 11', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1D'}}, { + 'DPA': {'UPRN': '6038155', 'UDPRN': '7845414', + 'ADDRESS': 'FLAT 14, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 14', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1G'}}, { + 'DPA': {'UPRN': '6038156', 'UDPRN': '7845415', + 'ADDRESS': 'FLAT 15, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 15', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1H'}}, { + 'DPA': {'UPRN': '6038157', 'UDPRN': '7845416', + 'ADDRESS': 'FLAT 16, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 16', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1J'}}, { + 'DPA': {'UPRN': '6038158', 'UDPRN': '7845417', + 'ADDRESS': 'FLAT 17, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 17', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1L'}}, { + 'DPA': {'UPRN': '6038159', 'UDPRN': '7845418', + 'ADDRESS': 'FLAT 18, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 18', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1N'}}, { + 'DPA': {'UPRN': '6038160', 'UDPRN': '7845419', + 'ADDRESS': 'FLAT 19, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', + 'SUB_BUILDING_NAME': 'FLAT 19', 'BUILDING_NAME': 'BEVIN HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', + 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', + 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', + 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1P'}}, { + 'DPA': {'UPRN': '3040038989', 'UDPRN': '16547514', + 'ADDRESS': '23, BUTLER CLOSE, CROPWELL BUTLER, NOTTINGHAM, NG12 3AF', + 'BUILDING_NUMBER': '23', 'THOROUGHFARE_NAME': 'BUTLER CLOSE', + 'DEPENDENT_LOCALITY': 'CROPWELL BUTLER', 'POST_TOWN': 'NOTTINGHAM', + 'POSTCODE': 'NG12 3AF', 'RPC': '2', 'X_COORDINATE': 468456.0, 'Y_COORDINATE': 336688.0, + 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 3040, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'RUSHCLIFFE', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000023504919', 'LAST_UPDATE_DATE': '01/10/2019', + 'ENTRY_DATE': '13/12/2000', 'BLPU_STATE_DATE': '13/12/2000', 'LANGUAGE': 'EN', + 'MATCH': 0.3, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '200003357053', 'UDPRN': '21443062', + 'ADDRESS': 'FLAT 23, PETER BUTLER HOUSE, WOLSELEY STREET, LONDON, SE1 2BJ', + 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'PETER BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'WOLSELEY STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'SE1 2BJ', + 'RPC': '2', 'X_COORDINATE': 534088.0, 'Y_COORDINATE': 179747.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5840, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'SOUTHWARK', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000006172980', 'PARENT_UPRN': '200003500897', + 'LAST_UPDATE_DATE': '10/02/2016', 'ENTRY_DATE': '20/05/2003', + 'BLPU_STATE_DATE': '08/04/2009', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '100100221882', 'UDPRN': '4625510', + 'ADDRESS': '23, BUTLER STREET, SHOTTON, GLANNAU DYFRDWY, CH5 1AP', + 'BUILDING_NUMBER': '23', 'THOROUGHFARE_NAME': 'BUTLER STREET', + 'DEPENDENT_LOCALITY': 'SHOTTON', 'POST_TOWN': 'GLANNAU DYFRDWY', 'POSTCODE': 'CH5 1AP', + 'RPC': '1', 'X_COORDINATE': 330758.0, 'Y_COORDINATE': 368483.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 6835, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'FLINTSHIRE', 'COUNTRY_CODE': 'W', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within Wales', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000034722275', 'LAST_UPDATE_DATE': '16/05/2022', + 'ENTRY_DATE': '10/05/2001', 'BLPU_STATE_DATE': '10/05/2001', 'LANGUAGE': 'CY', + 'MATCH': 0.3, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '200001132475', 'UDPRN': '26597335', + 'ADDRESS': '23 MORRIS HOUSE, BUTLER STREET, WIGAN, WN1 3QY', + 'BUILDING_NAME': '23 MORRIS HOUSE', 'THOROUGHFARE_NAME': 'BUTLER STREET', + 'POST_TOWN': 'WIGAN', 'POSTCODE': 'WN1 3QY', 'RPC': '2', 'X_COORDINATE': 358656.0, + 'Y_COORDINATE': 405727.0, 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', + 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 4250, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'WIGAN', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000038141883', 'PARENT_UPRN': '200001174781', + 'LAST_UPDATE_DATE': '10/02/2016', 'ENTRY_DATE': '15/01/2002', + 'BLPU_STATE_DATE': '15/01/2002', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '100021167639', 'UDPRN': '15753729', + 'ADDRESS': 'FLAT 23, JOYCE BUTLER HOUSE, COMMERCE ROAD, LONDON, N22 8EA', + 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'JOYCE BUTLER HOUSE', + 'THOROUGHFARE_NAME': 'COMMERCE ROAD', 'POST_TOWN': 'LONDON', 'POSTCODE': 'N22 8EA', + 'RPC': '2', 'X_COORDINATE': 530743.0, 'Y_COORDINATE': 190869.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5420, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'LONDON BOROUGH OF HARINGEY', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000005603686', 'PARENT_UPRN': '100023656717', + 'LAST_UPDATE_DATE': '16/05/2022', 'ENTRY_DATE': '31/03/2004', + 'BLPU_STATE_DATE': '24/03/2004', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { + 'DPA': {'UPRN': '200001825227', 'UDPRN': '1679218', + 'ADDRESS': 'BUTLER HOUSE, BUTLER LANE, BAILDON, SHIPLEY, BD17 6PG', + 'BUILDING_NAME': 'BUTLER HOUSE', 'THOROUGHFARE_NAME': 'BUTLER LANE', + 'DEPENDENT_LOCALITY': 'BAILDON', 'POST_TOWN': 'SHIPLEY', 'POSTCODE': 'BD17 6PG', + 'RPC': '1', 'X_COORDINATE': 415603.0, 'Y_COORDINATE': 439584.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 4705, + 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BRADFORD MDC', 'COUNTRY_CODE': 'E', + 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000031973762', 'LAST_UPDATE_DATE': '10/02/2016', + 'ENTRY_DATE': '02/07/2002', 'BLPU_STATE_DATE': '02/07/2002', 'LANGUAGE': 'EN', + 'MATCH': 0.3, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1B'}}, { + 'DPA': {'UPRN': '202082612', 'UDPRN': '17825144', + 'ADDRESS': 'FLAT 23, HUGH GAITSKELL HOUSE, BUTLER ROAD, LONDON, NW10 9RT', + 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'HUGH GAITSKELL HOUSE', + 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'LONDON', 'POSTCODE': 'NW10 9RT', + 'RPC': '2', 'X_COORDINATE': 521511.0, 'Y_COORDINATE': 184340.0, 'STATUS': 'APPROVED', + 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', + 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' + 'Apartment)', + 'LOCAL_CUSTODIAN_CODE': 5150, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BRENT', + 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', + 'POSTAL_ADDRESS_CODE': 'D', + 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', + 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', + 'TOPOGRAPHY_LAYER_TOID': 'osgb1000042025598', 'PARENT_UPRN': '202191825', + 'LAST_UPDATE_DATE': '10/02/2016', 'ENTRY_DATE': '13/09/1979', + 'BLPU_STATE_DATE': '10/08/2007', 'LANGUAGE': 'EN', 'MATCH': 0.3, + 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}] + + # TEMP + # from dotenv import load_dotenv + # from pathlib import Path + # ENV_FILE = Path(__file__).parent / "etl" / "eligibility" / "ha_15_32" / ".env" + # load_dotenv(ENV_FILE) + # self = SearchEpc(address1=address1, postcode=postcode) + + # From the ordnance survey data, we want to determine the property type and then use only similar property + # types for the estimation + property_os_place = os_data[0]["DPA"] + + from backend.OrdnanceSurvey import OrdnanceSuveyClient + + os_property_type, os_built_form = OrdnanceSuveyClient.parse_classification_code( + property_os_place["CLASSIFICATION_CODE"]) + # TODO: Then, if the property is semi-detatched, but all of the neighbours are terraced, we should update the + # property type to end-terraced + + # We firstly get the first 100 properties for the postcode, from the EPC api + epc_reponse = self.client.domestic.search(params={"postcode": self.postcode}, size=100) + epc_data = pd.DataFrame(epc_reponse["rows"]) + + # We now get the newest EPC per uprn + epc_data = epc_data.sort_values("lodgement-datetime", ascending=False).groupby("uprn").head(1) + + # For each record, parse the house number. We'll use this to identify the closest properties + epc_data["house_number"] = epc_data["address"].apply(lambda add1: self.get_house_number(add1)) + + # We convert the house number fo a purely numeric format - therefore + epc_data["numeric_house_number"] = epc_data["house_number"].apply( + lambda house_num: self.extract_numeric_housenumber_part(house_num) + ) + + epc_data["house_number_distance"] = abs( + epc_data["numeric_house_number"] - self.numeric_house_number + ) + + epc_built_form = self._get_epc_mode(col="built-form", epc_data=epc_data) + epc_property_type = self._get_epc_mode(col="property-type", epc_data=epc_data) + + # We check if the EPC built form is one of the terraced values. If the os_built_form is semi-detached, + # then we set it to be end terraced + if os_built_form == "Semi-Detached" and epc_built_form in ["End-Terraced", "Mid-Terraced"]: + estimation_built_form = "End-Terraced" + elif os_built_form == "": + estimation_built_form = epc_built_form + else: + estimation_built_form = os_built_form + + estimation_property_type = epc_property_type if os_property_type == "" else os_property_type + + # We filter the EPC data on just the property types we want to use + epc_data = epc_data[ + (epc_data["built-form"] == estimation_built_form) & (epc_data["property-type"] == estimation_property_type) + ] + + # We use house_number_distance as a weighting where closer homes are upweighted when interpolating + + # For each attribute, we need to determine the datatype and use an appropriate method + # to interpolate. + for attribute in epc_data.columns: + estimation_data = epc_data[[attribute, "house_number_distance"]] diff --git a/backend/requirements/base.txt b/backend/requirements/base.txt index 7a925030..3173f7f8 100644 --- a/backend/requirements/base.txt +++ b/backend/requirements/base.txt @@ -35,4 +35,5 @@ mip==1.15.0 boto3==1.28.3 pandas==1.5.3 pyarrow==12.0.1 -textblob \ No newline at end of file +textblob +usaddress==0.5.10 \ No newline at end of file diff --git a/etl/epc/property_change_app.py b/etl/epc/property_change_app.py index f8c293a1..7e2262d0 100644 --- a/etl/epc/property_change_app.py +++ b/etl/epc/property_change_app.py @@ -637,13 +637,6 @@ def app(): file_key="sap_change_model/dataset_test.parquet", ) - z = dataset[dataset["CONSTITUENCY"].isin(["E14000707", "E14000909"])] - z["CONSTITUENCY"].value_counts() - - z[z["CONSTITUENCY"] == "E14000909"]["UPRN"].sample(1) - - self.data[self.data["UPRN"] == "100030549358"] - if __name__ == "__main__": app() From 9f3853c2b18313222e831b40d79f2c6f8c44109b Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Sat, 30 Dec 2023 20:40:03 +0000 Subject: [PATCH 02/32] implemented estimation method for homes without epc --- backend/SearchEpc.py | 142 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 2 deletions(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 75fac93f..ed6857c7 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -4,6 +4,7 @@ import re import usaddress import pandas as pd +import numpy as np from epc_api.client import EpcClient from utils.logger import setup_logger from typing import List @@ -11,6 +12,101 @@ from fuzzywuzzy import process logger = setup_logger() +vartypes = { + 'low-energy-fixed-light-count': "Int64", + # 'address': 'str', + # 'uprn-source': 'str', + 'floor-height': 'float', + 'heating-cost-potential': 'float', + 'unheated-corridor-length': 'float', + 'hot-water-cost-potential': 'float', + 'construction-age-band': 'str', + 'potential-energy-rating': 'str', + 'mainheat-energy-eff': 'str', + 'windows-env-eff': 'str', + 'lighting-energy-eff': 'str', + 'environment-impact-potential': "Int64", + 'glazed-type': 'str', + 'heating-cost-current': 'float', + 'address3': 'str', + 'mainheatcont-description': 'str', + 'sheating-energy-eff': 'str', + 'property-type': 'str', + 'local-authority-label': 'str', + 'fixed-lighting-outlets-count': "Int64", + 'energy-tariff': 'str', + 'mechanical-ventilation': 'str', + 'hot-water-cost-current': 'str', + 'county': 'str', + 'postcode': 'str', + 'solar-water-heating-flag': 'str', + 'constituency': 'str', + 'co2-emissions-potential': 'float', + 'number-heated-rooms': 'float', + 'floor-description': 'str', + 'energy-consumption-potential': 'float', + 'local-authority': 'str', + 'built-form': 'str', + 'number-open-fireplaces': "Int64", + 'windows-description': 'str', + 'glazed-area': 'str', + # 'inspection-date': str, + 'mains-gas-flag': 'str', + 'co2-emiss-curr-per-floor-area': 'float', + 'address1': 'str', + 'heat-loss-corridor': 'str', + 'flat-storey-count': "Int64", + 'constituency-label': 'str', + 'roof-energy-eff': 'str', + 'total-floor-area': 'float', + 'building-reference-number': 'str', + 'environment-impact-current': 'float', + 'co2-emissions-current': 'float', + 'roof-description': 'str', + 'floor-energy-eff': 'str', + 'number-habitable-rooms': 'float', + 'address2': 'str', + 'hot-water-env-eff': 'str', + 'posttown': 'str', + 'mainheatc-energy-eff': 'str', + 'main-fuel': 'str', + 'lighting-env-eff': 'str', + 'windows-energy-eff': 'str', + 'floor-env-eff': 'str', + 'sheating-env-eff': 'str', + 'lighting-description': 'str', + 'roof-env-eff': 'str', + 'walls-energy-eff': 'str', + 'photo-supply': 'float', + 'lighting-cost-potential': 'float', + 'mainheat-env-eff': 'str', + 'multi-glaze-proportion': 'float', + 'main-heating-controls': 'str', + # 'lodgement-datetime', + 'flat-top-storey': 'str', + 'current-energy-rating': 'str', + 'secondheat-description': 'str', + 'walls-env-eff': 'str', + 'transaction-type': 'str', + # 'uprn': "Int64", + 'current-energy-efficiency': 'float', + 'energy-consumption-current': 'float', + 'mainheat-description': 'str', + 'lighting-cost-current': 'float', + # 'lodgement-date', + 'extension-count': "Int64", + 'mainheatc-env-eff': 'str', + 'lmk-key': 'str', + 'wind-turbine-count': "Int64", + 'tenure': 'str', + 'floor-level': 'str', + 'potential-energy-efficiency': "Int64", + 'hot-water-energy-eff': 'str', + 'low-energy-lighting': 'float', + 'walls-description': 'str', + 'hotwater-description': 'str' +} + class SearchEpc: """ @@ -1953,9 +2049,51 @@ class SearchEpc: (epc_data["built-form"] == estimation_built_form) & (epc_data["property-type"] == estimation_property_type) ] + epc_data["weight"] = 1 / epc_data["house_number_distance"] + # We use house_number_distance as a weighting where closer homes are upweighted when interpolating # For each attribute, we need to determine the datatype and use an appropriate method # to interpolate. - for attribute in epc_data.columns: - estimation_data = epc_data[[attribute, "house_number_distance"]] + + estimated_epc = {} + for key, vartype in vartypes.items(): + epc_data[key] = np.where(pd.isnull(epc_data[key]), None, epc_data[key]) + epc_data[key] = np.where(epc_data[key] == "", None, epc_data[key]) + epc_data[key] = epc_data[key].astype(vartype) + estimation_data = epc_data[[key, "weight"]] + estimation_data = estimation_data[~pd.isnull(estimation_data[key])] + + if estimation_data.shape[0] == 0: + estimated_epc[key] = None + continue + + if vartype == "Int64": + estimated_value = self._estimate_int(estimation_data, key) + elif vartype == "float": + estimated_value = self._estimate_float(estimation_data, key) + elif vartype == "str": + estimated_value = self._estimate_str(estimation_data, key) + else: + raise NotImplementedError("estimation method not implemented for type") + + estimated_epc[key] = estimated_value + + return estimated_epc + + @staticmethod + def _estimate_int(estimation_data, key): + return round(np.average(a=estimation_data[key], weights=estimation_data["weight"])) + + @staticmethod + def _estimate_float(estimation_data, key): + return np.average(a=estimation_data[key], weights=estimation_data["weight"]) + + @staticmethod + def _estimate_str(estimation_data, key): + agg = estimation_data.groupby(key)["weight"].sum().reset_index() + agg = agg[agg["weight"] == agg["weight"].max()] + if agg.shape[0] != 1: + raise NotImplementedError("implement me") + + return agg[key].values[0] From 05cce77f16c8802fff3317247271e31c46eec0b4 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Sat, 30 Dec 2023 20:48:40 +0000 Subject: [PATCH 03/32] pulling together OS client and DBClient --- backend/DbClient.py | 7 +++++++ backend/OrdnanceSurvey.py | 39 ++++++++++++++++++++++++++++++++++----- backend/SearchEpc.py | 5 ++--- 3 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 backend/DbClient.py diff --git a/backend/DbClient.py b/backend/DbClient.py new file mode 100644 index 00000000..2ee01349 --- /dev/null +++ b/backend/DbClient.py @@ -0,0 +1,7 @@ +class DbClient: + + def __init__(self): + """ + This class handles interaction with the database + """ + pass diff --git a/backend/OrdnanceSurvey.py b/backend/OrdnanceSurvey.py index 774fbaaa..afb57620 100644 --- a/backend/OrdnanceSurvey.py +++ b/backend/OrdnanceSurvey.py @@ -1,21 +1,50 @@ +from functools import lru_cache +import urllib.parse +import requests +from utils.logger import setup_logger + +logger = setup_logger() + + class OrdnanceSuveyClient: - def __init__(self, address, postcode): + def __init__(self, address, postcode, api_key): """ This class is tasked with interaction with the ordnance survey API. - :param address: - :param postcode: + :param address: The address for the property to search for + :param postcode: The postcode for the property to search for """ self.address = address self.postcode = postcode + self.full_address = ", ".join([self.address, self.postcode]) + self.api_key = api_key + self.results = None + + @lru_cache(maxsize=128) def get_places_api(self): """ This method is tasked with getting the places api from the Ordnance Survey. - :return: """ - pass + + if not self.api_key: + raise ValueError("Ordnance Survey API key not specified") + + encoded_address_query = urllib.parse.quote(self.full_address) + url = (f"https://api.os.uk/search/places/v1/find?query={encoded_address_query}&key=" + f"{self.api_key}") + response = requests.get(url) + if response.status_code == 200: + data = response.json() + + # Extract the UPRN from the data + # Note: This example assumes that the first result is the correct one, which might not always be the case. + results = data['results'] + self.results = results + else: + logger.info("Could not find any results for the provided address and postcode") + return @staticmethod def parse_classification_code(classification_code: str): diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index ed6857c7..a63437dd 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -2007,9 +2007,8 @@ class SearchEpc: from backend.OrdnanceSurvey import OrdnanceSuveyClient os_property_type, os_built_form = OrdnanceSuveyClient.parse_classification_code( - property_os_place["CLASSIFICATION_CODE"]) - # TODO: Then, if the property is semi-detatched, but all of the neighbours are terraced, we should update the - # property type to end-terraced + property_os_place["CLASSIFICATION_CODE"] + ) # We firstly get the first 100 properties for the postcode, from the EPC api epc_reponse = self.client.domestic.search(params={"postcode": self.postcode}, size=100) From ad9eec892414c5b9dc57ac25532ade213524a571 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Sat, 30 Dec 2023 21:00:01 +0000 Subject: [PATCH 04/32] Setting up SearchEPC --- backend/SearchEpc.py | 42 +++++++++++++++++++++++--------------- backend/app/plan/router.py | 2 ++ 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index a63437dd..11ddec09 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -6,6 +6,7 @@ import usaddress import pandas as pd import numpy as np from epc_api.client import EpcClient +from backend.OrdnanceSurvey import OrdnanceSuveyClient from utils.logger import setup_logger from typing import List from fuzzywuzzy import process @@ -138,9 +139,9 @@ class SearchEpc: self, address1: str, postcode: str, - address2: str = None, - address3: str = None, - address4: str = None, + auth_token: str, + os_api_key: str, + full_address: str | None = None, max_retries: int = None, uprn: [int, None] = None, size=None, @@ -150,9 +151,7 @@ class SearchEpc: but can be used to find the epc for the home, if address1 and postcode are insufficient :param address1: string, propery's address line 1 :param postcode: string, propery's postcode - :param address2: string, optional, propery's address line 2 - :param address3: string, optional, propery's address line 3 - :param address4: string, optional, propery's address line 4 + :param full_address: string, optional parameter, the full address of the property :param max_retries: int, optional, number of retries to make when searching the api :param uprn: int, optional, the uprn of the property :param size: int, optional, the number of results to return. If not provided, defaults to 25 which is the api's @@ -161,16 +160,17 @@ class SearchEpc: self.address1 = address1 self.postcode = postcode - self.address2 = address2 - self.address3 = address3 - self.address4 = address4 + self.full_address = full_address self.uprn = uprn self.house_number = self.get_house_number(self.address1) self.numeric_house_number = self.extract_numeric_housenumber_part(self.house_number) self.max_retries = max_retries if max_retries is not None else self.MAX_RETRIES - self.client = EpcClient(auth_token=os.getenv("EPC_AUTH_TOKEN")) + self.client = EpcClient(auth_token=auth_token) + self.ordnance_survey_client = OrdnanceSuveyClient( + address=self.address1, postcode=self.postcode, api_key=os_api_key + ) self.data = None @@ -241,12 +241,9 @@ class SearchEpc: return self.SUCCESS if retry > 0: - print("Failed previous attempt but retry successful") + logger.info("Failed previous attempt but retry successful") # If we got nothing, final try if not response: - # TODO: Make a call to OS uprn service and get the address' uprn, just in case there is an - # issue with how we are searching the api - return { "status": 204, "message": "no data", @@ -2004,9 +2001,7 @@ class SearchEpc: # types for the estimation property_os_place = os_data[0]["DPA"] - from backend.OrdnanceSurvey import OrdnanceSuveyClient - - os_property_type, os_built_form = OrdnanceSuveyClient.parse_classification_code( + os_property_type, os_built_form = self.ordnance_survey_client.parse_classification_code( property_os_place["CLASSIFICATION_CODE"] ) @@ -2096,3 +2091,16 @@ class SearchEpc: raise NotImplementedError("implement me") return agg[key].values[0] + + def find_property(self): + """ + This method will attempt to identify a property. It will, at first, use the EPC api to try and + find the EPC for the property and the associated UPRN. If this fails, it will use the Ordnance Survey API to + find the UPRN of the address. + + Because no result may have been provided by the EPC api because of formatting issues with the address, + if the ordnance survey api is used and the uprn retrieved, the EPC api is queried again with the UPRN, just + as a final check to see if there is any EPC data. + + If there is no EPC data, the epc data will be estimated based on the surrounding properties + """ diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index a284e50b..4100e47d 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -3,6 +3,7 @@ from datetime import datetime import numpy as np import pandas as pd from epc_api.client import EpcClient +from backend.OrdnanceSurvey import OrdnanceSuveyClient from fastapi import APIRouter, Depends from sqlalchemy.exc import IntegrityError, OperationalError from sqlalchemy.orm import sessionmaker @@ -74,6 +75,7 @@ async def trigger_plan(body: PlanTriggerRequest): # We validate each record in the file. If the record is NOT valid, we need to handle this accordingly # TODO: implment validation. We should also standardise postcode and address in some fashion as # a postcode of abcdef would be considered different to ABCDEF + # TODO: Search for the property # Create a record in db property_id, is_new = create_property( session, portfolio_id=body.portfolio_id, address=config['address'], postcode=config['postcode'] From 3343e27834ff5b2510f5b3cebe641efbfe9ad69f Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Sat, 30 Dec 2023 21:01:21 +0000 Subject: [PATCH 05/32] remove os from plan router --- backend/OrdnanceSurvey.py | 3 --- backend/app/plan/router.py | 1 - 2 files changed, 4 deletions(-) diff --git a/backend/OrdnanceSurvey.py b/backend/OrdnanceSurvey.py index afb57620..156e72bf 100644 --- a/backend/OrdnanceSurvey.py +++ b/backend/OrdnanceSurvey.py @@ -37,9 +37,6 @@ class OrdnanceSuveyClient: response = requests.get(url) if response.status_code == 200: data = response.json() - - # Extract the UPRN from the data - # Note: This example assumes that the first result is the correct one, which might not always be the case. results = data['results'] self.results = results else: diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index 4100e47d..209bb2b9 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -3,7 +3,6 @@ from datetime import datetime import numpy as np import pandas as pd from epc_api.client import EpcClient -from backend.OrdnanceSurvey import OrdnanceSuveyClient from fastapi import APIRouter, Depends from sqlalchemy.exc import IntegrityError, OperationalError from sqlalchemy.orm import sessionmaker From d1c40ff7dc80ba1c82655f286711160f2fb3cd7c Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Sat, 30 Dec 2023 21:04:24 +0000 Subject: [PATCH 06/32] set up SearchEpc in router --- backend/app/config.py | 1 + backend/app/plan/router.py | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/backend/app/config.py b/backend/app/config.py index 22621972..764bddf5 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -13,6 +13,7 @@ class Settings(BaseSettings): HEAT_PREDICTIONS_BUCKET: str PLAN_TRIGGER_BUCKET: str EPC_AUTH_TOKEN: str + ORDNANCE_SURVEY_API_KEY: str DB_HOST: str DB_PASSWORD: str DB_USERNAME: str diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index 209bb2b9..233a18cb 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -3,6 +3,7 @@ from datetime import datetime import numpy as np import pandas as pd from epc_api.client import EpcClient +from backend.SearchEpc import SearchEpc from fastapi import APIRouter, Depends from sqlalchemy.exc import IntegrityError, OperationalError from sqlalchemy.orm import sessionmaker @@ -75,6 +76,13 @@ async def trigger_plan(body: PlanTriggerRequest): # TODO: implment validation. We should also standardise postcode and address in some fashion as # a postcode of abcdef would be considered different to ABCDEF # TODO: Search for the property + epc_searcher = SearchEpc( + address1=config['address'], + postcode=config["postcode"], + auth_token=get_settings().EPC_AUTH_TOKEN, + os_api_key=get_settings().ORDNANCE_SURVEY_API_KEY + ) + epc_searcher.find_property() # Create a record in db property_id, is_new = create_property( session, portfolio_id=body.portfolio_id, address=config['address'], postcode=config['postcode'] From bb9b8308be2642e629e95d3fb1eee66e17100a59 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 10:55:30 +0000 Subject: [PATCH 07/32] created test file for no epc --- etl/testing_data/no_epc_input.py | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 etl/testing_data/no_epc_input.py diff --git a/etl/testing_data/no_epc_input.py b/etl/testing_data/no_epc_input.py new file mode 100644 index 00000000..0745ff7a --- /dev/null +++ b/etl/testing_data/no_epc_input.py @@ -0,0 +1,42 @@ +""" +This script will create an input csv for the recommendation engine and upload it to S3, which can be used for +testing +""" +import pandas as pd +from utils.s3 import save_csv_to_s3 + +USER_ID = 8 +PORTFOLIO_ID = 57 + + +def app(): + """ + This portfolio is for testing windows recommendations + :return: + """ + + test_file = pd.DataFrame( + [ + {"address": "21 Butler House", "postcode": "E2 0PN", "Notes": None}, + {"address": "22 Butler House", "postcode": "E2 0PN", "Notes": None}, + {"address": "23 Butler House", "postcode": "E2 0PN", "Notes": None}, + {"address": "24 Butler House", "postcode": "E2 0PN", "Notes": None}, + ] + ) + + # Store the data in s3 + filename = f"{USER_ID}/{PORTFOLIO_ID}/no_epc.csv" + save_csv_to_s3( + dataframe=test_file, + bucket_name="retrofit-plan-inputs-dev", + file_name=filename + ) + + body = { + "portfolio_id": str(PORTFOLIO_ID), + "housing_type": "Social", + "goal": "Increase EPC", + "goal_value": "A", + "trigger_file_path": filename + } + print(body) From 40b7ec1c1857d7f2f10eb8640984b021d245987a Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 11:44:18 +0000 Subject: [PATCH 08/32] Implementing searching epc methodology --- .idea/Model.iml | 2 +- .idea/misc.xml | 2 +- backend/OrdnanceSurvey.py | 15 +- backend/Property.py | 52 +- backend/SearchEpc.py | 1689 ++---------------------------------- backend/app/plan/router.py | 15 +- 6 files changed, 80 insertions(+), 1695 deletions(-) diff --git a/.idea/Model.iml b/.idea/Model.iml index b0f9c00d..4413bb06 100644 --- a/.idea/Model.iml +++ b/.idea/Model.iml @@ -7,7 +7,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index 1122b380..6f308057 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,7 +3,7 @@ - + diff --git a/backend/OrdnanceSurvey.py b/backend/OrdnanceSurvey.py index 156e72bf..1c2ed90f 100644 --- a/backend/OrdnanceSurvey.py +++ b/backend/OrdnanceSurvey.py @@ -22,6 +22,10 @@ class OrdnanceSuveyClient: self.results = None + self.most_relevant_result = None + self.property_type = None + self.built_form = None + @lru_cache(maxsize=128) def get_places_api(self): """ @@ -39,9 +43,18 @@ class OrdnanceSuveyClient: data = response.json() results = data['results'] self.results = results + + # Extract some details about the best match + self.most_relevant_result = self.results[0]["DPA"] + + self.property_type, self.built_form = self.parse_classification_code( + self.most_relevant_result["CLASSIFICATION_CODE"] + ) + + return else: logger.info("Could not find any results for the provided address and postcode") - return + return {"status": response.status_code} @staticmethod def parse_classification_code(classification_code: str): diff --git a/backend/Property.py b/backend/Property.py index 41696c37..5d465ce9 100644 --- a/backend/Property.py +++ b/backend/Property.py @@ -18,7 +18,6 @@ from recommendations.recommendation_utils import ( ) ENVIRONMENT = os.environ.get('ENVIRONMENT', 'dev') -EPC_AUTH_TOKEN = os.environ.get('EPC_AUTH_TOKEN') DATA_BUCKET = os.environ.get('DATA_BUCKET', 'retrofit-data-dev' if ENVIRONMENT == 'dev' else None) logger = setup_logger() @@ -49,16 +48,16 @@ class Property(Definitions): spatial = None - def __init__(self, id, postcode, address1, epc_client=None, data=None): + def __init__(self, id, data=None, old_data=None, full_sap_epc=None): self.id = id - self.postcode = postcode - self.address1 = address1 + self.data = data - self.old_data = None + self.old_data = old_data + self.full_sap_epc = full_sap_epc self.property_dimensions = None self.uprn = None - self.full_sap_epc = None + self.in_conservation_area, self.is_listed, self.is_heritage = None, None, None self.restricted_measures = False self.year_built = None @@ -92,47 +91,6 @@ class Property(Definitions): self.current_adjusted_energy = None self.expected_adjusted_energy = None - if epc_client: - self.epc_client = epc_client - else: - self.epc_client = EpcClient(auth_token=EPC_AUTH_TOKEN) - - def search_address_epc(self): - """ - This method searches for an address in the EPC database and returns the first result - :return: property data - """ - if self.data: - return - - # This will fail if a property does not have an EPC - this has been documented as a case to handle - response = self.epc_client.domestic.search(params={"address": self.address1, "postcode": self.postcode}) - - # Check if we have a full sap EPC - self.full_sap_epc = [r for r in response["rows"] if r["transaction-type"] == "new dwelling"] - self.full_sap_epc = self.full_sap_epc[0] if self.full_sap_epc else self.full_sap_epc - - if len(response["rows"]) > 1: - newest_response = [ - r for r in response["rows"] if - r["lodgement-datetime"] == max([x["lodgement-datetime"] for x in response["rows"]]) - ] - if len(newest_response) > 1: - raise Exception("More than one result found for this address - investigate me") - - # We'll keep old EPCs in case it contains information, not present on the newest one - self.old_data = [epc for epc in response["rows"] if epc["lmk-key"] != newest_response[0]["lmk-key"]] - - response["rows"] = newest_response - - self.data = response["rows"][0] - # For the moment, if we don't have a UPRN, we don't do anything about it, however we'll handle this in - # the future by using the Ordnance Survey places API - if not self.data["uprn"]: - logger.warning("We do not have a UPRN for this property") - else: - self.uprn = int(self.data["uprn"]) - def set_energy(self): """ Extracts and formats data about the home's energy and co2 consumption diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 11ddec09..cd390b5e 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -173,6 +173,9 @@ class SearchEpc: ) self.data = None + self.newest_epc = None + self.older_epcs = None + self.full_sap_epc = None self.size = size if size is not None else 25 @@ -220,21 +223,25 @@ class SearchEpc: else: return None - def search(self): + def get_epc(self, params=None, size=None): # Get the EPC data with retries + size = size if size is not None else self.size + if params is None: + if self.uprn: + params = {"uprn": self.uprn} + else: + params = {"address": self.address1, "postcode": self.postcode} for retry in range(self.max_retries): try: - if self.uprn: + if "uprn" in params: # We use the direct call method inside, since we need to implement uprn as a valid # parameter for the search function url = os.path.join(self.client.domestic.host, "search") - response = self.client.domestic.call(method="get", url=url, params={"uprn": self.uprn}) + response = self.client.domestic.call(method="get", url=url, params=params, size=size) else: - response = self.client.domestic.search( - params={"address": self.address1, "postcode": self.postcode}, size=self.size - ) + response = self.client.domestic.search(params=params, size=size) if response: self.data = response @@ -367,7 +374,7 @@ class SearchEpc: return mode_value - def estimate_epc(self): + def estimate_epc(self, property_type, built_form): """ For a property that does not have an EPC, we retrieve the EPC data for the closest properties and estimate the EPC for the property in question. @@ -377,1637 +384,15 @@ class SearchEpc: :return: """ - address1 = "23 Butler House" - postcode = "e2 0pn" - os_data = [ - {'DPA': {'UPRN': '6037833', 'UDPRN': '7844379', - 'ADDRESS': 'FLAT 23, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.5, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '6037829', 'UDPRN': '7844375', - 'ADDRESS': 'FLAT 2, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 2', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182832.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.5, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Q'}}, { - 'DPA': {'UPRN': '6037843', 'UDPRN': '7844389', - 'ADDRESS': 'FLAT 32, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 32', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2G'}}, { - 'DPA': {'UPRN': '100120810104', 'UDPRN': '18054741', - 'ADDRESS': '23, BUTLER CLOSE, OXFORD, OX2 6JG', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER CLOSE', 'POST_TOWN': 'OXFORD', 'POSTCODE': 'OX2 6JG', - 'RPC': '1', 'X_COORDINATE': 450777.0, 'Y_COORDINATE': 207585.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 3110, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'OXFORD', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000017505469', 'LAST_UPDATE_DATE': '27/06/2022', - 'ENTRY_DATE': '23/04/2003', 'BLPU_STATE_DATE': '28/04/2001', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '6037832', 'UDPRN': '7844378', - 'ADDRESS': 'FLAT 22, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 22', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1T'}}, { - 'DPA': {'UPRN': '6037840', 'UDPRN': '7844386', - 'ADDRESS': 'FLAT 3, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 3', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2D'}}, { - 'DPA': {'UPRN': '6037821', 'UDPRN': '7844367', - 'ADDRESS': 'FLAT 12, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 12', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1E'}}, { - 'DPA': {'UPRN': '6037822', 'UDPRN': '7844368', - 'ADDRESS': 'FLAT 13, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 13', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1F'}}, { - 'DPA': {'UPRN': '6037830', 'UDPRN': '7844376', - 'ADDRESS': 'FLAT 20, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 20', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1R'}}, { - 'DPA': {'UPRN': '6037831', 'UDPRN': '7844377', - 'ADDRESS': 'FLAT 21, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 21', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1S'}}, { - 'DPA': {'UPRN': '6037834', 'UDPRN': '7844380', - 'ADDRESS': 'FLAT 24, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 24', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1W'}}, { - 'DPA': {'UPRN': '6037835', 'UDPRN': '7844381', - 'ADDRESS': 'FLAT 25, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 25', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1X'}}, { - 'DPA': {'UPRN': '6037836', 'UDPRN': '7844382', - 'ADDRESS': 'FLAT 26, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 26', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Y'}}, { - 'DPA': {'UPRN': '6037837', 'UDPRN': '7844383', - 'ADDRESS': 'FLAT 27, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 27', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Z'}}, { - 'DPA': {'UPRN': '6037838', 'UDPRN': '7844384', - 'ADDRESS': 'FLAT 28, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 28', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2A'}}, { - 'DPA': {'UPRN': '6037839', 'UDPRN': '7844385', - 'ADDRESS': 'FLAT 29, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 29', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2B'}}, { - 'DPA': {'UPRN': '6037841', 'UDPRN': '7844387', - 'ADDRESS': 'FLAT 30, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 30', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2E'}}, { - 'DPA': {'UPRN': '6037842', 'UDPRN': '7844388', - 'ADDRESS': 'FLAT 31, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 31', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2F'}}, { - 'DPA': {'UPRN': '6037844', 'UDPRN': '7844390', - 'ADDRESS': 'FLAT 33, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 33', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2H'}}, { - 'DPA': {'UPRN': '6037845', 'UDPRN': '7844391', - 'ADDRESS': 'FLAT 34, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 34', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2J'}}, { - 'DPA': {'UPRN': '6037846', 'UDPRN': '7844392', - 'ADDRESS': 'FLAT 35, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 35', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2L'}}, { - 'DPA': {'UPRN': '6037847', 'UDPRN': '7844393', - 'ADDRESS': 'FLAT 36, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 36', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2N'}}, { - 'DPA': {'UPRN': '6037848', 'UDPRN': '7844394', - 'ADDRESS': 'FLAT 37, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 37', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2P'}}, { - 'DPA': {'UPRN': '6037849', 'UDPRN': '7844395', - 'ADDRESS': 'FLAT 38, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 38', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2Q'}}, { - 'DPA': {'UPRN': '6037850', 'UDPRN': '7844396', - 'ADDRESS': 'FLAT 39, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 39', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2R'}}, { - 'DPA': {'UPRN': '6037818', 'UDPRN': '7844364', - 'ADDRESS': 'FLAT 1, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 1', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1A'}}, { - 'DPA': {'UPRN': '6037851', 'UDPRN': '7844397', - 'ADDRESS': 'FLAT 4, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 4', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2S'}}, { - 'DPA': {'UPRN': '6037853', 'UDPRN': '7844399', - 'ADDRESS': 'FLAT 5, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 5', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2U'}}, { - 'DPA': {'UPRN': '6037854', 'UDPRN': '7844400', - 'ADDRESS': 'FLAT 6, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 6', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2W'}}, { - 'DPA': {'UPRN': '6037855', 'UDPRN': '7844401', - 'ADDRESS': 'FLAT 7, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 7', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2X'}}, { - 'DPA': {'UPRN': '6037856', 'UDPRN': '7844402', - 'ADDRESS': 'FLAT 8, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 8', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2Y'}}, { - 'DPA': {'UPRN': '6037857', 'UDPRN': '7844403', - 'ADDRESS': 'FLAT 9, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 9', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535439.0, 'Y_COORDINATE': 182828.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2Z'}}, { - 'DPA': {'UPRN': '6037819', 'UDPRN': '7844365', - 'ADDRESS': 'FLAT 10, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 10', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1B'}}, { - 'DPA': {'UPRN': '6037820', 'UDPRN': '7844366', - 'ADDRESS': 'FLAT 11, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 11', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1D'}}, { - 'DPA': {'UPRN': '6037823', 'UDPRN': '7844369', - 'ADDRESS': 'FLAT 14, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 14', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1G'}}, { - 'DPA': {'UPRN': '6037824', 'UDPRN': '7844370', - 'ADDRESS': 'FLAT 15, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 15', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1H'}}, { - 'DPA': {'UPRN': '6037825', 'UDPRN': '7844371', - 'ADDRESS': 'FLAT 16, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 16', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1J'}}, { - 'DPA': {'UPRN': '6037826', 'UDPRN': '7844372', - 'ADDRESS': 'FLAT 17, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 17', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1L'}}, { - 'DPA': {'UPRN': '6037827', 'UDPRN': '7844373', - 'ADDRESS': 'FLAT 18, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 18', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1N'}}, { - 'DPA': {'UPRN': '6037828', 'UDPRN': '7844374', - 'ADDRESS': 'FLAT 19, BUTLER HOUSE, BACTON STREET, LONDON, E2 0PN', - 'SUB_BUILDING_NAME': 'FLAT 19', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BACTON STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0PN', - 'RPC': '2', 'X_COORDINATE': 535436.0, 'Y_COORDINATE': 182835.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686710', 'PARENT_UPRN': '6128401', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1P'}}, { - 'DPA': {'UPRN': '100005484', 'UDPRN': '20364558', - 'ADDRESS': '23, BUTLER ROAD, DAGENHAM, RM8 2DT', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'DAGENHAM', 'POSTCODE': 'RM8 2DT', - 'RPC': '2', 'X_COORDINATE': 546681.0, 'Y_COORDINATE': 185956.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 5060, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BARKING AND DAGENHAM', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000007465373', 'LAST_UPDATE_DATE': '12/11/2018', - 'ENTRY_DATE': '01/01/1923', 'BLPU_STATE_DATE': '19/10/2009', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1S'}}, { - 'DPA': {'UPRN': '90215506', 'UDPRN': '54323251', 'ADDRESS': '23, BUTLER CLOSE, DUDLEY, DY1 4ST', - 'BUILDING_NUMBER': '23', 'THOROUGHFARE_NAME': 'BUTLER CLOSE', 'POST_TOWN': 'DUDLEY', - 'POSTCODE': 'DY1 4ST', 'RPC': '1', 'X_COORDINATE': 395277.0, 'Y_COORDINATE': 291399.0, - 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 4615, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'DUDLEY', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb5000005208567956', 'LAST_UPDATE_DATE': '12/04/2022', - 'ENTRY_DATE': '19/10/2016', 'BLPU_STATE_DATE': '19/10/2016', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1P'}}, { - 'DPA': {'UPRN': '6038165', 'UDPRN': '7845424', - 'ADDRESS': 'FLAT 23, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '100091297768', 'UDPRN': '20489790', - 'ADDRESS': '23, BUTLER HOUSE, ARGENT STREET, GRAYS, RM17 6LS', 'SUB_BUILDING_NAME': '23', - 'BUILDING_NAME': 'BUTLER HOUSE', 'THOROUGHFARE_NAME': 'ARGENT STREET', - 'POST_TOWN': 'GRAYS', 'POSTCODE': 'RM17 6LS', 'RPC': '2', 'X_COORDINATE': 561539.0, - 'Y_COORDINATE': 177535.0, 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', - 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 1595, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'THURROCK', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000000743609', 'PARENT_UPRN': '100091660367', - 'LAST_UPDATE_DATE': '12/11/2018', 'ENTRY_DATE': '22/04/2002', - 'BLPU_STATE_DATE': '22/04/2002', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '2465123670', 'UDPRN': '13173788', - 'ADDRESS': '23, BUTLER CLOSE, LEICESTER, LE4 7TP', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER CLOSE', 'POST_TOWN': 'LEICESTER', 'POSTCODE': 'LE4 7TP', - 'RPC': '1', 'X_COORDINATE': 461288.0, 'Y_COORDINATE': 307985.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 2465, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'LEICESTER CITY', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000023348951', 'LAST_UPDATE_DATE': '10/02/2016', - 'ENTRY_DATE': '10/04/2003', 'BLPU_STATE_DATE': '10/04/2003', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '100070981622', 'UDPRN': '1054333', - 'ADDRESS': '23, BUTLER ROAD, SOLIHULL, B92 7QL', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'SOLIHULL', 'POSTCODE': 'B92 7QL', - 'RPC': '1', 'X_COORDINATE': 413831.0, 'Y_COORDINATE': 283269.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 4625, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'SOLIHULL', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000021354544', 'LAST_UPDATE_DATE': '10/02/2016', - 'ENTRY_DATE': '14/11/2002', 'BLPU_STATE_DATE': '06/11/2009', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1T'}}, { - 'DPA': {'UPRN': '100090315357', 'UDPRN': '5239798', - 'ADDRESS': '23, BUTLER ROAD, HALSTEAD, CO9 1LL', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'HALSTEAD', 'POSTCODE': 'CO9 1LL', - 'RPC': '1', 'X_COORDINATE': 581028.0, 'Y_COORDINATE': 230625.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 1510, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BRAINTREE', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000004753569', 'LAST_UPDATE_DATE': '24/04/2019', - 'ENTRY_DATE': '16/04/2001', 'BLPU_STATE_DATE': '16/04/2001', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1L'}}, { - 'DPA': {'UPRN': '91966', 'UDPRN': '2741519', - 'ADDRESS': '23 BUTLER HOUSE, SUMMERHILL ROAD, BRISTOL, BS5 8HQ', - 'BUILDING_NAME': '23 BUTLER HOUSE', 'THOROUGHFARE_NAME': 'SUMMERHILL ROAD', - 'POST_TOWN': 'BRISTOL', 'POSTCODE': 'BS5 8HQ', 'RPC': '2', 'X_COORDINATE': 362679.0, - 'Y_COORDINATE': 173636.0, 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', - 'CLASSIFICATION_CODE': 'RD08', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Sheltered Accommodation', - 'LOCAL_CUSTODIAN_CODE': 116, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BRISTOL', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000015134420', 'PARENT_UPRN': '91963', - 'LAST_UPDATE_DATE': '28/07/2020', 'ENTRY_DATE': '16/01/1997', - 'BLPU_STATE_DATE': '16/01/1997', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '2630183449', 'UDPRN': '53937961', - 'ADDRESS': '23, BUTLER GARDENS, WYMONDHAM, NR18 0GE', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER GARDENS', 'POST_TOWN': 'WYMONDHAM', 'POSTCODE': 'NR18 0GE', - 'RPC': '1', 'X_COORDINATE': 612795.66, 'Y_COORDINATE': 303429.68, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 2630, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'SOUTH NORFOLK', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb5000005229788403', 'LAST_UPDATE_DATE': '24/04/2019', - 'ENTRY_DATE': '08/06/2015', 'BLPU_STATE_DATE': '21/11/2018', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2D'}}, { - 'DPA': {'UPRN': '100050385845', 'UDPRN': '10711132', - 'ADDRESS': '23, BUTLER ROAD, HARROGATE, HG1 4PF', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'HARROGATE', 'POSTCODE': 'HG1 4PF', - 'RPC': '1', 'X_COORDINATE': 430998.0, 'Y_COORDINATE': 456935.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 2745, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'NORTH YORKSHIRE', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000032665633', 'LAST_UPDATE_DATE': '30/03/2023', - 'ENTRY_DATE': '05/04/2001', 'BLPU_STATE_DATE': '05/04/2001', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2D'}}, { - 'DPA': {'UPRN': '100060219201', 'UDPRN': '19958031', - 'ADDRESS': '23, BUTLER CLOSE, BASINGSTOKE, RG22 6UF', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER CLOSE', 'POST_TOWN': 'BASINGSTOKE', 'POSTCODE': 'RG22 6UF', - 'RPC': '1', 'X_COORDINATE': 461229.0, 'Y_COORDINATE': 151529.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 1705, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BASINGSTOKE AND DEANE', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000013815926', 'LAST_UPDATE_DATE': '01/05/2021', - 'ENTRY_DATE': '03/05/2001', 'BLPU_STATE_DATE': '28/03/2009', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '100021255372', 'UDPRN': '10435391', - 'ADDRESS': '23, BUTLER AVENUE, HARROW, HA1 4EJ', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER AVENUE', 'POST_TOWN': 'HARROW', 'POSTCODE': 'HA1 4EJ', - 'RPC': '1', 'X_COORDINATE': 514794.44, 'Y_COORDINATE': 187933.1, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD02', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Detached', 'LOCAL_CUSTODIAN_CODE': 5450, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'HARROW', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000003018602', 'LAST_UPDATE_DATE': '10/02/2016', - 'ENTRY_DATE': '09/08/2004', 'BLPU_STATE_DATE': '17/08/2007', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1J'}}, { - 'DPA': {'UPRN': '100010537312', 'UDPRN': '19537132', - 'ADDRESS': '23, BUTLER PLACE, PRESTON, PR1 6BS', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER PLACE', 'POST_TOWN': 'PRESTON', 'POSTCODE': 'PR1 6BS', - 'RPC': '1', 'X_COORDINATE': 353907.0, 'Y_COORDINATE': 430681.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 2345, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'PRESTON', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000037964267', 'LAST_UPDATE_DATE': '24/04/2019', - 'ENTRY_DATE': '01/01/2004', 'BLPU_STATE_DATE': '03/12/2007', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1T'}}, { - 'DPA': {'UPRN': '10090793888', 'UDPRN': '53380797', - 'ADDRESS': '23, BUTLER DRIVE, ERITH, DA8 3AQ', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER DRIVE', 'POST_TOWN': 'ERITH', 'POSTCODE': 'DA8 3AQ', - 'RPC': '1', 'X_COORDINATE': 551416.62, 'Y_COORDINATE': 177160.6, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 5120, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BEXLEY', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb5000005152984756', 'LAST_UPDATE_DATE': '10/02/2016', - 'ENTRY_DATE': '14/01/2014', 'BLPU_STATE_DATE': '04/06/2015', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Q'}}, { - 'DPA': {'UPRN': '10022828895', 'UDPRN': '51566826', - 'ADDRESS': '23, BUTLER DRIVE, BRACKNELL, RG12 8DA', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER DRIVE', 'POST_TOWN': 'BRACKNELL', 'POSTCODE': 'RG12 8DA', - 'RPC': '1', 'X_COORDINATE': 484943.0, 'Y_COORDINATE': 168743.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 335, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BRACKNELL FOREST', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000002490438229', 'LAST_UPDATE_DATE': '10/02/2016', - 'ENTRY_DATE': '23/01/2009', 'BLPU_STATE_DATE': '23/01/2009', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '4Y'}}, { - 'DPA': {'UPRN': '100021255418', 'UDPRN': '10434913', - 'ADDRESS': '23, BUTLER ROAD, HARROW, HA1 4DS', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'HARROW', 'POSTCODE': 'HA1 4DS', - 'RPC': '1', 'X_COORDINATE': 514647.66, 'Y_COORDINATE': 187939.99, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 5450, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'HARROW', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000003018457', 'LAST_UPDATE_DATE': '10/02/2016', - 'ENTRY_DATE': '09/08/2004', 'BLPU_STATE_DATE': '17/08/2007', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1H'}}, { - 'DPA': {'UPRN': '10095848542', 'UDPRN': '56772037', - 'ADDRESS': '23, BUTLER STREET, MANCHESTER, M40 7SW', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'MANCHESTER', 'POSTCODE': 'M40 7SW', - 'RPC': '1', 'X_COORDINATE': 385363.25, 'Y_COORDINATE': 399029.33, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 4215, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'MANCHESTER', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '3', 'BLPU_STATE_CODE_DESCRIPTION': 'Unoccupied', - 'TOPOGRAPHY_LAYER_TOID': 'osgb5000005305734312', 'LAST_UPDATE_DATE': '08/12/2023', - 'ENTRY_DATE': '20/12/2021', 'BLPU_STATE_DATE': '06/12/2023', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Q'}}, { - 'DPA': {'UPRN': '14053961', 'UDPRN': '20066824', - 'ADDRESS': '23, BUTLER ROAD, CROWTHORNE, RG45 6QZ', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'CROWTHORNE', 'POSTCODE': 'RG45 6QZ', - 'RPC': '1', 'X_COORDINATE': 483577.0, 'Y_COORDINATE': 164784.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 360, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'WOKINGHAM', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000014499560', 'LAST_UPDATE_DATE': '10/02/2016', - 'ENTRY_DATE': '08/07/2000', 'BLPU_STATE_DATE': '01/02/2010', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1J'}}, { - 'DPA': {'UPRN': '38174349', 'UDPRN': '12536271', - 'ADDRESS': '23, BUTLER CRESCENT, LIVERPOOL, L6 9HS', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER CRESCENT', 'POST_TOWN': 'LIVERPOOL', 'POSTCODE': 'L6 9HS', - 'RPC': '1', 'X_COORDINATE': 336692.0, 'Y_COORDINATE': 391293.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 4310, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'LIVERPOOL', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000035036984', 'LAST_UPDATE_DATE': '23/03/2022', - 'ENTRY_DATE': '30/09/1999', 'BLPU_STATE_DATE': '30/09/1999', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1T'}}, { - 'DPA': {'UPRN': '63197467', 'UDPRN': '55267616', 'ADDRESS': '23, BUTLER WAY, WAKEFIELD, WF1 3DQ', - 'BUILDING_NUMBER': '23', 'THOROUGHFARE_NAME': 'BUTLER WAY', 'POST_TOWN': 'WAKEFIELD', - 'POSTCODE': 'WF1 3DQ', 'RPC': '1', 'X_COORDINATE': 433059.56, 'Y_COORDINATE': 421601.59, - 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 4725, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'WAKEFIELD', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb5000005255059772', 'LAST_UPDATE_DATE': '13/06/2022', - 'ENTRY_DATE': '04/06/2018', 'BLPU_STATE_DATE': '05/06/2018', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1P'}}, { - 'DPA': {'UPRN': '100010789959', 'UDPRN': '9117199', - 'ADDRESS': '23, BUTLER STREET, BLACKPOOL, FY1 3HR', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'BLACKPOOL', 'POSTCODE': 'FY1 3HR', - 'RPC': '1', 'X_COORDINATE': 331287.0, 'Y_COORDINATE': 436773.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 2373, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BLACKPOOL', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000037423291', 'LAST_UPDATE_DATE': '10/02/2016', - 'ENTRY_DATE': '18/04/2001', 'BLPU_STATE_DATE': '12/06/2007', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1H'}}, { - 'DPA': {'UPRN': '6038175', 'UDPRN': '7845434', - 'ADDRESS': 'FLAT 32, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 32', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2G'}}, { - 'DPA': {'UPRN': '100031395259', 'UDPRN': '16684081', - 'ADDRESS': '23, BUTLER CRESCENT, MANSFIELD, NG19 7LU', 'BUILDING_NUMBER': '23', - 'THOROUGHFARE_NAME': 'BUTLER CRESCENT', 'POST_TOWN': 'MANSFIELD', 'POSTCODE': 'NG19 7LU', - 'RPC': '1', 'X_COORDINATE': 451759.0, 'Y_COORDINATE': 362615.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 3025, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'MANSFIELD', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000022624910', 'LAST_UPDATE_DATE': '10/02/2016', - 'ENTRY_DATE': '07/11/2002', 'BLPU_STATE_DATE': '07/11/2002', 'LANGUAGE': 'EN', - 'MATCH': 0.4, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1J'}}, { - 'DPA': {'UPRN': '6038172', 'UDPRN': '7845431', - 'ADDRESS': 'FLAT 3, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 3', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2D'}}, { - 'DPA': {'UPRN': '6045644', 'UDPRN': '8071046', - 'ADDRESS': 'FLAT 23, BUTLER HOUSE, BURDETT ROAD, LONDON, E14 7AB', - 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'BURDETT ROAD', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E14 7AB', - 'RPC': '2', 'X_COORDINATE': 536908.0, 'Y_COORDINATE': 181460.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041732860', 'PARENT_UPRN': '6128774', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '6038164', 'UDPRN': '7845423', - 'ADDRESS': 'FLAT 22, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 22', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1T'}}, { - 'DPA': {'UPRN': '6038153', 'UDPRN': '7845412', - 'ADDRESS': 'FLAT 12, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 12', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1E'}}, { - 'DPA': {'UPRN': '6038154', 'UDPRN': '7845413', - 'ADDRESS': 'FLAT 13, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 13', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1F'}}, { - 'DPA': {'UPRN': '6038162', 'UDPRN': '7845421', - 'ADDRESS': 'FLAT 20, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 20', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1R'}}, { - 'DPA': {'UPRN': '6038163', 'UDPRN': '7845422', - 'ADDRESS': 'FLAT 21, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 21', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1S'}}, { - 'DPA': {'UPRN': '6038166', 'UDPRN': '7845425', - 'ADDRESS': 'FLAT 24, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 24', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1W'}}, { - 'DPA': {'UPRN': '6038167', 'UDPRN': '7845426', - 'ADDRESS': 'FLAT 25, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 25', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1X'}}, { - 'DPA': {'UPRN': '6038168', 'UDPRN': '7845427', - 'ADDRESS': 'FLAT 26, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 26', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Y'}}, { - 'DPA': {'UPRN': '6038169', 'UDPRN': '7845428', - 'ADDRESS': 'FLAT 27, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 27', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1Z'}}, { - 'DPA': {'UPRN': '6038170', 'UDPRN': '7845429', - 'ADDRESS': 'FLAT 28, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 28', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2A'}}, { - 'DPA': {'UPRN': '6038171', 'UDPRN': '7845430', - 'ADDRESS': 'FLAT 29, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 29', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2B'}}, { - 'DPA': {'UPRN': '6038173', 'UDPRN': '7845432', - 'ADDRESS': 'FLAT 30, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 30', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2E'}}, { - 'DPA': {'UPRN': '6038174', 'UDPRN': '7845433', - 'ADDRESS': 'FLAT 31, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 31', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2F'}}, { - 'DPA': {'UPRN': '6038150', 'UDPRN': '7845409', - 'ADDRESS': 'FLAT 1, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 1', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1A'}}, { - 'DPA': {'UPRN': '6038176', 'UDPRN': '7845435', - 'ADDRESS': 'FLAT 4, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 4', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2H'}}, { - 'DPA': {'UPRN': '6038177', 'UDPRN': '7845436', - 'ADDRESS': 'FLAT 5, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 5', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2J'}}, { - 'DPA': {'UPRN': '6038178', 'UDPRN': '7845437', - 'ADDRESS': 'FLAT 6, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 6', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2L'}}, { - 'DPA': {'UPRN': '6038179', 'UDPRN': '7845438', - 'ADDRESS': 'FLAT 7, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 7', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2N'}}, { - 'DPA': {'UPRN': '6038180', 'UDPRN': '7845439', - 'ADDRESS': 'FLAT 8, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 8', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2P'}}, { - 'DPA': {'UPRN': '6038181', 'UDPRN': '7845440', - 'ADDRESS': 'FLAT 9, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 9', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.4, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '2Q'}}, { - 'DPA': {'UPRN': '6038151', 'UDPRN': '7845410', - 'ADDRESS': 'FLAT 10, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 10', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1B'}}, { - 'DPA': {'UPRN': '6038152', 'UDPRN': '7845411', - 'ADDRESS': 'FLAT 11, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 11', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1D'}}, { - 'DPA': {'UPRN': '6038155', 'UDPRN': '7845414', - 'ADDRESS': 'FLAT 14, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 14', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1G'}}, { - 'DPA': {'UPRN': '6038156', 'UDPRN': '7845415', - 'ADDRESS': 'FLAT 15, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 15', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1H'}}, { - 'DPA': {'UPRN': '6038157', 'UDPRN': '7845416', - 'ADDRESS': 'FLAT 16, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 16', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1J'}}, { - 'DPA': {'UPRN': '6038158', 'UDPRN': '7845417', - 'ADDRESS': 'FLAT 17, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 17', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1L'}}, { - 'DPA': {'UPRN': '6038159', 'UDPRN': '7845418', - 'ADDRESS': 'FLAT 18, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 18', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1N'}}, { - 'DPA': {'UPRN': '6038160', 'UDPRN': '7845419', - 'ADDRESS': 'FLAT 19, BEVIN HOUSE, BUTLER STREET, LONDON, E2 0RW', - 'SUB_BUILDING_NAME': 'FLAT 19', 'BUILDING_NAME': 'BEVIN HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'E2 0RW', - 'RPC': '2', 'X_COORDINATE': 535491.0, 'Y_COORDINATE': 182853.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5900, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'TOWER HAMLETS', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000041686692', 'PARENT_UPRN': '6128805', - 'LAST_UPDATE_DATE': '20/06/2022', 'ENTRY_DATE': '08/05/2003', - 'BLPU_STATE_DATE': '08/05/2003', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1P'}}, { - 'DPA': {'UPRN': '3040038989', 'UDPRN': '16547514', - 'ADDRESS': '23, BUTLER CLOSE, CROPWELL BUTLER, NOTTINGHAM, NG12 3AF', - 'BUILDING_NUMBER': '23', 'THOROUGHFARE_NAME': 'BUTLER CLOSE', - 'DEPENDENT_LOCALITY': 'CROPWELL BUTLER', 'POST_TOWN': 'NOTTINGHAM', - 'POSTCODE': 'NG12 3AF', 'RPC': '2', 'X_COORDINATE': 468456.0, 'Y_COORDINATE': 336688.0, - 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 3040, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'RUSHCLIFFE', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000023504919', 'LAST_UPDATE_DATE': '01/10/2019', - 'ENTRY_DATE': '13/12/2000', 'BLPU_STATE_DATE': '13/12/2000', 'LANGUAGE': 'EN', - 'MATCH': 0.3, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '200003357053', 'UDPRN': '21443062', - 'ADDRESS': 'FLAT 23, PETER BUTLER HOUSE, WOLSELEY STREET, LONDON, SE1 2BJ', - 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'PETER BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'WOLSELEY STREET', 'POST_TOWN': 'LONDON', 'POSTCODE': 'SE1 2BJ', - 'RPC': '2', 'X_COORDINATE': 534088.0, 'Y_COORDINATE': 179747.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5840, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'SOUTHWARK', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000006172980', 'PARENT_UPRN': '200003500897', - 'LAST_UPDATE_DATE': '10/02/2016', 'ENTRY_DATE': '20/05/2003', - 'BLPU_STATE_DATE': '08/04/2009', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '100100221882', 'UDPRN': '4625510', - 'ADDRESS': '23, BUTLER STREET, SHOTTON, GLANNAU DYFRDWY, CH5 1AP', - 'BUILDING_NUMBER': '23', 'THOROUGHFARE_NAME': 'BUTLER STREET', - 'DEPENDENT_LOCALITY': 'SHOTTON', 'POST_TOWN': 'GLANNAU DYFRDWY', 'POSTCODE': 'CH5 1AP', - 'RPC': '1', 'X_COORDINATE': 330758.0, 'Y_COORDINATE': 368483.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD04', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Terraced', 'LOCAL_CUSTODIAN_CODE': 6835, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'FLINTSHIRE', 'COUNTRY_CODE': 'W', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within Wales', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000034722275', 'LAST_UPDATE_DATE': '16/05/2022', - 'ENTRY_DATE': '10/05/2001', 'BLPU_STATE_DATE': '10/05/2001', 'LANGUAGE': 'CY', - 'MATCH': 0.3, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '200001132475', 'UDPRN': '26597335', - 'ADDRESS': '23 MORRIS HOUSE, BUTLER STREET, WIGAN, WN1 3QY', - 'BUILDING_NAME': '23 MORRIS HOUSE', 'THOROUGHFARE_NAME': 'BUTLER STREET', - 'POST_TOWN': 'WIGAN', 'POSTCODE': 'WN1 3QY', 'RPC': '2', 'X_COORDINATE': 358656.0, - 'Y_COORDINATE': 405727.0, 'STATUS': 'APPROVED', 'LOGICAL_STATUS_CODE': '1', - 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 4250, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'WIGAN', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000038141883', 'PARENT_UPRN': '200001174781', - 'LAST_UPDATE_DATE': '10/02/2016', 'ENTRY_DATE': '15/01/2002', - 'BLPU_STATE_DATE': '15/01/2002', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '100021167639', 'UDPRN': '15753729', - 'ADDRESS': 'FLAT 23, JOYCE BUTLER HOUSE, COMMERCE ROAD, LONDON, N22 8EA', - 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'JOYCE BUTLER HOUSE', - 'THOROUGHFARE_NAME': 'COMMERCE ROAD', 'POST_TOWN': 'LONDON', 'POSTCODE': 'N22 8EA', - 'RPC': '2', 'X_COORDINATE': 530743.0, 'Y_COORDINATE': 190869.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5420, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'LONDON BOROUGH OF HARINGEY', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000005603686', 'PARENT_UPRN': '100023656717', - 'LAST_UPDATE_DATE': '16/05/2022', 'ENTRY_DATE': '31/03/2004', - 'BLPU_STATE_DATE': '24/03/2004', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}, { - 'DPA': {'UPRN': '200001825227', 'UDPRN': '1679218', - 'ADDRESS': 'BUTLER HOUSE, BUTLER LANE, BAILDON, SHIPLEY, BD17 6PG', - 'BUILDING_NAME': 'BUTLER HOUSE', 'THOROUGHFARE_NAME': 'BUTLER LANE', - 'DEPENDENT_LOCALITY': 'BAILDON', 'POST_TOWN': 'SHIPLEY', 'POSTCODE': 'BD17 6PG', - 'RPC': '1', 'X_COORDINATE': 415603.0, 'Y_COORDINATE': 439584.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD03', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Semi-Detached', 'LOCAL_CUSTODIAN_CODE': 4705, - 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BRADFORD MDC', 'COUNTRY_CODE': 'E', - 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000031973762', 'LAST_UPDATE_DATE': '10/02/2016', - 'ENTRY_DATE': '02/07/2002', 'BLPU_STATE_DATE': '02/07/2002', 'LANGUAGE': 'EN', - 'MATCH': 0.3, 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1B'}}, { - 'DPA': {'UPRN': '202082612', 'UDPRN': '17825144', - 'ADDRESS': 'FLAT 23, HUGH GAITSKELL HOUSE, BUTLER ROAD, LONDON, NW10 9RT', - 'SUB_BUILDING_NAME': 'FLAT 23', 'BUILDING_NAME': 'HUGH GAITSKELL HOUSE', - 'THOROUGHFARE_NAME': 'BUTLER ROAD', 'POST_TOWN': 'LONDON', 'POSTCODE': 'NW10 9RT', - 'RPC': '2', 'X_COORDINATE': 521511.0, 'Y_COORDINATE': 184340.0, 'STATUS': 'APPROVED', - 'LOGICAL_STATUS_CODE': '1', 'CLASSIFICATION_CODE': 'RD06', - 'CLASSIFICATION_CODE_DESCRIPTION': 'Self Contained Flat (Includes Maisonette / ' - 'Apartment)', - 'LOCAL_CUSTODIAN_CODE': 5150, 'LOCAL_CUSTODIAN_CODE_DESCRIPTION': 'BRENT', - 'COUNTRY_CODE': 'E', 'COUNTRY_CODE_DESCRIPTION': 'This record is within England', - 'POSTAL_ADDRESS_CODE': 'D', - 'POSTAL_ADDRESS_CODE_DESCRIPTION': 'A record which is linked to PAF', - 'BLPU_STATE_CODE': '2', 'BLPU_STATE_CODE_DESCRIPTION': 'In use', - 'TOPOGRAPHY_LAYER_TOID': 'osgb1000042025598', 'PARENT_UPRN': '202191825', - 'LAST_UPDATE_DATE': '10/02/2016', 'ENTRY_DATE': '13/09/1979', - 'BLPU_STATE_DATE': '10/08/2007', 'LANGUAGE': 'EN', 'MATCH': 0.3, - 'MATCH_DESCRIPTION': 'NO MATCH', 'DELIVERY_POINT_SUFFIX': '1U'}}] - - # TEMP - # from dotenv import load_dotenv - # from pathlib import Path - # ENV_FILE = Path(__file__).parent / "etl" / "eligibility" / "ha_15_32" / ".env" - # load_dotenv(ENV_FILE) - # self = SearchEpc(address1=address1, postcode=postcode) - # From the ordnance survey data, we want to determine the property type and then use only similar property # types for the estimation - property_os_place = os_data[0]["DPA"] - - os_property_type, os_built_form = self.ordnance_survey_client.parse_classification_code( - property_os_place["CLASSIFICATION_CODE"] - ) # We firstly get the first 100 properties for the postcode, from the EPC api - epc_reponse = self.client.domestic.search(params={"postcode": self.postcode}, size=100) - epc_data = pd.DataFrame(epc_reponse["rows"]) + epc_reponse = self.get_epc(params={"postcode": self.postcode}, size=100) + if epc_reponse["status"] != 200: + raise Exception("Unable to find postcode data - investigate me") + + epc_data = pd.DataFrame(self.data["rows"]) # We now get the newest EPC per uprn epc_data = epc_data.sort_values("lodgement-datetime", ascending=False).groupby("uprn").head(1) @@ -2029,14 +414,14 @@ class SearchEpc: # We check if the EPC built form is one of the terraced values. If the os_built_form is semi-detached, # then we set it to be end terraced - if os_built_form == "Semi-Detached" and epc_built_form in ["End-Terraced", "Mid-Terraced"]: + if built_form == "Semi-Detached" and epc_built_form in ["End-Terraced", "Mid-Terraced"]: estimation_built_form = "End-Terraced" - elif os_built_form == "": + elif built_form == "": estimation_built_form = epc_built_form else: - estimation_built_form = os_built_form + estimation_built_form = built_form - estimation_property_type = epc_property_type if os_property_type == "" else os_property_type + estimation_property_type = epc_property_type if property_type == "" else property_type # We filter the EPC data on just the property types we want to use epc_data = epc_data[ @@ -2073,6 +458,10 @@ class SearchEpc: estimated_epc[key] = estimated_value + estimated_epc["postcode"] = self.postcode + # Indicate that this epc was estimated + estimated_epc["estimated"] = True + return estimated_epc @staticmethod @@ -2104,3 +493,27 @@ class SearchEpc: If there is no EPC data, the epc data will be estimated based on the surrounding properties """ + + # Step 1: use the epc api to find the property and uprn + response = self.get_epc() + + if response["status"] == 200: + self.newest_epc, self.older_epcs, self.full_sap_epc = self.retrieve(address=self.full_address) + return + + # Step 2: If we don't have an EPC, we use the ordnance survey api to find the uprn + os_response = self.ordnance_survey_client.get_places_api() + + if os_response["status"] != 200: + # Investigate this if it happens + raise Exception("Unable to find property - investigate me") + + # Step 3: Now that we have a urpn, do another check against the epc api, this time searching with the uprn + self.uprn = self.ordnance_survey_client.results[0]["DPA"]["UPRN"] + response = self.get_epc() + if response["status"] == 200: + self.newest_epc, self.older_epcs, self.full_sap_epc = self.retrieve(address=self.full_address) + return + + # Step 4: If we still don't have an EPC, we estimate the EPC data + estimated_epc = self.estimate_epc() diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index 233a18cb..31e7b023 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -75,15 +75,16 @@ async def trigger_plan(body: PlanTriggerRequest): # We validate each record in the file. If the record is NOT valid, we need to handle this accordingly # TODO: implment validation. We should also standardise postcode and address in some fashion as # a postcode of abcdef would be considered different to ABCDEF - # TODO: Search for the property + epc_searcher = SearchEpc( - address1=config['address'], + address1=config["address"], postcode=config["postcode"], auth_token=get_settings().EPC_AUTH_TOKEN, os_api_key=get_settings().ORDNANCE_SURVEY_API_KEY ) epc_searcher.find_property() - # Create a record in db + # Create a record in db - TODO: Create this using the epc address and postcode and validate with + # uprn property_id, is_new = create_property( session, portfolio_id=body.portfolio_id, address=config['address'], postcode=config['postcode'] ) @@ -102,10 +103,10 @@ async def trigger_plan(body: PlanTriggerRequest): input_properties.append( Property( - postcode=config['postcode'], - address1=config['address'], - epc_client=epc_client, - id=property_id + id=property_id, + data=epc_searcher.newest_epc, + old_data=epc_searcher.older_epcs, + full_sap_epc=epc_searcher.full_sap_epc, ) ) From 19951b9ca143a522a4787359546a6225eb2ac96c Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 14:27:54 +0000 Subject: [PATCH 09/32] Added address formatting --- backend/OrdnanceSurvey.py | 38 ++++++++++++++------ backend/SearchEpc.py | 72 +++++++++++++++++++++++++++++--------- backend/app/plan/router.py | 5 --- 3 files changed, 83 insertions(+), 32 deletions(-) diff --git a/backend/OrdnanceSurvey.py b/backend/OrdnanceSurvey.py index 1c2ed90f..837e76bd 100644 --- a/backend/OrdnanceSurvey.py +++ b/backend/OrdnanceSurvey.py @@ -25,6 +25,28 @@ class OrdnanceSuveyClient: self.most_relevant_result = None self.property_type = None self.built_form = None + # This will be postcode and address, as returned by the ordnance survey + self.address_os = None + self.postcode_os = None + + def set_places_address(self): + """ + Given a response from the places api, this function will set the address and postcode of the property + """ + + if self.most_relevant_result is None: + raise ValueError("No results found - run get_places_api first") + + self.address_os = self.most_relevant_result["ADDRESS"] + self.postcode_os = self.most_relevant_result["POSTCODE"] + # We strip out the postcode from the address as this is already stored separately + self.address_os = self.address_os.replace(self.postcode_os, "").strip() + # Remove trailing comma + self.address_os = self.address_os.rstrip(",").strip() + # Convert to title case + self.address_os = self.address_os.title() + # Make sure postcode is upper case + self.postcode_os = self.postcode_os.upper() @lru_cache(maxsize=128) def get_places_api(self): @@ -47,17 +69,15 @@ class OrdnanceSuveyClient: # Extract some details about the best match self.most_relevant_result = self.results[0]["DPA"] - self.property_type, self.built_form = self.parse_classification_code( - self.most_relevant_result["CLASSIFICATION_CODE"] - ) + self.parse_classification_code(self.most_relevant_result["CLASSIFICATION_CODE"]) + self.set_places_address() - return else: logger.info("Could not find any results for the provided address and postcode") + return {"status": response.status_code} - @staticmethod - def parse_classification_code(classification_code: str): + def parse_classification_code(self, classification_code: str): """ This function will convert the classification code, returned by the OS places api, to a property type that is compatible with the EPC database. @@ -81,7 +101,5 @@ class OrdnanceSuveyClient: } mapped = value_map.get(classification_code, {}) - property_type = mapped.get("property_type", "") - built_form = mapped.get("built_form", "") - - return property_type, built_form + self.property_type = mapped.get("property_type", "") + self.built_form = mapped.get("built_form", "") diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index cd390b5e..d40a40b5 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -177,6 +177,10 @@ class SearchEpc: self.older_epcs = None self.full_sap_epc = None + # These are the address and postcode values, which we store in the database + self.address_clean = None + self.postcode_clean = None + self.size = size if size is not None else 25 @classmethod @@ -239,7 +243,7 @@ class SearchEpc: # We use the direct call method inside, since we need to implement uprn as a valid # parameter for the search function url = os.path.join(self.client.domestic.host, "search") - response = self.client.domestic.call(method="get", url=url, params=params, size=size) + response = self.client.domestic.call(method="get", url=url, params=params) else: response = self.client.domestic.search(params=params, size=size) @@ -312,7 +316,24 @@ class SearchEpc: return rows - def retrieve(self, property_type=None, address=None): + @staticmethod + def format_address(newest_epc): + """ + Format address and postcode for storage in the database + """ + postcode = newest_epc["postcode"] + address = newest_epc["address"] + + # Format them + address = address.replace(postcode, "").strip() + address = address.rstrip(",").strip() + address = address.title() + + postcode = postcode.upper() + + return address, postcode + + def extract_epc_data(self, property_type=None, address=None): """ Given a successful search, this method will format the data and return it @@ -338,7 +359,10 @@ class SearchEpc: # Finally, we identify the newest epc and the rest, and then return newest_epc, older_epcs = self.filter_newest_epc(list_of_epcs=rows) - return newest_epc, older_epcs, full_sap_epc + # Retrieve postcode and address + address_epc, postcode_epc = self.format_address(newest_epc=newest_epc) + + return newest_epc, older_epcs, full_sap_epc, address_epc, postcode_epc @staticmethod def filter_newest_epc(list_of_epcs: List): @@ -381,6 +405,10 @@ class SearchEpc: Note - do we have postcodes with just a single address? We would need to use a different approach to find the closest homes + :param property_type: This is the property type of the property we are estimating, that can be retrieved from + the ordnance survey api + :param built_form: This is the built form of the property we are estimating, that can be retrieved from + the ordnance survey api :return: """ @@ -400,14 +428,14 @@ class SearchEpc: # For each record, parse the house number. We'll use this to identify the closest properties epc_data["house_number"] = epc_data["address"].apply(lambda add1: self.get_house_number(add1)) - # We convert the house number fo a purely numeric format - therefore + # We convert the house number fo a purely numeric format - This numeric house number will be used as + # a distance weight when estimating the EPC epc_data["numeric_house_number"] = epc_data["house_number"].apply( lambda house_num: self.extract_numeric_housenumber_part(house_num) ) - epc_data["house_number_distance"] = abs( - epc_data["numeric_house_number"] - self.numeric_house_number - ) + epc_data["house_number_distance"] = abs(epc_data["numeric_house_number"] - self.numeric_house_number) + epc_data["weight"] = 1 / epc_data["house_number_distance"] epc_built_form = self._get_epc_mode(col="built-form", epc_data=epc_data) epc_property_type = self._get_epc_mode(col="property-type", epc_data=epc_data) @@ -428,13 +456,8 @@ class SearchEpc: (epc_data["built-form"] == estimation_built_form) & (epc_data["property-type"] == estimation_property_type) ] - epc_data["weight"] = 1 / epc_data["house_number_distance"] - - # We use house_number_distance as a weighting where closer homes are upweighted when interpolating - # For each attribute, we need to determine the datatype and use an appropriate method - # to interpolate. - + # to estimate. estimated_epc = {} for key, vartype in vartypes.items(): epc_data[key] = np.where(pd.isnull(epc_data[key]), None, epc_data[key]) @@ -498,7 +521,9 @@ class SearchEpc: response = self.get_epc() if response["status"] == 200: - self.newest_epc, self.older_epcs, self.full_sap_epc = self.retrieve(address=self.full_address) + ( + self.newest_epc, self.older_epcs, self.full_sap_epc, self.address_clean, self.postcode_clean + ) = self.extract_epc_data(address=self.full_address) return # Step 2: If we don't have an EPC, we use the ordnance survey api to find the uprn @@ -509,11 +534,24 @@ class SearchEpc: raise Exception("Unable to find property - investigate me") # Step 3: Now that we have a urpn, do another check against the epc api, this time searching with the uprn - self.uprn = self.ordnance_survey_client.results[0]["DPA"]["UPRN"] + self.uprn = self.ordnance_survey_client.most_relevant_result["UPRN"] response = self.get_epc() if response["status"] == 200: - self.newest_epc, self.older_epcs, self.full_sap_epc = self.retrieve(address=self.full_address) + ( + self.newest_epc, self.older_epcs, self.full_sap_epc, self.address_clean, self.postcode_clean + ) = self.extract_epc_data(address=self.ordnance_survey_client.most_relevant_result["ADDRESS"]) return # Step 4: If we still don't have an EPC, we estimate the EPC data - estimated_epc = self.estimate_epc() + estimated_epc = self.estimate_epc( + property_type=self.ordnance_survey_client.property_type, + built_form=self.ordnance_survey_client.built_form + ) + self.newest_epc = estimated_epc + self.older_epcs = [] + self.full_sap_epc = {} + + # Finally, set a standardised address 1 and postcode + self.address_clean = self.ordnance_survey_client.address_os + self.postcode_clean = self.ordnance_survey_client.postcode_os + return diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index 31e7b023..1cd3317d 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -2,7 +2,6 @@ from datetime import datetime import numpy as np import pandas as pd -from epc_api.client import EpcClient from backend.SearchEpc import SearchEpc from fastapi import APIRouter, Depends from sqlalchemy.exc import IntegrityError, OperationalError @@ -60,7 +59,6 @@ async def trigger_plan(body: PlanTriggerRequest): try: session.begin() logger.info("Getting the inputs") - epc_client = EpcClient(auth_token=get_settings().EPC_AUTH_TOKEN) plan_input = read_csv_from_s3(bucket_name=get_settings().PLAN_TRIGGER_BUCKET, filepath=body.trigger_file_path) uprn_filenames = read_dataframe_from_s3_parquet( @@ -73,8 +71,6 @@ async def trigger_plan(body: PlanTriggerRequest): input_properties = [] for config in plan_input: # We validate each record in the file. If the record is NOT valid, we need to handle this accordingly - # TODO: implment validation. We should also standardise postcode and address in some fashion as - # a postcode of abcdef would be considered different to ABCDEF epc_searcher = SearchEpc( address1=config["address"], @@ -91,7 +87,6 @@ async def trigger_plan(body: PlanTriggerRequest): # if a new record was not created, we don't produduce recommendations if not is_new: continue - # TODO: Need to add heat demand target create_property_targets( session, From c11eb1abaaed5364e45d798251b89f8e5edf5fee Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 14:32:15 +0000 Subject: [PATCH 10/32] cleaned up the temp filling of missing uprn --- backend/SearchEpc.py | 1 + backend/app/plan/router.py | 16 +++------------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index d40a40b5..c8008906 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -482,6 +482,7 @@ class SearchEpc: estimated_epc[key] = estimated_value estimated_epc["postcode"] = self.postcode + estimated_epc["uprn"] = self.uprn # Indicate that this epc was estimated estimated_epc["estimated"] = True diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index 1cd3317d..a0f6da7f 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -79,10 +79,9 @@ async def trigger_plan(body: PlanTriggerRequest): os_api_key=get_settings().ORDNANCE_SURVEY_API_KEY ) epc_searcher.find_property() - # Create a record in db - TODO: Create this using the epc address and postcode and validate with - # uprn + # Create a record in db property_id, is_new = create_property( - session, portfolio_id=body.portfolio_id, address=config['address'], postcode=config['postcode'] + session, body.portfolio_id, epc_searcher.address_clean, epc_searcher.postcode_clean ) # if a new record was not created, we don't produduce recommendations if not is_new: @@ -108,9 +107,8 @@ async def trigger_plan(body: PlanTriggerRequest): if not input_properties: return Response(status_code=204) - logger.info("Getting EPC, and spatial data") + logger.info("Getting spatial data") for p in input_properties: - p.search_address_epc() p.set_year_built() p.get_spatial_data(uprn_filenames) @@ -151,9 +149,6 @@ async def trigger_plan(body: PlanTriggerRequest): # Finally, we'll prepare data for predicting the impact on SAP data_processor = DataProcessor(None, newdata=True) data_processor.insert_data(pd.DataFrame([p.get_model_data()])) - # TODO: Temp - if data_processor.data["UPRN"].values[0] == "": - data_processor.data["UPRN"] = 0 data_processor.pre_process() @@ -515,11 +510,6 @@ async def trigger_plan(body: PlanTriggerRequest): update_or_create_property_spatial_details(session, p.uprn, p.spatial) - # TODO: TEMP - if p.data["uprn"] == "": - print("Get rid of me!") - p.data["uprn"] = 0 - property_data = p.get_full_property_data() update_property_data( session, property_id=p.id, portfolio_id=body.portfolio_id, property_data=property_data From e82fa9c11f224878ce28c83ea0bb500cd21e3934 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 15:44:42 +0000 Subject: [PATCH 11/32] minor changes to EpcSearcher --- backend/Property.py | 1 + backend/SearchEpc.py | 2 +- backend/app/plan/router.py | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/Property.py b/backend/Property.py index 5d465ce9..27b1e8f1 100644 --- a/backend/Property.py +++ b/backend/Property.py @@ -240,6 +240,7 @@ class Property(Definitions): if self.data["property-type"] == "Flat": self.data["built-form"] = "Semi-Detached" + self.set_year_built() self.set_energy() self.set_ventilation() self.set_solar_pv() diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index c8008906..087710b8 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -540,7 +540,7 @@ class SearchEpc: if response["status"] == 200: ( self.newest_epc, self.older_epcs, self.full_sap_epc, self.address_clean, self.postcode_clean - ) = self.extract_epc_data(address=self.ordnance_survey_client.most_relevant_result["ADDRESS"]) + ) = self.extract_epc_data() return # Step 4: If we still don't have an EPC, we estimate the EPC data diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index a0f6da7f..c7adfeb7 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -109,7 +109,6 @@ async def trigger_plan(body: PlanTriggerRequest): logger.info("Getting spatial data") for p in input_properties: - p.set_year_built() p.get_spatial_data(uprn_filenames) # The materials data could be cached or local so we don't need to make From 68458f1b9193752d969d29440f5c8fdecdb8d561 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 15:45:42 +0000 Subject: [PATCH 12/32] Added uprn to create_property --- backend/app/db/functions/property_functions.py | 5 +++-- backend/app/plan/router.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/app/db/functions/property_functions.py b/backend/app/db/functions/property_functions.py index 93dc0c49..88b4e87d 100644 --- a/backend/app/db/functions/property_functions.py +++ b/backend/app/db/functions/property_functions.py @@ -11,7 +11,7 @@ from backend.app.db.models.portfolio import ( from sqlalchemy.orm.exc import NoResultFound -def create_property(session: Session, portfolio_id: int, address: str, postcode: str) -> (int, bool): +def create_property(session: Session, portfolio_id: int, address: str, postcode: str, uprn: str) -> (int, bool): """ This function will create a record for the property in the database if it does not exist. If it does exist, it will just update the updated_at field. @@ -25,7 +25,7 @@ def create_property(session: Session, portfolio_id: int, address: str, postcode: try: # Attempt to fetch the existing property existing_property = session.query(PropertyModel).filter_by( - address=address, postcode=postcode, portfolio_id=portfolio_id + uprn=uprn, portfolio_id=portfolio_id ).one() # Update the 'updated_at' field @@ -43,6 +43,7 @@ def create_property(session: Session, portfolio_id: int, address: str, postcode: address=address, postcode=postcode, portfolio_id=portfolio_id, + uprn=uprn, creation_status=PropertyCreationStatus.LOADING, status=PortfolioStatus.ASSESSMENT.value, has_pre_condition_report=False, diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index c7adfeb7..9e24126e 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -81,7 +81,7 @@ async def trigger_plan(body: PlanTriggerRequest): epc_searcher.find_property() # Create a record in db property_id, is_new = create_property( - session, body.portfolio_id, epc_searcher.address_clean, epc_searcher.postcode_clean + session, body.portfolio_id, epc_searcher.address_clean, epc_searcher.postcode_clean, epc_searcher.uprn ) # if a new record was not created, we don't produduce recommendations if not is_new: From e46a3d0a195de5ac77b4aa2253727f621f9ad9e5 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 17:54:14 +0000 Subject: [PATCH 13/32] expanding search method to find epcs if there are none in the postcode --- backend/SearchEpc.py | 136 +++++++++++++++++++++---------- etl/testing_data/estimate_epc.py | 108 ++++++++++++++++++++++++ 2 files changed, 200 insertions(+), 44 deletions(-) create mode 100644 etl/testing_data/estimate_epc.py diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 087710b8..543fa6b8 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -398,7 +398,81 @@ class SearchEpc: return mode_value - def estimate_epc(self, property_type, built_form): + def fetch_nearby_epcs( + self, initial_postcode: str, + lmks_to_drop: list[str] | None = None, + built_form: str = "", + property_type: str = "" + ): + """ + Fetches and processes EPC data for a given initial postcode, applying successive trimming + to the postcode and filtering the data until a non-empty result set is found. + + The function queries the EPC API with the provided postcode, and if no data is found or + if the data doesn't meet certain criteria, it progressively shortens the postcode by + removing the last character and retries the query. This process continues until a valid + set of EPC data is obtained or the postcode is exhausted. + + Additional filtering is applied to the obtained EPC data based on 'lmk-key', 'built-form', + and 'property-type'. The data is also processed to extract and numerically interpret house + numbers, calculate house number distances, and apply weights based on these distances. + + :param initial_postcode: The initial full postcode for the EPC data query. + :param lmks_to_drop: List of 'lmk-key' values to be excluded from the EPC data. + :param built_form: The 'built-form' value to be used for filtering the EPC data. + :param property_type: The 'property-type' value to be used for filtering the EPC data. + :return: + """ + postcode = initial_postcode + while postcode: + # Fetch data from EPC API + epc_response = self.get_epc(params={"postcode": postcode}, size=100) + + if epc_response["status"] == 200: + epc_data = pd.DataFrame(self.data["rows"]) + + if lmks_to_drop is not None: + epc_data = epc_data[~epc_data["lmk-key"].isin(lmks_to_drop)] + + if not epc_data.empty: + # Further processing of the EPC data + epc_data = epc_data.sort_values("lodgement-datetime", ascending=False).groupby("uprn").head(1) + epc_data["house_number"] = epc_data["address"].apply(lambda add1: self.get_house_number(add1)) + epc_data["numeric_house_number"] = epc_data["house_number"].apply( + lambda house_num: self.extract_numeric_housenumber_part(house_num) + ) + epc_data["house_number_distance"] = abs( + epc_data["numeric_house_number"] - self.numeric_house_number + ) + epc_data["weight"] = 1 / epc_data["house_number_distance"] + + epc_built_form = self._estimate_str(key="built-form", estimation_data=epc_data) + epc_property_type = self._estimate_str(key="property-type", estimation_data=epc_data) + + if built_form == "Semi-Detached" and epc_built_form in ["End-Terraced", "Mid-Terraced"]: + estimation_built_form = "End-Terraced" + elif built_form == "": + estimation_built_form = epc_built_form + else: + estimation_built_form = built_form + + estimation_property_type = epc_property_type if property_type == "" else property_type + + epc_data = epc_data[ + (epc_data["built-form"] == estimation_built_form) & ( + epc_data["property-type"] == estimation_property_type) + ] + + if not epc_data.empty: + return epc_data # Return the filtered data if it's not empty + + # Shorten the postcode by one character for the next iteration + postcode = postcode[:-1] + + # If loop finishes without a valid response, raise an exception + raise Exception("Unable to find postcode data after trimming - investigate me") + + def estimate_epc(self, property_type, built_form, lmks_to_drop=None): """ For a property that does not have an EPC, we retrieve the EPC data for the closest properties and estimate the EPC for the property in question. @@ -409,52 +483,20 @@ class SearchEpc: the ordnance survey api :param built_form: This is the built form of the property we are estimating, that can be retrieved from the ordnance survey api + :param lmks_to_drop: This is a list of LMK keys that should be dropped from the estimation process. This + is used as an override for testing, to drop EPCs for the property we are testing :return: """ # From the ordnance survey data, we want to determine the property type and then use only similar property - # types for the estimation - - # We firstly get the first 100 properties for the postcode, from the EPC api - epc_reponse = self.get_epc(params={"postcode": self.postcode}, size=100) - if epc_reponse["status"] != 200: - raise Exception("Unable to find postcode data - investigate me") - - epc_data = pd.DataFrame(self.data["rows"]) - - # We now get the newest EPC per uprn - epc_data = epc_data.sort_values("lodgement-datetime", ascending=False).groupby("uprn").head(1) - - # For each record, parse the house number. We'll use this to identify the closest properties - epc_data["house_number"] = epc_data["address"].apply(lambda add1: self.get_house_number(add1)) - - # We convert the house number fo a purely numeric format - This numeric house number will be used as - # a distance weight when estimating the EPC - epc_data["numeric_house_number"] = epc_data["house_number"].apply( - lambda house_num: self.extract_numeric_housenumber_part(house_num) + # types for the estimation process + epc_data = self.fetch_nearby_epcs( + initial_postcode=self.postcode, + lmks_to_drop=lmks_to_drop, + built_form=built_form, + property_type=property_type ) - - epc_data["house_number_distance"] = abs(epc_data["numeric_house_number"] - self.numeric_house_number) - epc_data["weight"] = 1 / epc_data["house_number_distance"] - - epc_built_form = self._get_epc_mode(col="built-form", epc_data=epc_data) - epc_property_type = self._get_epc_mode(col="property-type", epc_data=epc_data) - - # We check if the EPC built form is one of the terraced values. If the os_built_form is semi-detached, - # then we set it to be end terraced - if built_form == "Semi-Detached" and epc_built_form in ["End-Terraced", "Mid-Terraced"]: - estimation_built_form = "End-Terraced" - elif built_form == "": - estimation_built_form = epc_built_form - else: - estimation_built_form = built_form - - estimation_property_type = epc_property_type if property_type == "" else property_type - - # We filter the EPC data on just the property types we want to use - epc_data = epc_data[ - (epc_data["built-form"] == estimation_built_form) & (epc_data["property-type"] == estimation_property_type) - ] + epc_data['lodgement-datetime'] = pd.to_datetime(epc_data['lodgement-datetime']) # For each attribute, we need to determine the datatype and use an appropriate method # to estimate. @@ -463,7 +505,7 @@ class SearchEpc: epc_data[key] = np.where(pd.isnull(epc_data[key]), None, epc_data[key]) epc_data[key] = np.where(epc_data[key] == "", None, epc_data[key]) epc_data[key] = epc_data[key].astype(vartype) - estimation_data = epc_data[[key, "weight"]] + estimation_data = epc_data[[key, "weight", "lodgement-datetime"]] estimation_data = estimation_data[~pd.isnull(estimation_data[key])] if estimation_data.shape[0] == 0: @@ -501,7 +543,13 @@ class SearchEpc: agg = estimation_data.groupby(key)["weight"].sum().reset_index() agg = agg[agg["weight"] == agg["weight"].max()] if agg.shape[0] != 1: - raise NotImplementedError("implement me") + # If we have multiple modes, we take the more recent data on average + recent_grouped = estimation_data[ + estimation_data[key].isin(agg[key].values) + ].groupby(key)["lodgement-datetime"].mean() + + newest_group = recent_grouped.idxmax() + return newest_group return agg[key].values[0] diff --git a/etl/testing_data/estimate_epc.py b/etl/testing_data/estimate_epc.py new file mode 100644 index 00000000..8041e38d --- /dev/null +++ b/etl/testing_data/estimate_epc.py @@ -0,0 +1,108 @@ +from pathlib import Path +from random import choices, sample + +import os +import pandas as pd +from tqdm import tqdm +from dotenv import load_dotenv +from utils.logger import setup_logger +from backend.SearchEpc import SearchEpc, vartypes + +ENV_FILE = Path(__file__).parent / "backend" / ".env" + +logger = setup_logger() + +DATA_DIRECTORY = Path(__file__).parent / "local_data" / "all-domestic-certificates" +DIR_SAMPLE_SIZE = 50 +N_DIRECTORIES = 25 + +EPC_AUTH_TOKEN = os.getenv("EPC_AUTH_TOKEN") + +load_dotenv(ENV_FILE) + + +def check_numeric_performance(estimated_value, actual_value): + # If we don't have anything to compare against, return None + if pd.isnull(actual_value): + return None + + if pd.isnull(estimated_value): + return 1 + + if actual_value == 0 and estimated_value == 0: + return 0 + + return abs(estimated_value - actual_value) / actual_value + + +def app(): + """ + This script is used to test the EPC estimation process. + """ + + numerical_vartypes = {key: value for key, value in vartypes.items() if value in ["float", "Int64"]} + str_var_types = {key: value for key, value in vartypes.items() if value == "str"} + # Make sure we have missed any keys + if len(numerical_vartypes) + len(str_var_types) != len(vartypes): + raise ValueError("Not all vartypes have been accounted for") + + directories = [entry for entry in DATA_DIRECTORY.iterdir() if entry.is_dir()] + + directory_sample = choices(directories, k=N_DIRECTORIES) + + results = [] + + for directory in tqdm(directory_sample): + filepath = directory / "certificates.csv" + df = pd.read_csv(filepath, low_memory=False) + df["UPRN"] = df["UPRN"].astype("Int64").astype("str") + df = df[~pd.isnull(df["UPRN"])] + + uprn_sample = sample(df["UPRN"].unique().tolist(), DIR_SAMPLE_SIZE) + df_sample = df[df["UPRN"].isin(uprn_sample)] + # Take the record with the newest LODGEMENT_DATETIME by uprn + df_sample = df_sample.sort_values("LODGEMENT_DATETIME", ascending=False).drop_duplicates("UPRN") + # Convert the columns to lower case and replace underscores with hyphens, the same as the api + df_sample.columns = df_sample.columns.str.lower().str.replace("_", "-") + + # For each epc, we test the estimation process + for _, epc in df_sample.iterrows(): + epc = epc.to_dict() + address1 = epc["address1"] + postcode = epc["postcode"] + + # Get all EPCs for this urpn and we make sure they get dropped from the estimate_epc function + epcs_for_uprn = df[df["UPRN"] == epc["uprn"]] + lmks_to_drop = epcs_for_uprn["LMK_KEY"].tolist() + searcher = SearchEpc(address1, postcode, auth_token=EPC_AUTH_TOKEN, os_api_key="") + searcher.uprn = epc["uprn"] + + estimated_epc = searcher.estimate_epc( + property_type=epc["property-type"], built_form=epc["built-form"], lmks_to_drop=lmks_to_drop + ) + + # We now compare the difference between the estimated and original + numeric_performance = { + key: check_numeric_performance(estimated_epc[key], epc[key]) for key, value in + numerical_vartypes.items() + } + + # Remove Nones + numeric_performance = {key: value for key, value in numeric_performance.items() if value is not None} + # Get an average + numeric_performance = sum(numeric_performance.values()) / len(numeric_performance) + + # categorical performance + categorical_performance = { + key: 0 if estimated_epc[key] != epc[key] else 1 for key, value in str_var_types.items() + } + # Get an average + categorical_performance = sum(categorical_performance.values()) / len(categorical_performance) + + results.append( + { + "uprn": epc["uprn"], + "numeric_performance": numeric_performance, + "categorical_performance": categorical_performance + } + ) From 81621eb1de1825ed80bc7469ad3827f48a8cb626 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 18:05:29 +0000 Subject: [PATCH 14/32] working on epc error estimation method --- backend/SearchEpc.py | 19 +++++++++++++------ etl/testing_data/estimate_epc.py | 13 ++++++++++--- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 543fa6b8..6a0f3389 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -7,6 +7,7 @@ import pandas as pd import numpy as np from epc_api.client import EpcClient from backend.OrdnanceSurvey import OrdnanceSuveyClient +from BaseUtility import Definitions from utils.logger import setup_logger from typing import List from fuzzywuzzy import process @@ -441,10 +442,15 @@ class SearchEpc: epc_data["numeric_house_number"] = epc_data["house_number"].apply( lambda house_num: self.extract_numeric_housenumber_part(house_num) ) - epc_data["house_number_distance"] = abs( - epc_data["numeric_house_number"] - self.numeric_house_number - ) - epc_data["weight"] = 1 / epc_data["house_number_distance"] + + if self.numeric_house_number is None: + # If we don't have a house number, we treat all weights as equal + epc_data["weight"] = 1 + else: + epc_data["house_number_distance"] = abs( + epc_data["numeric_house_number"] - self.numeric_house_number + ) + epc_data["weight"] = 1 / epc_data["house_number_distance"] epc_built_form = self._estimate_str(key="built-form", estimation_data=epc_data) epc_property_type = self._estimate_str(key="property-type", estimation_data=epc_data) @@ -504,9 +510,10 @@ class SearchEpc: for key, vartype in vartypes.items(): epc_data[key] = np.where(pd.isnull(epc_data[key]), None, epc_data[key]) epc_data[key] = np.where(epc_data[key] == "", None, epc_data[key]) - epc_data[key] = epc_data[key].astype(vartype) - estimation_data = epc_data[[key, "weight", "lodgement-datetime"]] + estimation_data = epc_data[[key, "weight", "lodgement-datetime"]].copy() estimation_data = estimation_data[~pd.isnull(estimation_data[key])] + estimation_data = estimation_data[~estimation_data[key].isin(Definitions.DATA_ANOMALY_MATCHES)] + estimation_data[key] = estimation_data[key].astype(vartype) if estimation_data.shape[0] == 0: estimated_epc[key] = None diff --git a/etl/testing_data/estimate_epc.py b/etl/testing_data/estimate_epc.py index 8041e38d..dd919000 100644 --- a/etl/testing_data/estimate_epc.py +++ b/etl/testing_data/estimate_epc.py @@ -32,6 +32,9 @@ def check_numeric_performance(estimated_value, actual_value): if actual_value == 0 and estimated_value == 0: return 0 + if actual_value == 0 and estimated_value != 0: + return 1 + return abs(estimated_value - actual_value) / actual_value @@ -91,18 +94,22 @@ def app(): numeric_performance = {key: value for key, value in numeric_performance.items() if value is not None} # Get an average numeric_performance = sum(numeric_performance.values()) / len(numeric_performance) + numeric_success = 1 - numeric_performance # categorical performance categorical_performance = { key: 0 if estimated_epc[key] != epc[key] else 1 for key, value in str_var_types.items() } # Get an average - categorical_performance = sum(categorical_performance.values()) / len(categorical_performance) + categorical_success = sum(categorical_performance.values()) / len(categorical_performance) results.append( { "uprn": epc["uprn"], - "numeric_performance": numeric_performance, - "categorical_performance": categorical_performance + "numeric_success": numeric_success, + "categorical_success": categorical_success, + "property_type": epc["property-type"], + "built_form": epc["built-form"], + "tenure": epc["tenure"], } ) From 748dc142714384813add7bf155f8d2b9d9f46313 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 18:15:29 +0000 Subject: [PATCH 15/32] handling missing weight possibilities and 0 weights --- backend/SearchEpc.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 6a0f3389..07a7de23 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -450,7 +450,10 @@ class SearchEpc: epc_data["house_number_distance"] = abs( epc_data["numeric_house_number"] - self.numeric_house_number ) - epc_data["weight"] = 1 / epc_data["house_number_distance"] + # We add 1, just in case we have a 0 weight (e.g. comparing house number 7a to 7b, or 9A to 9) + epc_data["weight"] = 1 / (epc_data["house_number_distance"] + 1) + # If we have a home without a house number, fill that weight with average + epc_data["weight"] = epc_data["weight"].fillna(epc_data["weight"].mean()) epc_built_form = self._estimate_str(key="built-form", estimation_data=epc_data) epc_property_type = self._estimate_str(key="property-type", estimation_data=epc_data) From 2156f6b0764cf8f52cb592187b097e1f019afa4c Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 18:23:52 +0000 Subject: [PATCH 16/32] building out aggregation --- backend/SearchEpc.py | 2 +- etl/testing_data/estimate_epc.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 07a7de23..f93fc5f0 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -437,6 +437,7 @@ class SearchEpc: if not epc_data.empty: # Further processing of the EPC data + epc_data['lodgement-datetime'] = pd.to_datetime(epc_data['lodgement-datetime']) epc_data = epc_data.sort_values("lodgement-datetime", ascending=False).groupby("uprn").head(1) epc_data["house_number"] = epc_data["address"].apply(lambda add1: self.get_house_number(add1)) epc_data["numeric_house_number"] = epc_data["house_number"].apply( @@ -505,7 +506,6 @@ class SearchEpc: built_form=built_form, property_type=property_type ) - epc_data['lodgement-datetime'] = pd.to_datetime(epc_data['lodgement-datetime']) # For each attribute, we need to determine the datatype and use an appropriate method # to estimate. diff --git a/etl/testing_data/estimate_epc.py b/etl/testing_data/estimate_epc.py index dd919000..c72df6af 100644 --- a/etl/testing_data/estimate_epc.py +++ b/etl/testing_data/estimate_epc.py @@ -113,3 +113,22 @@ def app(): "tenure": epc["tenure"], } ) + + # Get aggregate performance figures + results_df = pd.DataFrame(results) + + avg_numeric_succes = results_df["numeric_success"].median() + avg_categorical_sucess = results_df["categorical_success"].median() + + # Group by tenure + by_tenure = results_df.groupby("tenure").agg( + {"numeric_success": "median", "categorical_success": "median", "uprn": "count"} + ) + # By property type - we also want to see how many properties we have for each property type + by_property_type = results_df.groupby("property_type").agg( + {"numeric_success": "median", "categorical_success": "median", "uprn": "count"} + ) + # By property_type & built form + by_property_type_built_form = results_df.groupby(["property_type", "built_form"]).agg( + {"numeric_success": "median", "categorical_success": "median", "uprn": "count"} + ) From f7cd9d0d10f17583eb8ce49f8732031d5c295f27 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 18:39:47 +0000 Subject: [PATCH 17/32] minor --- backend/SearchEpc.py | 7 ++++++- etl/testing_data/estimate_epc.py | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index f93fc5f0..d7e1ae58 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -516,7 +516,12 @@ class SearchEpc: estimation_data = epc_data[[key, "weight", "lodgement-datetime"]].copy() estimation_data = estimation_data[~pd.isnull(estimation_data[key])] estimation_data = estimation_data[~estimation_data[key].isin(Definitions.DATA_ANOMALY_MATCHES)] - estimation_data[key] = estimation_data[key].astype(vartype) + if vartype == "Int64": + # We have some edge cases where we get the error "invalid literal for int() with base 10: '1.0'" + # so this handles this + estimation_data[key] = estimation_data[key].astype(float).astype(vartype) + else: + estimation_data[key] = estimation_data[key].astype(vartype) if estimation_data.shape[0] == 0: estimated_epc[key] = None diff --git a/etl/testing_data/estimate_epc.py b/etl/testing_data/estimate_epc.py index c72df6af..2203402a 100644 --- a/etl/testing_data/estimate_epc.py +++ b/etl/testing_data/estimate_epc.py @@ -7,6 +7,7 @@ from tqdm import tqdm from dotenv import load_dotenv from utils.logger import setup_logger from backend.SearchEpc import SearchEpc, vartypes +from etl.epc.settings import BUILT_FORM_REMAP ENV_FILE = Path(__file__).parent / "backend" / ".env" @@ -20,6 +21,12 @@ EPC_AUTH_TOKEN = os.getenv("EPC_AUTH_TOKEN") load_dotenv(ENV_FILE) +CATETORICALS_TO_IGNORE = [ + "postcode", "constituency", "local-authority", "built-form", "property-type", "address1", "constituency-label", + "building-reference-number", "address2", "posttown", "transaction-type", "lmk-key", "address3", + "local-authority-label", "county", +] + def check_numeric_performance(estimated_value, actual_value): # If we don't have anything to compare against, return None @@ -49,6 +56,10 @@ def app(): if len(numerical_vartypes) + len(str_var_types) != len(vartypes): raise ValueError("Not all vartypes have been accounted for") + # Drop some keys that aren't important + for k in CATETORICALS_TO_IGNORE: + str_var_types.pop(k, None) + directories = [entry for entry in DATA_DIRECTORY.iterdir() if entry.is_dir()] directory_sample = choices(directories, k=N_DIRECTORIES) @@ -80,11 +91,16 @@ def app(): searcher = SearchEpc(address1, postcode, auth_token=EPC_AUTH_TOKEN, os_api_key="") searcher.uprn = epc["uprn"] + # Perform the same remapping for built-form as in the Property class for this test, in case we get (e.g.) + # Enclosed End-Terrace + built_form = BUILT_FORM_REMAP.get(epc["built-form"], epc["built-form"]) + estimated_epc = searcher.estimate_epc( - property_type=epc["property-type"], built_form=epc["built-form"], lmks_to_drop=lmks_to_drop + property_type=epc["property-type"], built_form=built_form, lmks_to_drop=lmks_to_drop ) # We now compare the difference between the estimated and original + # TODO: We can convert windows and lighting to numeric versions and estimate how close we are numeric_performance = { key: check_numeric_performance(estimated_epc[key], epc[key]) for key, value in numerical_vartypes.items() From de10fe7e6dec6887216f9566a9f2bf10e719812f Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 18:46:19 +0000 Subject: [PATCH 18/32] handle edge case of a detatched maisonnete --- etl/testing_data/estimate_epc.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/etl/testing_data/estimate_epc.py b/etl/testing_data/estimate_epc.py index 2203402a..9ecd7236 100644 --- a/etl/testing_data/estimate_epc.py +++ b/etl/testing_data/estimate_epc.py @@ -94,6 +94,8 @@ def app(): # Perform the same remapping for built-form as in the Property class for this test, in case we get (e.g.) # Enclosed End-Terrace built_form = BUILT_FORM_REMAP.get(epc["built-form"], epc["built-form"]) + if (epc["property-type"] == "Maisonette") & (built_form == "Detached"): + built_form = "" estimated_epc = searcher.estimate_epc( property_type=epc["property-type"], built_form=built_form, lmks_to_drop=lmks_to_drop From 014f684de3b6038a2c545e47c2acc6d119f5bfea Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 2 Jan 2024 23:06:55 +0000 Subject: [PATCH 19/32] multiple bugs fixed --- backend/SearchEpc.py | 22 ++++++++++++++-------- etl/testing_data/estimate_epc.py | 9 ++++++--- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index d7e1ae58..ae34c49a 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -196,10 +196,11 @@ class SearchEpc: parsed_house_number = parsed_house_number[0][0] if parsed_house_number else None if parsed_house_number is None: - # Because usaddress isn't optimal for parsing addresses with 'Flat' as a prefix, we also add a custom - # approach - # Pattern to look for 'Flat' followed by a number, or just a number at the beginning - pattern = r'(?i)(?:flat\s*(\d+))|^\s*(\d+)' + # Because usaddress isn't optimal for parsing addresses with some prefixes such as 'Flat', + # we also add a custom approach + + # Pattern to look for 'Flat' or 'Apartment' followed by a number, or just a number at the beginning + pattern = r'(?i)(?:flat|apartment)\s*(\d+)|^\s*(\d+)' match = re.search(pattern, address) @@ -468,10 +469,15 @@ class SearchEpc: estimation_property_type = epc_property_type if property_type == "" else property_type - epc_data = epc_data[ - (epc_data["built-form"] == estimation_built_form) & ( - epc_data["property-type"] == estimation_property_type) - ] + # We handle some edge cases experiences with maisonettes - if built form is detatched, just filter + # on maisonette + if (estimation_property_type == "Maisonette") & (estimation_built_form == "Detached"): + epc_data = epc_data[epc_data["property-type"] == estimation_property_type] + else: + epc_data = epc_data[ + (epc_data["built-form"] == estimation_built_form) & ( + epc_data["property-type"] == estimation_property_type) + ] if not epc_data.empty: return epc_data # Return the filtered data if it's not empty diff --git a/etl/testing_data/estimate_epc.py b/etl/testing_data/estimate_epc.py index 9ecd7236..7dc669f9 100644 --- a/etl/testing_data/estimate_epc.py +++ b/etl/testing_data/estimate_epc.py @@ -7,6 +7,7 @@ from tqdm import tqdm from dotenv import load_dotenv from utils.logger import setup_logger from backend.SearchEpc import SearchEpc, vartypes +from BaseUtility import Definitions from etl.epc.settings import BUILT_FORM_REMAP ENV_FILE = Path(__file__).parent / "backend" / ".env" @@ -14,8 +15,8 @@ ENV_FILE = Path(__file__).parent / "backend" / ".env" logger = setup_logger() DATA_DIRECTORY = Path(__file__).parent / "local_data" / "all-domestic-certificates" -DIR_SAMPLE_SIZE = 50 -N_DIRECTORIES = 25 +DIR_SAMPLE_SIZE = 500 +N_DIRECTORIES = 50 EPC_AUTH_TOKEN = os.getenv("EPC_AUTH_TOKEN") @@ -94,7 +95,9 @@ def app(): # Perform the same remapping for built-form as in the Property class for this test, in case we get (e.g.) # Enclosed End-Terrace built_form = BUILT_FORM_REMAP.get(epc["built-form"], epc["built-form"]) - if (epc["property-type"] == "Maisonette") & (built_form == "Detached"): + if ((epc["property-type"] == "Maisonette") & (built_form == "Detached")) or ( + built_form in Definitions.DATA_ANOMALY_MATCHES + ): built_form = "" estimated_epc = searcher.estimate_epc( From 0ec7afccd9feceff95209dc659e96402c2bc824a Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 3 Jan 2024 10:46:22 +0000 Subject: [PATCH 20/32] fixing bug where all weights are 0, due to no house numbers --- backend/SearchEpc.py | 3 +++ etl/testing_data/estimate_epc.py | 1 + 2 files changed, 4 insertions(+) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index ae34c49a..b400b8f1 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -456,6 +456,9 @@ class SearchEpc: epc_data["weight"] = 1 / (epc_data["house_number_distance"] + 1) # If we have a home without a house number, fill that weight with average epc_data["weight"] = epc_data["weight"].fillna(epc_data["weight"].mean()) + # Finally, we might not have any house numbers whatsoever so everything could be + # missing, so we fill with 1 + epc_data["weight"] = epc_data["weight"].fillna(1) epc_built_form = self._estimate_str(key="built-form", estimation_data=epc_data) epc_property_type = self._estimate_str(key="property-type", estimation_data=epc_data) diff --git a/etl/testing_data/estimate_epc.py b/etl/testing_data/estimate_epc.py index 7dc669f9..a6c6ea6c 100644 --- a/etl/testing_data/estimate_epc.py +++ b/etl/testing_data/estimate_epc.py @@ -137,6 +137,7 @@ def app(): # Get aggregate performance figures results_df = pd.DataFrame(results) + results_df["tenure"] = results_df["tenure"].replace("Rented (social)", "rental (social)") avg_numeric_succes = results_df["numeric_success"].median() avg_categorical_sucess = results_df["categorical_success"].median() From aca882f10c481a4c0b0c268a67434bdb9cfb769a Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 3 Jan 2024 11:02:15 +0000 Subject: [PATCH 21/32] handling further edge case of semi-detached maisoneete --- backend/SearchEpc.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index b400b8f1..5504d573 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -474,7 +474,9 @@ class SearchEpc: # We handle some edge cases experiences with maisonettes - if built form is detatched, just filter # on maisonette - if (estimation_property_type == "Maisonette") & (estimation_built_form == "Detached"): + if (estimation_property_type == "Maisonette") & ( + estimation_built_form in ["Detached", "Semi-Detached"] + ): epc_data = epc_data[epc_data["property-type"] == estimation_property_type] else: epc_data = epc_data[ From 97a7aadcf720d0f31dea72b74aa51bc14ef8f445 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 3 Jan 2024 11:47:06 +0000 Subject: [PATCH 22/32] changed api retrieval to get desired property types first --- backend/SearchEpc.py | 27 ++++++++++++++++++++++----- etl/testing_data/estimate_epc.py | 2 ++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 5504d573..701029be 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -425,10 +425,22 @@ class SearchEpc: :param property_type: The 'property-type' value to be used for filtering the EPC data. :return: """ + + property_type_api_map = { + "Bungalow": "bungalow", + "Flat": "flat", + "House": "house", + "Maisonette": "maisonette", + "Park Home": "park home", + } + postcode = initial_postcode while postcode: # Fetch data from EPC API - epc_response = self.get_epc(params={"postcode": postcode}, size=100) + params = {"postcode": postcode} + if property_type: + params["property-type"] = property_type_api_map[property_type] + epc_response = self.get_epc(params=params, size=100) if epc_response["status"] == 200: epc_data = pd.DataFrame(self.data["rows"]) @@ -460,8 +472,13 @@ class SearchEpc: # missing, so we fill with 1 epc_data["weight"] = epc_data["weight"].fillna(1) - epc_built_form = self._estimate_str(key="built-form", estimation_data=epc_data) epc_property_type = self._estimate_str(key="property-type", estimation_data=epc_data) + estimation_property_type = epc_property_type if property_type == "" else property_type + + epc_built_form = self._estimate_str( + key="built-form", + estimation_data=epc_data[epc_data["property-type"] == estimation_property_type] + ) if built_form == "Semi-Detached" and epc_built_form in ["End-Terraced", "Mid-Terraced"]: estimation_built_form = "End-Terraced" @@ -470,10 +487,10 @@ class SearchEpc: else: estimation_built_form = built_form - estimation_property_type = epc_property_type if property_type == "" else property_type - # We handle some edge cases experiences with maisonettes - if built form is detatched, just filter # on maisonette + # We also add some additional logic for bungalows, because they are far less common than other + # property types if (estimation_property_type == "Maisonette") & ( estimation_built_form in ["Detached", "Semi-Detached"] ): @@ -488,7 +505,7 @@ class SearchEpc: return epc_data # Return the filtered data if it's not empty # Shorten the postcode by one character for the next iteration - postcode = postcode[:-1] + postcode = postcode[:-1].rstrip() # If loop finishes without a valid response, raise an exception raise Exception("Unable to find postcode data after trimming - investigate me") diff --git a/etl/testing_data/estimate_epc.py b/etl/testing_data/estimate_epc.py index a6c6ea6c..7a03edc3 100644 --- a/etl/testing_data/estimate_epc.py +++ b/etl/testing_data/estimate_epc.py @@ -142,6 +142,8 @@ def app(): avg_numeric_succes = results_df["numeric_success"].median() avg_categorical_sucess = results_df["categorical_success"].median() + # Before changing the search methodology: 0.7963985988175015, 0.5348837209302325 + # Group by tenure by_tenure = results_df.groupby("tenure").agg( {"numeric_success": "median", "categorical_success": "median", "uprn": "count"} From 98e6265b5d8d34d4c47adde8af31a85ba9d589c0 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 3 Jan 2024 12:08:41 +0000 Subject: [PATCH 23/32] handle bug with park hoems --- backend/SearchEpc.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 701029be..8dde4f8b 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -431,7 +431,7 @@ class SearchEpc: "Flat": "flat", "House": "house", "Maisonette": "maisonette", - "Park Home": "park home", + "Park home": "park home", } postcode = initial_postcode @@ -489,12 +489,17 @@ class SearchEpc: # We handle some edge cases experiences with maisonettes - if built form is detatched, just filter # on maisonette - # We also add some additional logic for bungalows, because they are far less common than other + # We also add some additional logic for Park homes, because they are far less common than other # property types + if (estimation_property_type == "Maisonette") & ( estimation_built_form in ["Detached", "Semi-Detached"] ): epc_data = epc_data[epc_data["property-type"] == estimation_property_type] + elif (estimation_property_type == "Park home") & ( + sum(epc_data["built-form"] == estimation_built_form) == 0 + ): + epc_data = epc_data[epc_data["property-type"] == estimation_property_type] else: epc_data = epc_data[ (epc_data["built-form"] == estimation_built_form) & ( From 0d154abc3d9d2f77dc28907e2ae6089b2c63890e Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 3 Jan 2024 13:45:49 +0000 Subject: [PATCH 24/32] handling the case of null built form --- backend/SearchEpc.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 8dde4f8b..6fbdb3ea 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -472,8 +472,9 @@ class SearchEpc: # missing, so we fill with 1 epc_data["weight"] = epc_data["weight"].fillna(1) - epc_property_type = self._estimate_str(key="property-type", estimation_data=epc_data) - estimation_property_type = epc_property_type if property_type == "" else property_type + estimation_property_type = self._estimate_str( + key="property-type", estimation_data=epc_data + ) if property_type == "" else property_type epc_built_form = self._estimate_str( key="built-form", @@ -482,7 +483,7 @@ class SearchEpc: if built_form == "Semi-Detached" and epc_built_form in ["End-Terraced", "Mid-Terraced"]: estimation_built_form = "End-Terraced" - elif built_form == "": + elif (built_form == "") or (pd.isnull(built_form)): estimation_built_form = epc_built_form else: estimation_built_form = built_form @@ -492,13 +493,17 @@ class SearchEpc: # We also add some additional logic for Park homes, because they are far less common than other # property types - if (estimation_property_type == "Maisonette") & ( + is_maisonette_with_bad_built_form = (estimation_property_type == "Maisonette") & ( estimation_built_form in ["Detached", "Semi-Detached"] - ): - epc_data = epc_data[epc_data["property-type"] == estimation_property_type] - elif (estimation_property_type == "Park home") & ( + ) + + is_park_home_without_built_form = (estimation_property_type == "Park home") & ( sum(epc_data["built-form"] == estimation_built_form) == 0 - ): + ) + + has_missing_built_form = not estimation_built_form + + if is_maisonette_with_bad_built_form or is_park_home_without_built_form or has_missing_built_form: epc_data = epc_data[epc_data["property-type"] == estimation_property_type] else: epc_data = epc_data[ From a42cb555d279588be62ae192e6a87038aa19dbf7 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 3 Jan 2024 21:34:01 +0000 Subject: [PATCH 25/32] pasted in reslts with 100 nearest homes --- backend/SearchEpc.py | 2 ++ etl/testing_data/estimate_epc.py | 34 +++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 6fbdb3ea..1d5c2296 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -440,6 +440,8 @@ class SearchEpc: params = {"postcode": postcode} if property_type: params["property-type"] = property_type_api_map[property_type] + + # We take the 20 nearest homes of the relevant type, so not to pull in too many irrelevant homes epc_response = self.get_epc(params=params, size=100) if epc_response["status"] == 200: diff --git a/etl/testing_data/estimate_epc.py b/etl/testing_data/estimate_epc.py index 7a03edc3..9e460678 100644 --- a/etl/testing_data/estimate_epc.py +++ b/etl/testing_data/estimate_epc.py @@ -142,12 +142,44 @@ def app(): avg_numeric_succes = results_df["numeric_success"].median() avg_categorical_sucess = results_df["categorical_success"].median() - # Before changing the search methodology: 0.7963985988175015, 0.5348837209302325 + # With 20 nearest homes + # 0.7718100840549558 + # 0.5116279069767442 + # 100 nearest homes + # 0.7859617377809409 + # 0.5348837209302325 # Group by tenure by_tenure = results_df.groupby("tenure").agg( {"numeric_success": "median", "categorical_success": "median", "uprn": "count"} ) + pd.set_option('display.max_rows', 500) + pd.set_option('display.max_columns', 500) + pd.set_option('display.width', 1000) + + # With 20 nearest homes + # numeric_success categorical_success uprn + # tenure + # NO DATA! 0.847840 0.581395 278 + # Not defined - use in the case of a new dwelling... 0.930282 0.651163 617 + # Owner-occupied 0.770330 0.511628 2588 + # Rented (private) 0.791885 0.558140 1232 + # owner-occupied 0.741088 0.488372 10912 + # rental (private) 0.749064 0.488372 3252 + # rental (social) 0.822109 0.581395 3878 + # unknown 0.895840 0.627907 1820 + + # 100 nearest homes + # tenure + # NO DATA! 0.899566 0.604651 233 + # Not defined - use in the case of a new dwelling... 0.927518 0.674419 608 + # Owner-occupied 0.777026 0.511628 3167 + # Rented (private) 0.805646 0.534884 1316 + # owner-occupied 0.762180 0.488372 10835 + # rental (private) 0.760503 0.511628 3181 + # rental (social) 0.830057 0.604651 3705 + # unknown 0.899948 0.627907 1571 + # By property type - we also want to see how many properties we have for each property type by_property_type = results_df.groupby("property_type").agg( {"numeric_success": "median", "categorical_success": "median", "uprn": "count"} From 439f4d65c77d07cafabef5d7f5427ad4bf108385 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 4 Jan 2024 09:39:12 +0000 Subject: [PATCH 26/32] Added estiamted to property details epc --- backend/Property.py | 1 + backend/app/db/models/portfolio.py | 1 + 2 files changed, 2 insertions(+) diff --git a/backend/Property.py b/backend/Property.py index 27b1e8f1..71d9e249 100644 --- a/backend/Property.py +++ b/backend/Property.py @@ -498,6 +498,7 @@ class Property(Definitions): "primary_energy_consumption": self.energy["primary_energy_consumption"], "co2_emissions": self.energy["co2_emissions"], "adjusted_energy_consumption": self.current_adjusted_energy, + "estimated": self.data.get("estimated", False) } return property_details_epc diff --git a/backend/app/db/models/portfolio.py b/backend/app/db/models/portfolio.py index 6f865381..f7c0370b 100644 --- a/backend/app/db/models/portfolio.py +++ b/backend/app/db/models/portfolio.py @@ -153,6 +153,7 @@ class PropertyDetailsEpcModel(Base): primary_energy_consumption = Column(Float) co2_emissions = Column(Float) adjusted_energy_consumption = Column(Float) + estimated = Column(Boolean, default=False) class PropertyDetailsSpatial(Base): From 227cbcce2d8c4631318178e3adfe8b8f0e42f1f8 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 4 Jan 2024 09:54:38 +0000 Subject: [PATCH 27/32] added uprn extraction to extract_epc_data: --- backend/Property.py | 6 ++++-- backend/SearchEpc.py | 12 +++++++++--- backend/app/plan/router.py | 2 ++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/backend/Property.py b/backend/Property.py index 71d9e249..ad152ff2 100644 --- a/backend/Property.py +++ b/backend/Property.py @@ -48,15 +48,17 @@ class Property(Definitions): spatial = None - def __init__(self, id, data=None, old_data=None, full_sap_epc=None): + def __init__(self, id, address, postcode, data=None, old_data=None, full_sap_epc=None): self.id = id + self.address = address + self.postcode = postcode self.data = data self.old_data = old_data self.full_sap_epc = full_sap_epc self.property_dimensions = None - self.uprn = None + self.uprn = None if data is not None else data["uprn"] self.in_conservation_area, self.is_listed, self.is_heritage = None, None, None self.restricted_measures = False diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 1d5c2296..9d3ecd42 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -364,7 +364,13 @@ class SearchEpc: # Retrieve postcode and address address_epc, postcode_epc = self.format_address(newest_epc=newest_epc) - return newest_epc, older_epcs, full_sap_epc, address_epc, postcode_epc + # Ge the uprn from the newest record for this home + uprns = {r["uprn"] for r in rows if r["uprn"]} + if len(uprns) != 1: + raise ValueError("Multiple UPRNs found - investigate me") + uprn = uprns.pop() + + return newest_epc, older_epcs, full_sap_epc, address_epc, postcode_epc, uprn @staticmethod def filter_newest_epc(list_of_epcs: List): @@ -626,7 +632,7 @@ class SearchEpc: if response["status"] == 200: ( - self.newest_epc, self.older_epcs, self.full_sap_epc, self.address_clean, self.postcode_clean + self.newest_epc, self.older_epcs, self.full_sap_epc, self.address_clean, self.postcode_clean, self.uprn ) = self.extract_epc_data(address=self.full_address) return @@ -642,7 +648,7 @@ class SearchEpc: response = self.get_epc() if response["status"] == 200: ( - self.newest_epc, self.older_epcs, self.full_sap_epc, self.address_clean, self.postcode_clean + self.newest_epc, self.older_epcs, self.full_sap_epc, self.address_clean, self.postcode_clean, self.uprn ) = self.extract_epc_data() return diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index 9e24126e..f4238ae5 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -98,6 +98,8 @@ async def trigger_plan(body: PlanTriggerRequest): input_properties.append( Property( id=property_id, + address=epc_searcher.address_clean, + postcode=epc_searcher.postcode_clean, data=epc_searcher.newest_epc, old_data=epc_searcher.older_epcs, full_sap_epc=epc_searcher.full_sap_epc, From 0d7479d96caab6421ca954ba676580d25a90ced9 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 4 Jan 2024 10:00:04 +0000 Subject: [PATCH 28/32] updated property class fixing bug with pulling out uprn --- backend/Property.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/Property.py b/backend/Property.py index ad152ff2..4b5e1304 100644 --- a/backend/Property.py +++ b/backend/Property.py @@ -58,7 +58,7 @@ class Property(Definitions): self.full_sap_epc = full_sap_epc self.property_dimensions = None - self.uprn = None if data is not None else data["uprn"] + self.uprn = None if data is None else data["uprn"] self.in_conservation_area, self.is_listed, self.is_heritage = None, None, None self.restricted_measures = False From 41749e85570d28c26e0bf6fb128ef06a0c65ae59 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 4 Jan 2024 11:16:49 +0000 Subject: [PATCH 29/32] added weighted datetime calc --- backend/Property.py | 2 +- backend/SearchEpc.py | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/backend/Property.py b/backend/Property.py index 4b5e1304..dc847750 100644 --- a/backend/Property.py +++ b/backend/Property.py @@ -58,7 +58,7 @@ class Property(Definitions): self.full_sap_epc = full_sap_epc self.property_dimensions = None - self.uprn = None if data is None else data["uprn"] + self.uprn = None if data is None else int(data["uprn"]) self.in_conservation_area, self.is_listed, self.is_heritage = None, None, None self.restricted_measures = False diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 9d3ecd42..4953b04c 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -584,6 +584,11 @@ class SearchEpc: estimated_epc[key] = estimated_value + # Insert an estimated lodgement datetime, with a weighted average + estimated_epc["lodgement-datetime"] = self.calculate_weighted_lodgement_datetime(epc_data=epc_data) + # Extract logement date + estimated_epc["lodgement-date"] = estimated_epc["lodgement-datetime"].strftime("%Y-%m-%d") + estimated_epc["postcode"] = self.postcode estimated_epc["uprn"] = self.uprn # Indicate that this epc was estimated @@ -591,6 +596,24 @@ class SearchEpc: return estimated_epc + @staticmethod + def calculate_weighted_lodgement_datetime(epc_data): + numeric_dates = pd.to_datetime(epc_data['lodgement-datetime']).view('int64') + + # Calculate the weighted sum of dates + weighted_sum = (numeric_dates * epc_data['weight']).sum() + + # Calculate the sum of weights + total_weights = epc_data['weight'].sum() + + # Calculate the weighted mean in numeric format + weighted_mean_numeric = weighted_sum / total_weights + + # Convert the numeric weighted mean back to datetime + weighted_mean_datetime = pd.to_datetime(weighted_mean_numeric) + + return weighted_mean_datetime + @staticmethod def _estimate_int(estimation_data, key): return round(np.average(a=estimation_data[key], weights=estimation_data["weight"])) From 1eb6f4c2a78b3ede33b01a05055781bb8e74cd01 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 4 Jan 2024 11:27:19 +0000 Subject: [PATCH 30/32] handling error cases in storing data to db for estimated properties --- backend/Property.py | 2 +- backend/SearchEpc.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/Property.py b/backend/Property.py index dc847750..be60784c 100644 --- a/backend/Property.py +++ b/backend/Property.py @@ -459,7 +459,7 @@ class Property(Definitions): """ Utility function for usage in the lambda, for preparing the _rating fields """ - return rating_lookup[field].value if field not in cls.DATA_ANOMALY_MATCHES else None + return rating_lookup[field].value if (field not in cls.DATA_ANOMALY_MATCHES) and (field is not None) else None def get_property_details_epc(self, portfolio_id: int, rating_lookup): diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 4953b04c..6e17d200 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -591,6 +591,7 @@ class SearchEpc: estimated_epc["postcode"] = self.postcode estimated_epc["uprn"] = self.uprn + estimated_epc["address"] = self.full_address # Indicate that this epc was estimated estimated_epc["estimated"] = True @@ -676,6 +677,7 @@ class SearchEpc: return # Step 4: If we still don't have an EPC, we estimate the EPC data + self.full_address = self.ordnance_survey_client.most_relevant_result["ADDRESS"] estimated_epc = self.estimate_epc( property_type=self.ordnance_survey_client.property_type, built_form=self.ordnance_survey_client.built_form From 15ec6460d2ea57a6ea1f475b7eb837b5b69b887b Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 4 Jan 2024 11:32:11 +0000 Subject: [PATCH 31/32] minor bug for when no valuation increase data --- backend/app/plan/router.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index f4238ae5..89347be2 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -558,7 +558,7 @@ async def trigger_plan(body: PlanTriggerRequest): # recommendation from being default to not default, we'll need to re-run this process to re-calculate the # the portfolion level impact - total_valuation_increase = sum(property_valuation_increases) + total_valuation_increase = sum([v for v in property_valuation_increases if v is not None]) labour_days = round(max( [sum(r["labour_days"] for r in rec_group if r["default"]) for p_id, rec_group in recommendations.items()] )) From 1b4ae239a3a052d49835d902aaefb68758b97e9c Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 4 Jan 2024 14:56:33 +0000 Subject: [PATCH 32/32] testing different weight methods - to run full test on --- backend/SearchEpc.py | 24 ++++++++++++++++-------- recommendations/Recommendations.py | 2 ++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/backend/SearchEpc.py b/backend/SearchEpc.py index 6e17d200..b3f58b04 100644 --- a/backend/SearchEpc.py +++ b/backend/SearchEpc.py @@ -472,13 +472,21 @@ class SearchEpc: epc_data["house_number_distance"] = abs( epc_data["numeric_house_number"] - self.numeric_house_number ) - # We add 1, just in case we have a 0 weight (e.g. comparing house number 7a to 7b, or 9A to 9) - epc_data["weight"] = 1 / (epc_data["house_number_distance"] + 1) - # If we have a home without a house number, fill that weight with average - epc_data["weight"] = epc_data["weight"].fillna(epc_data["weight"].mean()) - # Finally, we might not have any house numbers whatsoever so everything could be - # missing, so we fill with 1 - epc_data["weight"] = epc_data["weight"].fillna(1) + # # We add 1, just in case we have a 0 weight (e.g. comparing house number 7a to 7b, or 9A to 9) + # epc_data["weight"] = 1 / (epc_data["house_number_distance"] + 1) + # # If we have a home without a house number, fill that weight with average + # epc_data["weight"] = epc_data["weight"].fillna(epc_data["weight"].mean()) + # # Finally, we might not have any house numbers whatsoever so everything could be + # # missing, so we fill with 1 + # epc_data["weight"] = epc_data["weight"].fillna(1) + # TODO: Testing + # If the postcode is different from the initial postcode, it doesn't make sense to have + # any weightings + if all(pd.isnull(epc_data["house_number_distance"])) or (postcode != initial_postcode): + epc_data["weight"] = 1 + else: + epc_data["weight"] = 1 / np.sqrt(epc_data["house_number_distance"] + 1) + epc_data["weight"] = epc_data["weight"].fillna(epc_data["weight"].mean()) estimation_property_type = self._estimate_str( key="property-type", estimation_data=epc_data @@ -621,7 +629,7 @@ class SearchEpc: @staticmethod def _estimate_float(estimation_data, key): - return np.average(a=estimation_data[key], weights=estimation_data["weight"]) + return round(np.average(a=estimation_data[key], weights=estimation_data["weight"]), 2) @staticmethod def _estimate_str(estimation_data, key): diff --git a/recommendations/Recommendations.py b/recommendations/Recommendations.py index 4b54cb52..a5d1f35c 100644 --- a/recommendations/Recommendations.py +++ b/recommendations/Recommendations.py @@ -155,6 +155,8 @@ class Recommendations: # For the moment, we cap the number of SAP points that can be achieved by ventilation at 2 rec["sap_points"] = min(rec["sap_points"], VentilationRecommendations.SAP_LIMIT) + # Round to 2 decimal places + rec["sap_points"] = round(rec["sap_points"], 2) rec["co2_equivalent_savings"] = float(property_instance.data["co2-emissions-current"]) - new_carbon # Energy consumption current is per meter squared, so we need to multiply by the floor area to get