Example #1
0
    def test_calc_sector_total_impact(self):
        """Test running total impact calculations."""
        sup = SupplyChain()
        sup.read_wiod16(year='test',
                        range_rows=(5, 117),
                        range_cols=(4, 116),
                        col_iso3=2,
                        col_sectors=1)

        # Tropical cyclone over Florida and Caribbean
        hazard = Hazard('TC')
        hazard.read_mat(HAZ_TEST_MAT)

        # Read demo entity values
        # Set the entity default file to the demo one
        exp = Exposures()
        exp.read_hdf5(EXP_DEMO_H5)
        exp.check()
        exp.gdf.region_id = 840  #assign right id for USA
        exp.assign_centroids(hazard)

        impf_tc = IFTropCyclone()
        impf_tc.set_emanuel_usa()
        impf_set = ImpactFuncSet()
        impf_set.append(impf_tc)
        impf_set.check()

        sup.calc_sector_direct_impact(hazard, exp, impf_set)
        sup.calc_indirect_impact(io_approach='ghosh')
        sup.calc_total_impact()

        self.assertAlmostEqual((sup.years.shape[0], sup.mriot_data.shape[0]),
                               sup.total_impact.shape)
        self.assertAlmostEqual((sup.mriot_data.shape[0], ),
                               sup.total_aai_agg.shape)
Example #2
0
    def test_assign_pass(self):
        """Check that attribute `assigned` is correctly set."""
        np_rand = np.random.RandomState(123456789)

        haz = Hazard('FL')
        haz.set_raster([HAZ_DEMO_FL], window=Window(10, 20, 50, 60))
        haz.raster_to_vector()
        ncentroids = haz.centroids.size

        exp = Exposures()
        exp.gdf.crs = haz.centroids.crs

        # some are matching exactly, some are geographically close
        exp.gdf['longitude'] = np.concatenate([
            haz.centroids.lon,
            haz.centroids.lon + 0.001 * (-0.5 + np_rand.rand(ncentroids))
        ])
        exp.gdf['latitude'] = np.concatenate([
            haz.centroids.lat,
            haz.centroids.lat + 0.001 * (-0.5 + np_rand.rand(ncentroids))
        ])
        expected_result = np.concatenate(
            [np.arange(ncentroids),
             np.arange(ncentroids)])

        # make sure that it works for both float32 and float64
        for test_dtype in [np.float64, np.float32]:
            haz.centroids.lat = haz.centroids.lat.astype(test_dtype)
            haz.centroids.lon = haz.centroids.lon.astype(test_dtype)
            exp.assign_centroids(haz)
            self.assertEqual(exp.gdf.shape[0],
                             len(exp.gdf[INDICATOR_CENTR + 'FL']))
            np.testing.assert_array_equal(
                exp.gdf[INDICATOR_CENTR + 'FL'].values, expected_result)
Example #3
0
 def test_assign_raster_same_pass(self):
     """Test assign_centroids with raster hazard"""
     exp = Exposures()
     exp.set_from_raster(HAZ_DEMO_FL, window=Window(10, 20, 50, 60))
     exp.check()
     haz = Hazard('FL')
     haz.set_raster([HAZ_DEMO_FL], window=Window(10, 20, 50, 60))
     exp.assign_centroids(haz)
     np.testing.assert_array_equal(exp.gdf[INDICATOR_CENTR + 'FL'].values,
                                   np.arange(haz.centroids.size, dtype=int))
Example #4
0
 def test_assign_raster_pass(self):
     """ Test assign_centroids with raster hazard """
     exp = Exposures()
     exp['longitude'] = np.array([-69.235, -69.2427, -72, -68.8016496, 30])
     exp['latitude'] = np.array([10.235, 10.226, 2, 9.71272097, 50])
     exp.crs = DEF_CRS
     haz = Hazard('FL')
     haz.set_raster([HAZ_DEMO_FL], window=Window(10, 20, 50, 60))
     exp.assign_centroids(haz)
     self.assertEqual(exp[INDICATOR_CENTR + 'FL'][0], 51)
     self.assertEqual(exp[INDICATOR_CENTR + 'FL'][1], 100)
     self.assertEqual(exp[INDICATOR_CENTR + 'FL'][2], -1)
     self.assertEqual(exp[INDICATOR_CENTR + 'FL'][3], 3000 - 1)
     self.assertEqual(exp[INDICATOR_CENTR + 'FL'][4], -1)
Example #5
0
 def test_assign_large_hazard_subset_pass(self):
     """Test assign_centroids with raster hazard"""
     exp = Exposures()
     exp.set_from_raster(HAZ_DEMO_FL, window=Window(10, 20, 50, 60))
     exp.gdf.latitude[[0, 1]] = exp.gdf.latitude[[1, 0]]
     exp.gdf.longitude[[0, 1]] = exp.gdf.longitude[[1, 0]]
     exp.check()
     haz = Hazard('FL')
     haz.set_raster([HAZ_DEMO_FL])
     haz.raster_to_vector()
     exp.assign_centroids(haz)
     assigned_centroids = haz.centroids.select(
         sel_cen=exp.gdf[INDICATOR_CENTR + 'FL'].values)
     np.testing.assert_array_equal(assigned_centroids.lat, exp.gdf.latitude)
     np.testing.assert_array_equal(assigned_centroids.lon,
                                   exp.gdf.longitude)
Example #6
0
    def test_assign_raster_pass(self):
        """Test assign_centroids with raster hazard"""
        haz = Hazard('FL')

        # explicit, easy-to-understand raster centroids for hazard
        haz.centroids = Centroids()
        haz.centroids.meta = {
            'count': 1, 'crs': DEF_CRS,
            'width': 20, 'height': 10,
            'transform': rasterio.Affine(1.5, 0.0, -20, 0.0, -1.4, 8)
        }

        # explicit points with known results (see `expected_result` for details)
        exp = Exposures(crs=DEF_CRS)
        exp.gdf['longitude'] = np.array([
            -20.1, -20.0, -19.8, -19.0, -18.6, -18.4,
            -19.0, -19.0, -19.0, -19.0,
            -20.1, 0.0, 10.1, 10.1, 10.1, 0.0, -20.2, -20.3,
            -6.4, 9.8, 0.0,
        ])
        exp.gdf['latitude'] = np.array([
            7.3, 7.3, 7.3, 7.3, 7.3, 7.3,
            8.1, 7.9, 6.7, 6.5,
            8.1, 8.2, 8.3, 0.0, -6.1, -6.2, -6.3, 0.0,
            -1.9, -1.7, 0.0,
        ])
        exp.assign_centroids(haz)

        expected_result = [
            # constant y-value, varying x-value
            -1, 0, 0, 0, 0, 1,
            # constant x-value, varying y-value
            -1, 0, 0, 20,
            # out of bounds: topleft, top, topright, right, bottomright, bottom, bottomleft, left
            -1, -1, -1, -1, -1, -1, -1, -1,
            # some explicit points within the raster
            149, 139, 113,
        ]
        np.testing.assert_array_equal(exp.gdf[INDICATOR_CENTR + 'FL'].values, expected_result)
Example #7
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()
        exp.read_mat(ENT_TEST_MAT)
        exp.gdf.rename(columns={'if_': 'if_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()
        imp_set.read_mat(ENT_TEST_MAT)

        haz = Hazard('TC')
        haz.read_mat(HAZ_TEST_MAT)
        exp.assign_centroids(haz)

        new_exp = copy.deepcopy(exp)
        new_exp.gdf['value'] *= 3
        new_exp.gdf['if_TC'].values[:20] = 2
        new_exp.gdf['if_TC'].values[20:40] = 3
        new_exp.gdf['if_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.assertEqual(res_exp.crs, exp.crs)
        self.assertEqual(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.if_TC.values[:25], new_exp.gdf.if_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.if_TC.values[25:], exp.gdf.if_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 + IF_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 + IF_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 + IF_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 + IF_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 + IF_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 + IF_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()))
Example #8
0
    def calc_sector_direct_impact(self):
        """Test running direct impact calculations."""

        sup = SupplyChain()
        sup.read_wiod16(year='test',
                        range_rows=(5, 117),
                        range_cols=(4, 116),
                        col_iso3=2,
                        col_sectors=1)

        # Tropical cyclone over Florida and Caribbean
        hazard = Hazard('TC')
        hazard.read_mat(HAZ_TEST_MAT)

        # Read demo entity values
        # Set the entity default file to the demo one
        exp = Exposures()
        exp.read_hdf5(EXP_DEMO_H5)
        exp.check()
        exp.gdf.region_id = 840  #assign right id for USA
        exp.assign_centroids(hazard)

        impf_tc = IFTropCyclone()
        impf_tc.set_emanuel_usa()
        impf_set = ImpactFuncSet()
        impf_set.append(impf_tc)
        impf_set.check()

        subsecs = list(range(10)) + list(range(15, 25))
        sup.calc_sector_direct_impact(hazard,
                                      exp,
                                      impf_set,
                                      selected_subsec=subsecs)
        self.assertAlmostEqual((sup.years.shape[0], sup.mriot_data.shape[0]),
                               sup.direct_impact.shape)
        self.assertAlmostEqual(sup.direct_impact.sum(),
                               sup.direct_impact[:, sup.reg_pos['USA']].sum(),
                               places=3)
        self.assertAlmostEqual((sup.mriot_data.shape[0], ),
                               sup.direct_aai_agg.shape)
        self.assertAlmostEqual(sup.direct_aai_agg.sum(),
                               sup.direct_aai_agg[sup.reg_pos['USA']].sum(),
                               places=3)
        self.assertAlmostEqual(sup.reg_dir_imp[0], 'USA')
        self.assertAlmostEqual(sup.direct_impact.sum(),
                               sup.direct_impact[:, subsecs].sum(),
                               places=3)
        self.assertAlmostEqual(sup.direct_aai_agg.sum(),
                               sup.direct_aai_agg[subsecs].sum(),
                               places=3)

        sup.calc_sector_direct_impact(hazard,
                                      exp,
                                      impf_set,
                                      selected_subsec='manufacturing')
        self.assertAlmostEqual((sup.years.shape[0], sup.mriot_data.shape[0]),
                               sup.direct_impact.shape)
        self.assertAlmostEqual(sup.direct_impact.sum(),
                               sup.direct_impact[:, sup.reg_pos['USA']].sum(),
                               places=3)
        self.assertAlmostEqual((sup.mriot_data.shape[0], ),
                               sup.direct_aai_agg.shape)
        self.assertAlmostEqual(sup.direct_aai_agg.sum(),
                               sup.direct_aai_agg[sup.reg_pos['USA']].sum(),
                               places=3)
        self.assertAlmostEqual(sup.reg_dir_imp[0], 'USA')
        self.assertAlmostEqual(sup.direct_impact.sum(),
                               sup.direct_impact[:, range(4, 23)].sum(),
                               places=3)
        self.assertAlmostEqual(sup.direct_aai_agg.sum(),
                               sup.direct_aai_agg[range(4, 23)].sum(),
                               places=3)

        sup.calc_sector_direct_impact(hazard,
                                      exp,
                                      impf_set,
                                      selected_subsec='agriculture')
        self.assertAlmostEqual((sup.years.shape[0], sup.mriot_data.shape[0]),
                               sup.direct_impact.shape)
        self.assertAlmostEqual(sup.direct_impact.sum(),
                               sup.direct_impact[:, sup.reg_pos['USA']].sum(),
                               places=3)
        self.assertAlmostEqual((sup.mriot_data.shape[0], ),
                               sup.direct_aai_agg.shape)
        self.assertAlmostEqual(sup.direct_aai_agg.sum(),
                               sup.direct_aai_agg[sup.reg_pos['USA']].sum(),
                               places=3)
        self.assertAlmostEqual(sup.direct_impact.sum(),
                               sup.direct_impact[:, range(0, 1)].sum(),
                               places=3)
        self.assertAlmostEqual(sup.direct_aai_agg.sum(),
                               sup.direct_aai_agg[range(0, 1)].sum(),
                               places=3)

        sup.calc_sector_direct_impact(hazard,
                                      exp,
                                      impf_set,
                                      selected_subsec='mining')
        self.assertAlmostEqual((sup.years.shape[0], sup.mriot_data.shape[0]),
                               sup.direct_impact.shape)
        self.assertAlmostEqual(sup.direct_impact.sum(),
                               sup.direct_impact[:, sup.reg_pos['USA']].sum(),
                               places=3)
        self.assertAlmostEqual((sup.mriot_data.shape[0], ),
                               sup.direct_aai_agg.shape)
        self.assertAlmostEqual(sup.direct_aai_agg.sum(),
                               sup.direct_aai_agg[sup.reg_pos['USA']].sum(),
                               places=3)
        self.assertAlmostEqual(sup.direct_impact.sum(),
                               sup.direct_impact[:, range(3, 4)].sum(),
                               places=3)
        self.assertAlmostEqual(sup.direct_aai_agg.sum(),
                               sup.direct_aai_agg[range(3, 4)].sum(),
                               places=3)

        sup.calc_sector_direct_impact(hazard,
                                      exp,
                                      impf_set,
                                      selected_subsec='service')
        self.assertAlmostEqual((sup.years.shape[0], sup.mriot_data.shape[0]),
                               sup.direct_impact.shape)
        self.assertAlmostEqual(sup.direct_impact.sum(),
                               sup.direct_impact[:, sup.reg_pos['USA']].sum(),
                               places=3)
        self.assertAlmostEqual((sup.mriot_data.shape[0], ),
                               sup.direct_aai_agg.shape)
        self.assertAlmostEqual(sup.direct_aai_agg.sum(),
                               sup.direct_aai_agg[sup.reg_pos['USA']].sum(),
                               places=3)
        self.assertAlmostEqual(sup.direct_impact.sum(),
                               sup.direct_impact[:, range(26, 56)].sum(),
                               places=3)
        self.assertAlmostEqual(sup.direct_aai_agg.sum(),
                               sup.direct_aai_agg[range(26, 56)].sum(),
                               places=3)