def test_compute_statistics_with_masked_values(self): model_values = ma.array(np.arange(1.0, 5.0, 1), mask=np.array([False, False, True, False])) # [1, 2, --, 4] ref_values = ma.array([1.1, 2.2, 2.9, 3.7]) ref_values, model_values = utils.harmonise(ref_values, model_values) ref_values = ref_values.compressed() model_values = model_values.compressed() stats = calculate_statistics(model_values=model_values, reference_values=ref_values, config=self.config, model_name='kate', ref_name='ref') self.assertEqual('kate', stats['model_name']) self.assertEqual('ref', stats['ref_name']) self.assertAlmostEqual(0.216024, stats['unbiased_rmse'], 5) self.assertAlmostEqual(0.216024, stats['rmse'], 5) self.assertAlmostEqual(6.344131e-15, stats['pbias'], 5) self.assertAlmostEqual(0.0, stats['bias'], 5) self.assertAlmostEqual(0.99484975, stats['corrcoeff'], 5) self.assertAlmostEqual(1.039815, stats['reliability_index'], 5) self.assertAlmostEqual(0.9589041, stats['model_efficiency'], 5) self.assertAlmostEqual(2.33333, stats['mean'], 5) self.assertAlmostEqual(2.33333, stats['ref_mean'], 5) self.assertAlmostEqual(1.24722, stats['stddev'], 5) self.assertAlmostEqual(1.06562, stats['ref_stddev'], 5) self.assertAlmostEqual(1.17041, stats['normalised_stddev'], 5) self.assertAlmostEqual(2, stats['median'], 5) self.assertAlmostEqual(2.2, stats['ref_median'], 5) self.assertAlmostEqual(3.6, stats['p90'], 5) self.assertAlmostEqual(3.4, stats['ref_p90'], 5) self.assertAlmostEqual(3.8, stats['p95'], 5) self.assertAlmostEqual(3.55, stats['ref_p95'], 5) self.assertAlmostEqual(1, stats['min'], 5) self.assertAlmostEqual(1.1, stats['ref_min'], 5) self.assertAlmostEqual(4, stats['max'], 5) self.assertAlmostEqual(3.7, stats['ref_max'], 5) self.assertAlmostEqual(stats['rmse'] ** 2, stats['bias'] ** 2 + stats['unbiased_rmse'] ** 2, 5)
def test_harmonise_2(self): model_values = np.array(np.arange(1.0, 5.0, 1)) # [1, 2, 3, 4] ref_values = ma.array(np.array([1.1, 2.2, 2.9, 3.7]), mask=np.array([True, False, False, False])) ref_values, model_values = harmonise(ref_values, model_values) # Note: assert_array_equals does not tests if masks are equal # and there is no dedicated method for this # so masks need to be tested separately test.assert_array_equal(np.array([1, 2, 3, 4]), model_values) test.assert_array_equal(np.array([True, False, False, False]), model_values.mask) test.assert_array_equal(np.array([1.1, 2.2, 2.9, 3.7]), ref_values) test.assert_array_equal(np.array([True, False, False, False]), ref_values.mask)
def main(): parsed_args = parse_arguments(sys.argv[1:]) config = Configuration(properties_file_name=parsed_args.config, target_dir=parsed_args.output_dir, target_prefix=parsed_args.prefix) file_handler = setup_logging(config) if parsed_args.reference_file is not None: data = Data(parsed_args.path, parsed_args.reference_file, config.max_cache_size) else: data = Data(parsed_args.path, max_cache_size=config.max_cache_size) output = Output(config=config) matchups = None if data.has_one_dim_ref_var(): me = MatchupEngine(data, config) matchups = me.find_all_matchups() if not matchups: logging.warning('No matchups found. System will exit.') exit(0) if config.remove_empty_matchups: matchups = me.remove_empty_matchups(matchups) if not os.name == 'nt': logging.debug('Memory after matchups have been found: %s' % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss) matchup_count = 0 if matchups is None else len(matchups) collected_statistics = {} density_plot_files = [] target_files = [] density_plots = {} for (model_name, ref_name) in parsed_args.variable_mappings: unit = data.unit(model_name) is_gridded = len(data.get_reference_dimensions(ref_name)) > 1 if is_gridded: reference_values, model_values = data.get_values(ref_name, model_name) matchup_count += ma.count(reference_values) else: reference_values, model_values = utils.extract_values(matchups, data, ref_name, model_name) reference_values, model_values = utils.harmonise(reference_values, model_values) logging.debug('Compressing ref-variable %s' % ref_name) reference_values = reference_values.compressed() logging.debug('Compressing model-variable %s' % model_name) model_values = model_values.compressed() logging.info('Calculating statistics for \'%s\' with \'%s\'' % (model_name, ref_name)) stats = processor.calculate_statistics(model_values, reference_values, model_name, ref_name, unit, config) collected_statistics[(model_name, ref_name)] = stats if config.write_density_plots: axis_min = min(stats['min'], stats['ref_min']) axis_max = max(stats['p90'], stats['ref_p90']) logging.info('Creating density plot for \'%s\' and \'%s\'' % (model_name, ref_name)) density_plots[model_name + ref_name] = output.density_plot(model_name, ref_name, model_values, reference_values, config.density_plot_log_scaled, None, axis_min, axis_max, data.unit(model_name)) if not os.name == 'nt': logging.debug( 'Memory after statistics have been computed: %s' % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss) if config.write_csv: csv_target_file = '%s/%sstatistics.csv' % (parsed_args.output_dir, config.target_prefix) target_files.append(csv_target_file) output.csv(data, parsed_args.variable_mappings, collected_statistics, matchup_count, matchups=matchups, source_file=parsed_args.path, target_file=csv_target_file) logging.info('CSV output written to \'%s\'' % csv_target_file) if matchups is not None: matchup_filename = '%s_matchups.csv' % os.path.splitext(csv_target_file)[0] logging.info('Matchups written to \'%s\'' % matchup_filename) target_files.append(matchup_filename) taylor_target_files = [] if config.write_taylor_diagrams: taylor_target_file = '%s/%staylor.png' % (parsed_args.output_dir, config.target_prefix) written_taylor_diagrams, d = output.taylor(list(collected_statistics.values()), taylor_target_file) del d if written_taylor_diagrams: for written_taylor_diagram in written_taylor_diagrams: logging.info('Taylor diagram written to \'%s\'' % written_taylor_diagram) target_files.append(written_taylor_diagram) taylor_target_files.append(written_taylor_diagram) if config.write_density_plots: for (model_name, ref_name) in parsed_args.variable_mappings: density_target = '%s/density-%s-%s.png' % (parsed_args.output_dir, model_name, ref_name) density_plot_files.append(density_target) target_files.append(density_target) output.write_density_plot(density_plots[model_name + ref_name], density_target) logging.info('Density plot written to \'%s\'' % density_target) target_diagram_file = None if config.write_target_diagram: target_diagram_file = '%s/%starget.png' % (parsed_args.output_dir, config.target_prefix) output.target_diagram(list(collected_statistics.values()), target_diagram_file) logging.info('Target diagram written to \'%s\'' % target_diagram_file) target_files.append(target_diagram_file) if config.write_xhtml: xml_target_file = '%s/%sreport.xml' % (parsed_args.output_dir, config.target_prefix) path = str(os.path.dirname(os.path.realpath(__file__))) + '/../resources/' xsl = path + 'analysis-summary.xsl' css = path + 'styleset.css' xsl_target = '%s/%s' % (parsed_args.output_dir, os.path.basename(xsl)) css_target = '%s/%s' % (parsed_args.output_dir, os.path.basename(css)) output.xhtml(list(collected_statistics.values()), matchup_count, matchups, data, xml_target_file, taylor_target_files, target_diagram_file, density_plot_files) logging.info('XHTML report written to \'%s\'' % xml_target_file) shutil.copy(xsl, parsed_args.output_dir) logging.info('XHTML support file written to \'%s/%s\'' % (parsed_args.output_dir, 'analysis-summary.xsl')) shutil.copy(css, parsed_args.output_dir) logging.info('XHTML support file written to \'%s/%s\'' % (parsed_args.output_dir, 'styleset.xsl')) target_files.append(xml_target_file) target_files.append(xsl_target) target_files.append(css_target) if config.zip: create_zip(target_files, config, file_handler, parsed_args) logging.info('End of process')