@@ -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