Skip to content

Commit 64da484

Browse files
chahankChahan Kropfpeanutfun
authored
Forecast/select extended tests (#1182)
* Add extended select impact forecast test * Add extended hazard forecast test --------- Co-authored-by: Chahan Kropf <[email protected]> Co-authored-by: Lukas Riedel <[email protected]>
1 parent 48b6d40 commit 64da484

File tree

2 files changed

+87
-12
lines changed

2 files changed

+87
-12
lines changed

climada/engine/test/test_impact_forecast.py

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,58 @@ def test_impact_forecast_from_impact(
9292
self.assert_impact_kwargs(impact_forecast, **impact_kwargs)
9393

9494

95-
def test_impact_forecast_select(impact_forecast, lead_time, member, impact_kwargs):
95+
@pytest.mark.parametrize(
96+
"var, var_select",
97+
[("event_id", "event_ids"), ("event_name", "event_names"), ("date", "dates")],
98+
)
99+
def test_impact_forecast_select_events(
100+
impact_forecast, lead_time, member, impact_kwargs, var, var_select
101+
):
96102
"""Check if Impact.select works on the derived class"""
97-
event_ids = impact_kwargs["event_id"][np.array([2, 0])]
98-
impact_fc = impact_forecast.select(event_ids=event_ids)
103+
select_mask = np.array([2, 1])
104+
ordered_select_mask = np.array([1, 2])
105+
if var == "date":
106+
# Date needs to be a valid delta
107+
select_mask = np.array([1, 2])
108+
ordered_select_mask = np.array([1, 2])
109+
110+
var_value = np.array(impact_kwargs[var])[select_mask]
111+
# event_name is a list, convert to numpy array for indexing
112+
impact_fc = impact_forecast.select(**{var_select: var_value})
99113
# NOTE: Events keep their original order
100114
npt.assert_array_equal(
101-
impact_fc.event_id, impact_forecast.event_id[np.array([0, 2])]
115+
impact_fc.event_id,
116+
impact_forecast.event_id[ordered_select_mask],
117+
)
118+
npt.assert_array_equal(
119+
impact_fc.event_name,
120+
np.array(impact_forecast.event_name)[ordered_select_mask],
121+
)
122+
npt.assert_array_equal(impact_fc.date, impact_forecast.date[ordered_select_mask])
123+
npt.assert_array_equal(
124+
impact_fc.frequency, impact_forecast.frequency[ordered_select_mask]
125+
)
126+
npt.assert_array_equal(impact_fc.member, member[ordered_select_mask])
127+
npt.assert_array_equal(impact_fc.lead_time, lead_time[ordered_select_mask])
128+
npt.assert_array_equal(
129+
impact_fc.imp_mat.todense(),
130+
impact_forecast.imp_mat.todense()[ordered_select_mask],
131+
)
132+
133+
134+
def test_impact_forecast_select_exposure(
135+
impact_forecast, lead_time, member, impact_kwargs
136+
):
137+
"""Check if Impact.select works on the derived class"""
138+
exp_col = 0
139+
select_mask = np.array([exp_col])
140+
coord_exp = impact_kwargs["coord_exp"][select_mask]
141+
impact_fc = impact_forecast.select(coord_exp=coord_exp)
142+
npt.assert_array_equal(impact_fc.member, member)
143+
npt.assert_array_equal(impact_fc.lead_time, lead_time)
144+
npt.assert_array_equal(
145+
impact_fc.imp_mat.todense(), impact_forecast.imp_mat.todense()[:, exp_col]
102146
)
103-
npt.assert_array_equal(impact_fc.member, member[np.array([0, 2])])
104-
npt.assert_array_equal(impact_fc.lead_time, lead_time[np.array([0, 2])])
105147

106148

107149
@pytest.mark.skip("Concat from base class does not work")

climada/hazard/test/test_forecast.py

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,46 @@ def test_hazard_forecast_concat(haz_fc, lead_time, member):
107107
npt.assert_array_equal(haz_fc_concat.member, np.concatenate([member, member]))
108108

109109

110-
def test_hazard_forecast_select(haz_fc, lead_time, member):
110+
@pytest.mark.parametrize(
111+
"var, var_select",
112+
[("event_id", "event_id"), ("event_name", "event_names"), ("date", "date")],
113+
)
114+
def test_hazard_forecast_select(haz_fc, lead_time, member, haz_kwargs, var, var_select):
111115
"""Check if Hazard.select works on the derived class"""
112-
haz_fc_select = haz_fc.select(event_id=[4, 1])
113-
# NOTE: Events keep their original order
114-
npt.assert_array_equal(haz_fc_select.event_id, haz_fc.event_id[np.array([3, 0])])
115-
npt.assert_array_equal(haz_fc_select.member, member[np.array([3, 0])])
116-
npt.assert_array_equal(haz_fc_select.lead_time, lead_time[np.array([3, 0])])
116+
117+
select_mask = np.array([3, 2])
118+
ordered_select_mask = np.array([3, 2])
119+
if var == "date":
120+
# Date needs to be a valid delta
121+
select_mask = np.array([2, 3])
122+
ordered_select_mask = np.array([2, 3])
123+
124+
var_value = np.array(haz_kwargs[var])[select_mask]
125+
# event_name is a list, convert to numpy array for indexing
126+
haz_fc_sel = haz_fc.select(**{var_select: var_value})
127+
# Note: order is preserved
128+
npt.assert_array_equal(
129+
haz_fc_sel.event_id,
130+
haz_fc.event_id[ordered_select_mask],
131+
)
132+
npt.assert_array_equal(
133+
haz_fc_sel.event_name,
134+
np.array(haz_fc.event_name)[ordered_select_mask],
135+
)
136+
npt.assert_array_equal(haz_fc_sel.date, haz_fc.date[ordered_select_mask])
137+
npt.assert_array_equal(haz_fc_sel.frequency, haz_fc.frequency[ordered_select_mask])
138+
npt.assert_array_equal(haz_fc_sel.member, member[ordered_select_mask])
139+
npt.assert_array_equal(haz_fc_sel.lead_time, lead_time[ordered_select_mask])
140+
npt.assert_array_equal(
141+
haz_fc_sel.intensity.todense(),
142+
haz_fc.intensity.todense()[ordered_select_mask],
143+
)
144+
npt.assert_array_equal(
145+
haz_fc_sel.fraction.todense(),
146+
haz_fc.fraction.todense()[ordered_select_mask],
147+
)
148+
149+
assert haz_fc_sel.centroids == haz_fc.centroids
117150

118151

119152
def test_write_read_hazard_forecast(haz_fc, tmp_path):

0 commit comments

Comments
 (0)