Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)