further breaking up code

This commit is contained in:
Khalim Conn-Kowlessar 2023-07-20 12:24:34 +01:00
parent 24f0404c8d
commit c0f9462377
18 changed files with 133 additions and 53 deletions

1
.gitignore vendored
View file

@ -250,4 +250,5 @@ backend/node_modules
node_modules/
backend/.idea
open_uprn/.idea/
conservation_areas/.idea/

2
.idea/Model.iml generated
View file

@ -6,7 +6,7 @@
<sourceFolder url="file://$MODULE_DIR$/model_data" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/open_uprn" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="Python 3.10 (hestia-data)" jdkType="Python SDK" />
<orderEntry type="jdk" jdkName="Python 3.10 (conservation_areas)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

2
.idea/misc.xml generated
View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (hestia-data)" project-jdk-type="Python SDK" />
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (conservation_areas)" project-jdk-type="Python SDK" />
<component name="PythonCompatibilityInspectionAdvertiser">
<option name="version" value="3" />
</component>

View file

@ -1,7 +1,8 @@
from enum import Enum
import geopandas as gpd
from shapely.geometry import Point
from model_data.utils import setup_logger
from utils.logger import setup_logger
from datatypes.datatypes import OpenUprnCoordinateData
logger = setup_logger()
@ -39,7 +40,13 @@ class ConservationAreaClient:
self.gov_data = gpd.read_file(self.gov_path)
self.gov_data = self.gov_data.drop(columns=["dataset"])
def is_in_conservation_area(self, coordinates: dict):
def is_in_conservation_area(self, coordinates: OpenUprnCoordinateData):
"""
Check if a property is in a conservation area
:param coordinates: dictionary, which should have the OpenUprnCoordinateData format
:return:
"""
if not coordinates:
raise ValueError("Coordinates have not been set, run get_coordinates() first")

53
conservation_areas/app.py Normal file
View file

@ -0,0 +1,53 @@
"""
This application reads in the open uprn data from a static location and loads it into
our database for querying from other services
"""
import os
from conservation_areas.ConservationAreaClient import ConservationAreaClient
def app():
conservation_area_client = ConservationAreaClient(
historic_england_path=os.path.abspath(
os.path.dirname(__file__)
) + "/model_data/local_data/Historic_Eng_Conservation_Areas/Conservation_Areas.shp",
gov_path=os.path.abspath(
os.path.dirname(__file__)
) + "/model_data/local_data/gov-conservation-area.geojson"
)
conservation_area_client.read()
# We need to iterate through the open uprn data and check if the coordinates are in a conservation area
open_uprn_data = [
{'UPRN': 6032920, 'X_COORDINATE': 535110.0, 'Y_COORDINATE': 181819.0, 'LATITUDE': 51.5191407,
'LONGITUDE': -0.0540506},
{'UPRN': 6038625, 'X_COORDINATE': 535374.0, 'Y_COORDINATE': 182784.0, 'LATITUDE': 51.5277492,
'LONGITUDE': -0.0498772},
{'UPRN': 34153991, 'X_COORDINATE': 523238.74, 'Y_COORDINATE': 178003.02, 'LATITUDE': 51.4875579,
'LONGITUDE': -0.226392},
{'UPRN': 10008299676, 'X_COORDINATE': 533285.0, 'Y_COORDINATE': 184711.0, 'LATITUDE': 51.5455629,
'LONGITUDE': -0.0792445},
{'UPRN': 10008299677, 'X_COORDINATE': 533285.0, 'Y_COORDINATE': 184711.0, 'LATITUDE': 51.5455629,
'LONGITUDE': -0.0792445},
{'UPRN': 100021039066, 'X_COORDINATE': 535506.0, 'Y_COORDINATE': 185624.0, 'LATITUDE': 51.5532385,
'LONGITUDE': -0.0468833},
{'UPRN': 100021226060, 'X_COORDINATE': 529247.0, 'Y_COORDINATE': 187959.0, 'LATITUDE': 51.5756908,
'LONGITUDE': -0.1362513},
{'UPRN': 200003489276, 'X_COORDINATE': 533210.0, 'Y_COORDINATE': 179442.0, 'LATITUDE': 51.4982309,
'LONGITUDE': -0.0823165}
]
result = [conservation_area_client.is_in_conservation_area(coordinates) for coordinates in open_uprn_data]
conservation_area_client
uprns = [
int(x) for x in
['34153991', '6038625', '100021039066', '100021226060', '10008299676', '10008299677', '6032920', '200003489276']
]
open_uprn_client.data[open_uprn_client.data["UPRN"].isin(
uprns
)].to_dict("records")
# TODO: Add a method to write to the database

View file

@ -0,0 +1,16 @@
attrs==23.1.0
certifi==2023.5.7
click==8.1.6
click-plugins==1.1.1
cligj==0.7.2
fiona==1.9.4.post1
geopandas==0.13.2
numpy==1.25.1
packaging==23.1
pandas==2.0.3
pyproj==3.6.0
python-dateutil==2.8.2
pytz==2023.3
shapely==2.0.1
six==1.16.0
tzdata==2023.3

0
datatypes/__init__.py Normal file
View file

10
datatypes/datatypes.py Normal file
View file

@ -0,0 +1,10 @@
from dataclasses import dataclass
@dataclass
class OpenUprnCoordinateData:
UPRN: int
X_COORDINATE: float
Y_COORDINATE: float
LATITUDE: float
LONGITUDE: float

View file

@ -1,7 +1,7 @@
import math
from tqdm import tqdm
from dbfread import DBF
from model_data.utils import setup_logger
from utils.logger import setup_logger
logger = setup_logger()

View file

@ -2,7 +2,7 @@ from typing import List, Dict
import pandas as pd
from tqdm import tqdm
import string
from model_data.utils import setup_logger
from utils.logger import setup_logger
from fuzzywuzzy import fuzz
import numpy as np

View file

@ -13,7 +13,7 @@ from model_data.EpcClean import EpcClean
from statsmodels.stats.outliers_influence import variance_inflation_factor
from tqdm import tqdm
from model_data.utils import setup_logger
from utils.logger import setup_logger
logger = setup_logger()

View file

@ -2,7 +2,7 @@ from tqdm import tqdm
import os
from model_data.BoreholeClient import BoreholeClient
from model_data.LandRegistryClient import LandRegistryClient
from model_data.ConservationAreaClient import ConservationAreaClient
from conservation_areas.ConservationAreaClient import ConservationAreaClient
from model_data.temp_inputs import input_data
from model_data.Property import Property

View file

@ -1,7 +1,8 @@
import logging
from io import StringIO
from unittest.mock import patch
from model_data.utils import setup_logger, is_percentage_or_number, correct_spelling
from model_data.utils import is_percentage_or_number, correct_spelling
from utils.logger import setup_logger
class TestLogger:

View file

@ -1,4 +1,3 @@
import logging
import re
from textblob import TextBlob
@ -6,40 +5,6 @@ from textblob import TextBlob
PERCENTAGE_PATTERN = re.compile(r'^\d+%?$')
def setup_logger(log_file=None, level=logging.INFO, overwrite_handler=False):
# Create a logger and set the logging level
logger = logging.getLogger()
logger.setLevel(level)
# if logger already has handlers, just return it
if logger.hasHandlers() and not overwrite_handler:
return logger
# Define the log message format
log_format = "%(asctime)s [%(levelname)s] %(message)s"
date_format = "%Y-%m-%d %H:%M:%S"
formatter = logging.Formatter(log_format, datefmt=date_format)
# Create a file handler and set the file path and format
if log_file:
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(level)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# Create a console handler and set the format
console_handler = logging.StreamHandler()
console_handler.setLevel(level)
# Set the formatter for the handlers
console_handler.setFormatter(formatter)
# Add the handlers to the logger
logger.addHandler(console_handler)
return logger
def is_percentage_or_number(s):
# re.match returns None if the string does not match the pattern
return PERCENTAGE_PATTERN.match(s) is not None

View file

@ -1,5 +1,5 @@
import pandas as pd
from model_data.utils import setup_logger
from utils.logger import setup_logger
logger = setup_logger()

View file

@ -15,12 +15,4 @@ def app():
)
open_uprn_client.read()
uprns = [
int(x) for x in
['34153991', '6038625', '100021039066', '100021226060', '10008299676', '10008299677', '6032920', '200003489276']
]
open_uprn_client.data[open_uprn_client.data["UPRN"].isin(
uprns
)].to_dict("records")
# TODO: Add a method to write to the database

0
utils/__init__.py Normal file
View file

35
utils/logger.py Normal file
View file

@ -0,0 +1,35 @@
import logging
def setup_logger(log_file=None, level=logging.INFO, overwrite_handler=False):
# Create a logger and set the logging level
logger = logging.getLogger()
logger.setLevel(level)
# if logger already has handlers, just return it
if logger.hasHandlers() and not overwrite_handler:
return logger
# Define the log message format
log_format = "%(asctime)s [%(levelname)s] %(message)s"
date_format = "%Y-%m-%d %H:%M:%S"
formatter = logging.Formatter(log_format, datefmt=date_format)
# Create a file handler and set the file path and format
if log_file:
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(level)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# Create a console handler and set the format
console_handler = logging.StreamHandler()
console_handler.setLevel(level)
# Set the formatter for the handlers
console_handler.setFormatter(formatter)
# Add the handlers to the logger
logger.addHandler(console_handler)
return logger