CLIMATE-676 - Cleaning up the examples - Following up CLIMATE-666, some files are renamed and others are moved into a new folder.
Project: http://git-wip-us.apache.org/repos/asf/climate/repo Commit: http://git-wip-us.apache.org/repos/asf/climate/commit/fd310f40 Tree: http://git-wip-us.apache.org/repos/asf/climate/tree/fd310f40 Diff: http://git-wip-us.apache.org/repos/asf/climate/diff/fd310f40 Branch: refs/heads/master Commit: fd310f400d3ce1027925205f82fcf99691e39f9e Parents: e78ac8e Author: huikyole <[email protected]> Authored: Fri Sep 25 09:23:29 2015 -0700 Committer: huikyole <[email protected]> Committed: Fri Sep 25 09:23:29 2015 -0700 ---------------------------------------------------------------------- ...ia_prec_DJF_mean_taylor_diagram_to_TRMM.yaml | 45 ---- ...ia_prec_DJF_mean_taylor_diagram_to_TRMM.yaml | 45 ++++ ...ordex-AF_tasmax_annual_mean_bias_to_cru.yaml | 46 ++++ ...prec_subregion_annual_cycle_time_series.yaml | 90 ++++++++ .../metrics_and_plots.py | 219 +++++++++++++++++++ ...cap_prec_JJA_mean_taylor_diagram_to_cru.yaml | 44 ++++ ...nterannual_variability_portrait_diagram.yaml | 75 +++++++ .../configuration_file_examples/run_RCMES.py | 216 ++++++++++++++++++ ...ordex-AF_tasmax_annual_mean_bias_to_cru.yaml | 46 ---- examples/cordex-AF_tasmax_bias_to_cru.yaml | 46 ---- ...prec_subregion_annual_cycle_time_series.yaml | 90 -------- examples/example_package.py | 219 ------------------- ...cap_prec_JJA_mean_taylor_diagram_to_cru.yaml | 44 ---- .../narccap_prec_JJA_taylor_diagram_to_cru.yaml | 44 ---- ...nterannual_variability_portrait_diagram.yaml | 75 ------- .../old_examples/knmi_to_cru31_full_bias.py | 174 --------------- .../old_examples/model_ensemble_to_rcmed.py | 186 ---------------- examples/old_examples/multi_model_evaluation.py | 151 ------------- .../old_examples/multi_model_taylor_diagram.py | 144 ------------ .../old_examples/simple_model_to_model_bias.py | 124 ----------- .../simple_model_to_model_bias_DJF_and_JJA.py | 64 ------ examples/old_examples/simple_model_tstd.py | 89 -------- examples/old_examples/subregions.py | 53 ----- .../old_examples/subregions_portrait_diagram.py | 139 ------------ examples/old_examples/taylor_diagram_example.py | 113 ---------- .../old_examples/time_series_with_regions.py | 141 ------------ examples/run_RCMES.py | 216 ------------------ 27 files changed, 735 insertions(+), 2203 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/cmip5_SE_Asia_prec_DJF_mean_taylor_diagram_to_TRMM.yaml ---------------------------------------------------------------------- diff --git a/examples/cmip5_SE_Asia_prec_DJF_mean_taylor_diagram_to_TRMM.yaml b/examples/cmip5_SE_Asia_prec_DJF_mean_taylor_diagram_to_TRMM.yaml deleted file mode 100644 index 276e744..0000000 --- a/examples/cmip5_SE_Asia_prec_DJF_mean_taylor_diagram_to_TRMM.yaml +++ /dev/null @@ -1,45 +0,0 @@ -workdir: ./ -output_netcdf_filename: cmip5_SE_Asia_prec_DJF_1998-2010.nc - -# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) -time: - maximum_overlap_period: True - start_time: 1981-01-01 - end_time: 2010-12-31 - temporal_resolution: monthly - month_start: 12 - month_end: 2 - average_each_year: False - -space: - min_lat: -15.14 - max_lat: 27.26 - min_lon: 89.26 - max_lon: 146.96 - -regrid: - regrid_on_reference: True - regrid_dlat: 0.50 - regrid_dlon: 0.50 - -datasets: - reference: - data_source: rcmed - data_name: TRMM - dataset_id: 3 - parameter_id: 36 - - targets: - data_source: local - path: ./data/pr_Amon* - variable: pr - -number_of_metrics_and_plots: 1 - -metrics1: Taylor_diagram_spatial_pattern_of_multiyear_climatology - -plots1: - file_name: cmip5_SE_ASIA_prec_DJF_mean_taylor_diagram_to_TRMM - -use_subregions: False - http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/configuration_file_examples/cmip5_SE_Asia_prec_DJF_mean_taylor_diagram_to_TRMM.yaml ---------------------------------------------------------------------- diff --git a/examples/configuration_file_examples/cmip5_SE_Asia_prec_DJF_mean_taylor_diagram_to_TRMM.yaml b/examples/configuration_file_examples/cmip5_SE_Asia_prec_DJF_mean_taylor_diagram_to_TRMM.yaml new file mode 100644 index 0000000..276e744 --- /dev/null +++ b/examples/configuration_file_examples/cmip5_SE_Asia_prec_DJF_mean_taylor_diagram_to_TRMM.yaml @@ -0,0 +1,45 @@ +workdir: ./ +output_netcdf_filename: cmip5_SE_Asia_prec_DJF_1998-2010.nc + +# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) +time: + maximum_overlap_period: True + start_time: 1981-01-01 + end_time: 2010-12-31 + temporal_resolution: monthly + month_start: 12 + month_end: 2 + average_each_year: False + +space: + min_lat: -15.14 + max_lat: 27.26 + min_lon: 89.26 + max_lon: 146.96 + +regrid: + regrid_on_reference: True + regrid_dlat: 0.50 + regrid_dlon: 0.50 + +datasets: + reference: + data_source: rcmed + data_name: TRMM + dataset_id: 3 + parameter_id: 36 + + targets: + data_source: local + path: ./data/pr_Amon* + variable: pr + +number_of_metrics_and_plots: 1 + +metrics1: Taylor_diagram_spatial_pattern_of_multiyear_climatology + +plots1: + file_name: cmip5_SE_ASIA_prec_DJF_mean_taylor_diagram_to_TRMM + +use_subregions: False + http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/configuration_file_examples/cordex-AF_tasmax_annual_mean_bias_to_cru.yaml ---------------------------------------------------------------------- diff --git a/examples/configuration_file_examples/cordex-AF_tasmax_annual_mean_bias_to_cru.yaml b/examples/configuration_file_examples/cordex-AF_tasmax_annual_mean_bias_to_cru.yaml new file mode 100644 index 0000000..042a9a3 --- /dev/null +++ b/examples/configuration_file_examples/cordex-AF_tasmax_annual_mean_bias_to_cru.yaml @@ -0,0 +1,46 @@ +workdir: ./ +output_netcdf_filename: cordex-AF_CRU_taxmax_monthly_1990-2007.nc + +# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) +time: + maximum_overlap_period: True + start_time: 1990-01-01 + end_time: 2007-12-31 + temporal_resolution: monthly + month_start: 1 + month_end: 12 + average_each_year: False + +space: + min_lat: -45.76 + max_lat: 42.24 + min_lon: -24.64 + max_lon: 60.28 + +regrid: + regrid_on_reference: False + regrid_dlat: 0.44 + regrid_dlon: 0.44 + +datasets: + reference: + data_source: rcmed + data_name: CRU + dataset_id: 10 + parameter_id: 37 + + targets: + data_source: local + path: ./data/AFRICA*tasmax.nc + variable: tasmax + +number_of_metrics_and_plots: 1 + +metrics1: Map_plot_bias_of_multiyear_climatology + +plots1: + file_name: cordex-AF_tasmax_annual_mean_bias_to_cru + subplots_array: !!python/tuple [3,4] + +use_subregions: False + http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/configuration_file_examples/cordex_AF_prec_subregion_annual_cycle_time_series.yaml ---------------------------------------------------------------------- diff --git a/examples/configuration_file_examples/cordex_AF_prec_subregion_annual_cycle_time_series.yaml b/examples/configuration_file_examples/cordex_AF_prec_subregion_annual_cycle_time_series.yaml new file mode 100644 index 0000000..9483cae --- /dev/null +++ b/examples/configuration_file_examples/cordex_AF_prec_subregion_annual_cycle_time_series.yaml @@ -0,0 +1,90 @@ +workdir: ./ +output_netcdf_filename: cordex_AF_prec_monthly_mean_1990-2007.nc + +# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) +time: + maximum_overlap_period: True + start_time: 1998-01-01 + end_time: 2007-12-31 + temporal_resolution: monthly + month_start: 1 + month_end: 12 + average_each_year: False + +space: + min_lat: -45.76 + max_lat: 42.24 + min_lon: -24.64 + max_lon: 60.28 + +regrid: + regrid_on_reference: False + regrid_dlat: 0.44 + regrid_dlon: 0.44 + +datasets: + reference: + data_source: rcmed + data_name: CRU + dataset_id: 10 + parameter_id: 37 + + targets: + data_source: local + path: ./data/AFRICA*pr.nc + variable: pr + +number_of_metrics_and_plots: 1 + +metrics1: Timeseries_plot_subregion_annual_cycle + +plots1: + file_name: cordex_AF_prec_subregion_annual_cycle_time_series + subplots_array: !!python/tuple [7,3] + +use_subregions: True + +subregions: +#subregion name (R01, R02, R03,....) followed by an array of boundaries [south, north, west, east] + R01: + [29.0, 36.5, -10.0, 0.0] + R02: + [29, 37.5, 0, 10] + R03: + [25, 32.5, 10, 20] + R04: + [25, 32.5, 20, 33] + R05: + [12, 20.0, -19.3, -10.2] + R06: + [15, 25.0, 15, 30] + R07: + [7.3, 15, -10, 10] + R08: + [5, 7.3, -10, 10] + R09: + [6.9, 15, 33.9, 40] + R10: + [2.2, 11.8, 44.2, 51.8] + R11: + [0, 10, 10, 25] + R12: + [-10, 0, 10, 25] + R13: + [-15, 0, 30, 40] + R14: + [-27.9, -21.4, 13.6, 20] + R15: + [-35, -27.9, 13.6, 20] + R16: + [-35, -21.4, 20, 35.7] + R17: + [-25.8, -11.7, 43.2, 50.3] + R18: + [25, 35.0, 33, 40] + R19: + [28, 35, 45, 50] + R20: + [13, 20.0, 43, 50] + R21: + [20, 27.5, 50, 58] http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/configuration_file_examples/metrics_and_plots.py ---------------------------------------------------------------------- diff --git a/examples/configuration_file_examples/metrics_and_plots.py b/examples/configuration_file_examples/metrics_and_plots.py new file mode 100644 index 0000000..b564da5 --- /dev/null +++ b/examples/configuration_file_examples/metrics_and_plots.py @@ -0,0 +1,219 @@ +#Apache OCW lib immports +import ocw.data_source.local as local +import ocw.plotter as plotter +import ocw.utils as utils +from ocw.evaluation import Evaluation +import ocw.metrics as metrics + +# Python libraries +import numpy as np +import numpy.ma as ma +import matplotlib.pyplot as plt +from mpl_toolkits.basemap import Basemap +from matplotlib import rcParams +from matplotlib.patches import Polygon +import string + +def Map_plot_bias_of_multiyear_climatology(obs_dataset, obs_name, model_datasets, model_names, + file_name, row, column): + '''Draw maps of observed multi-year climatology and biases of models"''' + + # calculate climatology of observation data + obs_clim = utils.calc_temporal_mean(obs_dataset) + # determine the metrics + map_of_bias = metrics.TemporalMeanBias() + + # create the Evaluation object + bias_evaluation = Evaluation(obs_dataset, # Reference dataset for the evaluation + model_datasets, # list of target datasets for the evaluation + [map_of_bias, map_of_bias]) + + # run the evaluation (bias calculation) + bias_evaluation.run() + + rcm_bias = bias_evaluation.results[0] + + fig = plt.figure() + + lat_min = obs_dataset.lats.min() + lat_max = obs_dataset.lats.max() + lon_min = obs_dataset.lons.min() + lon_max = obs_dataset.lons.max() + + string_list = list(string.ascii_lowercase) + ax = fig.add_subplot(row,column,1) + m = Basemap(ax=ax, projection ='cyl', llcrnrlat = lat_min, urcrnrlat = lat_max, + llcrnrlon = lon_min, urcrnrlon = lon_max, resolution = 'l', fix_aspect=False) + lons, lats = np.meshgrid(obs_dataset.lons, obs_dataset.lats) + + x,y = m(lons, lats) + + m.drawcoastlines(linewidth=1) + m.drawcountries(linewidth=1) + m.drawstates(linewidth=0.5, color='w') + max = m.contourf(x,y,obs_clim,levels = plotter._nice_intervals(obs_dataset.values, 10), extend='both',cmap='PuOr') + ax.annotate('(a) \n' + obs_name,xy=(lon_min, lat_min)) + cax = fig.add_axes([0.02, 1.-float(1./row), 0.01, 1./row*0.6]) + plt.colorbar(max, cax = cax) + clevs = plotter._nice_intervals(rcm_bias, 11) + for imodel in np.arange(len(model_datasets)): + ax = fig.add_subplot(row, column,2+imodel) + m = Basemap(ax=ax, projection ='cyl', llcrnrlat = lat_min, urcrnrlat = lat_max, + llcrnrlon = lon_min, urcrnrlon = lon_max, resolution = 'l', fix_aspect=False) + m.drawcoastlines(linewidth=1) + m.drawcountries(linewidth=1) + m.drawstates(linewidth=0.5, color='w') + max = m.contourf(x,y,rcm_bias[imodel,:],levels = clevs, extend='both', cmap='RdBu_r') + ax.annotate('('+string_list[imodel+1]+') \n '+model_names[imodel],xy=(lon_min, lat_min)) + + cax = fig.add_axes([0.91, 0.1, 0.015, 0.8]) + plt.colorbar(max, cax = cax) + + plt.subplots_adjust(hspace=0.01,wspace=0.05) + + plt.show() + fig.savefig(file_name,dpi=600,bbox_inches='tight') + +def Taylor_diagram_spatial_pattern_of_multiyear_climatology(obs_dataset, obs_name, model_datasets, model_names, + file_name): + + # calculate climatological mean fields + obs_dataset.values = utils.calc_temporal_mean(obs_dataset) + for dataset in model_datasets: + dataset.values = utils.calc_temporal_mean(dataset) + + # Metrics (spatial standard deviation and pattern correlation) + # determine the metrics + taylor_diagram = metrics.SpatialPatternTaylorDiagram() + + # create the Evaluation object + taylor_evaluation = Evaluation(obs_dataset, # Reference dataset for the evaluation + model_datasets, # list of target datasets for the evaluation + [taylor_diagram]) + + # run the evaluation (bias calculation) + taylor_evaluation.run() + + taylor_data = taylor_evaluation.results[0] + + plotter.draw_taylor_diagram(taylor_data, model_names, obs_name, file_name, pos='upper right',frameon=False) + +def Time_series_subregion(obs_subregion_mean, obs_name, model_subregion_mean, model_names, seasonal_cycle, + file_name, row, column, x_tick=['']): + + nmodel, nt, nregion = model_subregion_mean.shape + + if seasonal_cycle: + obs_data = ma.mean(obs_subregion_mean.reshape([1,nt/12,12,nregion]), axis=1) + model_data = ma.mean(model_subregion_mean.reshape([nmodel,nt/12,12,nregion]), axis=1) + nt = 12 + else: + obs_data = obs_subregion_mean + model_data = model_subregion_mean + + x_axis = np.arange(nt) + x_tick_values = x_axis + + fig = plt.figure() + rcParams['xtick.labelsize'] = 6 + rcParams['ytick.labelsize'] = 6 + + for iregion in np.arange(nregion): + ax = fig.add_subplot(row, column, iregion+1) + x_tick_labels = [''] + if iregion+1 > column*(row-1): + x_tick_labels = x_tick + else: + x_tick_labels=[''] + ax.plot(x_axis, obs_data[0, :, iregion], color='r', lw=2, label=obs_name) + for imodel in np.arange(nmodel): + ax.plot(x_axis, model_data[imodel, :, iregion], lw=0.5, label = model_names[imodel]) + ax.set_xlim([-0.5,nt-0.5]) + ax.set_xticks(x_tick_values) + ax.set_xticklabels(x_tick_labels) + ax.set_title('Region %02d' % (iregion+1), fontsize=8) + + ax.legend(bbox_to_anchor=(-0.2, row/2), loc='center' , prop={'size':7}, frameon=False) + + fig.subplots_adjust(hspace=0.7, wspace=0.5) + plt.show() + fig.savefig(file_name, dpi=600, bbox_inches='tight') + +def Portrait_diagram_subregion(obs_subregion_mean, obs_name, model_subregion_mean, model_names, seasonal_cycle, + file_name, normalize=True): + + nmodel, nt, nregion = model_subregion_mean.shape + + if seasonal_cycle: + obs_data = ma.mean(obs_subregion_mean.reshape([1,nt/12,12,nregion]), axis=1) + model_data = ma.mean(model_subregion_mean.reshape([nmodel,nt/12,12,nregion]), axis=1) + nt = 12 + else: + obs_data = obs_subregion_mean + model_data = model_subregion_mean + + subregion_metrics = ma.zeros([4, nregion, nmodel]) + + for imodel in np.arange(nmodel): + for iregion in np.arange(nregion): + # First metric: bias + subregion_metrics[0, iregion, imodel] = metrics.calc_bias(model_data[imodel, :, iregion], obs_data[0, :, iregion], average_over_time = True) + # Second metric: standard deviation + subregion_metrics[1, iregion, imodel] = metrics.calc_stddev_ratio(model_data[imodel, :, iregion], obs_data[0, :, iregion]) + # Third metric: RMSE + subregion_metrics[2, iregion, imodel] = metrics.calc_rmse(model_data[imodel, :, iregion], obs_data[0, :, iregion]) + # Fourth metric: correlation + subregion_metrics[3, iregion, imodel] = metrics.calc_correlation(model_data[imodel, :, iregion], obs_data[0, :, iregion]) + + if normalize: + for iregion in np.arange(nregion): + subregion_metrics[0, iregion, : ] = subregion_metrics[0, iregion, : ]/ma.std(obs_data[0, :, iregion])*100. + subregion_metrics[1, iregion, : ] = subregion_metrics[1, iregion, : ]*100. + subregion_metrics[2, iregion, : ] = subregion_metrics[2, iregion, : ]/ma.std(obs_data[0, :, iregion])*100. + + region_names = ['R%02d' % i for i in np.arange(nregion)+1] + + for imetric, metric in enumerate(['bias','std','RMSE','corr']): + plotter.draw_portrait_diagram(subregion_metrics[imetric, :, :], region_names, model_names, file_name+'_'+metric, + xlabel='model',ylabel='region') + +def Map_plot_subregion(subregions, ref_dataset, directory): + + lons, lats = np.meshgrid(ref_dataset.lons, ref_dataset.lats) + fig = plt.figure() + ax = fig.add_subplot(111) + m = Basemap(ax=ax, projection='cyl',llcrnrlat = lats.min(), urcrnrlat = lats.max(), + llcrnrlon = lons.min(), urcrnrlon = lons.max(), resolution = 'l') + m.drawcoastlines(linewidth=0.75) + m.drawcountries(linewidth=0.75) + m.etopo() + x, y = m(lons, lats) + #subregion_array = ma.masked_equal(subregion_array, 0) + #max=m.contourf(x, y, subregion_array, alpha=0.7, cmap='Accent') + for subregion in subregions: + draw_screen_poly(subregion[1], m, 'w') + plt.annotate(subregion[0],xy=(0.5*(subregion[1][2]+subregion[1][3]), 0.5*(subregion[1][0]+subregion[1][1])), ha='center',va='center', fontsize=8) + plt.show() + fig.savefig(directory+'map_subregion', bbox_inches='tight') + +def draw_screen_poly(boundary_array, m, linecolor='k'): + + ''' Draw a polygon on a map + + :param boundary_array: [lat_north, lat_south, lon_east, lon_west] + :param m : Basemap object + ''' + + lats = [boundary_array[0], boundary_array[0], boundary_array[1], boundary_array[1]] + lons = [boundary_array[3], boundary_array[2], boundary_array[2], boundary_array[3]] + x, y = m( lons, lats ) + xy = zip(x,y) + poly = Polygon( xy, facecolor='none',edgecolor=linecolor ) + plt.gca().add_patch(poly) + + + + + + + http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/configuration_file_examples/narccap_prec_JJA_mean_taylor_diagram_to_cru.yaml ---------------------------------------------------------------------- diff --git a/examples/configuration_file_examples/narccap_prec_JJA_mean_taylor_diagram_to_cru.yaml b/examples/configuration_file_examples/narccap_prec_JJA_mean_taylor_diagram_to_cru.yaml new file mode 100644 index 0000000..c6b96cf --- /dev/null +++ b/examples/configuration_file_examples/narccap_prec_JJA_mean_taylor_diagram_to_cru.yaml @@ -0,0 +1,44 @@ +workdir: ./ +output_netcdf_filename: narccap_prec_JJA_1980-2003.nc + +# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) +time: + maximum_overlap_period: False + start_time: 1980-01-01 + end_time: 2003-12-31 + temporal_resolution: monthly + month_start: 6 + month_end: 8 + average_each_year: True + +space: + min_lat: 23.75 + max_lat: 49.75 + min_lon: -125.75 + max_lon: -66.75 + +regrid: + regrid_on_reference: False + regrid_dlat: 0.50 + regrid_dlon: 0.50 + +datasets: + reference: + data_source: rcmed + data_name: CRU + dataset_id: 10 + parameter_id: 37 + + targets: + data_source: local + path: ./data/prec.*ncep.monavg.nc + variable: prec + +number_of_metrics_and_plots: 1 + +metrics1: Taylor_diagram_spatial_pattern_of_multiyear_climatology + +plots1: + file_name: narccap_prec_JJA_mean_taylor_diagram_to_cru + +use_subregions: False http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/configuration_file_examples/narccap_tas_DJF_subregion_interannual_variability_portrait_diagram.yaml ---------------------------------------------------------------------- diff --git a/examples/configuration_file_examples/narccap_tas_DJF_subregion_interannual_variability_portrait_diagram.yaml b/examples/configuration_file_examples/narccap_tas_DJF_subregion_interannual_variability_portrait_diagram.yaml new file mode 100644 index 0000000..de2d98e --- /dev/null +++ b/examples/configuration_file_examples/narccap_tas_DJF_subregion_interannual_variability_portrait_diagram.yaml @@ -0,0 +1,75 @@ +workdir: ./ +output_netcdf_filename: narccap_tas_DJF_mean_mean_1980-2003.nc + +# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) +time: + maximum_overlap_period: False + start_time: 1980-01-01 + end_time: 2003-12-31 + temporal_resolution: monthly + month_start: 12 + month_end: 2 + average_each_year: True + +space: + min_lat: 23.75 + max_lat: 49.75 + min_lon: -125.75 + max_lon: -66.75 + +regrid: + regrid_on_reference: False + regrid_dlat: 0.50 + regrid_dlon: 0.50 + +datasets: + reference: + data_source: rcmed + data_name: CRU + dataset_id: 10 + parameter_id: 38 + + targets: + data_source: local + path: ./data/temp*ncep.monavg.nc + variable: temp + +number_of_metrics_and_plots: 1 + +metrics1: Portrait_diagram_subregion_interannual_variability + +plots1: + file_name: narccap_tas_DJF_subregion_interannual_variability_portrait_diagram + +use_subregions: True + +subregions: +#subregion name (R01, R02, R03,....) followed by an array of boundaries [south, north, west, east] + R01: + [42.75, 49.75, -123.75, -120.25] + R02: + [42.75, 49.75, -119.75, -112.75] + R03: + [37.25, 42.25, -123.75, -117.75] + R04: + [32.25, 37.25, -122.75, -114.75] + R05: + [31.25, 37.25, -113.75, -108.25] + R06: + [31.25, 37.25, -108.25, -99.75] + R07: + [37.25, 43.25, -110.25, -103.75] + R08: + [45.25, 49.25, -99.75, -90.25] + R09: + [34.75, 45.25, -99.75, -90.25] + R10: + [29.75, 34.75, -95.75, -84.75] + R11: + [38.25, 44.75, -89.75, -80.25] + R12: + [38.25, 44.75, -79.75, -70.25] + R13: + [30.75, 38.25, -83.75, -75.25] + R14: + [24.25, 30.75, -83.75, -80.25] http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/configuration_file_examples/run_RCMES.py ---------------------------------------------------------------------- diff --git a/examples/configuration_file_examples/run_RCMES.py b/examples/configuration_file_examples/run_RCMES.py new file mode 100644 index 0000000..6064c11 --- /dev/null +++ b/examples/configuration_file_examples/run_RCMES.py @@ -0,0 +1,216 @@ +#Apache OCW lib immports +import ocw.dataset_processor as dsp +import ocw.data_source.local as local +import ocw.data_source.rcmed as rcmed +import ocw.plotter as plotter +import ocw.utils as utils +from ocw.dataset import Bounds + +import matplotlib.pyplot as plt +from matplotlib import rcParams +import numpy as np +import numpy.ma as ma +import yaml +from glob import glob +import operator +from dateutil import parser +from datetime import datetime +import os +import sys + +from metrics_and_plots import * + +import ssl +if hasattr(ssl, '_create_unverified_context'): + ssl._create_default_https_context = ssl._create_unverified_context + +config_file = str(sys.argv[1]) + +print 'Reading the configuration file ', config_file +config = yaml.load(open(config_file)) +time_info = config['time'] +temporal_resolution = time_info['temporal_resolution'] + +start_time = datetime.strptime(time_info['start_time'].strftime('%Y%m%d'),'%Y%m%d') +end_time = datetime.strptime(time_info['end_time'].strftime('%Y%m%d'),'%Y%m%d') + +space_info = config['space'] +min_lat = space_info['min_lat'] +max_lat = space_info['max_lat'] +min_lon = space_info['min_lon'] +max_lon = space_info['max_lon'] + +""" Step 1: Load the reference data """ +ref_data_info = config['datasets']['reference'] +print 'Loading observation dataset:\n',ref_data_info +ref_name = ref_data_info['data_name'] +if ref_data_info['data_source'] == 'local': + ref_dataset = local.load_file(ref_data_info['path'], + ref_data_info['variable'], name=ref_name) +elif ref_data_info['data_source'] == 'rcmed': + ref_dataset = rcmed.parameter_dataset(ref_data_info['dataset_id'], + ref_data_info['parameter_id'], + min_lat, max_lat, min_lon, max_lon, + start_time, end_time) +else: + print ' ' + # TO DO: support ESGF + +ref_dataset = dsp.normalize_dataset_datetimes(ref_dataset, temporal_resolution) + +""" Step 2: Load model NetCDF Files into OCW Dataset Objects """ +model_data_info = config['datasets']['targets'] +print 'Loading model datasets:\n',model_data_info +if model_data_info['data_source'] == 'local': + model_datasets, model_names = local.load_multiple_files(file_path = model_data_info['path'], + variable_name =model_data_info['variable']) +else: + print ' ' + # TO DO: support RCMED and ESGF +for idata,dataset in enumerate(model_datasets): + model_datasets[idata] = dsp.normalize_dataset_datetimes(dataset, temporal_resolution) + +""" Step 3: Subset the data for temporal and spatial domain """ +# Create a Bounds object to use for subsetting +if time_info['maximum_overlap_period']: + start_time, end_time = utils.get_temporal_overlap([ref_dataset]+model_datasets) + print 'Maximum overlap period' + print 'start_time:', start_time + print 'end_time:', end_time + +if temporal_resolution == 'monthly' and end_time.day !=1: + end_time = end_time.replace(day=1) +if ref_data_info['data_source'] == 'rcmed': + min_lat = np.max([min_lat, ref_dataset.lats.min()]) + max_lat = np.min([max_lat, ref_dataset.lats.max()]) + min_lon = np.max([min_lon, ref_dataset.lons.min()]) + max_lon = np.min([max_lon, ref_dataset.lons.max()]) +bounds = Bounds(min_lat, max_lat, min_lon, max_lon, start_time, end_time) + +if ref_dataset.lats.ndim !=2 and ref_dataset.lons.ndim !=2: + ref_dataset = dsp.subset(bounds,ref_dataset) +for idata,dataset in enumerate(model_datasets): + if dataset.lats.ndim !=2 and dataset.lons.ndim !=2: + model_datasets[idata] = dsp.subset(bounds,dataset) + +# Temporaly subset both observation and model datasets for the user specified season +month_start = time_info['month_start'] +month_end = time_info['month_end'] +average_each_year = time_info['average_each_year'] + +ref_dataset = dsp.temporal_subset(month_start, month_end,ref_dataset,average_each_year) +for idata,dataset in enumerate(model_datasets): + model_datasets[idata] = dsp.temporal_subset(month_start, month_end,dataset,average_each_year) + +# generate grid points for regridding +if config['regrid']['regrid_on_reference']: + new_lat = ref_dataset.lats + new_lon = ref_dataset.lons +else: + delta_lat = config['regrid']['regrid_dlat'] + delta_lon = config['regrid']['regrid_dlon'] + nlat = (max_lat - min_lat)/delta_lat+1 + nlon = (max_lon - min_lon)/delta_lon+1 + new_lat = np.linspace(min_lat, max_lat, nlat) + new_lon = np.linspace(min_lon, max_lon, nlon) + +# number of models +nmodel = len(model_datasets) +print 'Dataset loading completed' +print 'Observation data:', ref_name +print 'Number of model datasets:',nmodel +for model_name in model_names: + print model_name + +""" Step 4: Spatial regriding of the reference datasets """ +print 'Regridding datasets: ', config['regrid'] +if not config['regrid']['regrid_on_reference']: + ref_dataset = dsp.spatial_regrid(ref_dataset, new_lat, new_lon) +for idata,dataset in enumerate(model_datasets): + model_datasets[idata] = dsp.spatial_regrid(dataset, new_lat, new_lon) + +print 'Propagating missing data information' +ref_dataset = dsp.mask_missing_data([ref_dataset]+model_datasets)[0] +model_datasets = dsp.mask_missing_data([ref_dataset]+model_datasets)[1:] + +""" Step 5: Checking and converting variable units """ +print 'Checking and converting variable units' +ref_dataset = dsp.variable_unit_conversion(ref_dataset) +for idata,dataset in enumerate(model_datasets): + model_datasets[idata] = dsp.variable_unit_conversion(dataset) + + +print 'Generating multi-model ensemble' +model_datasets.append(dsp.ensemble(model_datasets)) +model_names.append('ENS-models') + +""" Step 6: Generate subregion average and standard deviation """ +if config['use_subregions']: + # sort the subregion by region names and make a list + subregions= sorted(config['subregions'].items(),key=operator.itemgetter(0)) + + # number of subregions + nsubregion = len(subregions) + + print 'Calculating spatial averages and standard deviations of ',str(nsubregion),' subregions' + + ref_subregion_mean, ref_subregion_std, subregion_array = utils.calc_subregion_area_mean_and_std([ref_dataset], subregions) + model_subregion_mean, model_subregion_std, subregion_array = utils.calc_subregion_area_mean_and_std(model_datasets, subregions) + +""" Step 7: Write a netCDF file """ +workdir = config['workdir'] +if workdir[-1] != '/': + workdir = workdir+'/' +print 'Writing a netcdf file: ',workdir+config['output_netcdf_filename'] +if not os.path.exists(workdir): + os.system("mkdir "+workdir) + +if config['use_subregions']: + dsp.write_netcdf_multiple_datasets_with_subregions(ref_dataset, ref_name, model_datasets, model_names, + path=workdir+config['output_netcdf_filename'], + subregions=subregions, subregion_array = subregion_array, + ref_subregion_mean=ref_subregion_mean, ref_subregion_std=ref_subregion_std, + model_subregion_mean=model_subregion_mean, model_subregion_std=model_subregion_std) +else: + dsp.write_netcdf_multiple_datasets_with_subregions(ref_dataset, ref_name, model_datasets, model_names, + path=workdir+config['output_netcdf_filename']) + +""" Step 8: Calculate metrics and draw plots """ +nmetrics = config['number_of_metrics_and_plots'] +if config['use_subregions']: + Map_plot_subregion(subregions, ref_dataset, workdir) + +if nmetrics > 0: + print 'Calculating metrics and generating plots' + for imetric in np.arange(nmetrics)+1: + metrics_name = config['metrics'+'%1d' %imetric] + plot_info = config['plots'+'%1d' %imetric] + file_name = workdir+plot_info['file_name'] + + print 'metrics '+str(imetric)+'/'+str(nmetrics)+': ', metrics_name + if metrics_name == 'Map_plot_bias_of_multiyear_climatology': + row, column = plot_info['subplots_array'] + Map_plot_bias_of_multiyear_climatology(ref_dataset, ref_name, model_datasets, model_names, + file_name, row, column) + elif metrics_name == 'Taylor_diagram_spatial_pattern_of_multiyear_climatology': + Taylor_diagram_spatial_pattern_of_multiyear_climatology(ref_dataset, ref_name, model_datasets, model_names, + file_name) + elif config['use_subregions']: + if metrics_name == 'Timeseries_plot_subregion_interannual_variability' and average_each_year: + row, column = plot_info['subplots_array'] + Time_series_subregion(ref_subregion_mean, ref_name, model_subregion_mean, model_names, False, + file_name, row, column, x_tick=['Y'+str(i+1) for i in np.arange(model_subregion_mean.shape[1])]) + if metrics_name == 'Timeseries_plot_subregion_annual_cycle' and not average_each_year and month_start==1 and month_end==12: + row, column = plot_info['subplots_array'] + Time_series_subregion(ref_subregion_mean, ref_name, model_subregion_mean, model_names, True, + file_name, row, column, x_tick=['J','F','M','A','M','J','J','A','S','O','N','D']) + if metrics_name == 'Portrait_diagram_subregion_interannual_variability' and average_each_year: + Portrait_diagram_subregion(ref_subregion_mean, ref_name, model_subregion_mean, model_names, False, + file_name) + if metrics_name == 'Portrait_diagram_subregion_annual_cycle' and not average_each_year and month_start==1 and month_end==12: + Portrait_diagram_subregion(ref_subregion_mean, ref_name, model_subregion_mean, model_names, True, + file_name) + else: + print 'please check the currently supported metrics' + + http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/cordex-AF_tasmax_annual_mean_bias_to_cru.yaml ---------------------------------------------------------------------- diff --git a/examples/cordex-AF_tasmax_annual_mean_bias_to_cru.yaml b/examples/cordex-AF_tasmax_annual_mean_bias_to_cru.yaml deleted file mode 100644 index 042a9a3..0000000 --- a/examples/cordex-AF_tasmax_annual_mean_bias_to_cru.yaml +++ /dev/null @@ -1,46 +0,0 @@ -workdir: ./ -output_netcdf_filename: cordex-AF_CRU_taxmax_monthly_1990-2007.nc - -# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) -time: - maximum_overlap_period: True - start_time: 1990-01-01 - end_time: 2007-12-31 - temporal_resolution: monthly - month_start: 1 - month_end: 12 - average_each_year: False - -space: - min_lat: -45.76 - max_lat: 42.24 - min_lon: -24.64 - max_lon: 60.28 - -regrid: - regrid_on_reference: False - regrid_dlat: 0.44 - regrid_dlon: 0.44 - -datasets: - reference: - data_source: rcmed - data_name: CRU - dataset_id: 10 - parameter_id: 37 - - targets: - data_source: local - path: ./data/AFRICA*tasmax.nc - variable: tasmax - -number_of_metrics_and_plots: 1 - -metrics1: Map_plot_bias_of_multiyear_climatology - -plots1: - file_name: cordex-AF_tasmax_annual_mean_bias_to_cru - subplots_array: !!python/tuple [3,4] - -use_subregions: False - http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/cordex-AF_tasmax_bias_to_cru.yaml ---------------------------------------------------------------------- diff --git a/examples/cordex-AF_tasmax_bias_to_cru.yaml b/examples/cordex-AF_tasmax_bias_to_cru.yaml deleted file mode 100644 index 042a9a3..0000000 --- a/examples/cordex-AF_tasmax_bias_to_cru.yaml +++ /dev/null @@ -1,46 +0,0 @@ -workdir: ./ -output_netcdf_filename: cordex-AF_CRU_taxmax_monthly_1990-2007.nc - -# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) -time: - maximum_overlap_period: True - start_time: 1990-01-01 - end_time: 2007-12-31 - temporal_resolution: monthly - month_start: 1 - month_end: 12 - average_each_year: False - -space: - min_lat: -45.76 - max_lat: 42.24 - min_lon: -24.64 - max_lon: 60.28 - -regrid: - regrid_on_reference: False - regrid_dlat: 0.44 - regrid_dlon: 0.44 - -datasets: - reference: - data_source: rcmed - data_name: CRU - dataset_id: 10 - parameter_id: 37 - - targets: - data_source: local - path: ./data/AFRICA*tasmax.nc - variable: tasmax - -number_of_metrics_and_plots: 1 - -metrics1: Map_plot_bias_of_multiyear_climatology - -plots1: - file_name: cordex-AF_tasmax_annual_mean_bias_to_cru - subplots_array: !!python/tuple [3,4] - -use_subregions: False - http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/cordex_AF_prec_subregion_annual_cycle_time_series.yaml ---------------------------------------------------------------------- diff --git a/examples/cordex_AF_prec_subregion_annual_cycle_time_series.yaml b/examples/cordex_AF_prec_subregion_annual_cycle_time_series.yaml deleted file mode 100644 index 9483cae..0000000 --- a/examples/cordex_AF_prec_subregion_annual_cycle_time_series.yaml +++ /dev/null @@ -1,90 +0,0 @@ -workdir: ./ -output_netcdf_filename: cordex_AF_prec_monthly_mean_1990-2007.nc - -# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) -time: - maximum_overlap_period: True - start_time: 1998-01-01 - end_time: 2007-12-31 - temporal_resolution: monthly - month_start: 1 - month_end: 12 - average_each_year: False - -space: - min_lat: -45.76 - max_lat: 42.24 - min_lon: -24.64 - max_lon: 60.28 - -regrid: - regrid_on_reference: False - regrid_dlat: 0.44 - regrid_dlon: 0.44 - -datasets: - reference: - data_source: rcmed - data_name: CRU - dataset_id: 10 - parameter_id: 37 - - targets: - data_source: local - path: ./data/AFRICA*pr.nc - variable: pr - -number_of_metrics_and_plots: 1 - -metrics1: Timeseries_plot_subregion_annual_cycle - -plots1: - file_name: cordex_AF_prec_subregion_annual_cycle_time_series - subplots_array: !!python/tuple [7,3] - -use_subregions: True - -subregions: -#subregion name (R01, R02, R03,....) followed by an array of boundaries [south, north, west, east] - R01: - [29.0, 36.5, -10.0, 0.0] - R02: - [29, 37.5, 0, 10] - R03: - [25, 32.5, 10, 20] - R04: - [25, 32.5, 20, 33] - R05: - [12, 20.0, -19.3, -10.2] - R06: - [15, 25.0, 15, 30] - R07: - [7.3, 15, -10, 10] - R08: - [5, 7.3, -10, 10] - R09: - [6.9, 15, 33.9, 40] - R10: - [2.2, 11.8, 44.2, 51.8] - R11: - [0, 10, 10, 25] - R12: - [-10, 0, 10, 25] - R13: - [-15, 0, 30, 40] - R14: - [-27.9, -21.4, 13.6, 20] - R15: - [-35, -27.9, 13.6, 20] - R16: - [-35, -21.4, 20, 35.7] - R17: - [-25.8, -11.7, 43.2, 50.3] - R18: - [25, 35.0, 33, 40] - R19: - [28, 35, 45, 50] - R20: - [13, 20.0, 43, 50] - R21: - [20, 27.5, 50, 58] http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/example_package.py ---------------------------------------------------------------------- diff --git a/examples/example_package.py b/examples/example_package.py deleted file mode 100644 index b564da5..0000000 --- a/examples/example_package.py +++ /dev/null @@ -1,219 +0,0 @@ -#Apache OCW lib immports -import ocw.data_source.local as local -import ocw.plotter as plotter -import ocw.utils as utils -from ocw.evaluation import Evaluation -import ocw.metrics as metrics - -# Python libraries -import numpy as np -import numpy.ma as ma -import matplotlib.pyplot as plt -from mpl_toolkits.basemap import Basemap -from matplotlib import rcParams -from matplotlib.patches import Polygon -import string - -def Map_plot_bias_of_multiyear_climatology(obs_dataset, obs_name, model_datasets, model_names, - file_name, row, column): - '''Draw maps of observed multi-year climatology and biases of models"''' - - # calculate climatology of observation data - obs_clim = utils.calc_temporal_mean(obs_dataset) - # determine the metrics - map_of_bias = metrics.TemporalMeanBias() - - # create the Evaluation object - bias_evaluation = Evaluation(obs_dataset, # Reference dataset for the evaluation - model_datasets, # list of target datasets for the evaluation - [map_of_bias, map_of_bias]) - - # run the evaluation (bias calculation) - bias_evaluation.run() - - rcm_bias = bias_evaluation.results[0] - - fig = plt.figure() - - lat_min = obs_dataset.lats.min() - lat_max = obs_dataset.lats.max() - lon_min = obs_dataset.lons.min() - lon_max = obs_dataset.lons.max() - - string_list = list(string.ascii_lowercase) - ax = fig.add_subplot(row,column,1) - m = Basemap(ax=ax, projection ='cyl', llcrnrlat = lat_min, urcrnrlat = lat_max, - llcrnrlon = lon_min, urcrnrlon = lon_max, resolution = 'l', fix_aspect=False) - lons, lats = np.meshgrid(obs_dataset.lons, obs_dataset.lats) - - x,y = m(lons, lats) - - m.drawcoastlines(linewidth=1) - m.drawcountries(linewidth=1) - m.drawstates(linewidth=0.5, color='w') - max = m.contourf(x,y,obs_clim,levels = plotter._nice_intervals(obs_dataset.values, 10), extend='both',cmap='PuOr') - ax.annotate('(a) \n' + obs_name,xy=(lon_min, lat_min)) - cax = fig.add_axes([0.02, 1.-float(1./row), 0.01, 1./row*0.6]) - plt.colorbar(max, cax = cax) - clevs = plotter._nice_intervals(rcm_bias, 11) - for imodel in np.arange(len(model_datasets)): - ax = fig.add_subplot(row, column,2+imodel) - m = Basemap(ax=ax, projection ='cyl', llcrnrlat = lat_min, urcrnrlat = lat_max, - llcrnrlon = lon_min, urcrnrlon = lon_max, resolution = 'l', fix_aspect=False) - m.drawcoastlines(linewidth=1) - m.drawcountries(linewidth=1) - m.drawstates(linewidth=0.5, color='w') - max = m.contourf(x,y,rcm_bias[imodel,:],levels = clevs, extend='both', cmap='RdBu_r') - ax.annotate('('+string_list[imodel+1]+') \n '+model_names[imodel],xy=(lon_min, lat_min)) - - cax = fig.add_axes([0.91, 0.1, 0.015, 0.8]) - plt.colorbar(max, cax = cax) - - plt.subplots_adjust(hspace=0.01,wspace=0.05) - - plt.show() - fig.savefig(file_name,dpi=600,bbox_inches='tight') - -def Taylor_diagram_spatial_pattern_of_multiyear_climatology(obs_dataset, obs_name, model_datasets, model_names, - file_name): - - # calculate climatological mean fields - obs_dataset.values = utils.calc_temporal_mean(obs_dataset) - for dataset in model_datasets: - dataset.values = utils.calc_temporal_mean(dataset) - - # Metrics (spatial standard deviation and pattern correlation) - # determine the metrics - taylor_diagram = metrics.SpatialPatternTaylorDiagram() - - # create the Evaluation object - taylor_evaluation = Evaluation(obs_dataset, # Reference dataset for the evaluation - model_datasets, # list of target datasets for the evaluation - [taylor_diagram]) - - # run the evaluation (bias calculation) - taylor_evaluation.run() - - taylor_data = taylor_evaluation.results[0] - - plotter.draw_taylor_diagram(taylor_data, model_names, obs_name, file_name, pos='upper right',frameon=False) - -def Time_series_subregion(obs_subregion_mean, obs_name, model_subregion_mean, model_names, seasonal_cycle, - file_name, row, column, x_tick=['']): - - nmodel, nt, nregion = model_subregion_mean.shape - - if seasonal_cycle: - obs_data = ma.mean(obs_subregion_mean.reshape([1,nt/12,12,nregion]), axis=1) - model_data = ma.mean(model_subregion_mean.reshape([nmodel,nt/12,12,nregion]), axis=1) - nt = 12 - else: - obs_data = obs_subregion_mean - model_data = model_subregion_mean - - x_axis = np.arange(nt) - x_tick_values = x_axis - - fig = plt.figure() - rcParams['xtick.labelsize'] = 6 - rcParams['ytick.labelsize'] = 6 - - for iregion in np.arange(nregion): - ax = fig.add_subplot(row, column, iregion+1) - x_tick_labels = [''] - if iregion+1 > column*(row-1): - x_tick_labels = x_tick - else: - x_tick_labels=[''] - ax.plot(x_axis, obs_data[0, :, iregion], color='r', lw=2, label=obs_name) - for imodel in np.arange(nmodel): - ax.plot(x_axis, model_data[imodel, :, iregion], lw=0.5, label = model_names[imodel]) - ax.set_xlim([-0.5,nt-0.5]) - ax.set_xticks(x_tick_values) - ax.set_xticklabels(x_tick_labels) - ax.set_title('Region %02d' % (iregion+1), fontsize=8) - - ax.legend(bbox_to_anchor=(-0.2, row/2), loc='center' , prop={'size':7}, frameon=False) - - fig.subplots_adjust(hspace=0.7, wspace=0.5) - plt.show() - fig.savefig(file_name, dpi=600, bbox_inches='tight') - -def Portrait_diagram_subregion(obs_subregion_mean, obs_name, model_subregion_mean, model_names, seasonal_cycle, - file_name, normalize=True): - - nmodel, nt, nregion = model_subregion_mean.shape - - if seasonal_cycle: - obs_data = ma.mean(obs_subregion_mean.reshape([1,nt/12,12,nregion]), axis=1) - model_data = ma.mean(model_subregion_mean.reshape([nmodel,nt/12,12,nregion]), axis=1) - nt = 12 - else: - obs_data = obs_subregion_mean - model_data = model_subregion_mean - - subregion_metrics = ma.zeros([4, nregion, nmodel]) - - for imodel in np.arange(nmodel): - for iregion in np.arange(nregion): - # First metric: bias - subregion_metrics[0, iregion, imodel] = metrics.calc_bias(model_data[imodel, :, iregion], obs_data[0, :, iregion], average_over_time = True) - # Second metric: standard deviation - subregion_metrics[1, iregion, imodel] = metrics.calc_stddev_ratio(model_data[imodel, :, iregion], obs_data[0, :, iregion]) - # Third metric: RMSE - subregion_metrics[2, iregion, imodel] = metrics.calc_rmse(model_data[imodel, :, iregion], obs_data[0, :, iregion]) - # Fourth metric: correlation - subregion_metrics[3, iregion, imodel] = metrics.calc_correlation(model_data[imodel, :, iregion], obs_data[0, :, iregion]) - - if normalize: - for iregion in np.arange(nregion): - subregion_metrics[0, iregion, : ] = subregion_metrics[0, iregion, : ]/ma.std(obs_data[0, :, iregion])*100. - subregion_metrics[1, iregion, : ] = subregion_metrics[1, iregion, : ]*100. - subregion_metrics[2, iregion, : ] = subregion_metrics[2, iregion, : ]/ma.std(obs_data[0, :, iregion])*100. - - region_names = ['R%02d' % i for i in np.arange(nregion)+1] - - for imetric, metric in enumerate(['bias','std','RMSE','corr']): - plotter.draw_portrait_diagram(subregion_metrics[imetric, :, :], region_names, model_names, file_name+'_'+metric, - xlabel='model',ylabel='region') - -def Map_plot_subregion(subregions, ref_dataset, directory): - - lons, lats = np.meshgrid(ref_dataset.lons, ref_dataset.lats) - fig = plt.figure() - ax = fig.add_subplot(111) - m = Basemap(ax=ax, projection='cyl',llcrnrlat = lats.min(), urcrnrlat = lats.max(), - llcrnrlon = lons.min(), urcrnrlon = lons.max(), resolution = 'l') - m.drawcoastlines(linewidth=0.75) - m.drawcountries(linewidth=0.75) - m.etopo() - x, y = m(lons, lats) - #subregion_array = ma.masked_equal(subregion_array, 0) - #max=m.contourf(x, y, subregion_array, alpha=0.7, cmap='Accent') - for subregion in subregions: - draw_screen_poly(subregion[1], m, 'w') - plt.annotate(subregion[0],xy=(0.5*(subregion[1][2]+subregion[1][3]), 0.5*(subregion[1][0]+subregion[1][1])), ha='center',va='center', fontsize=8) - plt.show() - fig.savefig(directory+'map_subregion', bbox_inches='tight') - -def draw_screen_poly(boundary_array, m, linecolor='k'): - - ''' Draw a polygon on a map - - :param boundary_array: [lat_north, lat_south, lon_east, lon_west] - :param m : Basemap object - ''' - - lats = [boundary_array[0], boundary_array[0], boundary_array[1], boundary_array[1]] - lons = [boundary_array[3], boundary_array[2], boundary_array[2], boundary_array[3]] - x, y = m( lons, lats ) - xy = zip(x,y) - poly = Polygon( xy, facecolor='none',edgecolor=linecolor ) - plt.gca().add_patch(poly) - - - - - - - http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/narccap_prec_JJA_mean_taylor_diagram_to_cru.yaml ---------------------------------------------------------------------- diff --git a/examples/narccap_prec_JJA_mean_taylor_diagram_to_cru.yaml b/examples/narccap_prec_JJA_mean_taylor_diagram_to_cru.yaml deleted file mode 100644 index c6b96cf..0000000 --- a/examples/narccap_prec_JJA_mean_taylor_diagram_to_cru.yaml +++ /dev/null @@ -1,44 +0,0 @@ -workdir: ./ -output_netcdf_filename: narccap_prec_JJA_1980-2003.nc - -# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) -time: - maximum_overlap_period: False - start_time: 1980-01-01 - end_time: 2003-12-31 - temporal_resolution: monthly - month_start: 6 - month_end: 8 - average_each_year: True - -space: - min_lat: 23.75 - max_lat: 49.75 - min_lon: -125.75 - max_lon: -66.75 - -regrid: - regrid_on_reference: False - regrid_dlat: 0.50 - regrid_dlon: 0.50 - -datasets: - reference: - data_source: rcmed - data_name: CRU - dataset_id: 10 - parameter_id: 37 - - targets: - data_source: local - path: ./data/prec.*ncep.monavg.nc - variable: prec - -number_of_metrics_and_plots: 1 - -metrics1: Taylor_diagram_spatial_pattern_of_multiyear_climatology - -plots1: - file_name: narccap_prec_JJA_mean_taylor_diagram_to_cru - -use_subregions: False http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/narccap_prec_JJA_taylor_diagram_to_cru.yaml ---------------------------------------------------------------------- diff --git a/examples/narccap_prec_JJA_taylor_diagram_to_cru.yaml b/examples/narccap_prec_JJA_taylor_diagram_to_cru.yaml deleted file mode 100644 index c6b96cf..0000000 --- a/examples/narccap_prec_JJA_taylor_diagram_to_cru.yaml +++ /dev/null @@ -1,44 +0,0 @@ -workdir: ./ -output_netcdf_filename: narccap_prec_JJA_1980-2003.nc - -# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) -time: - maximum_overlap_period: False - start_time: 1980-01-01 - end_time: 2003-12-31 - temporal_resolution: monthly - month_start: 6 - month_end: 8 - average_each_year: True - -space: - min_lat: 23.75 - max_lat: 49.75 - min_lon: -125.75 - max_lon: -66.75 - -regrid: - regrid_on_reference: False - regrid_dlat: 0.50 - regrid_dlon: 0.50 - -datasets: - reference: - data_source: rcmed - data_name: CRU - dataset_id: 10 - parameter_id: 37 - - targets: - data_source: local - path: ./data/prec.*ncep.monavg.nc - variable: prec - -number_of_metrics_and_plots: 1 - -metrics1: Taylor_diagram_spatial_pattern_of_multiyear_climatology - -plots1: - file_name: narccap_prec_JJA_mean_taylor_diagram_to_cru - -use_subregions: False http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/narccap_tas_DJF_subregion_interannual_variability_portrait_diagram.yaml ---------------------------------------------------------------------- diff --git a/examples/narccap_tas_DJF_subregion_interannual_variability_portrait_diagram.yaml b/examples/narccap_tas_DJF_subregion_interannual_variability_portrait_diagram.yaml deleted file mode 100644 index de2d98e..0000000 --- a/examples/narccap_tas_DJF_subregion_interannual_variability_portrait_diagram.yaml +++ /dev/null @@ -1,75 +0,0 @@ -workdir: ./ -output_netcdf_filename: narccap_tas_DJF_mean_mean_1980-2003.nc - -# (RCMES will temporally subset data between month_start and month_end. If average_each_year is True (False), seasonal mean in each year is (not) calculated and used for metrics calculation.) -time: - maximum_overlap_period: False - start_time: 1980-01-01 - end_time: 2003-12-31 - temporal_resolution: monthly - month_start: 12 - month_end: 2 - average_each_year: True - -space: - min_lat: 23.75 - max_lat: 49.75 - min_lon: -125.75 - max_lon: -66.75 - -regrid: - regrid_on_reference: False - regrid_dlat: 0.50 - regrid_dlon: 0.50 - -datasets: - reference: - data_source: rcmed - data_name: CRU - dataset_id: 10 - parameter_id: 38 - - targets: - data_source: local - path: ./data/temp*ncep.monavg.nc - variable: temp - -number_of_metrics_and_plots: 1 - -metrics1: Portrait_diagram_subregion_interannual_variability - -plots1: - file_name: narccap_tas_DJF_subregion_interannual_variability_portrait_diagram - -use_subregions: True - -subregions: -#subregion name (R01, R02, R03,....) followed by an array of boundaries [south, north, west, east] - R01: - [42.75, 49.75, -123.75, -120.25] - R02: - [42.75, 49.75, -119.75, -112.75] - R03: - [37.25, 42.25, -123.75, -117.75] - R04: - [32.25, 37.25, -122.75, -114.75] - R05: - [31.25, 37.25, -113.75, -108.25] - R06: - [31.25, 37.25, -108.25, -99.75] - R07: - [37.25, 43.25, -110.25, -103.75] - R08: - [45.25, 49.25, -99.75, -90.25] - R09: - [34.75, 45.25, -99.75, -90.25] - R10: - [29.75, 34.75, -95.75, -84.75] - R11: - [38.25, 44.75, -89.75, -80.25] - R12: - [38.25, 44.75, -79.75, -70.25] - R13: - [30.75, 38.25, -83.75, -75.25] - R14: - [24.25, 30.75, -83.75, -80.25] http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/old_examples/knmi_to_cru31_full_bias.py ---------------------------------------------------------------------- diff --git a/examples/old_examples/knmi_to_cru31_full_bias.py b/examples/old_examples/knmi_to_cru31_full_bias.py deleted file mode 100644 index a241442..0000000 --- a/examples/old_examples/knmi_to_cru31_full_bias.py +++ /dev/null @@ -1,174 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -import datetime -import urllib -from os import path - -import numpy as np - -import ocw.data_source.local as local -import ocw.data_source.rcmed as rcmed -from ocw.dataset import Bounds as Bounds -import ocw.dataset_processor as dsp -import ocw.evaluation as evaluation -import ocw.metrics as metrics -import ocw.plotter as plotter -# File URL leader -FILE_LEADER = "http://zipper.jpl.nasa.gov/dist/" -# This way we can easily adjust the time span of the retrievals -YEARS = 3 -# Two Local Model Files -MODEL = "AFRICA_KNMI-RACMO2.2b_CTL_ERAINT_MM_50km_1989-2008_tasmax.nc" -# Filename for the output image/plot (without file extension) -OUTPUT_PLOT = "cru_31_tmax_knmi_africa_bias_full" - -# Download necessary NetCDF file if not present -if path.exists(MODEL): - pass -else: - urllib.urlretrieve(FILE_LEADER + MODEL, MODEL) - -""" Step 1: Load Local NetCDF File into OCW Dataset Objects """ -print("Loading %s into an OCW Dataset Object" % (MODEL,)) -knmi_dataset = local.load_file(MODEL, "tasmax") -print("KNMI_Dataset.values shape: (times, lats, lons) - %s \n" % (knmi_dataset.values.shape,)) - -""" Step 2: Fetch an OCW Dataset Object from the data_source.rcmed module """ -print("Working with the rcmed interface to get CRU3.1 Daily-Max Temp") -metadata = rcmed.get_parameters_metadata() - -cru_31 = [m for m in metadata if m['parameter_id'] == "39"][0] - -""" The RCMED API uses the following function to query, subset and return the -raw data from the database: - -rcmed.parameter_dataset(dataset_id, parameter_id, min_lat, max_lat, min_lon, - max_lon, start_time, end_time) - -The first two required params are in the cru_31 variable we defined earlier -""" -# Must cast to int since the rcmed api requires ints -dataset_id = int(cru_31['dataset_id']) -parameter_id = int(cru_31['parameter_id']) - -print("We are going to use the Model to constrain the Spatial Domain") -# The spatial_boundaries() function returns the spatial extent of the dataset -print("The KNMI_Dataset spatial bounds (min_lat, max_lat, min_lon, max_lon) are: \n" - "%s\n" % (knmi_dataset.spatial_boundaries(), )) -print("The KNMI_Dataset spatial resolution (lat_resolution, lon_resolution) is: \n" - "%s\n\n" % (knmi_dataset.spatial_resolution(), )) -min_lat, max_lat, min_lon, max_lon = knmi_dataset.spatial_boundaries() - -print("Calculating the Maximum Overlap in Time for the datasets") - -cru_start = datetime.datetime.strptime(cru_31['start_date'], "%Y-%m-%d") -cru_end = datetime.datetime.strptime(cru_31['end_date'], "%Y-%m-%d") -knmi_start, knmi_end = knmi_dataset.time_range() -# Grab the Max Start Time -start_time = max([cru_start, knmi_start]) -# Grab the Min End Time -end_time = min([cru_end, knmi_end]) -print("Overlap computed to be: %s to %s" % (start_time.strftime("%Y-%m-%d"), - end_time.strftime("%Y-%m-%d"))) -print("We are going to grab the first %s year(s) of data" % YEARS) -end_time = datetime.datetime(start_time.year + YEARS, start_time.month, start_time.day) -print("Final Overlap is: %s to %s" % (start_time.strftime("%Y-%m-%d"), - end_time.strftime("%Y-%m-%d"))) - -print("Fetching data from RCMED...") -cru31_dataset = rcmed.parameter_dataset(dataset_id, - parameter_id, - min_lat, - max_lat, - min_lon, - max_lon, - start_time, - end_time) - -""" Step 3: Resample Datasets so they are the same shape """ -print("CRU31_Dataset.values shape: (times, lats, lons) - %s" % (cru31_dataset.values.shape,)) -print("KNMI_Dataset.values shape: (times, lats, lons) - %s" % (knmi_dataset.values.shape,)) -print("Our two datasets have a mis-match in time. We will subset on time to %s years\n" % YEARS) - -# Create a Bounds object to use for subsetting -new_bounds = Bounds(min_lat, max_lat, min_lon, max_lon, start_time, end_time) -knmi_dataset = dsp.subset(new_bounds, knmi_dataset) - -print("CRU31_Dataset.values shape: (times, lats, lons) - %s" % (cru31_dataset.values.shape,)) -print("KNMI_Dataset.values shape: (times, lats, lons) - %s \n" % (knmi_dataset.values.shape,)) - -print("Temporally Rebinning the Datasets to a Single Timestep") -# To run FULL temporal Rebinning use a timedelta > 366 days. I used 999 in this example -knmi_dataset = dsp.temporal_rebin(knmi_dataset, datetime.timedelta(days=999)) -cru31_dataset = dsp.temporal_rebin(cru31_dataset, datetime.timedelta(days=999)) - -print("KNMI_Dataset.values shape: %s" % (knmi_dataset.values.shape,)) -print("CRU31_Dataset.values shape: %s \n\n" % (cru31_dataset.values.shape,)) - -""" Spatially Regrid the Dataset Objects to a 1/2 degree grid """ -# Using the bounds we will create a new set of lats and lons on 0.5 degree step -new_lons = np.arange(min_lon, max_lon, 0.5) -new_lats = np.arange(min_lat, max_lat, 0.5) - -# Spatially regrid datasets using the new_lats, new_lons numpy arrays -print("Spatially Regridding the KNMI_Dataset...") -knmi_dataset = dsp.spatial_regrid(knmi_dataset, new_lats, new_lons) -print("Spatially Regridding the CRU31_Dataset...") -cru31_dataset = dsp.spatial_regrid(cru31_dataset, new_lats, new_lons) -print("Final shape of the KNMI_Dataset:%s" % (knmi_dataset.values.shape, )) -print("Final shape of the CRU31_Dataset:%s" % (cru31_dataset.values.shape, )) - -""" Step 4: Build a Metric to use for Evaluation - Bias for this example """ -# You can build your own metrics, but OCW also ships with some common metrics -print("Setting up a Bias metric to use for evaluation") -bias = metrics.Bias() - -""" Step 5: Create an Evaluation Object using Datasets and our Metric """ -# The Evaluation Class Signature is: -# Evaluation(reference, targets, metrics, subregions=None) -# Evaluation can take in multiple targets and metrics, so we need to convert -# our examples into Python lists. Evaluation will iterate over the lists -print("Making the Evaluation definition") -bias_evaluation = evaluation.Evaluation(knmi_dataset, [cru31_dataset], [bias]) -print("Executing the Evaluation using the object's run() method") -bias_evaluation.run() - -""" Step 6: Make a Plot from the Evaluation.results """ -# The Evaluation.results are a set of nested lists to support many different -# possible Evaluation scenarios. -# -# The Evaluation results docs say: -# The shape of results is (num_metrics, num_target_datasets) if no subregion -# Accessing the actual results when we have used 1 metric and 1 dataset is -# done this way: -print("Accessing the Results of the Evaluation run") -results = bias_evaluation.results[0][0] - -# From the bias output I want to make a Contour Map of the region -print("Generating a contour map using ocw.plotter.draw_contour_map()") - -lats = new_lats -lons = new_lons -fname = OUTPUT_PLOT -gridshape = (1, 1) # Using a 1 x 1 since we have a single Bias for the full time range -plot_title = "TASMAX Bias of KNMI Compared to CRU 3.1 (%s - %s)" % (start_time.strftime("%Y/%d/%m"), end_time.strftime("%Y/%d/%m")) -sub_titles = ["Full Temporal Range"] - -plotter.draw_contour_map(results, lats, lons, fname, - gridshape=gridshape, ptitle=plot_title, - subtitles=sub_titles) http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/old_examples/model_ensemble_to_rcmed.py ---------------------------------------------------------------------- diff --git a/examples/old_examples/model_ensemble_to_rcmed.py b/examples/old_examples/model_ensemble_to_rcmed.py deleted file mode 100644 index 1f653a1..0000000 --- a/examples/old_examples/model_ensemble_to_rcmed.py +++ /dev/null @@ -1,186 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -import datetime -import math -import urllib -from os import path - -import numpy as np - -import ocw.data_source.local as local -import ocw.data_source.rcmed as rcmed -from ocw.dataset import Bounds as Bounds -import ocw.dataset_processor as dsp -import ocw.evaluation as evaluation -import ocw.metrics as metrics -import ocw.plotter as plotter - -# File URL leader -FILE_LEADER = "http://zipper.jpl.nasa.gov/dist/" -# This way we can easily adjust the time span of the retrievals -YEARS = 1 -# Two Local Model Files -FILE_1 = "AFRICA_KNMI-RACMO2.2b_CTL_ERAINT_MM_50km_1989-2008_tasmax.nc" -FILE_2 = "AFRICA_UC-WRF311_CTL_ERAINT_MM_50km-rg_1989-2008_tasmax.nc" -# Filename for the output image/plot (without file extension) -OUTPUT_PLOT = "tasmax_africa_bias_annual" - -# Download necessary NetCDF file if not present -if path.exists(FILE_1): - pass -else: - urllib.urlretrieve(FILE_LEADER + FILE_1, FILE_1) - -if path.exists(FILE_2): - pass -else: - urllib.urlretrieve(FILE_LEADER + FILE_2, FILE_2) - - -""" Step 1: Load Local NetCDF File into OCW Dataset Objects """ -# Load local knmi model data -knmi_dataset = local.load_file(FILE_1, "tasmax") -knmi_dataset.name = "AFRICA_KNMI-RACMO2.2b_CTL_ERAINT_MM_50km_1989-2008_tasmax" - -wrf311_dataset = local.load_file(FILE_2, "tasmax") -wrf311_dataset.name = "AFRICA_UC-WRF311_CTL_ERAINT_MM_50km-rg_1989-2008_tasmax" - - - -""" Step 2: Fetch an OCW Dataset Object from the data_source.rcmed module """ -print("Working with the rcmed interface to get CRU3.1 Daily-Max Temp") -metadata = rcmed.get_parameters_metadata() - -cru_31 = [m for m in metadata if m['parameter_id'] == "39"][0] - -""" The RCMED API uses the following function to query, subset and return the -raw data from the database: - -rcmed.parameter_dataset(dataset_id, parameter_id, min_lat, max_lat, min_lon, - max_lon, start_time, end_time) - -The first two required params are in the cru_31 variable we defined earlier -""" -# Must cast to int since the rcmed api requires ints -dataset_id = int(cru_31['dataset_id']) -parameter_id = int(cru_31['parameter_id']) - -# The spatial_boundaries() function returns the spatial extent of the dataset -min_lat, max_lat, min_lon, max_lon = wrf311_dataset.spatial_boundaries() - -# There is a boundry alignment issue with the datasets. To mitigate this -# we will use the math.floor() and math.ceil() functions to shrink the -# boundries slighty. -min_lat = math.ceil(min_lat) -max_lat = math.floor(max_lat) -min_lon = math.ceil(min_lon) -max_lon = math.floor(max_lon) - -print("Calculating the Maximum Overlap in Time for the datasets") - -cru_start = datetime.datetime.strptime(cru_31['start_date'], "%Y-%m-%d") -cru_end = datetime.datetime.strptime(cru_31['end_date'], "%Y-%m-%d") -knmi_start, knmi_end = knmi_dataset.time_range() -# Set the Time Range to be the year 1989 -start_time = datetime.datetime(1989,1,1) -end_time = datetime.datetime(1989,12,1) - -print("Time Range is: %s to %s" % (start_time.strftime("%Y-%m-%d"), - end_time.strftime("%Y-%m-%d"))) - -print("Fetching data from RCMED...") -cru31_dataset = rcmed.parameter_dataset(dataset_id, - parameter_id, - min_lat, - max_lat, - min_lon, - max_lon, - start_time, - end_time) - -""" Step 3: Resample Datasets so they are the same shape """ - -print("Temporally Rebinning the Datasets to an Annual Timestep") -# To run annual temporal Rebinning use a timedelta of 360 days. -knmi_dataset = dsp.temporal_rebin(knmi_dataset, datetime.timedelta(days=360)) -wrf311_dataset = dsp.temporal_rebin(wrf311_dataset, datetime.timedelta(days=360)) -cru31_dataset = dsp.temporal_rebin(cru31_dataset, datetime.timedelta(days=360)) - -# Running Temporal Rebin early helps negate the issue of datasets being on different -# days of the month (1st vs. 15th) -# Create a Bounds object to use for subsetting -new_bounds = Bounds(min_lat, max_lat, min_lon, max_lon, start_time, end_time) - -# Subset our model datasets so they are the same size -knmi_dataset = dsp.subset(new_bounds, knmi_dataset) -wrf311_dataset = dsp.subset(new_bounds, wrf311_dataset) - -""" Spatially Regrid the Dataset Objects to a 1/2 degree grid """ -# Using the bounds we will create a new set of lats and lons on 1/2 degree step -new_lons = np.arange(min_lon, max_lon, 0.5) -new_lats = np.arange(min_lat, max_lat, 0.5) - -# Spatially regrid datasets using the new_lats, new_lons numpy arrays -knmi_dataset = dsp.spatial_regrid(knmi_dataset, new_lats, new_lons) -wrf311_dataset = dsp.spatial_regrid(wrf311_dataset, new_lats, new_lons) -cru31_dataset = dsp.spatial_regrid(cru31_dataset, new_lats, new_lons) - -# Generate an ensemble dataset from knmi and wrf models -ensemble_dataset = dsp.ensemble([knmi_dataset, wrf311_dataset]) - -""" Step 4: Build a Metric to use for Evaluation - Bias for this example """ -print("Setting up a Bias metric to use for evaluation") -bias = metrics.Bias() - -""" Step 5: Create an Evaluation Object using Datasets and our Metric """ -# The Evaluation Class Signature is: -# Evaluation(reference, targets, metrics, subregions=None) -# Evaluation can take in multiple targets and metrics, so we need to convert -# our examples into Python lists. Evaluation will iterate over the lists -print("Making the Evaluation definition") -bias_evaluation = evaluation.Evaluation(cru31_dataset, - [knmi_dataset, wrf311_dataset, ensemble_dataset], - [bias]) -print("Executing the Evaluation using the object's run() method") -bias_evaluation.run() - -""" Step 6: Make a Plot from the Evaluation.results """ -# The Evaluation.results are a set of nested lists to support many different -# possible Evaluation scenarios. -# -# The Evaluation results docs say: -# The shape of results is (num_target_datasets, num_metrics) if no subregion -# Accessing the actual results when we have used 3 datasets and 1 metric is -# done this way: -print("Accessing the Results of the Evaluation run") -results = bias_evaluation.results - -# From the bias output I want to make a Contour Map of the region -print("Generating a contour map using ocw.plotter.draw_contour_map()") - -lats = new_lats -lons = new_lons -fname = OUTPUT_PLOT -gridshape = (3, 1) # Using a 3 x 1 since we have a 1 year of data for 3 models -plotnames = ["KNMI", "WRF311", "ENSEMBLE"] -for i, result in enumerate(results): - plot_title = "TASMAX Bias of CRU 3.1 vs. %s (%s - %s)" % (plotnames[i], start_time.strftime("%Y/%d/%m"), end_time.strftime("%Y/%d/%m")) - output_file = "%s_%s" % (fname, plotnames[i].lower()) - print "creating %s" % (output_file,) - plotter.draw_contour_map(result[0], lats, lons, output_file, - gridshape=gridshape, ptitle=plot_title) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/old_examples/multi_model_evaluation.py ---------------------------------------------------------------------- diff --git a/examples/old_examples/multi_model_evaluation.py b/examples/old_examples/multi_model_evaluation.py deleted file mode 100644 index 8136001..0000000 --- a/examples/old_examples/multi_model_evaluation.py +++ /dev/null @@ -1,151 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -import datetime -import numpy as np -from os import path - - -#import Apache OCW dependences -import ocw.data_source.local as local -import ocw.data_source.rcmed as rcmed -from ocw.dataset import Bounds as Bounds -import ocw.dataset_processor as dsp -import ocw.evaluation as evaluation -import ocw.metrics as metrics -import ocw.plotter as plotter -import ocw.utils as utils -import ssl -if hasattr(ssl, '_create_unverified_context'): - ssl._create_default_https_context = ssl._create_unverified_context - -# File URL leader -FILE_LEADER = "http://zipper.jpl.nasa.gov/dist/" -# Three Local Model Files -FILE_1 = "AFRICA_KNMI-RACMO2.2b_CTL_ERAINT_MM_50km_1989-2008_pr.nc" -FILE_2 = "AFRICA_UC-WRF311_CTL_ERAINT_MM_50km-rg_1989-2008_pr.nc" -FILE_3 = "AFRICA_UCT-PRECIS_CTL_ERAINT_MM_50km_1989-2008_pr.nc" -# Filename for the output image/plot (without file extension) -OUTPUT_PLOT = "pr_africa_bias_annual" -#variable that we are analyzing -varName = 'pr' -# Spatial and temporal configurations -LAT_MIN = -45.0 -LAT_MAX = 42.24 -LON_MIN = -24.0 -LON_MAX = 60.0 -START = datetime.datetime(2000, 1, 1) -END = datetime.datetime(2007, 12, 31) -EVAL_BOUNDS = Bounds(LAT_MIN, LAT_MAX, LON_MIN, LON_MAX, START, END) - -#regridding parameters -gridLonStep=0.5 -gridLatStep=0.5 - -#list for all target_datasets -target_datasets =[] -#list for names for all the datasets -allNames =[] - - -# Download necessary NetCDF file if not present -if path.exists(FILE_1): - pass -else: - urllib.urlretrieve(FILE_LEADER + FILE_1, FILE_1) - -if path.exists(FILE_2): - pass -else: - urllib.urlretrieve(FILE_LEADER + FILE_2, FILE_2) - -if path.exists(FILE_3): - pass -else: - urllib.urlretrieve(FILE_LEADER + FILE_3, FILE_3) - -""" Step 1: Load Local NetCDF File into OCW Dataset Objects and store in list""" -target_datasets.append(local.load_file(FILE_1, varName, name="KNMI")) -target_datasets.append(local.load_file(FILE_2, varName, name="UC")) -target_datasets.append(local.load_file(FILE_3, varName, name="UCT")) - - -""" Step 2: Fetch an OCW Dataset Object from the data_source.rcmed module """ -print("Working with the rcmed interface to get CRU3.1 Daily Precipitation") -# the dataset_id and the parameter id were determined from -# https://rcmes.jpl.nasa.gov/content/data-rcmes-database -CRU31 = rcmed.parameter_dataset(10, 37, LAT_MIN, LAT_MAX, LON_MIN, LON_MAX, START, END) - -""" Step 3: Resample Datasets so they are the same shape """ -print("Resampling datasets") -CRU31 = dsp.water_flux_unit_conversion(CRU31) -CRU31 = dsp.temporal_rebin(CRU31, datetime.timedelta(days=30)) - -for member, each_target_dataset in enumerate(target_datasets): - target_datasets[member] = dsp.subset(EVAL_BOUNDS, target_datasets[member]) - target_datasets[member] = dsp.water_flux_unit_conversion(target_datasets[member]) - target_datasets[member] = dsp.temporal_rebin(target_datasets[member], datetime.timedelta(days=30)) - - -""" Spatially Regrid the Dataset Objects to a user defined grid """ -# Using the bounds we will create a new set of lats and lons -print("Regridding datasets") -new_lats = np.arange(LAT_MIN, LAT_MAX, gridLatStep) -new_lons = np.arange(LON_MIN, LON_MAX, gridLonStep) -CRU31 = dsp.spatial_regrid(CRU31, new_lats, new_lons) - -for member, each_target_dataset in enumerate(target_datasets): - target_datasets[member] = dsp.spatial_regrid(target_datasets[member], new_lats, new_lons) - -#make the model ensemble -target_datasets_ensemble = dsp.ensemble(target_datasets) -target_datasets_ensemble.name="ENS" - -#append to the target_datasets for final analysis -target_datasets.append(target_datasets_ensemble) - -#find the mean value -#way to get the mean. Note the function exists in util.py -_, CRU31.values = utils.calc_climatology_year(CRU31) -CRU31.values = np.expand_dims(CRU31.values, axis=0) - -for member, each_target_dataset in enumerate(target_datasets): - _,target_datasets[member].values = utils.calc_climatology_year(target_datasets[member]) - target_datasets[member].values = np.expand_dims(target_datasets[member].values, axis=0) - - -for target in target_datasets: - allNames.append(target.name) - -#determine the metrics -mean_bias = metrics.Bias() - -#create the Evaluation object -RCMs_to_CRU_evaluation = evaluation.Evaluation(CRU31, # Reference dataset for the evaluation - # list of target datasets for the evaluation - target_datasets, - # 1 or more metrics to use in the evaluation - [mean_bias]) -RCMs_to_CRU_evaluation.run() - -#extract the relevant data from RCMs_to_CRU_evaluation.results -#the results returns a list (num_target_datasets, num_metrics). See docs for further details -rcm_bias = RCMs_to_CRU_evaluation.results[:][0] -#remove the metric dimension -new_rcm_bias = np.squeeze(np.array(RCMs_to_CRU_evaluation.results)) - -plotter.draw_contour_map(new_rcm_bias, new_lats, new_lons, gridshape=(2, 5),fname=OUTPUT_PLOT, subtitles=allNames, cmap='coolwarm_r') http://git-wip-us.apache.org/repos/asf/climate/blob/fd310f40/examples/old_examples/multi_model_taylor_diagram.py ---------------------------------------------------------------------- diff --git a/examples/old_examples/multi_model_taylor_diagram.py b/examples/old_examples/multi_model_taylor_diagram.py deleted file mode 100644 index f91ab3e..0000000 --- a/examples/old_examples/multi_model_taylor_diagram.py +++ /dev/null @@ -1,144 +0,0 @@ -#Apache OCW lib immports -from ocw.dataset import Dataset, Bounds -import ocw.data_source.local as local -import ocw.data_source.rcmed as rcmed -import ocw.dataset_processor as dsp -import ocw.evaluation as evaluation -import ocw.metrics as metrics -import ocw.plotter as plotter -import ocw.utils as utils - -import datetime -import numpy as np - -from os import path - -# File URL leader -FILE_LEADER = "http://zipper.jpl.nasa.gov/dist/" -# Three Local Model Files -FILE_1 = "AFRICA_KNMI-RACMO2.2b_CTL_ERAINT_MM_50km_1989-2008_pr.nc" -FILE_2 = "AFRICA_ICTP-REGCM3_CTL_ERAINT_MM_50km-rg_1989-2008_pr.nc" -FILE_3 = "AFRICA_UCT-PRECIS_CTL_ERAINT_MM_50km_1989-2008_pr.nc" -# Filename for the output image/plot (without file extension) -OUTPUT_PLOT = "pr_africa_taylor" - -# Spatial and temporal configurations -LAT_MIN = -45.0 -LAT_MAX = 42.24 -LON_MIN = -24.0 -LON_MAX = 60.0 -START = datetime.datetime(2000, 01, 1) -END = datetime.datetime(2007, 12, 31) -EVAL_BOUNDS = Bounds(LAT_MIN, LAT_MAX, LON_MIN, LON_MAX, START, END) - -#variable that we are analyzing -varName = 'pr' - -#regridding parameters -gridLonStep=0.5 -gridLatStep=0.5 - -#some vars for this evaluation -target_datasets_ensemble=[] -target_datasets =[] -ref_datasets =[] - -# Download necessary NetCDF file if not present -if path.exists(FILE_1): - pass -else: - urllib.urlretrieve(FILE_LEADER + FILE_1, FILE_1) - -if path.exists(FILE_2): - pass -else: - urllib.urlretrieve(FILE_LEADER + FILE_2, FILE_2) - -if path.exists(FILE_3): - pass -else: - urllib.urlretrieve(FILE_LEADER + FILE_3, FILE_3) - -""" Step 1: Load Local NetCDF File into OCW Dataset Objects and store in list""" -target_datasets.append(local.load_file(FILE_1, varName, name="KNMI")) -target_datasets.append(local.load_file(FILE_2, varName, name="REGM3")) -target_datasets.append(local.load_file(FILE_3, varName, name="UCT")) - - -""" Step 2: Fetch an OCW Dataset Object from the data_source.rcmed module """ -print("Working with the rcmed interface to get CRU3.1 Daily Precipitation") -# the dataset_id and the parameter id were determined from -# https://rcmes.jpl.nasa.gov/content/data-rcmes-database -CRU31 = rcmed.parameter_dataset(10, 37, LAT_MIN, LAT_MAX, LON_MIN, LON_MAX, START, END) - -""" Step 3: Resample Datasets so they are the same shape """ -print("Resampling datasets ...") -print("... on units") -CRU31 = dsp.water_flux_unit_conversion(CRU31) -print("... temporal") -CRU31 = dsp.temporal_rebin(CRU31, datetime.timedelta(days=30)) - -for member, each_target_dataset in enumerate(target_datasets): - target_datasets[member] = dsp.water_flux_unit_conversion(target_datasets[member]) - target_datasets[member] = dsp.temporal_rebin(target_datasets[member], datetime.timedelta(days=30)) - target_datasets[member] = dsp.subset(EVAL_BOUNDS, target_datasets[member]) - -#Regrid -print("... regrid") -new_lats = np.arange(LAT_MIN, LAT_MAX, gridLatStep) -new_lons = np.arange(LON_MIN, LON_MAX, gridLonStep) -CRU31 = dsp.spatial_regrid(CRU31, new_lats, new_lons) - -for member, each_target_dataset in enumerate(target_datasets): - target_datasets[member] = dsp.spatial_regrid(target_datasets[member], new_lats, new_lons) - -#find the mean values -#way to get the mean. Note the function exists in util.py as def calc_climatology_year(dataset): -CRU31.values,_ = utils.calc_climatology_year(CRU31) -CRU31.values = np.expand_dims(CRU31.values, axis=0) - -#make the model ensemble -target_datasets_ensemble = dsp.ensemble(target_datasets) -target_datasets_ensemble.name="ENS" - -#append to the target_datasets for final analysis -target_datasets.append(target_datasets_ensemble) - -for member, each_target_dataset in enumerate(target_datasets): - target_datasets[member].values,_ = utils.calc_climatology_year(target_datasets[member]) - target_datasets[member].values = np.expand_dims(target_datasets[member].values, axis=0) - -allNames =[] - -for target in target_datasets: - allNames.append(target.name) - -#calculate the metrics -pattern_correlation = metrics.PatternCorrelation() -spatial_std_dev = metrics.StdDevRatio() - - -#create the Evaluation object -RCMs_to_CRU_evaluation = evaluation.Evaluation(CRU31, # Reference dataset for the evaluation - # 1 or more target datasets for the evaluation - target_datasets, - # 1 or more metrics to use in the evaluation - [spatial_std_dev, pattern_correlation])#, mean_bias,spatial_std_dev_ratio, pattern_correlation]) -RCMs_to_CRU_evaluation.run() - -rcm_std_dev = [results[0] for results in RCMs_to_CRU_evaluation.results] -rcm_pat_cor = [results[1] for results in RCMs_to_CRU_evaluation.results] - -taylor_data = np.array([rcm_std_dev, rcm_pat_cor]).transpose() - -new_taylor_data = np.squeeze(np.array(taylor_data)) - -plotter.draw_taylor_diagram(new_taylor_data, - allNames, - "CRU31", - fname=OUTPUT_PLOT, - fmt='png', - frameon=False) - - -
