Added a module for importing water to water source heat pump
This commit is contained in:
parent
1ed60762c3
commit
93160912c3
|
@ -0,0 +1,173 @@
|
|||
"""
|
||||
WaterToWaterHPParameters import the heat pump information
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2021 Project Author Peter Yefi peteryefi@gmail.com
|
||||
"""
|
||||
|
||||
import pandas as pd
|
||||
from typing import Dict
|
||||
from city_model_structure.energy_systems.water_to_water_hp import WaterToWaterHP
|
||||
from city_model_structure.energy_system import EnergySystem
|
||||
from scipy.optimize import curve_fit
|
||||
import numpy as np
|
||||
from typing import List
|
||||
|
||||
|
||||
class WaterToWaterHPParameters:
|
||||
"""
|
||||
WaterToWaterHPParameters class
|
||||
"""
|
||||
|
||||
def __init__(self, city, base_path):
|
||||
self._city = city
|
||||
self._base_path = (base_path / 'heat_pumps/water_to_water.xlsx')
|
||||
|
||||
def _read_file(self) -> Dict:
|
||||
"""
|
||||
reads xlsx file containing water to water heat pump information
|
||||
into a dictionary
|
||||
:return : Dict
|
||||
"""
|
||||
xl_file = pd.ExcelFile(self._base_path)
|
||||
heat_pump_dfs = {sheet_name: xl_file.parse(sheet_name)
|
||||
for sheet_name in xl_file.sheet_names}
|
||||
|
||||
hp_data = {}
|
||||
flow_rates = {
|
||||
'156': [2.84, 4.23, 5.68],
|
||||
'256': [4.73, 7.13, 9.446],
|
||||
'335': [6.62, 9.97, 12.93],
|
||||
}
|
||||
|
||||
for sheet, dataframe in heat_pump_dfs.items():
|
||||
|
||||
df = heat_pump_dfs[sheet].dropna(axis=1, how='all')
|
||||
df = df.iloc[3:, 6:35]
|
||||
|
||||
if '156' in sheet:
|
||||
hp_data[sheet] = self._extract_required_hp_data(df, [0, 10, 25, 40, 55, 67], flow_rates['156'])
|
||||
elif '256' in sheet:
|
||||
hp_data[sheet] = self._extract_required_hp_data(df, [0, 9, 24, 39, 54, 66], flow_rates['256'])
|
||||
elif '335' in sheet:
|
||||
hp_data[sheet] = self._extract_required_hp_data(df, [0, 11, 26, 41, 56, 69], flow_rates['335'])
|
||||
|
||||
return hp_data
|
||||
|
||||
def _extract_required_hp_data(self, dataframe, ranges, flow_rates):
|
||||
"""
|
||||
Extracts 156 Kw water to water heat pump data
|
||||
:param dataframe: dataframe containing all data
|
||||
:param ranges: the range of values to extract
|
||||
:param flow_rates: the flow rates of water through pump
|
||||
:return: Dict
|
||||
"""
|
||||
# extract data rows and columns
|
||||
data = {'tc': self._extract_hp_data(dataframe, [1, 11, 21], ranges),
|
||||
'pd': self._extract_hp_data(dataframe, [2, 12, 22], ranges),
|
||||
'lwt': self._extract_hp_data(dataframe, [5, 15, 25], ranges),
|
||||
'fr': (self._extract_flow_and_ewt(dataframe, ranges, [1, 11, 21], flow_rates))[0],
|
||||
'ewt': (self._extract_flow_and_ewt(dataframe, ranges, [1, 11, 21], flow_rates))[1]}
|
||||
# range values for extracting data
|
||||
return data
|
||||
|
||||
def _extract_hp_data(self, df, columns, ranges):
|
||||
"""
|
||||
Extract variable specific (LWT, PD or TC) data from water to water hp
|
||||
:param df: the dataframe
|
||||
:param columns: the columns to extract data from
|
||||
:param ranges: the range of values to extract
|
||||
:return: List
|
||||
"""
|
||||
data = df.iloc[ranges[0]:ranges[1], columns[0]].append(df.iloc[ranges[0]:ranges[1], columns[1]])\
|
||||
.append(df.iloc[ranges[0]:ranges[1], columns[2]])
|
||||
for i in range(1, 5):
|
||||
data = data.append(df.iloc[ranges[i]:ranges[i + 1], columns[0]]).append(
|
||||
df.iloc[ranges[i]:ranges[i + 1], columns[1]]).append(df.iloc[ranges[i]:ranges[i + 1], columns[2]])
|
||||
return data.dropna().values.tolist()
|
||||
|
||||
def _extract_flow_and_ewt(self, df, ranges, columns, flow_rates):
|
||||
"""
|
||||
Create the flow and ewt data based on the length of the various
|
||||
columns for the variables being extracted
|
||||
:param df: the dataframe
|
||||
:param ranges: the range of values to extract
|
||||
:param columns: the columns to extract data from
|
||||
:param flow_rates: flow rate values
|
||||
:return:
|
||||
"""
|
||||
ewt_values = [-1.111111111, 4.444444444, 10, 15.55555556, 21.11111111]
|
||||
length = [len(df.iloc[ranges[0]:ranges[1], columns[0]].dropna()),
|
||||
len(df.iloc[ranges[0]:ranges[1], columns[1]].dropna()),
|
||||
len(df.iloc[ranges[0]:ranges[1], columns[2]].dropna())]
|
||||
|
||||
ewt_data = np.repeat(ewt_values[0], sum(length))
|
||||
flow_rates_data = np.repeat(flow_rates, length)
|
||||
|
||||
for i in range(1, 5):
|
||||
length = [len(df.iloc[ranges[i]:ranges[i + 1], columns[0]].dropna()),
|
||||
len(df.iloc[ranges[i]:ranges[i + 1], columns[1]].dropna()),
|
||||
len(df.iloc[ranges[i]:ranges[i + 1], columns[2]].dropna())]
|
||||
flow_rates_data = np.append(flow_rates_data, np.repeat(flow_rates, length))
|
||||
ewt_data = np.append(ewt_data, np.repeat(ewt_values[i], sum(length)))
|
||||
|
||||
return flow_rates_data.tolist(), ewt_data.tolist()
|
||||
|
||||
def enrich_city(self):
|
||||
"""
|
||||
Enriches the city with information from file
|
||||
"""
|
||||
heap_pump_data = self._read_file()
|
||||
for model, data in heap_pump_data.items():
|
||||
heat_pump = WaterToWaterHP()
|
||||
heat_pump.model = model.strip()
|
||||
heat_pump.total_cooling_capacity = data['tc']
|
||||
heat_pump.power_demand = data['pd']
|
||||
heat_pump.flow_rate = data['fr']
|
||||
heat_pump.entering_water_temp = data['ewt']
|
||||
heat_pump.leaving_water_temp = data['lwt']
|
||||
heat_pump.power_demand_coff = self._compute_coefficients(data, data_type='power')
|
||||
heat_pump.total_cooling_capacity_coff = self._compute_coefficients(data)
|
||||
|
||||
energy_system = EnergySystem(heat_pump.model, 0, [], None)
|
||||
energy_system.water_to_water_hp = heat_pump
|
||||
self._city.add_city_object(energy_system)
|
||||
return self._city
|
||||
|
||||
def _compute_coefficients(self, heat_pump_data: Dict, data_type="heat_output") -> List[float]:
|
||||
"""
|
||||
Compute heat output and electrical demand coefficients
|
||||
from heating performance data
|
||||
:param heat_pump_data: a dictionary of heat pump data.
|
||||
:param data_type: string to indicate whether coefficient are power demands
|
||||
or heat output coefficients. Default is heat output
|
||||
:return: Tuple[Dict, Dict]
|
||||
"""
|
||||
demand = heat_pump_data['tc'] if data_type == "heat_output" else heat_pump_data['pd']
|
||||
|
||||
# Compute heat output coefficients
|
||||
popt, _ = curve_fit(self._objective_function, [heat_pump_data['ewt'], heat_pump_data['lwt'], heat_pump_data['fr']],
|
||||
demand)
|
||||
return popt.tolist()
|
||||
|
||||
def _objective_function(self, xdata: List, a1: float, a2: float, a3: float, a4: float, a5: float, a6: float,
|
||||
a7: float, a8: float, a9: float, a10: float, a11: float) -> float:
|
||||
"""
|
||||
Objective function for computing coefficients
|
||||
:param xdata:
|
||||
:param a1: float
|
||||
:param a2: float
|
||||
:param a3: float
|
||||
:param a4: float
|
||||
:param a5: float
|
||||
:param a6: float
|
||||
:param a7: float
|
||||
:param a8: float
|
||||
:param a9: float
|
||||
:param a10: float
|
||||
:param a11: float
|
||||
:return:
|
||||
"""
|
||||
x, y, t = xdata
|
||||
return (a1 * x ** 2) + (a2 * x) + (a3 * y ** 2) + (a4 * y) + (a5 * t ** 2) + (a6 * t) + (a7 * x * y) + (
|
||||
a8 * x * t) + (a9 * y * t) + (a10 * x * y * t) + a11
|
||||
|
Loading…
Reference in New Issue
Block a user