Skip to content

Commit 380f0dd

Browse files
committed
Rework parameters to 'reduce_unique_selection'
1 parent 4c07a37 commit 380f0dd

3 files changed

Lines changed: 35 additions & 36 deletions

File tree

climada/engine/impact_forecast.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,8 @@ def min(self, dim: Literal["member", "lead_time"] | None = None):
315315
rdim = self._reduce_iter_dim(dim)
316316
return reduce_unique_selection(
317317
self,
318-
values=getattr(self, rdim),
319-
select=rdim,
320-
reduce_attr="min",
318+
attr=rdim,
319+
reduce_method="min",
321320
concat_kws={"reset_event_ids": True},
322321
)
323322

@@ -356,9 +355,8 @@ def max(self, dim: Literal["member", "lead_time"] | None = None):
356355
rdim = self._reduce_iter_dim(dim)
357356
return reduce_unique_selection(
358357
self,
359-
values=getattr(self, rdim),
360-
select=rdim,
361-
reduce_attr="max",
358+
attr=rdim,
359+
reduce_method="max",
362360
concat_kws={"reset_event_ids": True},
363361
)
364362

@@ -396,9 +394,8 @@ def mean(self, dim: Literal["member", "lead_time"] | None = None):
396394
rdim = self._reduce_iter_dim(dim)
397395
return reduce_unique_selection(
398396
self,
399-
values=getattr(self, rdim),
400-
select=rdim,
401-
reduce_attr="mean",
397+
attr=rdim,
398+
reduce_method="mean",
402399
concat_kws={"reset_event_ids": True},
403400
)
404401

@@ -431,9 +428,8 @@ def _quantile(
431428
rdim = self._reduce_iter_dim(dim)
432429
return reduce_unique_selection(
433430
self,
434-
values=getattr(self, rdim),
435-
select=rdim,
436-
reduce_attr="quantile",
431+
attr=rdim,
432+
reduce_method="quantile",
437433
q=q,
438434
concat_kws={"reset_event_ids": True},
439435
)

climada/hazard/forecast.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,7 @@ def min(self, dim: Literal["member", "lead_time"] | None = None):
142142
"""
143143
if dim is not None:
144144
rdim = self._reduce_iter_dim(dim)
145-
return reduce_unique_selection(
146-
self, values=getattr(self, rdim), select=rdim, reduce_attr="min"
147-
)
145+
return reduce_unique_selection(self, attr=rdim, reduce_method="min")
148146

149147
red_intensity = self.intensity.min(axis=0).tocsr()
150148
red_fraction = self.fraction.min(axis=0).tocsr()
@@ -176,9 +174,7 @@ def max(self, dim: Literal["member", "lead_time"] | None = None):
176174
"""
177175
if dim is not None:
178176
rdim = self._reduce_iter_dim(dim)
179-
return reduce_unique_selection(
180-
self, values=getattr(self, rdim), select=rdim, reduce_attr="max"
181-
)
177+
return reduce_unique_selection(self, attr=rdim, reduce_method="max")
182178

183179
red_intensity = self.intensity.max(axis=0).tocsr()
184180
red_fraction = self.fraction.max(axis=0).tocsr()
@@ -209,9 +205,7 @@ def mean(self, dim: Literal["member", "lead_time"] | None = None):
209205
"""
210206
if dim is not None:
211207
rdim = self._reduce_iter_dim(dim)
212-
return reduce_unique_selection(
213-
self, values=getattr(self, rdim), select=rdim, reduce_attr="mean"
214-
)
208+
return reduce_unique_selection(self, attr=rdim, reduce_method="mean")
215209

216210
red_intensity = sparse.csr_matrix(self.intensity.mean(axis=0))
217211
red_fraction = sparse.csr_matrix(self.fraction.mean(axis=0))
@@ -240,9 +234,8 @@ def _quantile(
240234
rdim = self._reduce_iter_dim(dim)
241235
return reduce_unique_selection(
242236
self,
243-
values=getattr(self, rdim),
244-
select=rdim,
245-
reduce_attr="quantile",
237+
attr=rdim,
238+
reduce_method="quantile",
246239
q=q,
247240
)
248241

climada/util/forecast.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -156,26 +156,33 @@ def _reduce_attrs(self, event_name: str, **attrs) -> dict[str, np.ndarray | list
156156

157157
def reduce_unique_selection(
158158
forecast,
159-
values: np.ndarray,
160-
select: str,
161-
reduce_attr: str,
159+
attr: str,
160+
reduce_method: str,
161+
*,
162+
select_kwarg: str | None = None,
162163
concat_kws: Mapping[str, Any] | None = None,
163164
**kwargs,
164165
):
165166
"""
166-
Reduce an attribute of a forecast object by selecting unique values
167-
and performing an attribute reduction method.
167+
Select unique values of an attribute and perform a reduction over each selection.
168168
169169
Parameters
170170
----------
171171
forecast : HazardForecast | ImpactForecast
172172
Forecast object to reduce.
173-
values : np.ndarray
174-
Array of values for which to select and reduce the attribute.
175-
select : str
176-
Name of the attribute to select on (e.g. 'lead_time', 'member').
177-
reduce_attr : str
173+
attr : str
174+
Attribute to draw values for which to select and reduce the attribute.
175+
reduce_method : str
178176
Name of the attribute reduction method to call (e.g. 'min', 'mean').
177+
select_kwarg : str | None
178+
Keyword argument to the select method (e.g. 'lead_time', 'member') of the
179+
forecast object. If ``None`` (default), the value of ``attr`` is used. This
180+
parameter exists because some parameters to select methods are called
181+
differently than the corresponding attributes.
182+
concat_kws
183+
Mapping of keyword arguments to the concat method of the forecast.
184+
kwargs
185+
Keyword arguments to the reduction method.
179186
180187
Returns
181188
-------
@@ -184,10 +191,13 @@ def reduce_unique_selection(
184191
and selected by the unique values.
185192
"""
186193
concat_kws = {} if concat_kws is None else concat_kws
194+
select_kwarg = attr if select_kwarg is None else select_kwarg
187195
return forecast.concat(
188196
[
189-
getattr(forecast.select(**{select: [val]}), reduce_attr)(dim=None, **kwargs)
190-
for val in np.unique(values)
197+
getattr(forecast.select(**{select_kwarg: [val]}), reduce_method)(
198+
dim=None, **kwargs
199+
)
200+
for val in np.unique(getattr(forecast, attr))
191201
],
192202
**concat_kws,
193203
)

0 commit comments

Comments
 (0)