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
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
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
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
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()
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()