def post_execute(self, dummy): """ Compute and store average losses from the risk_by_event dataset, and then loss curves and maps. """ oq = self.oqparam # sanity check on the risk_by_event alt = self.datastore.read_df('risk_by_event', 'event_id') K = self.datastore['risk_by_event'].attrs.get('K', 0) upper_limit = self.E * self.L * (K + 1) size = len(alt) assert size <= upper_limit, (size, upper_limit) if oq.avg_losses: for r in range(self.R): self.avg_losses[:, r] *= self.avg_ratio[r] self.datastore['avg_losses-rlzs'] = self.avg_losses stats.set_rlzs_stats(self.datastore, 'avg_losses', asset_id=self.assetcol['id'], loss_type=oq.loss_names) # save agg_losses units = self.datastore['cost_calculator'].get_units(oq.loss_names) if oq.calculation_mode == 'scenario_risk': # compute agg_losses alt['rlz_id'] = self.rlzs[alt.index.to_numpy()] agglosses = numpy.zeros((K + 1, self.R, self.L), F32) for (agg_id, rlz_id, loss_id), df in alt.groupby(['agg_id', 'rlz_id', 'loss_id']): agglosses[agg_id, rlz_id, loss_id] = (df.loss.sum() * self.avg_ratio[rlz_id]) self.datastore['agg_losses-rlzs'] = agglosses stats.set_rlzs_stats(self.datastore, 'agg_losses', agg_id=K, loss_types=oq.loss_names, units=units) logging.info('Total portfolio loss\n' + views.view('portfolio_loss', self.datastore)) else: # event_based_risk, run post_risk prc = PostRiskCalculator(oq, self.datastore.calc_id) if hasattr(self, 'exported'): prc.exported = self.exported with prc.datastore: prc.run(exports='') if (oq.investigation_time or not oq.avg_losses or 'agg_losses-rlzs' not in self.datastore): return # sanity check on the agg_losses and sum_losses sumlosses = self.avg_losses.sum(axis=0) if not numpy.allclose(agglosses[K], sumlosses, rtol=1E-6): url = ('https://docs.openquake.org/oq-engine/advanced/' 'addition-is-non-associative.html') logging.warning( 'Due to rounding errors inherent in floating-point arithmetic,' ' agg_losses != sum(avg_losses): %s != %s\nsee %s', agglosses[K].mean(), sumlosses.mean(), url)
def build_aggcurves(self): prc = PostRiskCalculator(self.oqparam, self.datastore.calc_id) prc.assetcol = self.assetcol if hasattr(self, 'exported'): prc.exported = self.exported with prc.datastore: prc.run(exports='') # save agg_curves-stats if self.R > 1 and 'aggcurves' in self.datastore: save_curve_stats(self.datastore)