Example #1
0
def create_target_diagram(statistics, config=None):
    figure = plt.figure()
    if config is None:
        config = get_default_config()

    statistics = utils.ensure_list(statistics)

    diagram = TargetDiagram(figure, config.normalise_target_diagram,
                            config.show_legends,
                            config.utilise_stddev_difference)

    diagram.setup_axes()
    for stats in statistics:
        diagram.plot_sample(
            stats['bias'], stats['unbiased_rmse'], stats['normalised_rmse'],
            stats['rmse'], stats['ref_stddev'], stats['stddev'],
            create_sample_name(stats['model_name'], stats['unit']))

    if config.normalise_target_diagram:
        diagram.plot_correcoeff_marker_line()

    diagram.update_legend()
    if not config.normalise_target_diagram:
        diagram.update_ranges(config.target_diagram_bounds)

    return diagram
Example #2
0
def create_taylor_diagrams(statistics, config=None):
    if config is None:
        config = get_default_config()

    statistics = utils.ensure_list(statistics)

    statistics_by_name_and_unit = sort_statistics_by_name_and_unit(
        config, statistics)
    diagrams = []

    for name in statistics_by_name_and_unit.keys():
        for current_unit in statistics_by_name_and_unit[name].keys():
            current_statistics = statistics_by_name_and_unit[name][
                current_unit]

            ref_names = list(
                map(lambda x: x.get('ref_name'), current_statistics))
            ref_stddevs = list(
                map(lambda x: x.get('ref_stddev'), current_statistics)
            ) if config.use_absolute_standard_deviation else list(
                np.ones(len(current_statistics)))
            units = list(map(lambda x: x.get('unit'), current_statistics))
            ref = tuple(zip(ref_names, ref_stddevs, units))
            model_stddevs = list(
                map(lambda x: x.get('stddev'), current_statistics)
            ) if config.use_absolute_standard_deviation else list(
                map(lambda x: x.get('normalised_stddev'), current_statistics))
            max_stddev = max(ref_stddevs + model_stddevs) * 1.5

            for v in ref_stddevs:
                if v == 0.0 or np.isnan(v):
                    logging.warning(
                        'Unable to create Taylor diagram from statistics.')
                    logging.debug('Statistics: %s' % current_statistics)
                    continue

            figure = plt.figure()
            diagram = TaylorDiagram(figure, ref,
                                    config.show_negative_corrcoeff,
                                    config.use_absolute_standard_deviation,
                                    config.show_legends, max_stddev)

            diagram.setup_axes()
            for stats in current_statistics:
                model_name = stats[
                    'model_name'] if 'model_name' in stats else None
                stddev = stats[
                    'stddev'] if config.use_absolute_standard_deviation else stats[
                        'normalised_stddev']
                diagram.plot_sample(stats['corrcoeff'], stddev, model_name,
                                    stats['unit'])

            diagram.update_legend()
            diagrams.append(diagram)

    return diagrams
Example #3
0
def create_target_diagram(statistics, config=None):
    figure = plt.figure()
    if config is None:
        config = get_default_config()

    statistics = utils.ensure_list(statistics)

    diagram = TargetDiagram(figure, config.normalise_target_diagram, config.show_legends, config.utilise_stddev_difference)

    diagram.setup_axes()
    for stats in statistics:
        diagram.plot_sample(stats['bias'], stats['unbiased_rmse'], stats['normalised_rmse'], stats['rmse'],
            stats['ref_stddev'], stats['stddev'], create_sample_name(stats['model_name'], stats['unit']))

    if config.normalise_target_diagram:
        diagram.plot_correcoeff_marker_line()

    diagram.update_legend()
    if not config.normalise_target_diagram:
        diagram.update_ranges(config.target_diagram_bounds)

    return diagram
Example #4
0
def create_taylor_diagrams(statistics, config=None):
    if config is None:
        config = get_default_config()

    statistics = utils.ensure_list(statistics)

    statistics_by_name_and_unit = sort_statistics_by_name_and_unit(config, statistics)
    diagrams = []

    for name in statistics_by_name_and_unit.keys():
        for current_unit in statistics_by_name_and_unit[name].keys():
            current_statistics = statistics_by_name_and_unit[name][current_unit]

            ref_names = list(map(lambda x: x.get('ref_name'), current_statistics))
            ref_stddevs = list(map(lambda x: x.get('ref_stddev'), current_statistics)) if config.use_absolute_standard_deviation else list(np.ones(len(current_statistics)))
            units = list(map(lambda x: x.get('unit'), current_statistics))
            ref = tuple(zip(ref_names, ref_stddevs, units))
            model_stddevs = list(map(lambda x: x.get('stddev'), current_statistics)) if config.use_absolute_standard_deviation else list(map(lambda x: x.get('normalised_stddev'), current_statistics))
            max_stddev = max(ref_stddevs + model_stddevs) * 1.5

            for v in ref_stddevs:
                if v == 0.0 or np.isnan(v):
                    logging.warning('Unable to create Taylor diagram from statistics.')
                    logging.debug('Statistics: %s' % current_statistics)
                    continue

            figure = plt.figure()
            diagram = TaylorDiagram(figure, ref, config.show_negative_corrcoeff, config.use_absolute_standard_deviation, config.show_legends, max_stddev)

            diagram.setup_axes()
            for stats in current_statistics:
                model_name = stats['model_name'] if 'model_name' in stats else None
                stddev = stats['stddev'] if config.use_absolute_standard_deviation else stats['normalised_stddev']
                diagram.plot_sample(stats['corrcoeff'], stddev, model_name, stats['unit'])

            diagram.update_legend()
            diagrams.append(diagram)

    return diagrams
Example #5
0
    def xhtml(self,
              statistics_list,
              matchup_count,
              matchups,
              data,
              target_file,
              taylor_target_files=None,
              target_diagram_file=None,
              density_plot_files=None):
        filename = os.path.dirname(os.path.realpath(
            __file__)) + '/../resources/matchup_report_template.xml'
        template = Template(filename=filename)
        buf = StringIO()

        taylor_target_files = utils.ensure_list(taylor_target_files)
        density_plot_files = utils.ensure_list(density_plot_files)

        all_relative_stats = []
        all_model_stats = []
        all_ref_stats = []
        for stats in statistics_list:
            pair_statistics = {}
            for key in ('rmse', 'unbiased_rmse', 'normalised_rmse', 'bias',
                        'pbias', 'corrcoeff', 'reliability_index',
                        'model_efficiency', 'normalised_stddev'):
                pair_statistics[key] = format_statistic(stats, key)
            pair = (stats['model_name'], stats['ref_name'], pair_statistics)
            all_relative_stats.append(pair)

            model_pair = {}
            for key in ('min', 'max', 'mean', 'stddev', 'median', 'p90',
                        'p95'):
                model_pair[key] = format_statistic(stats, key)
            all_model_stats.append((stats['model_name'], model_pair))

            ref_pair = {}
            for key in ('ref_min', 'ref_max', 'ref_mean', 'ref_stddev',
                        'ref_median', 'ref_p90', 'ref_p95'):
                ref_pair[key.replace('ref_',
                                     '')] = format_statistic(stats, key)
            all_ref_stats.append((stats['ref_name'], ref_pair))

        density_plot_files = get_basenames(density_plot_files)
        taylor_target_files = get_basenames(taylor_target_files)
        target_diagram_file = os.path.basename(
            target_diagram_file) if target_diagram_file is not None else None

        ctx = Context(
            buf,
            pairs=all_relative_stats,
            performed_at=datetime.now().strftime('%b %d, %Y at %H:%M:%S'),
            record_count=matchup_count,
            time_delta=self.config.time_delta,
            depth_delta=self.config.depth_delta,
            ddof=self.config.ddof,
            alpha=self.config.alpha,
            beta=self.config.beta,
            all_relative_stats=all_relative_stats,
            all_model_stats=all_model_stats,
            all_ref_stats=all_ref_stats,
            matchups=matchups,
            data=data,
            reference_vars=data.ref_vars(),
            model_vars=data.model_vars(),
            write_taylor_diagrams=self.config.write_taylor_diagrams,
            taylor_target_files=taylor_target_files,
            write_target_diagram=self.config.write_target_diagram,
            target_diagram_file=target_diagram_file,
            density_plot_files=density_plot_files)
        template.render_context(ctx)
        xml = buf.getvalue()

        directory = os.path.dirname(target_file)
        if not os.path.exists(directory):
            os.makedirs(directory)
        file = open(target_file, 'w')
        file.write(xml)
        file.close()
Example #6
0
    def xhtml(self, statistics_list, matchup_count, matchups, data, target_file, taylor_target_files=None, target_diagram_file=None, density_plot_files=None):
        filename = os.path.dirname(os.path.realpath(__file__)) + '/../resources/matchup_report_template.xml'
        template = Template(filename=filename)
        buf = StringIO()

        taylor_target_files = utils.ensure_list(taylor_target_files)
        density_plot_files = utils.ensure_list(density_plot_files)

        all_relative_stats = []
        all_model_stats = []
        all_ref_stats = []
        for stats in statistics_list:
            pair_statistics = {}
            for key in ('rmse', 'unbiased_rmse', 'normalised_rmse', 'bias', 'pbias', 'corrcoeff', 'reliability_index', 'model_efficiency', 'normalised_stddev'):
                pair_statistics[key] = format_statistic(stats, key)
            pair = (stats['model_name'], stats['ref_name'], pair_statistics)
            all_relative_stats.append(pair)

            model_pair = {}
            for key in ('min', 'max', 'mean', 'stddev', 'median', 'p90', 'p95'):
                model_pair[key] = format_statistic(stats, key)
            all_model_stats.append((stats['model_name'], model_pair))

            ref_pair = {}
            for key in ('ref_min', 'ref_max', 'ref_mean', 'ref_stddev', 'ref_median', 'ref_p90', 'ref_p95'):
                ref_pair[key.replace('ref_', '')] = format_statistic(stats, key)
            all_ref_stats.append((stats['ref_name'], ref_pair))

        density_plot_files = get_basenames(density_plot_files)
        taylor_target_files = get_basenames(taylor_target_files)
        target_diagram_file = os.path.basename(target_diagram_file) if target_diagram_file is not None else None

        ctx = Context(buf,
            pairs=all_relative_stats,
            performed_at=datetime.now().strftime('%b %d, %Y at %H:%M:%S'),
            record_count=matchup_count,
            time_delta=self.config.time_delta,
            depth_delta=self.config.depth_delta,
            ddof=self.config.ddof,
            alpha=self.config.alpha,
            beta=self.config.beta,
            all_relative_stats=all_relative_stats,
            all_model_stats=all_model_stats,
            all_ref_stats=all_ref_stats,
            matchups=matchups,
            data=data,
            reference_vars=data.ref_vars(),
            model_vars=data.model_vars(),
            write_taylor_diagrams=self.config.write_taylor_diagrams,
            taylor_target_files=taylor_target_files,
            write_target_diagram=self.config.write_target_diagram,
            target_diagram_file=target_diagram_file,
            density_plot_files=density_plot_files)
        template.render_context(ctx)
        xml = buf.getvalue()

        directory = os.path.dirname(target_file)
        if not os.path.exists(directory):
            os.makedirs(directory)
        file = open(target_file, 'w')
        file.write(xml)
        file.close()