AirNow and UFS-CHEM

Our first example will demonstrate the basics available in MELODIES MONET to compare the meteorological capabilities of UFS-CHEM results against AirNow surface observations. We will analyze variables including ozone, temperature, windspeed, and wind direction.

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_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/airnow_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': {'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': {'airnow': {'o3': 'OZONE',
     'tmp2m': 'TEMP',
     'windspeed': 'WS',
     'rel_hum': 'RHUM'}},
   'projection': None,
   'plot_kwargs': {'color': 'magenta', 'marker': 's', 'linestyle': '-'}}},
 'obs': {'airnow': {'use_airnow': True,
   'filename': 'example:airnow:2017-07',
   'obs_type': 'pt_sfc',
   'variables': {'OZONE': {'unit_scale': 1,
     'unit_scale_method': '*',
     'nan_value': -1.0,
     'ylabel_plot': 'Ozone (ppbv)',
     'xlabel_plot': 'Ozone (ppbv)',
     'vmin_plot': 0.0,
     'vmax_plot': 80,
     'vdiff_plot': 20.0,
     'nlevels_plot': 21},
    'TEMP': {'unit_scale': 273.15,
     'unit_scale_method': '+',
     'nan_value': -1.0,
     'ylabel_plot': 'Temperature 2m (K)',
     'xlabel_plot': 'Temperature 2m (K)',
     'vmin_plot': 275,
     'vmax_plot': 320,
     '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': 10,
     'vdiff_plot': 4,
     'nlevels_plot': 18},
    'WD': {'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': 380,
     'vdiff_plot': 3,
     'nlevels_plot': 18},
    'RHUM': {'unit_scale': 1,
     'unit_scale_method': '*',
     'nan_value': -1.0,
     'ylabel_plot': 'Relative Humidity 2m (%)',
     'xlabel_plot': 'Relative Humidity 2m (%)',
     'vmin_plot': 0,
     'vmax_plot': 100,
     'vdiff_plot': 15,
     'nlevels_plot': 8}},
   'extra_calc': {'rose_plot': {'obs_wdir': 'WD', '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': ['state_name', 'epa_region'],
   'domain_name': ['MI', 'R5'],
   'data': ['airnow_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'ts_select_time': 'time_local',
    'ts_avg_window': 'h',
    'set_axis': True}},
  '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': ['state_name', 'epa_region'],
   'domain_name': ['MI', 'R5'],
   'data': ['airnow_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'ts_select_time': 'time_local',
    'ts_avg_window': 'h',
    'set_axis': True,
    'filter_string': 'WS != 0 and WD != 0'}},
  'plot_grp2': {'type': 'spatial_bias',
   'fig_kwargs': {'states': True, 'figsize': [10, 5]},
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['state_name', 'epa_region'],
   'domain_name': ['MI', 'R5'],
   'data': ['airnow_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': ['epa_region', 'siteid'],
   'domain_name': ['R5', '260810020'],
   'data': ['airnow_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'}}},
  'plot_grp3a': {'type': 'spatial_overlay',
   'fig_kwargs': {'states': True, 'figsize': [10, 5]},
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['epa_region', 'siteid'],
   'domain_name': ['R5', '260810020'],
   'data': ['airnow_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'set_axis': True,
    'wind_barb': True,
    'wind_barb_step': 2,
    'filter_string': 'WS != 0 and WD != 0'}},
  'plot_grp4': {'type': 'boxplot',
   'fig_kwargs': {'figsize': [8, 6]},
   'text_kwargs': {'fontsize': 20.0},
   'domain_type': ['epa_region'],
   'domain_name': ['R5'],
   'data': ['airnow_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True,
    'set_axis': False,
    'set_stat_sig': False}},
  'plot_grp5': {'type': 'multi_boxplot',
   'fig_kwargs': {'figsize': [10, 8]},
   'text_kwargs': {'fontsize': 20.0},
   'gridlines': True,
   'xlabel': 'Binned by Observed Wind Speed (m/s)',
   'domain_type': ['epa_region'],
   'domain_name': ['R5'],
   'interval_list': [0, 3, 5, 8, 11, 14],
   'interval_var': 'WS',
   'interval_labels': ['[0, 3)', '[3, 5)', '[5, 8)', '[8, 11)', '[11, 14)'],
   'model_name_list': ['AirNow', 'ufschem_v1'],
   'data': ['airnow_ufschem_v1'],
   'data_proc': {'rem_obs_nan': True, 'set_axis': False}},
  'plot_grp6': {'type': 'rose_plot',
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['state_name', 'siteid'],
   'domain_name': ['MI', '260810020'],
   'data': ['airnow_ufschem_v1'],
   'color_map': 'inferno',
   '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_name', 'epa_region'],
   'domain_name': ['MI', 'R5'],
   'data': ['airnow_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': ['epa_region'],
  'domain_name': ['R5'],
  'data': ['airnow_ufschem_v1']}}

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

an
analysis(
    control='control_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/airnow_ufschem',
    output_dir_save='./output/airnow_ufschem',
    output_dir_read='./output/airnow_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 relative humidity...
Calculating modeled windspeed...
Calculating modeled wind direction...

Applying open_models() populates the models attribute.

We can access the underlying dataset with the obj attribute.

an.models['ufschem_v1'].obj
<xarray.Dataset> Size: 320MB
Dimensions:        (time: 72, z: 1, y: 192, x: 384)
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)
    o3             (time, z, y, x) float32 21MB dask.array<chunksize=(1, 1, 192, 384), meta=np.ndarray>
    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>
    ...             ...
    spfh2m         (time, z, y, x) float32 21MB 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>
    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
{'airnow': observation(
     obs='airnow',
     label='airnow',
     file='example:airnow:2017-07',
     obj=...,
     extra_calc={'rose_plot': {'obs_wdir': 'WD', 'obs_wspd': 'WS'}},
     type='pt_src',
     sat_type=None,
     sat_method=None,
     data_proc=None,
     variable_dict={'OZONE': {'unit_scale': 1, 'unit_scale_method': '*', 'nan_value': -1.0, 'ylabel_plot': 'Ozone (ppbv)', 'xlabel_plot': 'Ozone (ppbv)', 'vmin_plot': 0.0, 'vmax_plot': 80, 'vdiff_plot': 20.0, 'nlevels_plot': 21}, 'TEMP': {'unit_scale': 273.15, 'unit_scale_method': '+', 'nan_value': -1.0, 'ylabel_plot': 'Temperature 2m (K)', 'xlabel_plot': 'Temperature 2m (K)', 'vmin_plot': 275, 'vmax_plot': 320, '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': 10, 'vdiff_plot': 4, 'nlevels_plot': 18}, 'WD': {'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': 380, 'vdiff_plot': 3, 'nlevels_plot': 18}, 'RHUM': {'unit_scale': 1, 'unit_scale_method': '*', 'nan_value': -1.0, 'ylabel_plot': 'Relative Humidity 2m (%)', 'xlabel_plot': 'Relative Humidity 2m (%)', 'vmin_plot': 0, 'vmax_plot': 100, 'vdiff_plot': 15, 'nlevels_plot': 8}},
     resample=None,
     time_var=None,
     regrid_method=None,
 )}
an.obs['airnow'].obj
<xarray.Dataset> Size: 18MB
Dimensions:     (time: 49, y: 1, x: 1934)
Coordinates:
  * time        (time) datetime64[ns] 392B 2017-07-01 ... 2017-07-03
    siteid      (x) <U9 70kB ...
    latitude    (x) float64 15kB ...
    longitude   (x) float64 15kB ...
  * x           (x) int64 15kB 0 1 2 3 4 5 6 ... 1928 1929 1930 1931 1932 1933
Dimensions without coordinates: y
Data variables: (12/30)
    BARPR       (time, y, x) float64 758kB ...
    BC          (time, y, x) float64 758kB ...
    CO          (time, y, x) float64 758kB ...
    NO          (time, y, x) float64 758kB ...
    NO2         (time, y, x) float64 758kB ...
    NO2Y        (time, y, x) float64 758kB ...
    ...          ...
    utcoffset   (y, x) int64 15kB ...
    cmsa_name   (y, x) float64 15kB ...
    msa_code    (y, x) float64 15kB ...
    msa_name    (y, x) <U52 402kB ...
    state_name  (y, x) <U2 15kB ...
    epa_region  (y, x) <U5 39kB ...

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  BARPR  BC  CO   NO  NO2  NO2Y  NOX  NOY  OC  ...  \
0     2017-07-01    NaN NaN NaN  NaN  NaN   NaN  NaN  NaN NaN  ...   
1     2017-07-01    NaN NaN NaN  0.0  1.0   NaN  NaN  NaN NaN  ...   
2     2017-07-01    NaN NaN NaN  0.0  1.0   NaN  NaN  NaN NaN  ...   
3     2017-07-01    NaN NaN NaN  0.0  0.0   NaN  NaN  NaN NaN  ...   
4     2017-07-01    NaN NaN NaN  1.0  NaN   NaN  NaN  NaN NaN  ...   
...          ...    ...  ..  ..  ...  ...   ...  ...  ...  ..  ...   
94761 2017-07-03    NaN NaN NaN  NaN  NaN   NaN  NaN  NaN NaN  ...   
94762 2017-07-03    NaN NaN NaN  NaN  NaN   NaN  NaN  NaN NaN  ...   
94763 2017-07-03    NaN NaN NaN  NaN  NaN   NaN  NaN  NaN NaN  ...   
94764 2017-07-03    NaN NaN NaN  NaN  NaN   NaN  NaN  NaN NaN  ...   
94765 2017-07-03    NaN NaN NaN  NaN  NaN   NaN  NaN  NaN NaN  ...   

       epa_region         o3       tmp2m  windspeed    rel_hum   surfpres_pa  \
0              CA        NaN         NaN        NaN        NaN           NaN   
1              CA        NaN         NaN        NaN        NaN           NaN   
2              CA        NaN         NaN        NaN        NaN           NaN   
3              CA        NaN         NaN        NaN        NaN           NaN   
4              CA        NaN         NaN        NaN        NaN           NaN   
...           ...        ...         ...        ...        ...           ...   
94761          R4  36.069859  306.480591   2.508962  44.425949  99474.218750   
94762         R10  41.025520  300.077881   3.429372  34.690170  91309.281250   
94763              60.390541  309.205658   4.180239  19.677402  97643.179688   
94764          R6  37.098976  307.381134   1.890426  44.821545  97904.625000   
94765        DSMG  27.582333  292.441650   2.494158  70.515137  84186.460938   

         spfh2m   ugrd10m   vgrd10m     winddir  
0           NaN       NaN       NaN         NaN  
1           NaN       NaN       NaN         NaN  
2           NaN       NaN       NaN         NaN  
3           NaN       NaN       NaN         NaN  
4           NaN       NaN       NaN         NaN  
...         ...       ...       ...         ...  
94761  0.014326 -0.492948 -2.460059   11.330902  
94762  0.008417  2.487059  2.361171  226.487396  
94763  0.007485  4.102063  0.804657  258.901855  
94764  0.015450  1.062653  1.563483  214.202789  
94765  0.011723 -0.536846  2.435697  167.570312  

[94766 rows x 43 columns]
saving pair
CPU times: user 4.96 s, sys: 859 ms, total: 5.82 s
Wall time: 2.33 s
an.paired
{'airnow_ufschem_v1': pair(
     type='pt_sfc',
     radius_of_influence=1000000.0,
     obs='airnow',
     model='ufschem_v1',
     model_vars=['o3', 'tmp2m', 'windspeed', 'rel_hum'],
     obs_vars=['OZONE', 'TEMP', 'WS', 'RHUM'],
     filename='airnow_ufschem_v1.nc',
 )}
an.paired['airnow_ufschem_v1']
pair(
    type='pt_sfc',
    radius_of_influence=1000000.0,
    obs='airnow',
    model='ufschem_v1',
    model_vars=['o3', 'tmp2m', 'windspeed', 'rel_hum'],
    obs_vars=['OZONE', 'TEMP', 'WS', 'RHUM'],
    filename='airnow_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 across scales (e.g. EPA region and CONUS)

  • 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 AirNow 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). Additional processing and consideration for calm winds is under development.

%%time

an.plotting()
Warning: no valid obs found for MI
Warning: no valid obs found for MI
Warning: no valid obs found for MI
Warning: no valid obs found for 260810020
Warning: no valid obs found for 260810020
WARNING:matplotlib.legend:No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.
Saving rose plot to ./output/airnow_ufschem/plot_grp6.rose_plot.OZONE.2017-07-01_00.2017-07-03_00.state_name.MI...
../_images/0a3596775b10f6a1fbf81090df7889a888405865f930e67dcf431ebe0eae0105.png ../_images/512196300426d759ada186627b35a5add0d9db6100c1f839f90c6a4442971b56.png ../_images/7cd9f9459a0c436a05f3204a6cc44b814c5283a5c5ed385335c10a607aac56ac.png ../_images/d041aa1ab62ebfd6835efb4e7681364d52905ac4696857172c3517714aa61d40.png ../_images/f2ded2d7d10b4cb57628776a14cdeb37a012f2331cc2fc74ac479bdb65ae8a9c.png ../_images/85ba4c2e438bba9e8abc338b5f8febe053ec76c1697ef6ff817b66c1b2b5d16a.png ../_images/d9b326f7fe3bbd45c4d554521c2f83fe210e7a78b8f8eaaa64693e27c5e8a073.png ../_images/0a3596775b10f6a1fbf81090df7889a888405865f930e67dcf431ebe0eae0105.png ../_images/512196300426d759ada186627b35a5add0d9db6100c1f839f90c6a4442971b56.png ../_images/7cd9f9459a0c436a05f3204a6cc44b814c5283a5c5ed385335c10a607aac56ac.png ../_images/d041aa1ab62ebfd6835efb4e7681364d52905ac4696857172c3517714aa61d40.png ../_images/f2ded2d7d10b4cb57628776a14cdeb37a012f2331cc2fc74ac479bdb65ae8a9c.png ../_images/ded124b7ea3f6d0d6c3a8d9abe3769be18762e8aa8733b279076290a45e45853.png ../_images/d9b326f7fe3bbd45c4d554521c2f83fe210e7a78b8f8eaaa64693e27c5e8a073.png ../_images/813c96a28d249cc70a93344db28763804ca14e178a5f11cdf916d3ebd789e555.png ../_images/b8ccbf31936e9662e5bd54543c1db4cc4ac0eebcfb8dc07b1b4d7d78ac59dfbe.png ../_images/02c82715f89d3a74f15438b7b6c7ffc20b29ad4d2306259759762696295e6808.png ../_images/1d2cee8597744f01d3d2a1b518b78e58ed8d9130b6491e76b356e7f40edca17b.png ../_images/3add124d02040917be86c11ce6128181895e57c5837cd253cbcb951e24b6e478.png ../_images/713e15f4c6621ddaeb32100e11b51027966eecb9cb31a5c2595a3ac8aeb78425.png ../_images/082a61f9dd76a58b604f41dc0418ce3b0d74737c952ea970d60d850eee3300f3.png ../_images/e6c16371f73f02955ec3b194c546a75fd480e8c72ed7b12523740a5baf24a586.png ../_images/ae053f452cc395a54054b5b92df987a076db050508ba8b3947f5128f4e264b3d.png ../_images/d08e9a29b9e888951dbb78aa7b6f8f1722641a6171cb9034970d2283ca9f67fa.png ../_images/ab2b9abe42975166c8489064f47bf8a77de23d5d606b4a8049e7b989708331be.png ../_images/7b3759e14a11305445f80a28ecbcbec18891a071ee2973800844700b7493d850.png ../_images/ee6c92348983fe216ebe9d01b439dd56ce13f6842236c73b1ffbb23786fe4608.png ../_images/c7a3b662649839e366b44a75119230b98fcc1359659b4b57b987b52b172f0b9d.png ../_images/6cdf6bb39ff23c6033a9319f3ad55dac32f4286e7607e30ceeaaa9e775daf52c.png ../_images/ae053f452cc395a54054b5b92df987a076db050508ba8b3947f5128f4e264b3d.png ../_images/9cf926ef9d8b943082cb6cc09abe61e7657875d69c699b402bfdafad05ab1426.png ../_images/ab2b9abe42975166c8489064f47bf8a77de23d5d606b4a8049e7b989708331be.png ../_images/91a53f343c92ffd4ec0a74d79ea44a0c8cb0a95b3e0d042fbf383c3e3f27039c.png ../_images/ee6c92348983fe216ebe9d01b439dd56ce13f6842236c73b1ffbb23786fe4608.png ../_images/b30b8590ac07d1f885996a86d2048720d3f7acb082d5459fc0c6553720609327.png ../_images/03e936fa28cca93a9eeb7584a03b30a260a163e8dd8e3978bc1ec70199365346.png ../_images/0558e072534e0b3fc1f1ae4ae8016ce0aace676f15df76355d3877c21bc51b8f.png ../_images/becdfddea8d118f96741f228fd30e9e8f7d495585cf699d4e067aa257129e5d3.png ../_images/dbdb9e2d9cc0ca23b3439c76c149c0eb6331566df1328d5b14c12de3de01f0f4.png ../_images/faac4b36527da377c5c9149a804d3433992a506bed38edb16f6b0e2b5fdbe372.png ../_images/82b12c437d2b76bb8a9e7bd62a75d58163482db6ed4afac29af9c6e7c58d557a.png ../_images/59d05e31afd1747dafedf3b4aef62e3689ba505782ec17b5ff5c86bcfb7832b1.png ../_images/f6465628aed530c37a5dc9d00d8e1b6d19c8ee2818d799be025be023c10999e4.png ../_images/7ea61322def181488ff7010c0faef83e4273afbc2ab1c9030c6e7dd23f68fb49.png
Saving rose plot to ./output/airnow_ufschem/plot_grp6.rose_plot.OZONE.2017-07-01_00.2017-07-03_00.siteid.260810020...
../_images/161d3dbae8fef72f7409656ee9e0e95efe8341f36187ad75eb75c0e0b4d00129.png
Saving rose plot to ./output/airnow_ufschem/plot_grp6.rose_plot.TEMP.2017-07-01_00.2017-07-03_00.state_name.MI...
../_images/d825329612bca48296a97286286f567bdc0e4792fcae8e1e1e147f822363ca85.png
Saving rose plot to ./output/airnow_ufschem/plot_grp6.rose_plot.TEMP.2017-07-01_00.2017-07-03_00.siteid.260810020...
../_images/bc930c94dedd0686156502bcde95424f2f541ccd91a3807a95622ce6008374e3.png
Saving rose plot to ./output/airnow_ufschem/plot_grp6.rose_plot.WS.2017-07-01_00.2017-07-03_00.state_name.MI...
../_images/69bddb1cdba4b2a0b0a235149286adf237ee537952185952205f051a70aad412.png
Saving rose plot to ./output/airnow_ufschem/plot_grp6.rose_plot.WS.2017-07-01_00.2017-07-03_00.siteid.260810020...
../_images/d125b889918d2ed1cde48099ce8e78cee564f689c2275faa9125fabdf40502d7.png
Warning: no valid obs found for MI
Warning: no valid obs found for 260810020
Warning: no valid obs found for MI
CPU times: user 2min 13s, sys: 9.49 s, total: 2min 22s
Wall time: 2min 20s
../_images/b0f0fc132fe6ad7dc56750155ffcac6aad7b4ff51ed462cae15484b88a5f873d.png ../_images/e9c6fdca3059155b14847122a2caaac7e2dd52870a366a106d4f681314adee09.png ../_images/70e6a1431b3d9c043ce3e8ff5c39c6779f896e521e0638eefe6f73696df826c1.png ../_images/08329ecb4077a9a02ff63473afc232eecaaf339f09488aaaefddab5e27b372c7.png ../_images/6f5dd337cd867e900d7aae1c65d706a57e73bde8dd7cd058e2169e59bb7071e3.png ../_images/07ffaabd69d9e9fd2aa2a56fbaa8162ca5ae9e895889cebd20335a6d6c7ffbcb.png ../_images/5b06ea1796e2c2cfe101fd0e29a93afe8ec5303ebb0f75a66335666423b3181c.png
%%time

an.stats()
CPU times: user 3.14 s, sys: 255 ms, total: 3.39 s
Wall time: 3.44 s
../_images/3a4b1fe8f007daad9c4467918641488bb2481b884d5135a81b103380c4936796.png ../_images/5a1691a0468c0d0bea0bae99f1573b2335c8940f1c2890e7794495697f921c1c.png ../_images/e8e05cd97ff954553aff8fa991ee7bad99b80a1877b9261c729d5551da1569a5.png ../_images/c8d7c6d6cf98a6e7fa30a35208b25a6614eaa090d27bf74444c4ce1f26f395dd.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