def statistics(outputs, weights, params): """ :param outputs: An instance of `AssetsIndividualOutputs` See `classical` for a description of `params` :returns: an instance of `StatisticalOutputs` It makes use of `..base.statistics` to compute curves and maps """ ret = [] # traverse the curve matrix on the second dimension (the assets) # accumulating results in `ret`, then return `ret` unzipped for loss_ratio_curves in outputs.curve_matrix.transpose(1, 0, 2, 3): # get the loss ratios only from the first curve loss_ratios, _poes = loss_ratio_curves[0] curves_poes = [poes for _losses, poes in loss_ratio_curves] mean_curve, quantile_curves, mean_maps, quantile_maps = ( base.asset_statistics( loss_ratios, curves_poes, params.quantiles, weights, params.conditional_loss_poes)) # compute also mean and quantile loss fractions mean_fractions = [ conditional_loss_ratio(mean_curve[0], mean_curve[1], poe) for poe in params.poes_disagg] quantile_fractions = [[ conditional_loss_ratio(quantile_curve[0], quantile_curve[1], poe) for poe in params.poes_disagg] for quantile_curve in quantile_curves] ret.append((mean_curve, mean_maps, mean_fractions, quantile_curves, quantile_maps, quantile_fractions)) (mean_curve, mean_maps, mean_fractions, quantile_curves, quantile_maps, quantile_fractions) = zip(*ret) # now all the lists keep N items # transpose maps and fractions to have P/F/Q items of N-sized lists mean_maps = numpy.array(mean_maps).transpose() mean_fractions = numpy.array(mean_fractions).transpose() quantile_curves = numpy.array(quantile_curves).transpose(1, 0, 2, 3) quantile_maps = numpy.array(quantile_maps).transpose(2, 1, 0) quantile_fractions = numpy.array(quantile_fractions).transpose(2, 1, 0) return StatisticalOutputs( outputs.assets, mean_curve, mean_maps, mean_fractions, quantile_curves, quantile_maps, quantile_fractions)
def statistics(assets, curve_matrix, weights, params): ret = [] for curves in curve_matrix: non_trivial_curves = [(losses, poes) for losses, poes in curves if losses[-1] > 0] if not non_trivial_curves: # no damage. all trivial curves loss_ratios, _poes = curves[0] curves_poes = [poes for _losses, poes in curves] else: # standard case max_losses = [losses[-1] # we assume non-decreasing losses for losses, _poes in non_trivial_curves] reference_curve = non_trivial_curves[numpy.argmax(max_losses)] loss_ratios = reference_curve[0] curves_poes = [interpolate.interp1d( losses, poes, bounds_error=False, fill_value=0)(loss_ratios) for losses, poes in curves] mean_curve, quantile_curves, mean_maps, quantile_maps = ( base.asset_statistics( loss_ratios, curves_poes, params.quantiles, weights, params.conditional_loss_poes)) ret.append((mean_curve, mean_maps, quantile_curves, quantile_maps)) (mean_curves, mean_maps, quantile_curves, quantile_maps) = zip(*ret) # now all the lists keep N items # transpose maps and fractions to have P/F/Q items of N-sized lists mean_maps = numpy.array(mean_maps).transpose() if (len(quantile_curves) and len(quantile_curves[0])): quantile_curves = numpy.array(quantile_curves).transpose(1, 0, 2, 3) else: quantile_curves = None if (len(quantile_maps) and len(quantile_maps[0])): quantile_maps = numpy.array(quantile_maps).transpose(2, 1, 0) else: quantile_maps = None return StatisticalOutputs( assets, mean_curves, mean_maps, quantile_curves, quantile_maps)