AirNow and WRF-Chem

Our first example will demonstrate the basics available in MELODIES MONET to compare WRF-Chem model results against AirNow surface observations for ozone and PM2.5.

This example shows how one can compare results from two different model simulations against observations. This particular example compares WRF-Chem results using two different chemical mechanisms (RACM_ESRL and RACM_ESRL_VCP). Simulated surface ozone is slightly improved in WRF-Chem using the RACM_ESRL_VCP mechanism as compared to the AirNow observations.

First, we import the melodies_monet.driver module.

from melodies_monet import driver
Please install s3fs if retrieving from the Amazon S3 Servers.  Otherwise continue with local data

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

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_wrfchem_mech-0905_2.yaml"
an.read_control()
an.control_dict
Hide code cell output
{'analysis': {'start_time': '2019-09-05-06:00:00',
  'end_time': '2019-09-06-06:00:00',
  'output_dir': './output/airnow_wrfchem',
  'debug': True},
 'model': {'RACM_ESRL': {'files': 'example:wrfchem:racm_esrl',
   'mod_type': 'wrfchem',
   'mod_kwargs': {'mech': 'racm_esrl_vcp', 'surf_only_nc': True},
   'radius_of_influence': 12000,
   'mapping': {'airnow': {'PM2_5_DRY': 'PM2.5', 'o3': 'OZONE'}},
   'projection': None,
   'plot_kwargs': {'color': 'magenta', 'marker': 's', 'linestyle': '-'}},
  'RACM_ESRL_VCP': {'files': 'example:wrfchem:racm_esrl_vcp',
   'mod_type': 'wrfchem',
   'mod_kwargs': {'mech': 'racm_esrl_vcp', 'surf_only_nc': True},
   'radius_of_influence': 12000,
   'mapping': {'airnow': {'PM2_5_DRY': 'PM2.5', 'o3': 'OZONE'}},
   'projection': None,
   'plot_kwargs': {'color': 'gold', 'marker': 'o', 'linestyle': '-'}}},
 'obs': {'airnow': {'use_airnow': True,
   'filename': 'example:airnow:2019-09',
   'obs_type': 'pt_sfc',
   'variables': {'OZONE': {'unit_scale': 1,
     'unit_scale_method': '*',
     'nan_value': -1.0,
     'ylabel_plot': 'Ozone (ppbv)',
     'vmin_plot': 15.0,
     'vmax_plot': 55.0,
     'vdiff_plot': 20.0,
     'nlevels_plot': 21},
    'PM2.5': {'unit_scale': 1,
     'unit_scale_method': '*',
     'nan_value': -1.0,
     'ylabel_plot': 'PM2.5 (ug/m3)',
     'ty_scale': 2.0,
     'vmin_plot': 0.0,
     'vmax_plot': 22.0,
     'vdiff_plot': 15.0,
     'nlevels_plot': 23}}}},
 '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': ['all', 'state_name', 'epa_region'],
   'domain_name': ['CONUS', 'CA', 'R9'],
   'data': ['airnow_RACM_ESRL', 'airnow_RACM_ESRL_VCP'],
   'data_proc': {'rem_obs_nan': True,
    'ts_select_time': 'time_local',
    'ts_avg_window': 'H',
    'set_axis': True}},
  'plot_grp2': {'type': 'taylor',
   'fig_kwargs': {'figsize': [8, 8]},
   'default_plot_kwargs': {'linewidth': 2.0, 'markersize': 10.0},
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['all'],
   'domain_name': ['CONUS'],
   'data': ['airnow_RACM_ESRL', 'airnow_RACM_ESRL_VCP'],
   'data_proc': {'rem_obs_nan': True, 'set_axis': True}},
  'plot_grp3': {'type': 'spatial_bias',
   'fig_kwargs': {'states': True, 'figsize': [10, 5]},
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['all'],
   'domain_name': ['CONUS'],
   'data': ['airnow_RACM_ESRL', 'airnow_RACM_ESRL_VCP'],
   'data_proc': {'rem_obs_nan': True, 'set_axis': True}},
  'plot_grp4': {'type': 'spatial_overlay',
   'fig_kwargs': {'states': True, 'figsize': [10, 5]},
   'text_kwargs': {'fontsize': 16.0},
   'domain_type': ['all', 'epa_region'],
   'domain_name': ['CONUS', 'R9'],
   'data': ['airnow_RACM_ESRL', 'airnow_RACM_ESRL_VCP'],
   'data_proc': {'rem_obs_nan': True, 'set_axis': True}},
  'plot_grp5': {'type': 'boxplot',
   'fig_kwargs': {'figsize': [8, 6]},
   'text_kwargs': {'fontsize': 20.0},
   'domain_type': ['all'],
   'domain_name': ['CONUS'],
   'data': ['airnow_RACM_ESRL', 'airnow_RACM_ESRL_VCP'],
   'data_proc': {'rem_obs_nan': True, 'set_axis': False}},
  'plot_grp6': {'type': 'multi_boxplot',
   'fig_kwargs': {'figsize': [10, 8]},
   'text_kwargs': {'fontsize': 20.0},
   'domain_type': ['all'],
   'domain_name': ['CONUS'],
   'region_name': ['epa_region'],
   'region_list': ['R1',
    'R2',
    'R3',
    'R4',
    'R5',
    'R6',
    'R7',
    'R8',
    'R9',
    'R10'],
   'model_name_list': ['AirNow', 'WRF-Chem', 'WRF-Chem vcp'],
   'data': ['airnow_RACM_ESRL', 'airnow_RACM_ESRL_VCP'],
   'data_proc': {'rem_obs_nan': True, 'set_axis': False}}},
 'stats': {'stat_list': ['MB', 'MdnB', 'R2', 'RMSE'],
  'round_output': 2,
  'output_table': False,
  'output_table_kwargs': {'figsize': [7, 3],
   'fontsize': 12.0,
   'xscale': 1.4,
   'yscale': 1.4,
   'edges': 'horizontal'},
  'domain_type': ['all'],
  'domain_name': ['CONUS'],
  'data': ['airnow_RACM_ESRL', 'airnow_RACM_ESRL_VCP']}}

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

an
analysis(
    control='control_wrfchem_mech-0905_2.yaml',
    control_dict=...,
    models={},
    obs={},
    paired={},
    start_time=Timestamp('2019-09-05 06:00:00'),
    end_time=Timestamp('2019-09-06 06:00:00'),
    time_intervals=None,
    download_maps=True,
    output_dir='./output/airnow_wrfchem',
    output_dir_save='./output/airnow_wrfchem',
    output_dir_read='./output/airnow_wrfchem',
    debug=True,
    save=None,
    read=None,
)

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()
example:wrfchem:racm_esrl
**** Reading WRF-Chem model output...
example:wrfchem:racm_esrl_vcp
**** Reading WRF-Chem model output...

Applying open_models() populates the models attribute.

an.models
{'RACM_ESRL': model(
     model='wrfchem',
     radius_of_influence=12000,
     mod_kwargs={'mech': 'racm_esrl_vcp', 'surf_only_nc': True, 'var_list': ['PM2_5_DRY', 'o3']},
     file_str='example:wrfchem:racm_esrl',
     label='RACM_ESRL',
     obj=...,
     mapping={'airnow': {'PM2_5_DRY': 'PM2.5', 'o3': 'OZONE'}},
     label='RACM_ESRL',
     ...
 ),
 'RACM_ESRL_VCP': model(
     model='wrfchem',
     radius_of_influence=12000,
     mod_kwargs={'mech': 'racm_esrl_vcp', 'surf_only_nc': True, 'var_list': ['PM2_5_DRY', 'o3']},
     file_str='example:wrfchem:racm_esrl_vcp',
     label='RACM_ESRL_VCP',
     obj=...,
     mapping={'airnow': {'PM2_5_DRY': 'PM2.5', 'o3': 'OZONE'}},
     label='RACM_ESRL_VCP',
     ...
 )}

We can access the underlying dataset with the obj attribute.

an.models['RACM_ESRL'].obj
<xarray.Dataset>
Dimensions:    (y: 284, x: 440, time: 31, z: 1)
Coordinates:
    longitude  (y, x) float32 -122.3 -122.2 -122.1 ... -60.68 -60.52 -60.37
    latitude   (y, x) float32 21.19 21.22 21.24 21.27 ... 50.33 50.28 50.24 50.2
  * time       (time) datetime64[ns] 2019-09-05 ... 2019-09-06T06:00:00
Dimensions without coordinates: y, x, z
Data variables:
    PM2_5_DRY  (time, z, y, x) float32 3.046 3.048 2.84 ... 0.45 0.4506 0.4512
    o3         (time, z, y, x) float32 30.0 30.0 30.0 30.0 ... 34.72 36.87 37.13
Attributes: (12/17)
    FieldType:                                       104
    MemoryOrder:                                     XYZ
    description:                                     pm2.5 aerosol dry mass
    units:                                           ug m^-3
    stagger:                                         
    coordinates:                                     XLONG XLAT XTIME
    ...                                              ...
    MOAD_CEN_LAT:                                    39.617638
    STAND_LON:                                       -97.0
    MAP_PROJ:                                        1
    CEN_LAT:                                         39.617638
    CEN_LON:                                         -97.77487
    mapping_tables_to_airnow:                        {'OZONE': 'o3', 'PM2.5':...

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()
an.obs
{'airnow': observation(
     obs='airnow',
     label='airnow',
     file='example:airnow:2019-09',
     obj=...,
     type='pt_src',
     type=None,
     variable_dict={'OZONE': {'unit_scale': 1, 'unit_scale_method': '*', 'nan_value': -1.0, 'ylabel_plot': 'Ozone (ppbv)', 'vmin_plot': 15.0, 'vmax_plot': 55.0, 'vdiff_plot': 20.0, 'nlevels_plot': 21}, 'PM2.5': {'unit_scale': 1, 'unit_scale_method': '*', 'nan_value': -1.0, 'ylabel_plot': 'PM2.5 (ug/m3)', 'ty_scale': 2.0, 'vmin_plot': 0.0, 'vmax_plot': 22.0, 'vdiff_plot': 15.0, 'nlevels_plot': 23}},
 )}
an.obs['airnow'].obj
<xarray.Dataset>
Dimensions:     (x: 3786, time: 2091, y: 1)
Coordinates:
  * x           (x) int64 0 1 2 3 4 5 6 7 ... 3779 3780 3781 3782 3783 3784 3785
  * time        (time) datetime64[ns] 2019-09-01 ... 2019-09-30T00:30:00
    latitude    (y, x) float64 ...
    longitude   (y, x) float64 ...
    siteid      (y, x) object ...
Dimensions without coordinates: y
Data variables: (12/30)
    BARPR       (time, y, x) float64 ...
    BC          (time, y, x) float64 ...
    CO          (time, y, x) float64 ...
    NO          (time, y, x) float64 ...
    NO2         (time, y, x) float64 ...
    NO2Y        (time, y, x) float64 ...
    ...          ...
    cmsa_name   (y, x) float64 ...
    msa_code    (y, x) float64 ...
    msa_name    (y, x) object ...
    state_name  (y, x) object ...
    epa_region  (y, x) object ...
    time_local  (time, y, x) datetime64[ns] ...
Attributes:
    title:         
    format:        NetCDF-4
    date_created:  2021-06-07

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
After pairing:  
                       time  BARPR   BC   CO   NO  NO2  NO2Y  NOX  NOY  OZONE  \
0       2019-09-01 00:00:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0   25.0   
1       2019-09-01 00:15:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
2       2019-09-01 00:30:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
3       2019-09-01 01:00:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0   24.0   
4       2019-09-01 01:15:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
...                     ...    ...  ...  ...  ...  ...   ...  ...  ...    ...   
7916521 2019-09-29 23:15:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
7916522 2019-09-29 23:30:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
7916523 2019-09-30 00:00:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    8.0   
7916524 2019-09-30 00:15:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
7916525 2019-09-30 00:30:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   

         ...  longitude  cmsa_name  msa_code  msa_name  state_name  \
0        ...   -52.8167       -1.0      -1.0                    CC   
1        ...   -52.8167       -1.0      -1.0                    CC   
2        ...   -52.8167       -1.0      -1.0                    CC   
3        ...   -52.8167       -1.0      -1.0                    CC   
4        ...   -52.8167       -1.0      -1.0                    CC   
...      ...        ...        ...       ...       ...         ...   
7916521  ...    69.2725       -1.0      -1.0                         
7916522  ...    69.2725       -1.0      -1.0                         
7916523  ...    69.2725       -1.0      -1.0                         
7916524  ...    69.2725       -1.0      -1.0                         
7916525  ...    69.2725       -1.0      -1.0                         

         epa_region          time_local     siteid  PM2_5_DRY  o3  
0                CA 2019-08-31 20:00:00  000010102        NaN NaN  
1                CA 2019-08-31 20:15:00  000010102        NaN NaN  
2                CA 2019-08-31 20:30:00  000010102        NaN NaN  
3                CA 2019-08-31 21:00:00  000010102        NaN NaN  
4                CA 2019-08-31 21:15:00  000010102        NaN NaN  
...             ...                 ...        ...        ...  ..  
7916521        DSUZ 2019-09-30 04:15:00  UZB010001        NaN NaN  
7916522        DSUZ 2019-09-30 04:30:00  UZB010001        NaN NaN  
7916523        DSUZ 2019-09-30 05:00:00  UZB010001        NaN NaN  
7916524        DSUZ 2019-09-30 05:15:00  UZB010001        NaN NaN  
7916525        DSUZ 2019-09-30 05:30:00  UZB010001        NaN NaN  

[7916526 rows x 36 columns]
After pairing:  
                       time  BARPR   BC   CO   NO  NO2  NO2Y  NOX  NOY  OZONE  \
0       2019-09-01 00:00:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0   25.0   
1       2019-09-01 00:15:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
2       2019-09-01 00:30:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
3       2019-09-01 01:00:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0   24.0   
4       2019-09-01 01:15:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
...                     ...    ...  ...  ...  ...  ...   ...  ...  ...    ...   
7916521 2019-09-29 23:15:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
7916522 2019-09-29 23:30:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
7916523 2019-09-30 00:00:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    8.0   
7916524 2019-09-30 00:15:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   
7916525 2019-09-30 00:30:00   -1.0 -1.0 -1.0 -1.0 -1.0  -1.0 -1.0 -1.0    NaN   

         ...  longitude  cmsa_name  msa_code  msa_name  state_name  \
0        ...   -52.8167       -1.0      -1.0                    CC   
1        ...   -52.8167       -1.0      -1.0                    CC   
2        ...   -52.8167       -1.0      -1.0                    CC   
3        ...   -52.8167       -1.0      -1.0                    CC   
4        ...   -52.8167       -1.0      -1.0                    CC   
...      ...        ...        ...       ...       ...         ...   
7916521  ...    69.2725       -1.0      -1.0                         
7916522  ...    69.2725       -1.0      -1.0                         
7916523  ...    69.2725       -1.0      -1.0                         
7916524  ...    69.2725       -1.0      -1.0                         
7916525  ...    69.2725       -1.0      -1.0                         

         epa_region          time_local     siteid  PM2_5_DRY  o3  
0                CA 2019-08-31 20:00:00  000010102        NaN NaN  
1                CA 2019-08-31 20:15:00  000010102        NaN NaN  
2                CA 2019-08-31 20:30:00  000010102        NaN NaN  
3                CA 2019-08-31 21:00:00  000010102        NaN NaN  
4                CA 2019-08-31 21:15:00  000010102        NaN NaN  
...             ...                 ...        ...        ...  ..  
7916521        DSUZ 2019-09-30 04:15:00  UZB010001        NaN NaN  
7916522        DSUZ 2019-09-30 04:30:00  UZB010001        NaN NaN  
7916523        DSUZ 2019-09-30 05:00:00  UZB010001        NaN NaN  
7916524        DSUZ 2019-09-30 05:15:00  UZB010001        NaN NaN  
7916525        DSUZ 2019-09-30 05:30:00  UZB010001        NaN NaN  

[7916526 rows x 36 columns]
CPU times: user 45 s, sys: 39.5 s, total: 1min 24s
Wall time: 1min 19s
an.paired
{'airnow_RACM_ESRL': pair(
     type='pt_sfc',
     radius_of_influence=1000000.0,
     obs='airnow',
     model='RACM_ESRL',
     model_vars=['PM2_5_DRY', 'o3'],
     obs_vars=['PM2.5', 'OZONE'],
     filename='airnow_RACM_ESRL.nc',
 ),
 'airnow_RACM_ESRL_VCP': pair(
     type='pt_sfc',
     radius_of_influence=1000000.0,
     obs='airnow',
     model='RACM_ESRL_VCP',
     model_vars=['PM2_5_DRY', 'o3'],
     obs_vars=['PM2.5', 'OZONE'],
     filename='airnow_RACM_ESRL_VCP.nc',
 )}
an.paired['airnow_RACM_ESRL']
pair(
    type='pt_sfc',
    radius_of_influence=1000000.0,
    obs='airnow',
    model='RACM_ESRL',
    model_vars=['PM2_5_DRY', 'o3'],
    obs_vars=['PM2.5', 'OZONE'],
    filename='airnow_RACM_ESRL.nc',
)

Plot

The plotting() routine produces plots.

%%time

an.plotting()
Reference std: 5.409628418207226
Warning: ty_scale not specified for OZONE, so default used.
Reference std: 16.454896847070792
Warning: ty_scale not specified for OZONE, so default used.
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:341: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:341: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:341: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:341: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:693: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:693: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:693: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:693: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:693: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:693: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:693: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
/home/btang6/MELODIES-MONET/melodies_monet/plots/surfplots.py:693: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df_mean=df.groupby(['siteid'],as_index=False).mean()
CPU times: user 2min 53s, sys: 2min 29s, total: 5min 23s
Wall time: 5min 4s
../_images/f9aee8a055ba89c6bc7a5cfa9934b7c2719a3efd9760e075ecba48604f54bfbd.png ../_images/cc438745c86f87532c8ed62b258dd01556980dbbe0fbd3b65799b03f45c58d72.png ../_images/b3e668c752e93dac9d9a363bcfab4d4bb8eb9af5a7a6f1e1e57db770a5402bbc.png ../_images/cd4570b4792ef787f367da5f824a521f3e9a5f0e21c67eb895de861936bc607c.png ../_images/382fcd7707bd783fe9ac55e5164ce11061aa93a507cd57fe00e2d86162e480e4.png ../_images/65d4ff5b950a564aaf441657335c6236fb401032fb48c55c3542cfb821ac931a.png ../_images/fb0471ecd532e9d7b35db2b0a77d38e6c7861999bfcf1f587d7c567dfe3ebcc9.png ../_images/3e35ad87b229543915569d737d02bb4c2e35f332f42a3dae8a15b2c4315cea56.png ../_images/169b71c614f9347a012a594dd9c24c0940fae6ad0efba8106e589d447be7251a.png ../_images/c8ab55ad83ad0b1385acb39c97a1086a74b3b33dfc037e0e266f9c5fe90aed49.png ../_images/3c028ecc7784e248f166df76659cd1b09dc34ca16ffb8df2bf4b413a7d4637a5.png ../_images/3beb820e74dafcf47ffa98240ebef78555aa11000d7408da605485f2052787d6.png ../_images/afbe551b62eb58d00ffa9831ed9bda5cbdfe320bb779081b422e04e518084bfe.png ../_images/7fc7cf6cf352bfce0d0bcb7aac7f604dbf20774ad652085ed15660844cf69e49.png ../_images/6015337695de6384f220ab297371821cb12e568039485b5753046a137bcc3c79.png ../_images/5812345cb071f4e839402878e10cbaec110c0ce36736872f34bc5fbb19c7cdd9.png ../_images/911f9cb63fef9565a7d9a21b11d740c6394fbe14375aef546d67549607b1cf45.png ../_images/17fbb56fdb69a45461c436a184b554fd3d4ee3f765fc406db2d7cfda6053f7ab.png ../_images/465190442a9d4bbf95bf9cd586324af51b562370e77390e31e9f7e5ac3658832.png ../_images/5fa14851f514dc40e646fc0bdfc02e74e472e4dfdcc1401e8759d71ad4f871bd.png ../_images/da7917baad33f6e4fd407328e56a8d336679a0c010bf7de64f50dc04388562cd.png ../_images/23a83371555955d263535ae4ff8c4df1105c4bad6915bda25a038b132aee8bb2.png ../_images/096e1a9c8e3ff91127f4d9689656d6dc8f452920d82e5653c1211657932ff2b6.png ../_images/1f996f257eea3a238c786d93d2d2f986992909a119f7a1aaaf737ac7827aff9d.png

The figures are saved in the directory specified by the analysis instance’s output_dir attribute.

Statistics

The stats() routine produces tables of statistics.

%%time

an.stats()
CPU times: user 50.1 s, sys: 1min 20s, total: 2min 10s
Wall time: 1min 37s

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