ParameterDerive
===
The python file for the parameters needed for the cpp program
###### tags: `SmartDispenserSimulator`
```
# Import the libraries for use
import pandas as pd
import numpy as np
from datetime import datetime
from statistics import mean
"""
Variable Names and Definition:
data: For reading the complete data from the raw data csv file
hv: Series variable for storing the hot valve usage data
wv: Series variable for storing the warm valve usage data
cv: Series variable for storing the cold valve usage data
VolumeUse: Dataframe for saving the volume used and the output csv is obtained from this dataframe
dheatloss: Dataframe for getting the heat loss coefficient
heatlossindex: list variable to keep the index values of the dataframe dheatloss
heatlossindcont: list variable to keep the continuous index values of the dataframe dheatloss
heati: Selecting the continuous array i from heatlossindcont
m: Series variable for storing the slope of each array
n: The average of the series m giving the conductivity value
dcoldloss: Dataframe for getting the cold loss coefficient
coldlossindex: list variable to keep the index values of the dataframe dcoldloss
coldlossindcont: list variable to keep the continuous index values of the dataframe coldloss
coldi: Selecting the continuous array i from coldlossindcont
m1: Series variable for storing the slope of each array
n1: The average of the series m giving the conductivity value
dfwarmloss: Dataframe for getting the warm tank conductivity
warmlossindex: list variable to keep the index values of the dataframe dfwarmloss
warmlossindcont: list variable to keep the continuous index values of the dataframe dfwarmloss
warmi: Selecting the continuous array i from heatlossindcont
m1: Series variable for storing the slope of each array
n2: The average of the series m giving the conductivity value
dheat: Data frame for determining the minimum and maximum heat temperatures for regular heating
ascendingorderObjhot: dheat temperature values sorted in ascending order
htcount: Counts of each temperature of the dheat dataframe
heatmax: Upper limit temperature
heatmin: Lower limit temperature
dcool: Data frame for determining the minimum and maximum heat temperatures for regular heating
ascendingorderObjc: dheat temperature values sorted in ascending order
ctcount: Counts of each temperature of the dcool dataframe
coldmax: Upper limit temperature
coldmin: Lower limit temperature
"""
# Import and read data, drop the fields not needed for parameter calculation
""" Change the file name here for other simulators """
data = pd.read_csv("MA_04_01_test (1).csv", header = 0)
data = data.drop([ 'Watts', 'HighWaterLevel', 'LowWaterLevel',
'MeanWaterLevel', 'Sterilizing', 'ErrorCode'], axis = 1)
## Change the upload times to Unix Timestamps
def DT(row):
date = datetime.strptime(row, "%Y-%m-%d %H:%M")
return datetime.timestamp(date)
data['UploadTime'] = data['UploadTime'].apply(DT)
hv = (data['Hot_Valve'] > 0) # To get the rows where the hot tank water is used
wv = (data['Warm_Valve'] > 0) # To get the rows where the warm tank water is used
cv = (data['Cold_Valve'] > 0) # To get the rows where the cold tank water is used
# Volume used Calculation
VolumeUse = pd.DataFrame(columns = ['VolumeUse', 'Case'])
for i, row in data.iterrows(): # Calculating the volume used by subtracting subsequent rows
VolumeUse['VolumeUse'] = (-(data['Usage_L'] + 0.001*data['Usage_CC']) + (data['Usage_L'].shift(-1) + 0.001*(data['Usage_CC'].shift(-1))))
for j in range(len(hv)): # Setting the number as per the tank from which the water is used
if(hv[j] == True):
VolumeUse['Case'][j] = 1
elif(wv[j] == True):
VolumeUse['Case'][j] = 2
elif(cv[j] == True):
VolumeUse['Case'][j] = 3
else:
VolumeUse['Case'][j] = 0
VolumeUse.Case = VolumeUse.Case.shift(-1)
for i,row in VolumeUse.iterrows(): # Setting the rows where volume use exist but the tank information is not present
if((VolumeUse['VolumeUse'][i] > 0) & (VolumeUse['Case'][i] == 0)):
VolumeUse['Case'][i] = 1
# Generating a .csv file for the volume of water used and the case for the cpp program
""" Change the name of the file and path here """
VolumeUse.to_csv(r'C:\Users\AnkitPanda\Desktop\Internship@Taiwan\Test1.csv', index = None, header = None)
# Heat Loss Coefficient for the hot tank
# Getting the rows having the Heating flag as 0
dheatloss = pd.DataFrame()
for i, row in data.iterrows():
if(row['Heating'] == 0):
dheatloss = dheatloss.append(data.loc[i])
# Dropping coloumns not needed for calculation
dheatloss = dheatloss.drop(['ColdTemp', 'Cooling', 'Refilling', 'WarmTemp'], axis = 1)
# Separating the rows where the heat loss occurs
heatlossindex = dheatloss.index[dheatloss['Heating'] == 0].tolist() # The index of the main dataframe where the heating is 0
heatlossindcont = []
k = 0
li = []
length = len(heatlossindex)
for i,item in enumerate(heatlossindex): # Separating out the continuous indexes to a new list element
if(i+1 < length and item + 1 != heatlossindex[i+1]):
li.append(item)
heatlossindcont.append(li)
li = []
continue
li.append(item)
# Removing the rows which have the heating after refilling
heatarray = []
for i in range(len(heatlossindcont)):
if(len(heatlossindcont[i]) >= 30): # Removing the list elements in which the refilling occurs, 30 mins. has been set as a time for the threshold
heatarray.append(heatlossindcont[i]) # If no one use the dispenser for more than 30 mins. only that data to be used
heatlossindcont = heatarray
# Fitting a linear line to the data for obtaining the conductivity value
m = []
for i in range(len(heatlossindcont)):
heati = heatlossindcont[i]
l = len(heatlossindcont[i])
f = heati[0]
h = heati[l - 1]
a = data.iloc[f:h,1]
b = list(range(len(a)))
c = np.polynomial.polynomial.Polynomial.fit(b,a,1)
m.append(c.convert().coef[1]) # Getting the slope of the lines after fitting the curve
n = mean(m) # Calculating the mean of the slope data to get the conductivity
# Getting the rows where the value of cooling is 0
dcoldloss = pd.DataFrame()
for i, row in data.iterrows():
if(row['Cooling'] == 0):
dcoldloss = dcoldloss.append(data.loc[i])
# Dropping the rows which do not have use in the calculation
dcoldloss = dcoldloss.drop(['Heating', 'HotTemp', 'Refilling', 'WarmTemp'], axis = 1)
# Getting the list of index which have cooling flag is 0
coldlossindex = dcoldloss.index[dcoldloss['Cooling'] == 0].tolist()
coldlossindcont = []
li1 = []
length = len(coldlossindex)
for i,item in enumerate(coldlossindex): # Separating the continuous rows
if(i+1 < length and item + 1 != coldlossindex[i+1]):
li1.append(item)
coldlossindcont.append(li1)
li1 = []
continue
li1.append(item)
# Removing the coloumns which have cold water usage
coldarray = []
for i in range(len(coldlossindcont)):
if(len(coldlossindcont[i])> 100): # If a length of less than 100 minutes means tha the cold water was used and hence cannot be tested
coldarray.append(coldlossindcont[i])
coldlossindcont = coldarray
m1 = []
# Fitting a linear line to the points for the conductivity value
coldi = coldlossindcont[0]
l1 = len(coldlossindcont[0])
f1 = coldi[0]
h1 = coldi[l1 - 1]
a1 = data.iloc[f1:h1+5,10]
b1 = list(range(len(a1)))
c1 = np.polynomial.polynomial.Polynomial.fit(b1,a1,1)
m1.append(c1.convert().coef[1])
n1 = mean(m1)
" Warm tank coefficient "
dfwarmloss = pd.DataFrame() # Dataframe for warm temperature values
for i, row in data.iterrows(): # getting the values where the refilling is not happening
if((row['Refilling'] == 0) & (row['Warm_Valve'] == 0)):
dfwarmloss = dfwarmloss.append(data.loc[i])
warmlossindex = dfwarmloss.index[(dfwarmloss['Refilling'] == 0) & (dfwarmloss['Warm_Valve'] == 0)].tolist() # getting the index values of the warm tank
dfwarmloss = dfwarmloss.drop(['ColdTemp', 'Cooling', 'Heating', 'HotTemp'], axis = 1)
warmlossindcont = []
li1 = []
length = len(warmlossindex)
for i,item in enumerate(warmlossindex): # Getting the row indices into a new list
if(i+1 < length and item + 1 != warmlossindex[i+1]):
li1.append(item)
warmlossindcont.append(li1)
li1 = []
continue
li1.append(item)
warmarray = []
for i in range(len(warmlossindcont)): # If the warm tank is refilling in less than 20 minutes then we need to remove those rows
if(len(warmlossindcont[i]) > 20):
warmarray.append(warmlossindcont[i])
warmlossindcont = warmarray
m2 = []
for i in range(len(warmlossindcont)):
warmi = warmlossindcont[i]
l1 = len(warmlossindcont[i])
f1 = warmi[0]
h1 = warmi[l1 - 1]
a1 = data.iloc[f1:h1,9]
b1 = list(range(len(a1)))
c1 = np.polynomial.polynomial.Polynomial.fit(b1,a1,1)
m2.append(c1.convert().coef[1])
mavg = []
for i in range(len(m2)): # Removing the lines which have a negative slope for the equation
if(m2[i] < 0):
mavg.append(m2[i])
n2 = mean(mavg) # Calculating the mean of all the conductivity values
" Getting the insulation temperature for the hot tank "
# Separating the columns in which the Heating, Power Saving and Refilling is not there
dheat = pd.DataFrame()
for i, row in data.iterrows():
if((row['Heating'] == 0) & (row['SavingPower'] == 0) & (row['Refilling'] == 0)):
dheat = dheat.append(data.loc[i])
# Sorting the hot temperatures to get the minima and maxima of the data
ascendingorderObjhot = dheat.sort_values(by = 'HotTemp')
# Dropping the unwanted rows
ascendingorderObjhot = ascendingorderObjhot.drop(['ColdTemp', 'Cooling', 'Heating', 'Hot_Valve',
'Refilling', 'SavingPower', 'UploadTime', 'WarmTemp', 'Warm_Valve' ], axis = 1)
# Getting the value counts of the objects
htcount = ascendingorderObjhot['HotTemp'].value_counts()
# Sorting the index by temperatures
htcount = htcount.sort_index()
# Removing the values which are not frequent in the data
# The frequency here has been set to 10 since observed in the dataset the extreme values have a frequency of 4 or 5
htcount = htcount[htcount >= 10]
# Getting the minima and maxima of the data
heat = []
heat = htcount.index
heatmin = heat[0]
l = len(heat)
heatmax = heat[l - 1]
" Getting the insulation temperature for the cold tank"
# Separating the columns in which the Cooling, PowerSaving and Cold_Valve is not used
dcool = pd.DataFrame()
for i,row in data.iterrows():
if((row['Cooling'] == 0) & (row['SavingPower'] == 0) & (row['Cold_Valve'] == 0)):
dcool = dcool.append(data.loc[i])
# Sorting the hot temperatures to get the minima and maxima of the data
ascendingorderObjc = dcool.sort_values(by = 'ColdTemp')
# Dropping the unwanted columns
ascendingorderObjc = ascendingorderObjc.drop(['HotTemp', 'Cooling', 'Heating', 'Hot_Valve',
'Refilling', 'SavingPower', 'UploadTime', 'WarmTemp', 'Warm_Valve', 'Cold_Valve' ], axis = 1)
# Getting the value counts of the objects
ctcount = ascendingorderObjc['ColdTemp'].value_counts()
# Sorting the index by temperatures
ctcount = ctcount.sort_index()
# Removing the values which are not frequent in the data
# The frequency here has been set to 10 since observed in the dataset the extreme values have a frequency of 4 or 5
ctcount = ctcount[ctcount >= 10]
# Getting the minima and maxima of the data
cold = []
cold = ctcount.index
coldmin = cold[0]
lc = len(cold)
coldmax = cold[lc - 1]
" Write the final parameters to the csv for the simulator program to read it "
par = pd.DataFrame({'0' : [heatmin], '1' : [heatmax], '2': [coldmin], '3': [coldmax], '4' : [n],'5' : [n2], '6' : [n1]})
par.to_csv(r'C:\Users\AnkitPanda\Desktop\Internship@Taiwan\parameter.csv', index = None, header = None)
```