Skip to content

Commit 0b6e1e4

Browse files
committed
Add min max mean for hazard forecast
1 parent dfce16f commit 0b6e1e4

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed

climada/hazard/forecast.py

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,136 @@ def _check_sizes(self):
104104
num_entries = len(self.event_id)
105105
size(exp_len=num_entries, var=self.member, var_name="Forecast.member")
106106
size(exp_len=num_entries, var=self.lead_time, var_name="Forecast.lead_time")
107+
108+
def _reduce_attrs(self, reduce_method: str):
109+
"""
110+
Reduce the attributes of a HazardForecast to a single value.
111+
112+
Attributes are modified as follows:
113+
- lead_time: set to NaT
114+
- member: set to -1
115+
- event_id: set to 0
116+
- event_name: set to reduce_method
117+
- date: set to the minimum value
118+
- frequency: set to 1
119+
120+
Parameters
121+
----------
122+
reduce_method : str
123+
The reduction method used to reduce the attributes.
124+
"""
125+
reduced_attrs = {
126+
"lead_time": np.array([np.timedelta64("NaT")]),
127+
"member": np.array([-1]),
128+
"event_id": np.array([0]),
129+
"event_name": np.array([reduce_method]),
130+
"date": np.array([self.date.min()]),
131+
"frequency": np.array([1]),
132+
"orig": np.array([True]),
133+
}
134+
135+
return reduced_attrs
136+
137+
def min(self):
138+
"""
139+
Reduce the impact matrix and at_event of a HazardForecast to the minimum
140+
value.
141+
142+
Parameters
143+
----------
144+
None
145+
146+
Returns
147+
-------
148+
HazardForecast
149+
A HazardForecast object with the min intensity and fraction.
150+
"""
151+
red_intensity = sparse.csr_matrix(self.intensity.min(axis=0))
152+
red_fraction = sparse.csr_matrix(self.fraction.sum())
153+
reduced_attrs = self._reduce_attrs("min")
154+
return HazardForecast(
155+
lead_time=reduced_attrs["lead_time"],
156+
member=reduced_attrs["member"],
157+
haz_type=self.haz_type,
158+
pool=self.pool,
159+
units=self.units,
160+
centroids=self.centroids,
161+
event_id=reduced_attrs["event_id"],
162+
frequency=reduced_attrs["frequency"],
163+
frequency_unit=self.frequency_unit,
164+
event_name=reduced_attrs["event_name"],
165+
date=reduced_attrs["date"],
166+
orig=hazard.orig,
167+
intensity=red_intensity,
168+
fraction=red_fraction,
169+
)
170+
171+
def max(self):
172+
"""
173+
Reduce the impact matrix and at_event of a HazardForecast to the maximum
174+
value.
175+
176+
Parameters
177+
----------
178+
None
179+
180+
Returns
181+
-------
182+
HazardForecast
183+
A HazardForecast object with the min intensity and fraction.
184+
"""
185+
red_intensity = sparse.csr_matrix(self.intensity.min(axis=0))
186+
red_fraction = sparse.csr_matrix(self.fraction.sum())
187+
reduced_attrs = self._reduce_attrs("max")
188+
return HazardForecast(
189+
lead_time=reduced_attrs["lead_time"],
190+
member=reduced_attrs["member"],
191+
haz_type=self.haz_type,
192+
pool=self.pool,
193+
units=self.units,
194+
centroids=self.centroids,
195+
event_id=reduced_attrs["event_id"],
196+
frequency=reduced_attrs["frequency"],
197+
frequency_unit=self.frequency_unit,
198+
event_name=reduced_attrs["event_name"],
199+
date=reduced_attrs["date"],
200+
orig=hazard.orig,
201+
intensity=red_intensity,
202+
fraction=red_fraction,
203+
)
204+
205+
def mean(self):
206+
"""
207+
Reduce the impact matrix and at_event of a HazardForecast to the mean value.
208+
209+
The mean value is computed by taking the mean of the impact matrix along the
210+
exposure points axis (axis=1) and then taking the mean of the resulting array.
211+
212+
Parameters
213+
----------
214+
None
215+
216+
Returns
217+
-------
218+
HazardForecast
219+
A HazardForecast object with the min intensity and fraction.
220+
"""
221+
red_intensity = sparse.csr_matrix(self.intensity.min(axis=0))
222+
red_fraction = sparse.csr_matrix(self.fraction.sum())
223+
reduced_attrs = self._reduce_attrs("mean")
224+
return HazardForecast(
225+
lead_time=reduced_attrs["lead_time"],
226+
member=reduced_attrs["member"],
227+
haz_type=self.haz_type,
228+
pool=self.pool,
229+
units=self.units,
230+
centroids=self.centroids,
231+
event_id=reduced_attrs["event_id"],
232+
frequency=reduced_attrs["frequency"],
233+
frequency_unit=self.frequency_unit,
234+
event_name=reduced_attrs["event_name"],
235+
date=reduced_attrs["date"],
236+
orig=hazard.orig,
237+
intensity=red_intensity,
238+
fraction=red_fraction,
239+
)

0 commit comments

Comments
 (0)