def test_change_imp_func_pass(self): """Test _change_imp_func""" meas = MeasureSet() meas.read_mat(ENT_TEST_MAT) act_1 = meas.get_measure(name='Mangroves')[0] imp_set = ImpactFuncSet() imp_tc = ImpactFunc() imp_tc.haz_type = 'XX' imp_tc.id = 1 imp_tc.intensity = np.arange(10, 100, 10) imp_tc.intensity[0] = 0. imp_tc.intensity[-1] = 100. imp_tc.mdd = np.array([0.0, 0.0, 0.021857142857143, 0.035887500000000, 0.053977415307403, 0.103534246575342, 0.180414000000000, 0.410796000000000, 0.410796000000000]) imp_tc.paa = np.array([0, 0.005000000000000, 0.042000000000000, 0.160000000000000, 0.398500000000000, 0.657000000000000, 1.000000000000000, 1.000000000000000, 1.000000000000000]) imp_set.append(imp_tc) new_imp = act_1._change_imp_func(imp_set).get_func('XX')[0] self.assertTrue(np.array_equal(new_imp.intensity, np.array([4., 24., 34., 44., 54., 64., 74., 84., 104.]))) self.assertTrue(np.array_equal(new_imp.mdd, np.array([0, 0, 0.021857142857143, 0.035887500000000, 0.053977415307403, 0.103534246575342, 0.180414000000000, 0.410796000000000, 0.410796000000000]))) self.assertTrue(np.array_equal(new_imp.paa, np.array([0, 0.005000000000000, 0.042000000000000, 0.160000000000000, 0.398500000000000, 0.657000000000000, 1.000000000000000, 1.000000000000000, 1.000000000000000]))) self.assertFalse(id(new_imp) == id(imp_tc))
def test_cutoff_hazard_pass(self): """Test _cutoff_hazard_damage""" meas = MeasureSet() meas.read_mat(ENT_TEST_MAT) act_1 = meas.get_measure(name='Seawall')[0] haz = Hazard('TC') haz.read_mat(HAZ_TEST_MAT) exp = Exposures() exp.read_mat(ENT_TEST_MAT) exp.gdf.rename(columns={'if_': 'if_TC'}, inplace=True) exp.check() imp_set = ImpactFuncSet() imp_set.read_mat(ENT_TEST_MAT) new_haz = act_1._cutoff_hazard_damage(exp, imp_set, haz) self.assertFalse(id(new_haz) == id(haz)) pos_no_null = np.array([6249, 7697, 9134, 13500, 13199, 5944, 9052, 9050, 2429, 5139, 9053, 7102, 4096, 1070, 5948, 1076, 5947, 7432, 5949, 11694, 5484, 6246, 12147, 778, 3326, 7199, 12498, 11698, 6245, 5327, 4819, 8677, 5970, 7101, 779, 3894, 9051, 5976, 3329, 5978, 4282, 11697, 7193, 5351, 7310, 7478, 5489, 5526, 7194, 4283, 7191, 5328, 4812, 5528, 5527, 5488, 7475, 5529, 776, 5758, 4811, 6223, 7479, 7470, 5480, 5325, 7477, 7318, 7317, 11696, 7313, 13165, 6221]) all_haz = np.arange(haz.intensity.shape[0]) all_haz[pos_no_null] = -1 pos_null = np.argwhere(all_haz > 0).reshape(-1) for i_ev in pos_null: self.assertEqual(new_haz.intensity[i_ev, :].max(), 0)
def test_cutoff_hazard_region_pass(self): """Test _cutoff_hazard_damage in specific region""" meas = MeasureSet() meas.read_mat(ENT_TEST_MAT) act_1 = meas.get_measure(name='Seawall')[0] act_1.exp_region_id = [1] haz = Hazard('TC') haz.read_mat(HAZ_TEST_MAT) exp = Exposures() exp.read_mat(ENT_TEST_MAT) exp['region_id'] = np.zeros(exp.shape[0]) exp.region_id.values[10:] = 1 exp.check() imp_set = ImpactFuncSet() imp_set.read_mat(ENT_TEST_MAT) new_haz = act_1._cutoff_hazard_damage(exp, imp_set, haz) self.assertFalse(id(new_haz) == id(haz)) pos_no_null = np.array([ 6249, 7697, 9134, 13500, 13199, 5944, 9052, 9050, 2429, 5139, 9053, 7102, 4096, 1070, 5948, 1076, 5947, 7432, 5949, 11694, 5484, 6246, 12147, 778, 3326, 7199, 12498, 11698, 6245, 5327, 4819, 8677, 5970, 7101, 779, 3894, 9051, 5976, 3329, 5978, 4282, 11697, 7193, 5351, 7310, 7478, 5489, 5526, 7194, 4283, 7191, 5328, 4812, 5528, 5527, 5488, 7475, 5529, 776, 5758, 4811, 6223, 7479, 7470, 5480, 5325, 7477, 7318, 7317, 11696, 7313, 13165, 6221 ]) all_haz = np.arange(haz.intensity.shape[0]) all_haz[pos_no_null] = -1 pos_null = np.argwhere(all_haz > 0).reshape(-1) centr_null = np.unique(exp.centr_[exp.region_id == 0]) for i_ev in pos_null: self.assertEqual(new_haz.intensity[i_ev, centr_null].max(), 0)
def test_demo_file(self): # Read demo excel file meas = MeasureSet() description = 'One single file.' meas.read_mat(ENT_TEST_MAT, description) # Check results n_meas = 4 self.assertEqual(meas.size(), n_meas) act_man = meas.get_measure(name='Mangroves')[0] self.assertEqual(act_man.name, 'Mangroves') self.assertEqual(act_man.haz_type, 'XX') self.assertEqual(type(act_man.color_rgb), np.ndarray) self.assertEqual(len(act_man.color_rgb), 3) self.assertEqual(act_man.color_rgb[0], 0.1529) self.assertEqual(act_man.color_rgb[1], 0.251) self.assertEqual(act_man.color_rgb[2], 0.5451) self.assertEqual(act_man.cost, 1311768360.8515418) self.assertEqual(act_man.hazard_freq_cutoff, 0) self.assertEqual(act_man.hazard_set, 'nil') self.assertEqual(act_man.hazard_inten_imp, (1, -4)) self.assertEqual(act_man.exposures_set, 'nil') self.assertEqual(act_man.exp_region_id, 0) self.assertEqual(act_man.mdd_impact, (1, 0)) self.assertEqual(act_man.paa_impact, (1, 0)) self.assertEqual(act_man.imp_fun_map, 'nil') self.assertEqual(act_man.risk_transf_attach, 0) self.assertEqual(act_man.risk_transf_cover, 0) act_buil = meas.get_measure(name='Building code')[0] self.assertEqual(act_buil.name, 'Building code') self.assertEqual(act_buil.haz_type, 'XX') self.assertEqual(type(act_buil.color_rgb), np.ndarray) self.assertEqual(len(act_buil.color_rgb), 3) self.assertEqual(act_buil.color_rgb[0], 0.6980) self.assertEqual(act_buil.color_rgb[1], 0.8745) self.assertEqual(act_buil.color_rgb[2], 0.9333) self.assertEqual(act_buil.cost, 9200000000.0000000) self.assertEqual(act_buil.hazard_freq_cutoff, 0) self.assertEqual(act_buil.hazard_set, 'nil') self.assertEqual(act_buil.hazard_inten_imp, (1, 0)) self.assertEqual(act_buil.exposures_set, 'nil') self.assertEqual(act_buil.exp_region_id, 0) self.assertEqual(act_buil.mdd_impact, (0.75, 0)) self.assertEqual(act_buil.paa_impact, (1, 0)) self.assertEqual(act_man.imp_fun_map, 'nil') self.assertEqual(act_buil.risk_transf_attach, 0) self.assertEqual(act_buil.risk_transf_cover, 0) self.assertEqual(meas.tag.file_name, ENT_TEST_MAT) self.assertEqual(meas.tag.description, description)
class Entity(object): """Collects exposures, impact functions, measures and discount rates. Default values set when empty constructor. Attributes: exposures (Exposures): exposures impact_funcs (ImpactFucs): impact functions measures (MeasureSet): measures disc_rates (DiscRates): discount rates def_file (str): Default file from configuration file """ def __init__(self): """ Empty initializator """ self.exposures = Exposures() self.disc_rates = DiscRates() self.impact_funcs = ImpactFuncSet() self.measures = MeasureSet() def read_mat(self, file_name, description=''): """Read MATLAB file of climada. Parameters: file_name (str, optional): file name(s) or folder name containing the files to read description (str or list(str), optional): one description of the data or a description of each data file Raises: ValueError """ self.exposures = Exposures() self.exposures.read_mat(file_name) self.disc_rates = DiscRates() self.disc_rates.read_mat(file_name, description) self.impact_funcs = ImpactFuncSet() self.impact_funcs.read_mat(file_name, description) self.measures = MeasureSet() self.measures.read_mat(file_name, description) def read_excel(self, file_name, description=''): """Read csv or xls or xlsx file following climada's template. Parameters: file_name (str, optional): file name(s) or folder name containing the files to read description (str or list(str), optional): one description of the data or a description of each data file Raises: ValueError """ self.exposures = Exposures(pd.read_excel(file_name)) self.exposures.tag = Tag() self.exposures.tag.file_name = file_name self.exposures.tag.description = description self.disc_rates = DiscRates() self.disc_rates.read_excel(file_name, description) self.impact_funcs = ImpactFuncSet() self.impact_funcs.read_excel(file_name, description) self.measures = MeasureSet() self.measures.read_excel(file_name, description) def write_excel(self, file_name): """ Write excel file following template. """ self.exposures.to_excel(file_name) self.impact_funcs.write_excel(file_name) self.measures.write_excel(file_name) self.disc_rates.write_excel(file_name) def check(self): """Check instance attributes. Raises: ValueError """ self.disc_rates.check() self.exposures.check() self.impact_funcs.check() self.measures.check() def __setattr__(self, name, value): """Check input type before set""" if name == "exposures": if not isinstance(value, Exposures): LOGGER.error("Input value is not (sub)class of Exposures.") raise ValueError elif name == "impact_funcs": if not isinstance(value, ImpactFuncSet): LOGGER.error("Input value is not (sub)class of ImpactFuncSet.") raise ValueError elif name == "measures": if not isinstance(value, MeasureSet): LOGGER.error("Input value is not (sub)class of MeasureSet.") raise ValueError elif name == "disc_rates": if not isinstance(value, DiscRates): LOGGER.error("Input value is not (sub)class of DiscRates.") raise ValueError super().__setattr__(name, value) def __str__(self): return 'Exposures: \n' + self.exposures.tag.__str__() + \ '\nDiscRates: \n' + self.disc_rates.tag.__str__() + \ '\nImpactFuncSet: \n' + self.impact_funcs.tag.__str__() + \ '\nMeasureSet: \n' + self.measures.tag.__str__() __repr__ = __str__