예제 #1
0
    def test_cutoff_hazard_pass(self):
        """Test _cutoff_hazard_damage"""
        meas = MeasureSet.from_mat(ENT_TEST_MAT)
        act_1 = meas.get_measure(name='Seawall')[0]

        haz = Hazard.from_mat(HAZ_TEST_MAT)
        exp = Exposures.from_mat(ENT_TEST_MAT)
        exp.gdf.rename(columns={'impf': 'impf_TC'}, inplace=True)
        exp.check()

        imp_set = ImpactFuncSet.from_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)
예제 #2
0
    def test_cutoff_hazard_region_pass(self):
        """Test _cutoff_hazard_damage in specific region"""
        meas = MeasureSet.from_mat(ENT_TEST_MAT)
        act_1 = meas.get_measure(name='Seawall')[0]
        act_1.exp_region_id = [1]

        haz = Hazard.from_mat(HAZ_TEST_MAT)
        exp = Exposures.from_mat(ENT_TEST_MAT)
        exp.gdf['region_id'] = np.zeros(exp.gdf.shape[0])
        exp.gdf.region_id.values[10:] = 1
        exp.check()

        imp_set = ImpactFuncSet.from_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.gdf.centr_[exp.gdf.region_id == 0])
        for i_ev in pos_null:
            self.assertEqual(new_haz.intensity[i_ev, centr_null].max(), 0)
예제 #3
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))
    def test_demo_file_pass(self):
        """Read demo excel file"""
        # Read demo mat file
        description = 'One single file.'
        imp_funcs = ImpactFuncSet.from_mat(ENT_TEST_MAT, description)

        # Check results
        n_funcs = 2
        hazard = 'TC'
        first_id = 1
        second_id = 3

        self.assertEqual(len(imp_funcs._data), 1)
        self.assertEqual(len(imp_funcs._data[hazard]), n_funcs)

        # first function
        self.assertEqual(imp_funcs._data[hazard][first_id].id, 1)
        self.assertEqual(imp_funcs._data[hazard][first_id].name,
                         'Tropical cyclone default')
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity_unit,
                         'm/s')

        self.assertEqual(imp_funcs._data[hazard][first_id].intensity.shape,
                         (9, ))
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity[0], 0)
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity[1], 20)
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity[2], 30)
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity[3], 40)
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity[4], 50)
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity[5], 60)
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity[6], 70)
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity[7], 80)
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity[8], 100)

        self.assertEqual(imp_funcs._data[hazard][first_id].mdd.shape, (9, ))
        self.assertEqual(imp_funcs._data[hazard][first_id].mdd[0], 0)
        self.assertEqual(imp_funcs._data[hazard][first_id].mdd[8], 0.41079600)

        self.assertEqual(imp_funcs._data[hazard][first_id].paa.shape, (9, ))
        self.assertEqual(imp_funcs._data[hazard][first_id].paa[0], 0)
        self.assertEqual(imp_funcs._data[hazard][first_id].paa[8], 1)

        # second function
        self.assertEqual(imp_funcs._data[hazard][second_id].id, 3)
        self.assertEqual(imp_funcs._data[hazard][second_id].name,
                         'TC Building code')
        self.assertEqual(imp_funcs._data[hazard][first_id].intensity_unit,
                         'm/s')

        self.assertEqual(imp_funcs._data[hazard][second_id].intensity.shape,
                         (9, ))
        self.assertEqual(imp_funcs._data[hazard][second_id].intensity[0], 0)
        self.assertEqual(imp_funcs._data[hazard][second_id].intensity[1], 20)
        self.assertEqual(imp_funcs._data[hazard][second_id].intensity[2], 30)
        self.assertEqual(imp_funcs._data[hazard][second_id].intensity[3], 40)
        self.assertEqual(imp_funcs._data[hazard][second_id].intensity[4], 50)
        self.assertEqual(imp_funcs._data[hazard][second_id].intensity[5], 60)
        self.assertEqual(imp_funcs._data[hazard][second_id].intensity[6], 70)
        self.assertEqual(imp_funcs._data[hazard][second_id].intensity[7], 80)
        self.assertEqual(imp_funcs._data[hazard][second_id].intensity[8], 100)

        self.assertEqual(imp_funcs._data[hazard][second_id].mdd.shape, (9, ))
        self.assertEqual(imp_funcs._data[hazard][second_id].mdd[0], 0)
        self.assertEqual(imp_funcs._data[hazard][second_id].mdd[8], 0.4)

        self.assertEqual(imp_funcs._data[hazard][second_id].paa.shape, (9, ))
        self.assertEqual(imp_funcs._data[hazard][second_id].paa[0], 0)
        self.assertEqual(imp_funcs._data[hazard][second_id].paa[8], 1)

        # general information
        self.assertEqual(imp_funcs.tag.file_name, str(ENT_TEST_MAT))
        self.assertEqual(imp_funcs.tag.description, description)
예제 #5
0
    def test_filter_exposures_pass(self):
        """Test _filter_exposures method with two values"""
        meas = Measure()
        meas.exp_region_id = [3, 4]
        meas.haz_type = 'TC'

        exp = Exposures.from_mat(ENT_TEST_MAT)
        exp.gdf.rename(columns={
            'impf_': 'impf_TC',
            'centr_': 'centr_TC'
        },
                       inplace=True)
        exp.gdf['region_id'] = np.ones(exp.gdf.shape[0])
        exp.gdf.region_id.values[:exp.gdf.shape[0] // 2] = 3
        exp.gdf.region_id[0] = 4
        exp.check()

        imp_set = ImpactFuncSet.from_mat(ENT_TEST_MAT)

        haz = Hazard.from_mat(HAZ_TEST_MAT)
        exp.assign_centroids(haz)

        new_exp = copy.deepcopy(exp)
        new_exp.gdf['value'] *= 3
        new_exp.gdf['impf_TC'].values[:20] = 2
        new_exp.gdf['impf_TC'].values[20:40] = 3
        new_exp.gdf['impf_TC'].values[40:] = 1

        new_ifs = copy.deepcopy(imp_set)
        new_ifs.get_func('TC')[1].intensity += 1
        ref_ifs = copy.deepcopy(new_ifs)

        new_haz = copy.deepcopy(haz)
        new_haz.intensity *= 4

        res_exp, res_ifs, res_haz = meas._filter_exposures(
            exp, imp_set, haz, new_exp.copy(deep=True), new_ifs, new_haz)

        # unchanged meta data
        self.assertEqual(res_exp.ref_year, exp.ref_year)
        self.assertEqual(res_exp.value_unit, exp.value_unit)
        self.assertEqual(res_exp.tag.file_name, exp.tag.file_name)
        self.assertEqual(res_exp.tag.description, exp.tag.description)
        self.assertTrue(u_coord.equal_crs(res_exp.crs, exp.crs))
        self.assertTrue(u_coord.equal_crs(res_exp.gdf.crs, exp.gdf.crs))

        # regions (that is just input data, no need for testing, but it makes the changed and unchanged parts obious)
        self.assertTrue(np.array_equal(res_exp.gdf.region_id.values[0], 4))
        self.assertTrue(
            np.array_equal(res_exp.gdf.region_id.values[1:25],
                           np.ones(24) * 3))
        self.assertTrue(
            np.array_equal(res_exp.gdf.region_id.values[25:], np.ones(25)))

        # changed exposures
        self.assertTrue(
            np.array_equal(res_exp.gdf.value.values[:25],
                           new_exp.gdf.value.values[:25]))
        self.assertTrue(
            np.all(
                np.not_equal(res_exp.gdf.value.values[:25],
                             exp.gdf.value.values[:25])))
        self.assertTrue(
            np.all(
                np.not_equal(res_exp.gdf.impf_TC.values[:25],
                             new_exp.gdf.impf_TC.values[:25])))
        self.assertTrue(
            np.array_equal(res_exp.gdf.latitude.values[:25],
                           new_exp.gdf.latitude.values[:25]))
        self.assertTrue(
            np.array_equal(res_exp.gdf.longitude.values[:25],
                           new_exp.gdf.longitude.values[:25]))

        # unchanged exposures
        self.assertTrue(
            np.array_equal(res_exp.gdf.value.values[25:],
                           exp.gdf.value.values[25:]))
        self.assertTrue(
            np.all(
                np.not_equal(res_exp.gdf.value.values[25:],
                             new_exp.gdf.value.values[25:])))
        self.assertTrue(
            np.array_equal(res_exp.gdf.impf_TC.values[25:],
                           exp.gdf.impf_TC.values[25:]))
        self.assertTrue(
            np.array_equal(res_exp.gdf.latitude.values[25:],
                           exp.gdf.latitude.values[25:]))
        self.assertTrue(
            np.array_equal(res_exp.gdf.longitude.values[25:],
                           exp.gdf.longitude.values[25:]))

        # unchanged impact functions
        self.assertEqual(list(res_ifs.get_func().keys()), [meas.haz_type])
        self.assertEqual(res_ifs.get_func()[meas.haz_type][1].id,
                         imp_set.get_func()[meas.haz_type][1].id)
        self.assertTrue(
            np.array_equal(res_ifs.get_func()[meas.haz_type][1].intensity,
                           imp_set.get_func()[meas.haz_type][1].intensity))
        self.assertEqual(res_ifs.get_func()[meas.haz_type][3].id,
                         imp_set.get_func()[meas.haz_type][3].id)
        self.assertTrue(
            np.array_equal(res_ifs.get_func()[meas.haz_type][3].intensity,
                           imp_set.get_func()[meas.haz_type][3].intensity))

        # changed impact functions
        self.assertTrue(
            np.array_equal(
                res_ifs.get_func()[meas.haz_type][1 + IMPF_ID_FACT].intensity,
                ref_ifs.get_func()[meas.haz_type][1].intensity))
        self.assertTrue(
            np.array_equal(
                res_ifs.get_func()[meas.haz_type][1 + IMPF_ID_FACT].paa,
                ref_ifs.get_func()[meas.haz_type][1].paa))
        self.assertTrue(
            np.array_equal(
                res_ifs.get_func()[meas.haz_type][1 + IMPF_ID_FACT].mdd,
                ref_ifs.get_func()[meas.haz_type][1].mdd))
        self.assertTrue(
            np.array_equal(
                res_ifs.get_func()[meas.haz_type][3 + IMPF_ID_FACT].intensity,
                ref_ifs.get_func()[meas.haz_type][3].intensity))
        self.assertTrue(
            np.array_equal(
                res_ifs.get_func()[meas.haz_type][3 + IMPF_ID_FACT].paa,
                ref_ifs.get_func()[meas.haz_type][3].paa))
        self.assertTrue(
            np.array_equal(
                res_ifs.get_func()[meas.haz_type][3 + IMPF_ID_FACT].mdd,
                ref_ifs.get_func()[meas.haz_type][3].mdd))

        # unchanged hazard
        self.assertTrue(
            np.array_equal(res_haz.intensity[:, :36].toarray(),
                           haz.intensity[:, :36].toarray()))
        self.assertTrue(
            np.array_equal(res_haz.intensity[:, 37:46].toarray(),
                           haz.intensity[:, 37:46].toarray()))
        self.assertTrue(
            np.array_equal(res_haz.intensity[:, 47:].toarray(),
                           haz.intensity[:, 47:].toarray()))

        # changed hazard
        self.assertTrue(
            np.array_equal(res_haz.intensity[[36, 46]].toarray(),
                           new_haz.intensity[[36, 46]].toarray()))