ISH and UFS-CHEM

Our first example will demonstrate the basics available in MELODIES MONET to compare UFS-CHEM results against ISH surface observations for temperature, wind speed, and dewpoint.

ISH is a particularly useful for model evaluations because it is a global dataset. As you will see in the YAML file, we can create plots globally, for individual countries, and states. NOTE: MELODIES-MONET examples that use ISH will take longer to finish running due to the larger amount of data.

First, we import the melodies_monet.driver module.

from melodies_monet import driver

Analysis driver class

Now, lets create an instance of the analysis driver class, melodies_monet.driver.analysis. It consists of these main parts:

  • model instances

  • observation instances

  • a paired instance of both

an = driver.analysis()

Initially, most of our analysis object’s attributes are set to None, though some have meaningful defaults:

an
analysis(
    control='control.yaml',
    control_dict=None,
    models={},
    obs={},
    paired={},
    start_time=None,
    end_time=None,
    time_intervals=None,
    download_maps=True,
    output_dir=None,
    output_dir_save=None,
    output_dir_read=None,
    debug=False,
    save=None,
    read=None,
    regrid=False,
)

Control file

We set the YAML control file and begin by reading the file.

Note

Check out the Description of All YAML Options for info on how to create and modify these files.

an.control = "control_ish_ufschem-example.yaml"
an.read_control()
an.control_dict

Hide code cell output

{'analysis': {'start_time': '2017-07-01-00:00:00',
  'end_time': '2017-07-03-00:00:00',
  'output_dir': './output/ish_ufschem',
  'debug': True},
 'model': {'ufschem_v1': {'files': 'example:ufschem:2017-07',
   'files_surf': 'example:ufschem:2017-07_sfc',
   'mod_type': 'ufs',
   'is_global': True,
   'mod_kwargs': {'surf_only': True,
    'sfc_varlist': ['tmp2m', 'spfh2m', 'ugrd10m', 'vgrd10m']},
   'radius_of_influence': 100000,
   'extra_calc': {'dewpoint': {'pres_calc': 'surfpres_pa',
     'specific_hum': 'spfh2m'},
    'rel_hum': {'pres_calc': 'surfpres_pa',
     'specific_hum': 'spfh2m',
     'temp_calc': 'tmp2m'},
    'windspeed': {'u_comp': 'ugrd10m', 'v_comp': 'vgrd10m'},
    'winddir': {'u_comp': 'ugrd10m', 'v_comp': 'vgrd10m'},
    'wind_barb': {'u_comp': 'ugrd10m', 'v_comp': 'vgrd10m'},
    'rose_plot': {'model_wdir': 'winddir', 'model_wspd': 'windspeed'}},
   'mapping': {'ish': {'tmp2m': 't', 'windspeed': 'ws', 'dewpoint': 'dpt'}},
   'projection': None,
   'plot_kwargs': {'color': 'magenta', 'marker': 's', 'linestyle': '-'}}},
 'obs': {'ish': {'filename': 'example:ish:2017-07',
   'obs_type': 'pt_sfc',
   'variables': {'t': {'unit_scale': 273.15,
     'unit_scale_method': '+',
     'nan_value': -1.0,
     'ylabel_plot': 'Temperature 2m (K)',
     'xlabel_plot': 'Temperature 2m (K)',
     'vmin_plot': 273.15,
     'vmax_plot': 313,
     'vdiff_plot': 20.0,
     'nlevels_plot': 21},
    'ws': {'unit_scale': 1,
     'unit_scale_method': '*',
     'nan_value': -1.0,
     'ylabel_plot': 'Windspeed 10m (m/s)',
     'xlabel_plot': 'Windspeed 10m (m/s)',
     'vmin_plot': 0,
     'vmax_plot': 12,
     'vdiff_plot': 4,
     'nlevels_plot': 18},
    'wdir': {'unit_scale': 1,
     'unit_scale_method': '*',
     'nan_value': -1.0,
     'ylabel_plot': 'Wind Direction 10m (deg)',
     'xlabel_plot': 'Wind Direction 10m (deg)',
     'vmin_plot': 0,
     'vmax_plot': 370,
     'vdiff_plot': 4,
     'nlevels_plot': 18},
    'dpt': {'unit_scale': 273.15,
     'unit_scale_method': '+',
     'nan_value': -1.0,
     'ylabel_plot': 'Dewpoint 2m (K)',
     'xlabel_plot': 'Dewpoint 2m (K)',
     'vmin_plot': 273.15,
     'vmax_plot': 300,
     'vdiff_plot': 4,
     'nlevels_plot': 18}},
   'extra_calc': {'rose_plot': {'obs_wdir': 'wdir', 'obs_wspd': 'ws'}}}},
 'plots': {'plot_grp1': {'type': 'timeseries',
   'fig_kwargs': {'figsize': [12, 6]},
   'default_plot_kwargs': {'linewidth': 2.0, 'markersize': 10.0},
   'text_kwargs': {'fontsize': 24.0},
   'domain_type': ['country', 'state'],
   'domain_name': ['US', 'MI'],
   'data': ['ish_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'ts_select_time': 'time_local',
    'ts_avg_window': 'h',
    'set_axis': True,
    'filter_string': '24 < latitude < 50 and -130 < longitude < -60'}},
  'plot_grp1a': {'type': 'timeseries',
   'fig_kwargs': {'figsize': [12, 6]},
   'default_plot_kwargs': {'linewidth': 2.0, 'markersize': 10.0},
   'text_kwargs': {'fontsize': 24.0},
   'domain_type': ['country', 'state'],
   'domain_name': ['US', 'MI'],
   'data': ['ish_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'ts_select_time': 'time_local',
    'ts_avg_window': 'h',
    'set_axis': True,
    'filter_string': '24 < latitude < 50 and -130 < longitude < -60 and ws != 0 and wdir != 0'}},
  'plot_grp2': {'type': 'spatial_bias',
   'fig_kwargs': {'states': True, 'figsize': [10, 5]},
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['state'],
   'domain_name': ['MI'],
   'data': ['ish_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True, 'set_axis': True, 'wind_barb': True}},
  'plot_grp3': {'type': 'spatial_overlay',
   'fig_kwargs': {'states': True, 'figsize': [10, 5]},
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['country', 'state'],
   'domain_name': ['US', 'MI'],
   'data': ['ish_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'set_axis': True,
    'wind_barb': True,
    'wind_barb_step': 2,
    'filter_string': '24 < latitude < 50 and -130 < longitude < -60'}},
  'plot_grp3a': {'type': 'spatial_overlay',
   'fig_kwargs': {'states': True, 'figsize': [10, 5]},
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['country', 'state'],
   'domain_name': ['US', 'MI'],
   'data': ['ish_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'set_axis': True,
    'wind_barb': True,
    'wind_barb_step': 2,
    'filter_string': '24 < latitude < 50 and -130 < longitude < -60 and ws != 0 and wdir != 0'}},
  'plot_grp3b': {'type': 'spatial_overlay',
   'fig_kwargs': {'states': True, 'figsize': [10, 5]},
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['all'],
   'domain_name': ['Filter_Box_Midwest'],
   'data': ['ish_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'set_axis': True,
    'wind_barb': True,
    'wind_barb_step': 2,
    'wind_barb_kwargs': {'length': 6, 'linewidth': 0.85, 'color': 'magenta'},
    'filter_string': '37 < latitude < 49 and -104 < longitude < -80'}},
  'plot_grp4': {'type': 'boxplot',
   'fig_kwargs': {'figsize': [8, 6]},
   'text_kwargs': {'fontsize': 20.0},
   'domain_type': ['state'],
   'domain_name': ['MI'],
   'data': ['ish_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True, 'set_axis': False}},
  'plot_grp4a': {'type': 'boxplot',
   'fig_kwargs': {'figsize': [8, 6]},
   'text_kwargs': {'fontsize': 20.0},
   'gridlines': True,
   'domain_type': ['all'],
   'domain_name': ['Filter_Box_Midwest'],
   'data': ['ish_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'set_axis': False,
    'filter_string': '37 < latitude < 49 and -104 < longitude < -80',
    'set_stat_sig': True}},
  'plot_grp5': {'type': 'multi_boxplot',
   'fig_kwargs': {'figsize': [10, 8]},
   'text_kwargs': {'fontsize': 20.0},
   'gridlines': True,
   'xlabel': 'Binned by Observed Temperature (K)',
   'domain_type': ['state'],
   'domain_name': ['MI'],
   'interval_list': [273.15, 281.15, 289.15, 297.15, 305.15],
   'interval_labels': ['[273.15, 281.15)',
    '[281.15, 289.15)',
    '[289.15, 297.15)',
    '[297.15, 305.15)'],
   'interval_var': 't',
   'model_name_list': ['ISH', 'ufschem_v1'],
   'data': ['ish_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True, 'set_axis': False}},
  'plot_grp6': {'type': 'rose_plot',
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['state', 'siteid'],
   'domain_name': ['MI', '72539614815'],
   'data': ['ish_ufschem_v1'],
   'color_map': 'cividis',
   'data_proc': {'rem_obs_nan': True, 'set_axis': True, 'wr_calm_limit': 0.5}},
  'plot_grp7': {'type': 'diurnal',
   'fig_kwargs': {'figsize': [12, 6]},
   'default_plot_kwargs': {'linewidth': 2.0, 'markersize': 10.0},
   'text_kwargs': {'fontsize': 24.0},
   'domain_type': ['state', 'siteid'],
   'domain_name': ['MI', '72539614815'],
   'data': ['ish_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'ts_select_time': 'time_local',
    'ts_avg_window': 'h',
    'set_axis': True}}},
 'stats': {'stat_list': ['MB', 'MdnB', 'R2', 'RMSE', 'MAE', 'MSE'],
  'round_output': 2,
  'output_table': True,
  'output_table_kwargs': {'figsize': [7, 3],
   'fontsize': 12.0,
   'xscale': 1.4,
   'yscale': 1.4,
   'edges': 'horizontal'},
  'domain_type': ['state'],
  'domain_name': ['MI'],
  'data': ['ish_ufschem_v1']}}

Now, some of our analysis object’s attributes are populated:

an
analysis(
    control='control_ish_ufschem-example.yaml',
    control_dict=...,
    models={},
    obs={},
    paired={},
    start_time=Timestamp('2017-07-01 00:00:00'),
    end_time=Timestamp('2017-07-03 00:00:00'),
    time_intervals=None,
    download_maps=True,
    output_dir='./output/ish_ufschem',
    output_dir_save='./output/ish_ufschem',
    output_dir_read='./output/ish_ufschem',
    debug=True,
    save=None,
    read=None,
    regrid=False,
)

Load the model data

The driver will automatically loop through the “models” found in the model section of the YAML file and create an instance of melodies_monet.driver.model for each that includes the

  • label

  • mapping information

  • file names (can be expressed using a glob expression)

  • xarray object

an.open_models()
ufs
example:ufschem:2017-07
**** Reading UFS-AQM or UFS-Chem model output...
Performing extra model calculations...
Calculating modeled Dewpoint...
Calculating modeled relative humidity...
Calculating modeled windspeed...
Calculating modeled wind direction...

Applying open_models() populates the models attribute.

an.models
{'ufschem_v1': model(
     model='ufs',
     is_global=True,
     radius_of_influence=100000,
     mod_kwargs={'surf_only': True, 'sfc_varlist': ['tmp2m', 'spfh2m', 'ugrd10m', 'vgrd10m'], 'fname_sfc': ['/home/rschwantes/.cache/pooch/5207e0e702072b5e37fd507da111f78d-2017_07_01_03_ufschemv1_sfc.nc'], 'var_list': ['lat', 'lon', 'phalf', 'tmp', 'pressfc', 'dpres', 'hgtsfc', 'delz']},
     file_str='example:ufschem:2017-07',
     label='ufschem_v1',
     obj=...,
     extra_calc={'dewpoint': {'pres_calc': 'surfpres_pa', 'specific_hum': 'spfh2m'}, 'rel_hum': {'pres_calc': 'surfpres_pa', 'specific_hum': 'spfh2m', 'temp_calc': 'tmp2m'}, 'windspeed': {'u_comp': 'ugrd10m', 'v_comp': 'vgrd10m'}, 'winddir': {'u_comp': 'ugrd10m', 'v_comp': 'vgrd10m'}, 'wind_barb': {'u_comp': 'ugrd10m', 'v_comp': 'vgrd10m'}, 'rose_plot': {'model_wdir': 'winddir', 'model_wspd': 'windspeed'}},
     mapping={'ish': {'tmp2m': 't', 'windspeed': 'ws', 'dewpoint': 'dpt'}},
     variable_dict={'surfpres_pa': 'None', 'spfh2m': 'None', 'tmp2m': 'None', 'ugrd10m': 'None', 'vgrd10m': 'None', 'winddir': 'None', 'windspeed': 'None'},
     label='ufschem_v1',
     ...
 )}

We can access the underlying dataset with the obj attribute.

an.models['ufschem_v1'].obj
<xarray.Dataset> Size: 320MB
Dimensions:        (y: 192, x: 384, time: 72, z: 1)
Coordinates:
    latitude       (y, x) float64 590kB dask.array<chunksize=(192, 384), meta=np.ndarray>
    longitude      (y, x) float64 590kB dask.array<chunksize=(192, 384), meta=np.ndarray>
  * time           (time) datetime64[ns] 576B 2017-07-01T01:00:00 ... 2017-07-04
  * x              (x) float64 3kB 0.0 0.9375 1.875 2.812 ... 357.2 358.1 359.1
  * y              (y) float64 2kB 89.28 88.36 87.42 ... -87.42 -88.36 -89.28
Dimensions without coordinates: z
Data variables: (12/14)
    temperature_k  (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    surfpres_pa    (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    dp_pa          (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    surfalt_m      (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    dz_m           (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    pres_pa_mid    (time, z, y, x) float64 42MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    ...             ...
    ugrd10m        (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    vgrd10m        (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    dewpoint       (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    rel_hum        (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    windspeed      (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    winddir        (time, z, y, x) float32 21MB 243.3 244.2 ... 352.7 351.9
Attributes:
    grid:         gaussian
    grid_id:      1
    hydrostatic:  non-hydrostatic
    im:           384
    jm:           192
    ncnsto:       139
    source:       FV3GFS
    NCO:          netCDF Operators version 5.0.7 (Homepage = http://nco.sf.ne...
    ak:           [0. 0.]
    bk:           [0.99467119 1.        ]
    history:      Fri Feb 27 09:53:22 2026: ncrcat 20170701_dynf001.nc 201707...

Load the observational data

As with the model data, the driver will loop through the “observations” found in the obs section of the YAML file and create an instance of melodies_monet.driver.observation for each.

an.open_obs()
Performing extra calculations for obs...
an.obs
{'ish': observation(
     obs='ish',
     label='ish',
     file='example:ish:2017-07',
     obj=...,
     extra_calc={'rose_plot': {'obs_wdir': 'wdir', 'obs_wspd': 'ws'}},
     type='pt_src',
     sat_type=None,
     sat_method=None,
     data_proc=None,
     variable_dict={'t': {'unit_scale': 273.15, 'unit_scale_method': '+', 'nan_value': -1.0, 'ylabel_plot': 'Temperature 2m (K)', 'xlabel_plot': 'Temperature 2m (K)', 'vmin_plot': 273.15, 'vmax_plot': 313, 'vdiff_plot': 20.0, 'nlevels_plot': 21}, 'ws': {'unit_scale': 1, 'unit_scale_method': '*', 'nan_value': -1.0, 'ylabel_plot': 'Windspeed 10m (m/s)', 'xlabel_plot': 'Windspeed 10m (m/s)', 'vmin_plot': 0, 'vmax_plot': 12, 'vdiff_plot': 4, 'nlevels_plot': 18}, 'wdir': {'unit_scale': 1, 'unit_scale_method': '*', 'nan_value': -1.0, 'ylabel_plot': 'Wind Direction 10m (deg)', 'xlabel_plot': 'Wind Direction 10m (deg)', 'vmin_plot': 0, 'vmax_plot': 370, 'vdiff_plot': 4, 'nlevels_plot': 18}, 'dpt': {'unit_scale': 273.15, 'unit_scale_method': '+', 'nan_value': -1.0, 'ylabel_plot': 'Dewpoint 2m (K)', 'xlabel_plot': 'Dewpoint 2m (K)', 'vmin_plot': 273.15, 'vmax_plot': 300, 'vdiff_plot': 4, 'nlevels_plot': 18}},
     resample=None,
     time_var=None,
     regrid_method=None,
 )}
an.obs['ish'].obj
<xarray.Dataset> Size: 48MB
Dimensions:       (time: 49, y: 1, x: 12321)
Coordinates:
  * time          (time) datetime64[ns] 392B 2017-07-01 ... 2017-07-03
    siteid        (x) <U11 542kB ...
    latitude      (x) float64 99kB ...
    longitude     (x) float64 99kB ...
  * x             (x) int64 99kB 0 1 2 3 4 5 ... 12316 12317 12318 12319 12320
Dimensions without coordinates: y
Data variables: (12/19)
    varlength     (time, y, x) float64 5MB ...
    wdir          (time, y, x) float64 5MB nan nan 320.0 80.0 ... nan nan nan
    ws            (time, y, x) float64 5MB nan nan 4.0 2.0 ... nan nan nan nan
    ceiling       (time, y, x) float64 5MB ...
    vsb           (time, y, x) float64 5MB ...
    t             (time, y, x) float64 5MB nan nan 271.1 275.1 ... nan nan nan
    ...            ...
    icao          (y, x) <U4 197kB ...
    elevation     (y, x) float64 99kB ...
    utcoffset     (y, x) float64 99kB ...
    begin         (y, x) datetime64[ns] 99kB ...
    end           (y, x) datetime64[ns] 99kB ...
    time_local    (time, y, x) datetime64[ns] 5MB ...

Pair model and observational data

Now, we create a melodies_monet.driver.pair for each model–obs pair using the pair_data() routine.

%%time

an.pair_data()

Hide code cell output

1, in pair data
After pairing:               time  varlength   wdir   ws  ceiling      vsb       t     dpt  \
0      2017-07-01      108.0    NaN  NaN      NaN      NaN     NaN     NaN   
1      2017-07-01        NaN    NaN  NaN      NaN      NaN     NaN     NaN   
2      2017-07-01      108.0  320.0  4.0      NaN      NaN  271.15  271.15   
3      2017-07-01      244.0   80.0  2.0  22000.0  50000.0  275.15     NaN   
4      2017-07-01       89.0  330.0  2.0      NaN      NaN  274.15  270.15   
...           ...        ...    ...  ...      ...      ...     ...     ...   
603724 2017-07-03        NaN    NaN  NaN      NaN      NaN     NaN     NaN   
603725 2017-07-03        NaN    NaN  NaN      NaN      NaN     NaN     NaN   
603726 2017-07-03        NaN    NaN  NaN      NaN      NaN     NaN     NaN   
603727 2017-07-03        NaN    NaN  NaN      NaN      NaN     NaN     NaN   
603728 2017-07-03        NaN    NaN  NaN      NaN      NaN     NaN     NaN   

             p       siteid  ...        end          time_local       tmp2m  \
0          NaN  01001099999  ... 2025-06-25 2017-07-01 01:00:00         NaN   
1          NaN  01001499999  ... 2025-06-25 2017-07-01 01:00:00         NaN   
2       1019.0  01002099999  ... 2025-06-25 2017-07-01 01:00:00         NaN   
3       1018.0  01003099999  ... 2025-05-22 2017-07-01 01:00:00         NaN   
4       1019.0  01006099999  ... 2025-06-25 2017-07-01 01:00:00         NaN   
...        ...          ...  ...        ...                 ...         ...   
603724     NaN  A0735500241  ... 2025-06-26 2017-07-02 18:00:00  298.115448   
603725     NaN  A0735700182  ... 2025-06-26 2017-07-02 18:00:00  296.508728   
603726     NaN  A0735900240  ... 2025-06-26 2017-07-02 19:00:00  297.586121   
603727     NaN  A5125500445  ... 2025-06-27 2017-07-02 18:00:00  305.124634   
603728     NaN  A5125600451  ... 2025-06-26 2017-07-02 18:00:00  305.778809   

       windspeed    dewpoint    surfpres_pa    spfh2m   ugrd10m   vgrd10m  \
0            NaN         NaN            NaN       NaN       NaN       NaN   
1            NaN         NaN            NaN       NaN       NaN       NaN   
2            NaN         NaN            NaN       NaN       NaN       NaN   
3            NaN         NaN            NaN       NaN       NaN       NaN   
4            NaN         NaN            NaN       NaN       NaN       NaN   
...          ...         ...            ...       ...       ...       ...   
603724  3.982688  290.651276   97900.859375  0.012797 -0.319284 -3.969869   
603725  2.021883  284.787537   97245.101562  0.008799 -0.932796 -1.793852   
603726  4.401100  290.402740   98487.718750  0.012520  4.279436  1.027672   
603727  1.187236  298.060455  100835.375000  0.019665  0.411652 -1.113585   
603728  1.674726  294.957031   97393.554688  0.016850 -0.772506  1.485914   

           winddir  
0              NaN  
1              NaN  
2              NaN  
3              NaN  
4              NaN  
...            ...  
603724    4.598221  
603725   27.474243  
603726  256.496582  
603727  339.712494  
603728  152.530701  

[603729 rows x 31 columns]
saving pair
CPU times: user 6.1 s, sys: 1.55 s, total: 7.65 s
Wall time: 5.29 s
an.paired
{'ish_ufschem_v1': pair(
     type='pt_sfc',
     radius_of_influence=1000000.0,
     obs='ish',
     model='ufschem_v1',
     model_vars=['tmp2m', 'windspeed', 'dewpoint'],
     obs_vars=['t', 'ws', 'dpt'],
     filename='ish_ufschem_v1.nc',
 )}
an.paired['ish_ufschem_v1']
pair(
    type='pt_sfc',
    radius_of_influence=1000000.0,
    obs='ish',
    model='ufschem_v1',
    model_vars=['tmp2m', 'windspeed', 'dewpoint'],
    obs_vars=['t', 'ws', 'dpt'],
    filename='ish_ufschem_v1.nc',
)

MELODIES-MONET now contains several meteorological capabilities

In addition to previous capabilites and plots, users can now:

  • Specify wind barbs

    • Note: users may experience longer wait times if they wish to plot wind barbs

  • Create rose plots for pollution and wind speed

    • Rose plots can be aggregated at the Country-, EPA region-, and MSA-scale

  • Create boxplots on given intervals for any of the supported meteorological variables

  • Mark statistical significance on boxplots

Plot

The plotting() routine produces plots.

NOTE: That ISH data for calm wind sets windspeed = 0 and wind direction = 0. In the wind-rose plots, calm winds are plotted as an inner circle for wind direction and data is removed for pollution rose plots based on the threshold set in your yaml file.

All other plots, it’s up to the user on what to consider for these calm winds. Plots below and corresponding yaml file demonstrates how to remove all calm winds from the calculation for the timeseries plots (second set of plots plot_grp1a) and the spatial overlay plots (second set of plots plot_grp3a). You can see that windspeed biases go down when removing these calm winds. Additional processing and consideration for calm winds is under development.

%%time

an.plotting()
p-value annotation legend:
      ns: 5.00e-02 < p <= 1.00e+00
       *: 1.00e-02 < p <= 5.00e-02
      **: 1.00e-03 < p <= 1.00e-02
     ***: 1.00e-04 < p <= 1.00e-03
    ****: p <= 1.00e-04

ish vs. ufschem_v1: Custom statistical test, P_val:5.084e-07
p-value annotation legend:
      ns: 5.00e-02 < p <= 1.00e+00
       *: 1.00e-02 < p <= 5.00e-02
      **: 1.00e-03 < p <= 1.00e-02
     ***: 1.00e-04 < p <= 1.00e-03
    ****: p <= 1.00e-04

ish vs. ufschem_v1: Custom statistical test, P_val:0.000e+00
p-value annotation legend:
      ns: 5.00e-02 < p <= 1.00e+00
       *: 1.00e-02 < p <= 5.00e-02
      **: 1.00e-03 < p <= 1.00e-02
     ***: 1.00e-04 < p <= 1.00e-03
    ****: p <= 1.00e-04

ish vs. ufschem_v1: Custom statistical test, P_val:9.758e-92
Saving rose plot to ./output/ish_ufschem/plot_grp6.rose_plot.t.2017-07-01_00.2017-07-03_00.state.MI...
../_images/b69bdb82b1acf5ca110c0b978d0230b7517f6189e08a35517dda9d6dae17eb4b.png ../_images/cc374e7bb37962c6e8f7ffcbf92d03542d3a8fc5a8446ff67d9be050d16200c2.png ../_images/82beb701e3ab408e5f5bb18e8386ccd999a14d2cf1cc2ada6319e40fda5c6067.png ../_images/74d1941a7e3a7058991f71060fc26dff379be6ad09ee68d80c5a288d6353c2ff.png ../_images/c336d4f1490e51fdd280453c8ab588ecb1a70aa27ac1e79fe15d09439ff01905.png ../_images/f6130a2e9bf7c8d290c7a2a703f6cebeafd061b3eaad6a6fd75d52d241f3d750.png ../_images/36e4c612930e351229da5dcfcbb6f0c25906a0ecf29ae05133142a4f4d749ab9.png ../_images/16b26bf4b2ab292c96872cfe96676747495b5a5a81274f8546e93efacf50cfc4.png ../_images/6a3fa7e06bbdeb345d085383a669fc39ea1262c35d73b7ea6cd37bf28561f796.png ../_images/bf757df085f3f5f9f03fc108c4d384a73f505bf21d968628eea0a4aef354ac26.png ../_images/76471e54fb430ddbf99070c7aa56a1be0332994195deed5173647378cd5feff9.png ../_images/c4b4c326c9a18267589c384b9feb7388af8fe5f88d3e888ad066430c3ffb2c68.png ../_images/72f292abd8a753d297456caefbeb7d21546613027c59c39f44d75b584c1be4e8.png ../_images/75f387b41a4a956839fbd867b68ba6fc10108c2e75fecf1c8e5377c1e60e1e03.png ../_images/370604bcc4601ea7c5f1c7c73b586a06f4c3415d287d685194ac293d9d75a859.png ../_images/d8fd37f0857b8a197c6cf80df9ebd3b7f862978425b9b1bb88355e680e6c0057.png ../_images/8a52b09c0c91df3ec8818326978777e4ae9c339e7b6ee1a18ef5f15bb6114eae.png ../_images/544233d3722502b308eb42248cdbecdc02dbac3d57a4bd37d3ef645ff1f44863.png ../_images/66cf0e0d07d269e58352ef26f1965b5ec1e1da8409aa4112e1fec6a2242ea21c.png ../_images/e81a32055cab2a362c1fd5dda86e767fed47335708b1a1c247f10d5ec1befe93.png ../_images/d7aaea6d968e7347f30a86768cb6c78fd2cebb1eafc3500e7fbe25e6d7b2d25b.png ../_images/eb8418c4044f8bd4beb409adef9fea3aeb574b8babb286b46d003db7c3c3851f.png ../_images/443202eeb535240175ac48c6eaddc472d8e509932eb6055607d81666a20f985f.png ../_images/3f18619c22ede18449df32d63d8b54129160cbe3e1f2e09c9acc02cdf947370a.png ../_images/716e79276493c898fc9589860cb193adcd929476b576a06f24ee06d6c5816bc5.png ../_images/32ab7c609013621c1062cdc7ea965a65d4ee2b4a43e5b880df1c0ad8f18a0593.png ../_images/86ad1b8258e2cfc46024fc1c832e022bf579935f6202e3bb9651e71408f14511.png ../_images/da35b48eb192bcd4e0d1ac7af4b860358655c94936404606f76fb4668666ba60.png ../_images/7d4500cc4140e58959cbe52877f8f842c3ae982b1accf44db033b5550085f05c.png ../_images/56d21301568d90f3412309271f274481220fe02b2e787858dfe5b83164b93e40.png ../_images/35efc301b5e46745f0d3e5ef6f1fa15e05ac8de835dcb074ac517c14da9a6dc6.png ../_images/65060deb6405c0c189c39633b104c7809e943a5c59166d2f6f72f417e018cc4a.png ../_images/506fa0c493a32ee7d4d7fc3f999c1d6cb69b82d2bf5f0aa6e1511bfb27e1afe8.png ../_images/f8d142d134e1862093de4a0a7411bff2227f113758d1e2b87f940dca777b77d8.png ../_images/124900d43d471327a43b451dec31bb17e11ebb2143952d911d705cc77de5f39a.png ../_images/ff8978cca3e54970a5bdb25b4410b00a21e900823a6f6ecbf01f5dc84c768e1f.png ../_images/72b57c23c3cb662e9eaa5c8b0ad24874472db390a9a5e63a5a0420a50d4e5a66.png ../_images/ec0e633ebeffa2152e2de9edc7d26b011e7402bbf31d864a26c68b3955faa9bd.png ../_images/6848c0338a50f4e2a029c88980ea144fd49be6a7bcfd83d6da00420d771b5caf.png ../_images/613f01219050e6a63df903e07220770db624571deca11b4ecc7aef8c9a95eb2c.png
Saving rose plot to ./output/ish_ufschem/plot_grp6.rose_plot.t.2017-07-01_00.2017-07-03_00.siteid.72539614815...
../_images/bd7eb12b6cd1f52e5ddcea5e6f6db2ef24f03c5432497c5d79a29561d07eb796.png
Saving rose plot to ./output/ish_ufschem/plot_grp6.rose_plot.ws.2017-07-01_00.2017-07-03_00.state.MI...
../_images/657fdbf4d9c566e72df884bb68a2f060371f148b7627ea53dd67226cd505dccf.png
Saving rose plot to ./output/ish_ufschem/plot_grp6.rose_plot.ws.2017-07-01_00.2017-07-03_00.siteid.72539614815...
../_images/cee03c4bf687ead2a25c14c30adb54866358a15358c06c2b25ca486b126d7ca7.png
Saving rose plot to ./output/ish_ufschem/plot_grp6.rose_plot.dpt.2017-07-01_00.2017-07-03_00.state.MI...
../_images/2c56147aa4f0b6d39ad7961430b118663d2f44090390f311654d096242ba84e4.png
Saving rose plot to ./output/ish_ufschem/plot_grp6.rose_plot.dpt.2017-07-01_00.2017-07-03_00.siteid.72539614815...
../_images/b0a82c877c48e7aafaad510ca64e74f925c4ad842b0c449778f7536314d890cb.png
CPU times: user 2min 29s, sys: 32.1 s, total: 3min 1s
Wall time: 2min 59s
../_images/d76564f8c737d94f1b1cce3c4b0288976660c7c2e02505ec51046ff0fd340613.png ../_images/2c7ad0270111bafe93db76d1b29dd83448fc147c3bf5706c700988068775837e.png ../_images/7b87d488466772526c3d7e24e30faab2a44ce701e5ee07beb464be9ff58a9e68.png ../_images/71a542d5599834e81c9d051bf98fc4ee054003e0da00eb10b4928edddef741f6.png ../_images/5023451d5f6f99f29c7938d96b1413fad890ad3929b6eabf3c2f54c11eed4889.png ../_images/262dee0842dd6b0c359484b0441ecb6449f31fcb18bfc476b3d8cbb77d9e9132.png
%%time

an.stats()
CPU times: user 6.45 s, sys: 11.7 s, total: 18.2 s
Wall time: 18.3 s
../_images/5d4905211e30f777fab966f20047d4253cdfd87f7d1dbdb0b70b318a05d11b2c.png ../_images/d4c2d16ec31b5b7db9ea04986d65e7b9149a58e23c3e98424adaaa8fdc6123de.png ../_images/35b6572ae718d7badbb13a6c338ac41f9fda59e17f809a20ca9ef51f50955bfa.png

The stats routine has produced two files (one for each data variable). This is one of them:

output/airnow_wrfchem/stats.OZONE.all.CONUS.2019-09-05_06.2019-09-06_06.csv
Stat_ID,Stat_FullName,airnow_RACM_ESRL,airnow_RACM_ESRL_VCP
MB,Mean_Bias,3.93,3.23
MdnB,Median_Bias,3.86,3.27
R2,Coefficient_of_Determination_(R2),0.56,0.54
RMSE,Root_Mean_Square_Error,11.64,11.59