diff --git a/climada/engine/impact.py b/climada/engine/impact.py index d8c944c7b9..32d3fa3219 100644 --- a/climada/engine/impact.py +++ b/climada/engine/impact.py @@ -2208,9 +2208,12 @@ def stack_attribute(attr_name: str) -> np.ndarray: imp_mat = sparse.vstack(imp_mats) # Concatenate other attributes - kwargs = { - attr: stack_attribute(attr) for attr in ("date", "frequency", "at_event") - } + concat_attrs = { + name.lstrip("_") # Private attributes with getter/setter + for name, value in first_imp.__dict__.items() + if isinstance(value, np.ndarray) + }.difference(("event_id", "coord_exp", "eai_exp", "aai_agg")) + kwargs = {attr: stack_attribute(attr) for attr in concat_attrs} # Get remaining attributes from first impact object in list return cls( diff --git a/climada/engine/test/test_impact_forecast.py b/climada/engine/test/test_impact_forecast.py index 94655c8b17..f696d17d6a 100644 --- a/climada/engine/test/test_impact_forecast.py +++ b/climada/engine/test/test_impact_forecast.py @@ -202,13 +202,23 @@ def test_no_select(self, impact_forecast, impact_kwargs): assert imp_fc_select.imp_mat.shape == (0, num_centroids) -@pytest.mark.skip("Concat from base class does not work") -def test_impact_forecast_concat(impact_forecast, member): +def test_impact_forecast_concat(impact_forecast, member, lead_time): """Check if Impact.concat works on the derived class""" impact_fc = ImpactForecast.concat( [impact_forecast, impact_forecast], reset_event_ids=True ) npt.assert_array_equal(impact_fc.member, np.concatenate([member, member])) + npt.assert_array_equal(impact_fc.lead_time, np.concatenate([lead_time, lead_time])) + npt.assert_array_equal( + impact_fc.event_id, np.arange(impact_fc.imp_mat.shape[0]) + 1 + ) + npt.assert_array_equal(impact_fc.event_name, impact_forecast.event_name * 2) + npt.assert_array_equal( + impact_fc.imp_mat.toarray(), + np.vstack( + (impact_forecast.imp_mat.toarray(), impact_forecast.imp_mat.toarray()) + ), + ) def test_impact_forecast_blocked_methods(impact_forecast):