def __init__(self, generateFunc, Yesterday): self.df = generateFunc[0] self.stateOfDay = generateFunc[1] self.MoversList = generateFunc[2] self.YesterdayPatients = Yesterday s = States() self.deathRate = s.returnConfig("Rates", "deathRate", float) self.daysFromLimbo = s.returnConfig( "Days", "daysUntilLimboDieDuetoLackOfBeds", int) self.numberOfBeds = s.returnConfig("SampleDefaults", "numberOfBeds", int) self.deathsLackBed = s.returnConfig("Rates", "deathsDueToLackOfBeds", float) self.hospitalRate = s.returnConfig("Rates", "hospitalizationRate", float) self.hospitalRateICU = s.returnConfig("Rates", "deathRateForICU", float) self.dayUntilCuredCovid = s.returnConfig("Days", "dayUnitlCuredIfPositive", int) self.daysUnitlCuredHos = s.returnConfig("Days", "dayUnitlCuredIfInHospital", int) self.xlimit = s.returnConfig("SampleDefaults", "xlimit", int) self.ylimit = s.returnConfig("SampleDefaults", "ylimit", int) self.distanceLimit = s.returnConfig("SampleDefaults", "distance", float)
def __init__(self): s = States() self.groupSize = s.returnConfig("SampleDefaults", "groupSize", int) self.state = s.status self.colors = s.stateColors self.sampleSize = s.returnConfig("SampleDefaults", "sampleSize", float) self.x = s.returnConfig("SampleDefaults", "xLimit", int) self.y = s.returnConfig("SampleDefaults", "yLimit", int)
class SampleModel: def __init__(self, day, generateFunc, processFunc, plotFunc, path): self.day = day self.path = path self.s = States() self.dayLimit = self.s.returnConfig('SampleDefaults', 'dayLimit', int) self.x = self.s.returnConfig('SampleDefaults', 'xLimit', int) self.y = self.s.returnConfig('SampleDefaults', 'yLimit', int) self.groupsize = self.s.returnConfig('SampleDefaults', 'groupSize', int) self.sampleSize = self.s.returnConfig('SampleDefaults', 'sampleSize', float) self.distance = self.s.returnConfig('SampleDefaults', 'distance', float) self.beds = self.s.returnConfig('SampleDefaults', 'numberOfBeds', float) logfile = f"{self.path}/{self.s.returnConfig('SampleDefaults', 'logfile', str)}" self.logFile = open(logfile, "w+") self.distanceLimit = self.s.returnConfig("SampleDefaults", "distance", float) self.generateData = generateFunc self.stateOfDay = self.generateData[1] self.MoversList = self.generateData[2] self.YesterdayPatients = list(self.generateData[0]['State']) self.startProcess = processFunc self.plotData = plotFunc def write_log(self, *args): line = ' '.join([str(a) for a in args]) self.logFile.write(line + '\n') print(line) return def infect(self, i): if rn.random() > 0.25 and self.day > 3: return if self.generateData[0].loc[i, "State"] == 0: self.generateData[0].loc[i, "State"], self.generateData[0].loc[i, "Day"] = 1, self.day def nextDay(self): process = self.startProcess self.day += 1 process.kill(self.day) process.hospitilize(self.day) process.cure(self.day) self.move() self.interact() return def plot(self): self.plotData.setup_plot(self.day) return def count(self): List = list(self.generateData[0]['State']) self.stateOfDay.loc[self.day, 'Healthy'] = List.count(0) self.stateOfDay.loc[self.day, 'Covid-19(+)'] = List.count(1) self.stateOfDay.loc[self.day, 'Hospitalized'] = List.count(2) self.stateOfDay.loc[self.day, 'Cured'] = List.count(4) self.stateOfDay.loc[self.day, 'Dead'] = List.count(3) self.stateOfDay.loc[self.day, 'Limbo'] = List.count(5) self.stateOfDay.loc[self.day, 'Self Cured'] = List.count(6) self.stateOfDay.loc[self.day, 'Total Cured'] = List.count(6) + List.count(4) return def run(self): self.infect(rn.randrange(self.groupsize)) self.plot() self.count() self.log(2) self.nextDay() self.plot() self.count() self.log(2) return def interact(self): for i in range(len(self.generateData[0])): for j in range(i): if self.check(i, j): if (self.generateData[0].loc[i, 'State'] == 0): self.infect(i) else: self.infect(j) def check(self, i, j): Dist = math.sqrt((self.generateData[0].loc[i, 'X'] - self.generateData[0].loc[j, 'X']) ** 2 + (self.generateData[0].loc[i, 'Y'] - self.generateData[0].loc[j, 'Y'])**2) flag = ((self.YesterdayPatients[i] == 1) ^ (self.YesterdayPatients[j] == 1)) and Dist < self.distanceLimit return flag def move(self): for i in self.MoversList: if (self.generateData[0].loc[i, 'State'] == 2) or (self.generateData[0].loc[i, 'State'] == 3) or (self.generateData[0].loc[i, 'State'] == 5): self.MoversList.remove(i) self.generateData[0].loc[i, 'X'], self.generateData[0].loc[i, 'Y'] = (self.generateData[0].loc[i, 'X'] + rn.uniform( 1, self.x / 3)) % self.x , (self.generateData[0].loc[i, 'Y'] + rn.uniform(1, self.y / 3)) % self.y def log(self, phase): if phase == 1: self.write_log(31 * '-') self.write_log("Here's the Input Data:") self.write_log(8 * '- - ') self.write_log('Numper of Sample:', self.groupsize) self.write_log('X & Y limites: ', self.x, ', ', self.y) self.write_log('Distance required for Contamination:', self.distance) self.write_log("Moving Sample", self.sampleSize) self.write_log("Number Of Beds", self.beds) x = input("Do you wish to continue? y/n: ") if x == "y": pass elif x == 'n': sys.exit() elif phase == 2: self.write_log(31 * '-') self.write_log('Day:', self.day) self.write_log(8 * '- - ') self.write_log(self.generateData[1].loc[self.day]) return def end(self): self.Png_to_gif() self.stateOfDay.to_excel(f"{self.path}/Stat.xlsx") self.stateOfDay.plot(title='Statistical Data Vs. Days Passed') plt.savefig(f"{self.path}/Stat") self.logFile.close() def condition(self): healthy = len(self.generateData[0][self.generateData[0]['State'] == 0]) covid19 = len(self.generateData[0][self.generateData[0]['State'] == 1]) hospitilize = len(self.generateData[0][self.generateData[0]['State'] == 2]) dead = len(self.generateData[0][self.generateData[0]['State'] == 3]) cured = len(self.generateData[0][self.generateData[0]['State'] == 4]) Limbo = len(self.generateData[0][self.generateData[0]['State'] == 5]) selfcured = len(self.generateData[0][self.generateData[0]['State'] == 6]) today = list(self.generateData[1].loc[self.day]) yest = list(self.generateData[1].loc[self.day- 1]) if covid19 == 0 and today == yest and hospitilize == 0: return 1 else: return 0 def main(self): whileBreak = 0 while True: whileBreak += int(self.condition()) if whileBreak > 2: self.end() break else: self.whileBreak = 0 self.YesterdayPatients = list(self.generateData[0]['State']) self.nextDay() self.plot() self.count() self.log(2) def Png_to_gif(self): frames = [] inImgs = f"{self.path}/days/*.png" output = f"{self.path}/png_to_gif.gif" img, *imgs = [Image.open(i) for i in sorted(glob.glob(inImgs))] img.save(fp=output, format='GIF', append_images=imgs, save_all=True, duration=500, loop=0)
class Draw: def __init__(self, df, path): self.path = path self.fig, self.axs = plt.subplots(2, figsize=(10, 8)) self.fig.suptitle('Covid-19 Epidemic Sample Model', fontsize=16) self.ld = [ 'Healthy', 'Covid-19(+)', 'Hospitalized', 'Cured', 'Self Cured', 'Death Toll', 'Limbo', 'Total Cured' ] self.df = df[0] self.stateOfDay = df[1] self.MoversList = df[2] self.state = States() self.dayLimit = self.state.returnConfig('SampleDefaults', 'dayLimit', int) self.x = self.state.returnConfig('SampleDefaults', 'xLimit', int) self.y = self.state.returnConfig('SampleDefaults', 'yLimit', int) self.groupsize = self.state.returnConfig('SampleDefaults', 'groupSize', int) self.sampleSize = self.state.returnConfig('SampleDefaults', 'sampleSize', float) self.distance = self.state.returnConfig('SampleDefaults', 'distance', float) self.beds = self.state.returnConfig('SampleDefaults', 'numberOfBeds', float) self.distanceLimit = self.state.returnConfig("SampleDefaults", "distance", float) def setup_plot(self, day): self.axs[0].cla() self.scat = self.axs[0].scatter(self.df['X'], self.df['Y'], s=1, c=self.plt1color()) for i in self.MoversList: self.axs[0].scatter(self.df.loc[i, 'X'], self.df.loc[i, 'Y'], s=6, facecolors='none', edgecolors='black') self.axs[0].text(self.df.loc[i, 'X'] + 0.02, self.df.loc[i, 'Y'] + 0.02, str(i), fontsize=5) sDay = str(day) title = f"Day={sDay}, Group Size={self.groupsize}, Movers={self.sampleSize * 100}%, Infection Distance={self.distance}" self.axs[0].set_title(title, loc='center') title2 = f"Healthy={len(self.df[self.df['State'] == 0])}, Infected={len(self.df[self.df['State'] == 1])}, Dead={len(self.df[self.df['State'] == 3])}" self.axs[0].set_xlabel(title2) self.axs[0].set_yticklabels([]) self.axs[0].set_xticklabels([]) self.axs[0].tick_params(which='both', bottom=False, top=False, right=False, left=False, labelbottom=True) self.axs[1].set_yticklabels([]) self.axs[1].set_xticklabels([]) self.axs[1].cla() self.axs[1].plot(self.stateOfDay.Healthy, label=self.ld[0], color=self.plt2color()[0]) self.axs[1].plot(self.stateOfDay['Covid-19(+)'], label=self.ld[1], color=self.plt2color()[1]) self.axs[1].plot(self.stateOfDay.Hospitalized, label=self.ld[2], color=self.plt2color()[2]) self.axs[1].plot(self.stateOfDay.Cured, label=self.ld[3], color=self.plt2color()[3]) self.axs[1].plot(self.stateOfDay['Self Cured'], label=self.ld[4], color=self.plt2color()[4]) self.axs[1].plot(self.stateOfDay.Dead, label=self.ld[5], color=self.plt2color()[5]) self.axs[1].plot(self.stateOfDay.Limbo, label=self.ld[6], color=self.plt2color()[6]) self.axs[1].plot(self.stateOfDay['Total Cured'], label=self.ld[7], color=self.plt2color()[7]) self.axs[1].set_prop_cycle(color=self.plt2color()) self.axs[1].legend(bbox_to_anchor=(0, 1), loc='upper left', borderaxespad=0.) plt.tight_layout(rect=[0, 0.03, 1, 0.95]) plt.ion() plt.pause(0.5) plt.xlabel("Days") if day < 10: sDay = '0' + sDay title = f"{self.path}/days/Day{sDay}.png" plt.savefig(title) return def plt1color(self): cols = [] for l in self.df.index: if self.df.loc[l, 'State'] == 1: # Infected cols.append(self.state.stateColors(1)) elif self.df.loc[l, 'State'] == 3: # Dead cols.append(self.state.stateColors(3)) elif self.df.loc[l, 'State'] == 2: # Hospitalized cols.append(self.state.stateColors(2)) elif self.df.loc[l, 'State'] == 4: # Cured cols.append(self.state.stateColors(4)) elif self.df.loc[l, 'State'] == 5: # Limbo cols.append(self.state.stateColors(5)) elif self.df.loc[l, 'State'] == 100: #Total Cured cols.append(self.state.stateColors(100)) else: cols.append('blue') # Healthy return cols def plt2color(self): cols = [] for i in self.stateOfDay.columns: if i == 'Covid-19(+)': # Infected cols.append('red') elif i == 'Dead': # Dead cols.append('black') elif i == 'Hospitalized': # Hospitalized cols.append('orange') elif i == 'Cured': # Cured cols.append('green') elif i == 'Self Cured': # limbo cols.append('cyan') elif i == 'Limbo': # limbo cols.append('yellow') elif i == 'Total Cured': # limbo cols.append('lime') else: cols.append('blue') # Healthy return cols