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 test_select_wrong_pass(self): """Test select wrong time range.""" disc_rate = DiscRates() disc_rate.tag.file_name = 'file1.txt' disc_rate.tag.description = 'descr1' disc_rate.years = np.arange(2000, 2050) disc_rate.rates = np.arange(disc_rate.years.size) year_range = np.arange(2050, 2060) self.assertEqual(None, disc_rate.select(year_range))
def test_net_present_value_pass(self): """Test net_present_value right time range.""" disc_rate = DiscRates() disc_rate.tag.file_name = 'file1.txt' disc_rate.tag.description = 'descr1' disc_rate.years = np.arange(2000, 2050) disc_rate.rates = np.ones(disc_rate.years.size)*0.02 val_years = np.ones(23)*6.512201157564418e9 res = disc_rate.net_present_value(2018, 2040, val_years) self.assertEqual(res, 1.215049630691397e+11)
def test_select_pass(self): """Test select right time range.""" disc_rate = DiscRates() disc_rate.tag.file_name = 'file1.txt' disc_rate.tag.description = 'descr1' disc_rate.years = np.arange(2000, 2050) disc_rate.rates = np.arange(disc_rate.years.size) year_range = np.arange(2010, 2020) sel_disc = disc_rate.select(year_range) self.assertTrue(np.array_equal(sel_disc.years, year_range)) self.assertTrue(np.array_equal(sel_disc.rates, disc_rate.rates[10:20]))
def from_excel(cls, 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 Returns ------- ent : climada.entity.Entity The entity from excel file """ exp = Exposures(pd.read_excel(file_name)) exp.tag = Tag() exp.tag.file_name = str(file_name) exp.tag.description = description dr = DiscRates.from_excel(file_name, description) impf_set = ImpactFuncSet.from_excel(file_name, description) meas_set = MeasureSet.from_excel(file_name, description) return cls(exposures=exp, disc_rates=dr, impact_func_set=impf_set, measure_set=meas_set)
def test_write_read_pass(self): """Read demo excel file.""" years = np.arange(1950, 2150) rates = np.ones(years.size) * 0.03 disc_rate = DiscRates(years=years, rates=rates) file_name = CONFIG.disc_rates.test_data.dir().joinpath( 'test_disc.xlsx') disc_rate.write_excel(file_name) disc_read = DiscRates.from_excel(file_name) self.assertTrue(np.array_equal(disc_read.years, disc_rate.years)) self.assertTrue(np.array_equal(disc_read.rates, disc_rate.rates)) self.assertEqual(disc_read.tag.file_name, str(file_name)) self.assertEqual(disc_read.tag.description, '')
def test_write_read_pass(self): """ Read demo excel file.""" disc_rate = DiscRates() disc_rate.years = np.arange(1950, 2150) disc_rate.rates = np.ones(disc_rate.years.size)*0.03 file_name = os.path.join(os.path.join(CURR_DIR, 'data'), 'test_disc.xlsx') disc_rate.write_excel(file_name) disc_read = DiscRates() disc_read.read_excel(file_name) self.assertTrue(np.array_equal(disc_read.years, disc_rate.years)) self.assertTrue(np.array_equal(disc_read.rates, disc_rate.rates)) self.assertEqual(disc_read.tag.file_name, file_name) self.assertEqual(disc_read.tag.description, '')
def test_append_to_empty_same(self): """Append DiscRates to empty one.""" disc_rate = DiscRates() disc_rate_add = DiscRates() disc_rate_add.tag.file_name = 'file1.txt' disc_rate_add.tag.description = 'descr1' disc_rate_add.years = np.array([2000, 2001, 2002]) disc_rate_add.rates = np.array([0.1, 0.2, 0.3]) disc_rate.append(disc_rate_add) disc_rate.check() self.assertTrue(np.array_equal(disc_rate.years, disc_rate_add.years)) self.assertTrue(np.array_equal(disc_rate.rates, disc_rate_add.rates)) self.assertTrue(np.array_equal(disc_rate.tag.file_name, \ disc_rate_add.tag.file_name)) self.assertTrue(np.array_equal(disc_rate.tag.description, \ disc_rate_add.tag.description))
def test_template_file_pass(self): """ Read demo excel file.""" disc_rate = DiscRates() disc_rate.read_excel(ENT_TEMPLATE_XLS) # Check results n_rates = 102 self.assertIn('int', str(disc_rate.years.dtype)) self.assertEqual(disc_rate.years.shape, (n_rates,)) self.assertEqual(disc_rate.years[0], 2000) self.assertEqual(disc_rate.years[n_rates-1], 2101) self.assertIn('float', str(disc_rate.rates.dtype)) self.assertEqual(disc_rate.rates.shape, (n_rates,)) self.assertEqual(disc_rate.rates.min(), 0.02) self.assertEqual(disc_rate.rates.max(), 0.02) self.assertEqual(disc_rate.tag.file_name, ENT_TEMPLATE_XLS) self.assertEqual(disc_rate.tag.description, '')
def test_demo_file_pass(self): """ Read demo excel file.""" disc_rate = DiscRates() description = 'One single file.' disc_rate.read_excel(ENT_DEMO_TODAY, description) # Check results n_rates = 51 self.assertIn('int', str(disc_rate.years.dtype)) self.assertEqual(disc_rate.years.shape, (n_rates,)) self.assertEqual(disc_rate.years[0], 2000) self.assertEqual(disc_rate.years[n_rates-1], 2050) self.assertIn('float', str(disc_rate.rates.dtype)) self.assertEqual(disc_rate.rates.shape, (n_rates,)) self.assertEqual(disc_rate.rates.min(), 0.02) self.assertEqual(disc_rate.rates.max(), 0.02) self.assertEqual(disc_rate.tag.file_name, ENT_DEMO_TODAY) self.assertEqual(disc_rate.tag.description, description)
def test_demo_file_pass(self): """ Read demo mat file""" # Read demo excel file disc_rate = DiscRates() description = 'One single file.' disc_rate.read_mat(ENT_TEST_MAT, description) # Check results n_rates = 51 self.assertIn('int', str(disc_rate.years.dtype)) self.assertEqual(len(disc_rate.years), n_rates) self.assertEqual(disc_rate.years[0], 2000) self.assertEqual(disc_rate.years[n_rates-1], 2050) self.assertIn('float', str(disc_rate.rates.dtype)) self.assertEqual(len(disc_rate.rates), n_rates) self.assertEqual(disc_rate.rates.min(), 0.02) self.assertEqual(disc_rate.rates.max(), 0.02) self.assertEqual(disc_rate.tag.file_name, ENT_TEST_MAT) self.assertEqual(disc_rate.tag.description, description)
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 __init__(self, exposures=None, disc_rates=None, impact_func_set=None, measure_set=None): """ Initialize entity Parameters ---------- exposures : climada.entity.Exposures, optional Exposures of the entity. The default is None (empty Exposures()). disc_rates : climada.entity.DiscRates, optional Disc rates of the entity. The default is None (empty DiscRates()). impact_func_set : climada.entity.ImpactFuncSet, optional The impact function set. The default is None (empty ImpactFuncSet()). measure_set : climada.entity.Measures, optional The measures. The default is None (empty MeasuresSet(). """ self.exposures = Exposures() if exposures is None else exposures self.disc_rates = DiscRates() if disc_rates is None else disc_rates self.impact_funcs = ImpactFuncSet( ) if impact_func_set is None else impact_func_set self.measures = MeasureSet() if measure_set is None else measure_set
def test_check_wrongRates_fail(self): """Wrong discount rates definition""" disc_rate = DiscRates() disc_rate.rates = np.array([3, 4]) disc_rate.years = np.array([1]) with self.assertRaises(ValueError) as cm: disc_rate.check() self.assertIn('Invalid DiscRates.rates size: 1 != 2.', str(cm.exception))
def test_net_present_value_wrong_pass(self): """Test net_present_value wrong time range.""" disc_rate = DiscRates() disc_rate.tag.file_name = 'file1.txt' disc_rate.tag.description = 'descr1' disc_rate.years = np.arange(2000, 2050) disc_rate.rates = np.arange(disc_rate.years.size) val_years = np.ones(11)*6.512201157564418e9 with self.assertRaises(ValueError): disc_rate.net_present_value(2050, 2060, val_years)
def test_check_wrongRates_fail(self): """Wrong discount rates definition""" disc_rate = DiscRates() disc_rate.rates = np.array([3,4]) disc_rate.years = np.array([1]) with self.assertLogs('climada.util.checker', level='ERROR') as cm: with self.assertRaises(ValueError): disc_rate.check() self.assertIn('Invalid DiscRates.rates size: 1 != 2.', cm.output[0])
def from_mat(cls, 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 Returns ------- ent : climada.entity.Entity The entity from matlab file """ return cls(exposures=Exposures.from_mat(file_name), disc_rates=DiscRates.from_mat(file_name, description), impact_func_set=ImpactFuncSet.from_mat( file_name, description), measure_set=MeasureSet.from_mat(file_name, 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, exposures=None, disc_rates=None, impact_func_set=None, measure_set=None): """ Initialize entity Parameters ---------- exposures : climada.entity.Exposures, optional Exposures of the entity. The default is None (empty Exposures()). disc_rates : climada.entity.DiscRates, optional Disc rates of the entity. The default is None (empty DiscRates()). impact_func_set : climada.entity.ImpactFuncSet, optional The impact function set. The default is None (empty ImpactFuncSet()). measure_set : climada.entity.Measures, optional The measures. The default is None (empty MeasuresSet(). """ self.exposures = Exposures() if exposures is None else exposures self.disc_rates = DiscRates() if disc_rates is None else disc_rates self.impact_funcs = ImpactFuncSet( ) if impact_func_set is None else impact_func_set self.measures = MeasureSet() if measure_set is None else measure_set @classmethod def from_mat(cls, 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 Returns ------- ent : climada.entity.Entity The entity from matlab file """ return cls(exposures=Exposures.from_mat(file_name), disc_rates=DiscRates.from_mat(file_name, description), impact_func_set=ImpactFuncSet.from_mat( file_name, description), measure_set=MeasureSet.from_mat(file_name, description)) def read_mat(self, *args, **kwargs): """This function is deprecated, use Entity.from_mat instead.""" LOGGER.warning("The use of Entity.read_mat is deprecated." "Use Entity.from_mat instead.") self.__dict__ = Entity.from_mat(*args, **kwargs).__dict__ @classmethod def from_excel(cls, 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 Returns ------- ent : climada.entity.Entity The entity from excel file """ exp = Exposures(pd.read_excel(file_name)) exp.tag = Tag() exp.tag.file_name = str(file_name) exp.tag.description = description dr = DiscRates.from_excel(file_name, description) impf_set = ImpactFuncSet.from_excel(file_name, description) meas_set = MeasureSet.from_excel(file_name, description) return cls(exposures=exp, disc_rates=dr, impact_func_set=impf_set, measure_set=meas_set) def read_excel(self, *args, **kwargs): """This function is deprecated, use Entity.from_excel instead.""" LOGGER.warning("The use of Entity.read_excel is deprecated." "Use Entity.from_excel instead.") self.__dict__ = Entity.from_excel(*args, **kwargs).__dict__ def write_excel(self, file_name): """Write excel file following template.""" self.exposures.gdf.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): raise ValueError("Input value is not (sub)class of Exposures.") elif name == "impact_funcs": if not isinstance(value, ImpactFuncSet): raise ValueError( "Input value is not (sub)class of ImpactFuncSet.") elif name == "measures": if not isinstance(value, MeasureSet): raise ValueError( "Input value is not (sub)class of MeasureSet.") elif name == "disc_rates": if not isinstance(value, DiscRates): raise ValueError("Input value is not (sub)class of DiscRates.") 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__
def __init__(self): """ Empty initializator """ self.exposures = Exposures() self.disc_rates = DiscRates() self.impact_funcs = ImpactFuncSet() self.measures = MeasureSet()
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__
def test_append_different_append(self): """Append DiscRates with same and new values. The rates with repeated years are overwritten.""" disc_rate = DiscRates() disc_rate.tag.file_name = 'file1.txt' disc_rate.tag.description = 'descr1' disc_rate.years = np.array([2000, 2001, 2002]) disc_rate.rates = np.array([0.1, 0.2, 0.3]) disc_rate_add = DiscRates() disc_rate_add.tag.file_name = 'file2.txt' disc_rate_add.tag.description = 'descr2' disc_rate_add.years = np.array([2000, 2001, 2003]) disc_rate_add.rates = np.array([0.11, 0.22, 0.33]) disc_rate.append(disc_rate_add) disc_rate.check() self.assertTrue(np.array_equal(disc_rate.years, \ np.array([2000, 2001, 2002, 2003]))) self.assertTrue(np.array_equal(disc_rate.rates, \ np.array([0.11, 0.22, 0.3, 0.33]))) self.assertTrue(np.array_equal(disc_rate.tag.file_name, 'file1.txt + file2.txt')) self.assertTrue(np.array_equal(disc_rate.tag.description, 'descr1 + descr2'))
def test_append_equal_same(self): """Append the same DiscRates. The inital DiscRates is obtained.""" disc_rate = DiscRates() disc_rate.tag.file_name = 'file1.txt' disc_rate.tag.description = 'descr1' disc_rate.years = np.array([2000, 2001, 2002]) disc_rate.rates = np.array([0.1, 0.2, 0.3]) disc_rate_add = DiscRates() disc_rate_add.tag.file_name = 'file1.txt' disc_rate_add.tag.description = 'descr1' disc_rate_add.years = np.array([2000, 2001, 2002]) disc_rate_add.rates = np.array([0.1, 0.2, 0.3]) disc_rate.append(disc_rate_add) disc_rate.check() self.assertTrue(np.array_equal(disc_rate.years, disc_rate_add.years)) self.assertTrue(np.array_equal(disc_rate.rates, disc_rate_add.rates)) self.assertTrue(np.array_equal(disc_rate.tag.file_name, disc_rate_add.tag.file_name)) self.assertEqual(disc_rate.tag.description, disc_rate_add.tag.description)
def test_attributes_all(self): """All attributes are defined""" disc_rate = DiscRates() self.assertTrue(hasattr(disc_rate, 'years')) self.assertTrue(hasattr(disc_rate, 'rates'))