diff --git a/hub/catalog_factories/construction/eilat_catalog.py b/hub/catalog_factories/construction/eilat_catalog.py index 43f889c2..0afe0f73 100644 --- a/hub/catalog_factories/construction/eilat_catalog.py +++ b/hub/catalog_factories/construction/eilat_catalog.py @@ -22,6 +22,7 @@ class EilatCatalog(Catalog): """ Eilat catalog class """ + def __init__(self, path): _path_archetypes = Path(path / 'eilat_archetypes.json').resolve() _path_constructions = (path / 'eilat_constructions.json').resolve() @@ -121,8 +122,14 @@ class EilatCatalog(Catalog): construction_period = archetype['period_of_construction'] average_storey_height = archetype['average_storey_height'] extra_loses_due_to_thermal_bridges = archetype['extra_loses_due_thermal_bridges'] - infiltration_rate_for_ventilation_system_off = archetype['infiltration_rate_for_ventilation_system_off'] / cte.HOUR_TO_SECONDS - infiltration_rate_for_ventilation_system_on = archetype['infiltration_rate_for_ventilation_system_on'] / cte.HOUR_TO_SECONDS + infiltration_rate_for_ventilation_system_off = archetype[ + 'infiltration_rate_for_ventilation_system_off'] / cte.HOUR_TO_SECONDS + infiltration_rate_for_ventilation_system_on = archetype[ + 'infiltration_rate_for_ventilation_system_on'] / cte.HOUR_TO_SECONDS + infiltration_rate_area_for_ventilation_system_off = archetype[ + 'infiltration_rate_area_for_ventilation_system_off'] + infiltration_rate_area_for_ventilation_system_on = archetype[ + 'infiltration_rate_area_for_ventilation_system_on'] archetype_constructions = [] for archetype_construction in archetype['constructions']: @@ -160,7 +167,9 @@ class EilatCatalog(Catalog): extra_loses_due_to_thermal_bridges, None, infiltration_rate_for_ventilation_system_off, - infiltration_rate_for_ventilation_system_on)) + infiltration_rate_for_ventilation_system_on, + infiltration_rate_area_for_ventilation_system_off, + infiltration_rate_area_for_ventilation_system_on)) return _catalog_archetypes def names(self, category=None): diff --git a/hub/catalog_factories/construction/nrel_catalog.py b/hub/catalog_factories/construction/nrel_catalog.py index da31fd9f..f825746b 100644 --- a/hub/catalog_factories/construction/nrel_catalog.py +++ b/hub/catalog_factories/construction/nrel_catalog.py @@ -129,6 +129,12 @@ class NrelCatalog(Catalog): infiltration_rate_for_ventilation_system_on = float( archetype['infiltration_rate_for_ventilation_system_on']['#text'] ) / cte.HOUR_TO_SECONDS + infiltration_rate_area_for_ventilation_system_off = float( + archetype['infiltration_rate_area_for_ventilation_system_on']['#text'] + ) + infiltration_rate_area_for_ventilation_system_on = float( + archetype['infiltration_rate_area_for_ventilation_system_on']['#text'] + ) archetype_constructions = [] for archetype_construction in archetype['constructions']['construction']: @@ -162,7 +168,9 @@ class NrelCatalog(Catalog): extra_loses_due_to_thermal_bridges, indirect_heated_ratio, infiltration_rate_for_ventilation_system_off, - infiltration_rate_for_ventilation_system_on)) + infiltration_rate_for_ventilation_system_on, + infiltration_rate_area_for_ventilation_system_off, + infiltration_rate_area_for_ventilation_system_on)) return _catalog_archetypes def names(self, category=None): diff --git a/hub/city_model_structure/building_demand/internal_zone.py b/hub/city_model_structure/building_demand/internal_zone.py index 8bf2c98b..77d524a7 100644 --- a/hub/city_model_structure/building_demand/internal_zone.py +++ b/hub/city_model_structure/building_demand/internal_zone.py @@ -132,6 +132,8 @@ class InternalZone: _thermal_boundary = ThermalBoundary(surface, surface.solid_polygon.area, windows_areas) surface.associated_thermal_boundaries = [_thermal_boundary] _thermal_boundaries.append(_thermal_boundary) + if self.thermal_archetype is None: + return None # there are no archetype _number_of_storeys = int(self.volume / self.area / self.thermal_archetype.average_storey_height) _thermal_zone = ThermalZone(_thermal_boundaries, self, self.volume, self.area, _number_of_storeys) for thermal_boundary in _thermal_zone.thermal_boundaries: diff --git a/hub/city_model_structure/building_demand/surface.py b/hub/city_model_structure/building_demand/surface.py index 79c835dd..bf704d18 100644 --- a/hub/city_model_structure/building_demand/surface.py +++ b/hub/city_model_structure/building_demand/surface.py @@ -18,6 +18,7 @@ from hub.city_model_structure.attributes.point import Point from hub.city_model_structure.greenery.vegetation import Vegetation from hub.city_model_structure.building_demand.thermal_boundary import ThermalBoundary import hub.helpers.constants as cte +from hub.helpers.configuration_helper import ConfigurationHelper class Surface: @@ -41,7 +42,7 @@ class Surface: self._short_wave_reflectance = None self._long_wave_emittance = None self._inverse = None - self._associated_thermal_boundaries = [] + self._associated_thermal_boundaries = None self._vegetation = None self._percentage_shared = None self._solar_collectors_area_reduction_factor = None @@ -167,10 +168,10 @@ class Surface: """ if self._type is None: inclination_cos = math.cos(self.inclination) - # 170 degrees + # 170 degrees if inclination_cos <= -0.98: self._type = 'Ground' - # between 80 and 100 degrees + # between 80 and 100 degrees elif abs(inclination_cos) <= 0.17: self._type = 'Wall' else: @@ -365,12 +366,12 @@ class Surface: _protected_building_restriction = 1 # 10 degrees range if abs(math.sin(self.inclination)) < 0.17: - # horizontal + # horizontal _construction_restriction = 0.8 _separation_of_panels = 0.46 _shadow_between_panels = 0.7 else: - # tilted + # tilted _construction_restriction = 0.9 _separation_of_panels = 0.9 _shadow_between_panels = 1 @@ -417,4 +418,4 @@ class Surface: Set installed solar collector area in m2 :return: dict """ - self._installed_solar_collector_area = value + self._installed_solar_collector_area = value \ No newline at end of file diff --git a/hub/city_model_structure/building_demand/thermal_archetype.py b/hub/city_model_structure/building_demand/thermal_archetype.py index 18786379..30c33e23 100644 --- a/hub/city_model_structure/building_demand/thermal_archetype.py +++ b/hub/city_model_structure/building_demand/thermal_archetype.py @@ -141,7 +141,7 @@ class ThermalArchetype: Get infiltration rate for ventilation system off in l/s/m2 :return: float """ - return self._infiltration_rate_for_ventilation_system_off + return self._infiltration_rate_area_for_ventilation_system_off @infiltration_rate_area_for_ventilation_system_off.setter def infiltration_rate_area_for_ventilation_system_off(self, value): @@ -149,7 +149,7 @@ class ThermalArchetype: Set infiltration rate for ventilation system off in l/s/m2 :param value: float """ - self._infiltration_rate_for_ventilation_system_off = value + self._infiltration_rate_area_for_ventilation_system_off = value @property def infiltration_rate_area_for_ventilation_system_on(self): @@ -157,7 +157,7 @@ class ThermalArchetype: Get infiltration rate for ventilation system on in l/s/m2 :return: float """ - return self._infiltration_rate_for_ventilation_system_on + return self._infiltration_rate_area_for_ventilation_system_on @infiltration_rate_area_for_ventilation_system_on.setter def infiltration_rate_area_for_ventilation_system_on(self, value): @@ -165,5 +165,4 @@ class ThermalArchetype: Set infiltration rate for ventilation system on in l/s/m2 :param value: float """ - self._infiltration_rate_for_ventilation_system_on = value - + self._infiltration_rate_area_for_ventilation_system_on = value diff --git a/hub/data/construction/eilat_archetypes.json b/hub/data/construction/eilat_archetypes.json index 25748055..809c971b 100644 --- a/hub/data/construction/eilat_archetypes.json +++ b/hub/data/construction/eilat_archetypes.json @@ -8,6 +8,8 @@ "extra_loses_due_thermal_bridges": 0.1, "infiltration_rate_for_ventilation_system_on": 0, "infiltration_rate_for_ventilation_system_off": 0.9, + "infiltration_rate_area_for_ventilation_system_on": 0, + "infiltration_rate_area_for_ventilation_system_off": 0.006, "constructions": { "OutdoorsWall": { "opaque_surface_name": "residential_1000_1980_BWh", @@ -42,6 +44,8 @@ "extra_loses_due_thermal_bridges": 0.1, "infiltration_rate_for_ventilation_system_on": 0, "infiltration_rate_for_ventilation_system_off": 0.31, + "infiltration_rate_area_for_ventilation_system_on": 0, + "infiltration_rate_area_for_ventilation_system_off": 0.002, "constructions": { "OutdoorsWall": { "opaque_surface_name": "dormitory_2011_3000_BWh", @@ -76,6 +80,8 @@ "extra_loses_due_thermal_bridges": 0.09, "infiltration_rate_for_ventilation_system_on": 0, "infiltration_rate_for_ventilation_system_off": 0.65, + "infiltration_rate_area_for_ventilation_system_on": 0, + "infiltration_rate_area_for_ventilation_system_off": 0.004, "constructions": { "OutdoorsWall": { "opaque_surface_name": "hotel_employees_1981_2010_BWh", diff --git a/hub/data/construction/us_archetypes.xml b/hub/data/construction/us_archetypes.xml index 629feb8c..a6384316 100644 --- a/hub/data/construction/us_archetypes.xml +++ b/hub/data/construction/us_archetypes.xml @@ -21,6 +21,8 @@ 0.15 0.5 0 + 0.003 + 0 @@ -44,6 +46,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -67,6 +71,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -89,6 +95,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -111,6 +119,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -133,6 +143,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -155,6 +167,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -177,6 +191,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -199,6 +215,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -221,6 +239,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -243,6 +263,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -265,6 +287,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -287,6 +311,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -309,6 +335,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -331,6 +359,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -353,6 +383,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -375,6 +407,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -397,6 +431,8 @@ 0.15 0.1 0 + 0.0005 + 0 @@ -419,6 +455,8 @@ 0.15 0.1 0 + 0.0005 + 0 @@ -441,6 +479,8 @@ 0.15 0.1 0 + 0.0005 + 0 @@ -463,6 +503,8 @@ 0.15 0.1 0 + 0.0005 + 0 @@ -485,6 +527,8 @@ 0.15 0.1 0 + 0.0005 + 0 @@ -507,6 +551,8 @@ 0.15 0.1 0 + 0.0005 + 0 @@ -529,6 +575,8 @@ 0.15 0.1 0 + 0.0005 + 0 @@ -551,6 +599,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -573,6 +623,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -595,6 +647,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -617,6 +671,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -639,6 +695,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -661,6 +719,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -683,6 +743,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -705,6 +767,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -727,6 +791,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -749,6 +815,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -771,6 +839,8 @@ 0.15 0.10 0 + 0.0005 + 0 @@ -793,6 +863,8 @@ 0.15 0.50 0 + 0.003 + 0 @@ -815,5 +887,7 @@ 0.15 0.10 0 + 0.0005 + 0 diff --git a/hub/exports/building_energy/idf.py b/hub/exports/building_energy/idf.py index aa2d0d5e..d22988d0 100644 --- a/hub/exports/building_energy/idf.py +++ b/hub/exports/building_energy/idf.py @@ -331,7 +331,6 @@ class Idf: for material in self._idf.idfobjects[self._MATERIAL]: if material.Name == "DefaultMaterial": return - self._idf.set_default_constructions() return for layer in thermal_boundary.layers: @@ -467,7 +466,7 @@ class Idf: def _add_infiltration_surface(self, thermal_zone, zone_name): schedule = f'INF_CONST schedules {thermal_zone.usage_name}' - _infiltration = thermal_zone.infiltration_rate_area_system_off*1 + _infiltration = thermal_zone.infiltration_rate_area_system_off*cte.INFILTRATION_75PA_TO_4PA self._idf.newidfobject(self._INFILTRATION, Name=f'{zone_name}_infiltration', Zone_or_ZoneList_or_Space_or_SpaceList_Name=zone_name, diff --git a/hub/exports/building_energy/idf_files/Energy+.idd b/hub/exports/building_energy/idf_files/Energy+.idd index 40da6796..95d10597 100644 --- a/hub/exports/building_energy/idf_files/Energy+.idd +++ b/hub/exports/building_energy/idf_files/Energy+.idd @@ -1,4 +1,4 @@ -!IDD_Version 23.2.0 +!IDD_Version 24.1.0 !IDD_BUILD 7636e6b3e9 ! *************************************************************************** ! This file is the Input Data Dictionary (IDD) for EnergyPlus. @@ -30002,10 +30002,10 @@ People, A7 , \field Mean Radiant Temperature Calculation Type \note optional (only required for thermal comfort runs) \type choice - \key ZoneAveraged + \key EnclosureAveraged \key SurfaceWeighted \key AngleFactor - \default ZoneAveraged + \default EnclosureAveraged A8 , \field Surface Name/Angle Factor List Name \type object-list \object-list AllHeatTranAngFacNames diff --git a/hub/exports/building_energy/idf_files/Minimal.idf b/hub/exports/building_energy/idf_files/Minimal.idf index b7a9a935..e18f8b78 100644 --- a/hub/exports/building_energy/idf_files/Minimal.idf +++ b/hub/exports/building_energy/idf_files/Minimal.idf @@ -13,7 +13,7 @@ ! HVAC: None. ! - Version,23.2; + Version,24.1; Timestep,4; @@ -154,4 +154,4 @@ Output:Meter,InteriorLights:Electricity,hourly; OutputControl:IlluminanceMap:Style, - Comma; !- Column separator \ No newline at end of file + Comma; !- Column separator diff --git a/hub/exports/energy_building_exports_factory.py b/hub/exports/energy_building_exports_factory.py index 952e4a12..698b4ebb 100644 --- a/hub/exports/energy_building_exports_factory.py +++ b/hub/exports/energy_building_exports_factory.py @@ -20,9 +20,10 @@ class EnergyBuildingsExportsFactory: """ Energy Buildings exports factory class """ - def __init__(self, handler, city, path, custom_insel_block='d18599', target_buildings=None): + def __init__(self, handler, city, path, custom_insel_block='d18599', target_buildings=None, weather_file=None): self._city = city self._export_type = '_' + handler.lower() + self._weather_file = weather_file validate_import_export_type(EnergyBuildingsExportsFactory, handler) if isinstance(path, str): path = Path(path) @@ -53,12 +54,13 @@ class EnergyBuildingsExportsFactory: """ idf_data_path = (Path(__file__).parent / './building_energy/idf_files/').resolve() url = wh().epw_file(self._city.region_code) - weather_path = (Path(__file__).parent.parent / f'data/weather/epw/{url.rsplit("/", 1)[1]}').resolve() - if not weather_path.exists(): - with open(weather_path, 'wb') as epw_file: + if self._weather_file is None: + self._weather_file = (Path(__file__).parent.parent / f'data/weather/epw/{url.rsplit("/", 1)[1]}').resolve() + if not self._weather_file.exists(): + with open(self._weather_file, 'wb') as epw_file: epw_file.write(requests.get(url, allow_redirects=True).content) - return Idf(self._city, self._path, (idf_data_path / 'Minimal.idf'), (idf_data_path / 'Energy+.idd'), weather_path, - target_buildings=self._target_buildings) + return Idf(self._city, self._path, (idf_data_path / 'Minimal.idf'), (idf_data_path / 'Energy+.idd'), + self._weather_file, target_buildings=self._target_buildings) @property def _insel_monthly_energy_balance(self): diff --git a/hub/helpers/constants.py b/hub/helpers/constants.py index f9f07776..5827e6d7 100644 --- a/hub/helpers/constants.py +++ b/hub/helpers/constants.py @@ -24,6 +24,8 @@ BTU_H_TO_WATTS = 0.29307107 KILO_WATTS_HOUR_TO_JULES = 3600000 WATTS_HOUR_TO_JULES = 3600 GALLONS_TO_QUBIC_METERS = 0.0037854117954011185 +INFILTRATION_75PA_TO_4PA = (4/75)**0.65 + # time SECOND = 'second' diff --git a/hub/imports/construction/eilat_physics_parameters.py b/hub/imports/construction/eilat_physics_parameters.py index 6aab492e..9f800079 100644 --- a/hub/imports/construction/eilat_physics_parameters.py +++ b/hub/imports/construction/eilat_physics_parameters.py @@ -66,6 +66,8 @@ class EilatPhysicsParameters: thermal_archetype.indirect_heated_ratio = 0 thermal_archetype.infiltration_rate_for_ventilation_system_on = catalog_archetype.infiltration_rate_for_ventilation_system_on thermal_archetype.infiltration_rate_for_ventilation_system_off = catalog_archetype.infiltration_rate_for_ventilation_system_off + thermal_archetype.infiltration_rate_area_for_ventilation_system_on = catalog_archetype.infiltration_rate_area_for_ventilation_system_on + thermal_archetype.infiltration_rate_area_for_ventilation_system_off = catalog_archetype.infiltration_rate_area_for_ventilation_system_off effective_thermal_capacity = 0 _constructions = [] for catalog_construction in catalog_archetype.constructions: diff --git a/hub/imports/construction/nrel_physics_parameters.py b/hub/imports/construction/nrel_physics_parameters.py index d38a4bd4..36fc84b7 100644 --- a/hub/imports/construction/nrel_physics_parameters.py +++ b/hub/imports/construction/nrel_physics_parameters.py @@ -69,6 +69,8 @@ class NrelPhysicsParameters: thermal_archetype.indirect_heated_ratio = catalog_archetype.indirect_heated_ratio thermal_archetype.infiltration_rate_for_ventilation_system_on = catalog_archetype.infiltration_rate_for_ventilation_system_on thermal_archetype.infiltration_rate_for_ventilation_system_off = catalog_archetype.infiltration_rate_for_ventilation_system_off + thermal_archetype.infiltration_rate_area_for_ventilation_system_on = catalog_archetype.infiltration_rate_area_for_ventilation_system_on + thermal_archetype.infiltration_rate_area_for_ventilation_system_off = catalog_archetype.infiltration_rate_area_for_ventilation_system_off _constructions = [] for catalog_construction in catalog_archetype.constructions: construction = Construction() diff --git a/hub/persistence/repositories/city.py b/hub/persistence/repositories/city.py index 17e018a6..65851bd5 100644 --- a/hub/persistence/repositories/city.py +++ b/hub/persistence/repositories/city.py @@ -136,3 +136,7 @@ class City(Repository): except SQLAlchemyError as err: logging.error('Error while fetching city by name %s', err) raise SQLAlchemyError from err + + def get_by_id(self, city_id) -> Model: + with Session(self.engine) as session: + return session.execute(select(Model).where(Model.id == city_id)).first()[0] \ No newline at end of file diff --git a/main.py b/main.py index a55c0175..e69de29b 100644 --- a/main.py +++ b/main.py @@ -1,61 +0,0 @@ -from pathlib import Path - -import pandas as pd -from building_modelling.geojson_creator import process_geojson -from building_modelling.ep_run_enrich import energy_plus_workflow -from hub.imports.geometry_factory import GeometryFactory -from hub.helpers.dictionaries import Dictionaries -from hub.imports.construction_factory import ConstructionFactory -from hub.imports.usage_factory import UsageFactory -from hub.imports.weather_factory import WeatherFactory -import hub.helpers.constants as cte - -# Specify the GeoJSON file path -input_files_path = (Path(__file__).parent / 'input_files') -input_files_path.mkdir(parents=True, exist_ok=True) -geojson_file = process_geojson(x=-73.5681295982132, y=45.49218262677643, diff=0.00006) -geojson_file_path = input_files_path / 'output_buildings_expanded.geojson' -output_path = (Path(__file__).parent / 'out_files').resolve() -output_path.mkdir(parents=True, exist_ok=True) -energy_plus_output_path = output_path / 'energy_plus_outputs' -energy_plus_output_path.mkdir(parents=True, exist_ok=True) -simulation_results_path = (Path(__file__).parent / 'out_files' / 'simulation_results').resolve() -simulation_results_path.mkdir(parents=True, exist_ok=True) -sra_output_path = output_path / 'sra_outputs' -sra_output_path.mkdir(parents=True, exist_ok=True) -cost_analysis_output_path = output_path / 'cost_analysis' -cost_analysis_output_path.mkdir(parents=True, exist_ok=True) -city = GeometryFactory(file_type='geojson', - path=geojson_file_path, - height_field='height', - year_of_construction_field='year_of_construction', - function_field='function', - function_to_hub=Dictionaries().montreal_function_to_hub_function).city -ConstructionFactory('nrcan', city).enrich() -UsageFactory('nrcan', city).enrich() -WeatherFactory('epw', city).enrich() -energy_plus_workflow(city, energy_plus_output_path) -building_name = [] -building_function = [] -building_year_of_construction = [] -total_floor_area = [] -building_heui = [] -building_ceui = [] -for building in city.buildings: - building_name.append(building.name) - building_function.append(building.function) - building_year_of_construction.append(building.year_of_construction) - total_floor_area.append(building.thermal_zones_from_internal_zones[0].total_floor_area) - building_heui.append(building.heating_demand[cte.YEAR][0] / ( - building.thermal_zones_from_internal_zones[0].total_floor_area * 3.6e6)) - building_ceui.append(building.cooling_demand[cte.YEAR][0] / ( - building.thermal_zones_from_internal_zones[0].total_floor_area * 3.6e6)) - -df = pd.DataFrame() -df['building name'] = building_name -df['function'] = building_function -df['yoc'] = building_year_of_construction -df['floor_area'] = total_floor_area -df['heating_eui'] = building_heui -df['cooling_eui'] = building_ceui -df.to_csv('results.csv') diff --git a/results_1.csv b/results_1.csv deleted file mode 100644 index d79cf894..00000000 --- a/results_1.csv +++ /dev/null @@ -1,20 +0,0 @@ -,building name,function,yoc,floor_area,heating_eui,cooling_eui -0,173347,residential,1986,265.38375176489353,267.0533083996842,18.007308537312785 -1,173348,residential,1986,283.668703481555,522.850852783527,20.576579713797777 -2,173403,residential,1985,11447.230666354299,228.49446179883506,12.684394922648671 -3,174898,residential,1986,283.6906412792159,522.7696663647462,19.57503262214429 -4,175785,residential,1986,467.7235050201416,516.4055045521648,21.088254314769788 -5,175910,residential,1986,261.0009156614542,527.5080465374183,25.742695259498305 -6,176056,residential,1986,182.04670348763466,349.0021295379444,16.753929193049903 -7,176261,residential,1986,277.90742287479225,583.4254987281645,26.256967472981707 -8,176293,residential,1986,369.68735361099243,257.4909312314216,14.023930562649928 -9,176296,residential,1986,290.90516459941864,575.7189866853944,19.385255082748102 -10,176298,residential,1986,369.51916921138763,257.2805985434431,14.098189573739344 -11,176918,residential,1987,2326.6517127379775,345.8090447174934,16.443395331027673 -12,178164,residential,1986,264.07378363609314,268.730268398251,17.960546856543576 -13,179679,residential,1986,260.14088670909405,271.81072456915604,18.017496250196757 -14,179789,residential,1986,181.17727002501488,349.001383425343,16.54743635457496 -15,181310,residential,1986,181.64067029953003,349.52817271006825,16.32917192857884 -16,182393,residential,1986,199.37044820690062,684.773963332913,21.540957535632746 -17,182442,residential,1986,277.0023966698591,312.7559318665529,15.48912001605364 -18,182546,residential,1986,182.38363614678383,687.7449588121772,28.929786166435022