Brian Blaylock
August 10, 2022

NAM Data#

This tutorial shows you how to download NAM data from Amazon (and other sources) with the Herbie Python package.

[1]:
from herbie.archive import Herbie
from toolbox.cartopy_tools import common_features, pc
from paint.standard2 import cm_tmp

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
🥳 Herbie loaded your custom templates.
[4]:
H = Herbie("2022-08-10", model="nam", fxx=6, priority="nomads")
✅ Found ┊ model=nam ┊ product=conusnest.hiresf ┊ 2022-Aug-10 00:00 UTC F06GRIB2 @ nomadsIDX @ nomads
[5]:
ds = H.xarray("TMP:2 m above")
ds
[5]:
<xarray.Dataset>
Dimensions:              (y: 1059, x: 1799)
Coordinates:
    time                 datetime64[ns] 2022-08-10
    step                 timedelta64[ns] 06:00:00
    heightAboveGround    float64 2.0
    latitude             (y, x) float64 21.14 21.14 21.15 ... 47.86 47.85 47.84
    longitude            (y, x) float64 237.3 237.3 237.3 ... 299.0 299.0 299.1
    valid_time           datetime64[ns] 2022-08-10T06:00:00
Dimensions without coordinates: y, x
Data variables:
    t2m                  (y, x) float32 295.0 295.0 294.9 ... 290.4 290.4 290.4
    gribfile_projection  object None
Attributes:
    GRIB_edition:            2
    GRIB_centre:             kwbc
    GRIB_centreDescription:  US National Weather Service - NCEP
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             US National Weather Service - NCEP
    model:                   nam
    product:                 conusnest.hiresf
    description:             North America Mesoscale - CONUS
    remote_grib:             https://nomads.ncep.noaa.gov/pub/data/nccf/com/n...
    local_grib:              /p/cwfs/blaylock/data/nam/20220810/subset_6765c0...
    searchString:            TMP:2 m above
[7]:
ax = common_features("50m", crs=ds.herbie.crs, figsize=[8, 8]).STATES().ax
p = ax.pcolormesh(
    ds.longitude, ds.latitude, ds.t2m, transform=pc, **cm_tmp(units="K").cmap_kwargs
)
plt.colorbar(
    p, ax=ax, orientation="horizontal", pad=0.05, **cm_tmp(units="K").cbar_kwargs
)

ax.set_title(
    f"{ds.model.upper()}: {H.product_description} ({H.product})\nValid: {ds.valid_time.dt.strftime('%H:%M UTC %d %b %Y').item()}",
    loc="left",
)
ax.set_title(ds.t2m.GRIB_name, loc="right")
[7]:
Text(1.0, 1.0, '2 metre temperature')
../../_images/user_guide_notebooks_data_nam_4_1.png

Cycle through all products:#

[44]:
def plot_product(product):
    H = Herbie("2022-08-10", model="nam", fxx=6, product=product)

    ds = H.xarray("TMP:2 m above")

    ax = common_features("50m", crs=ds.herbie.crs, figsize=[8, 8]).STATES().ax
    p = ax.pcolormesh(
        ds.longitude, ds.latitude, ds.t2m, transform=pc, **cm_tmp(units="K").cmap_kwargs
    )
    plt.colorbar(
        p, ax=ax, orientation="horizontal", pad=0.05, **cm_tmp(units="K").cbar_kwargs
    )

    ax.set_title(
        f"{ds.model.upper()}: {H.product_description} ({product})\nValid: {ds.valid_time.dt.strftime('%H:%M UTC %d %b %Y').item()}",
        loc="left",
    )
    ax.set_title(ds.t2m.GRIB_name, loc="right")
    return H, ds, ax
[45]:
H.PRODUCTS.keys()
[45]:
dict_keys(['conusnest.hiresf', 'firewxnest.hiresf', 'alaskanest.hiresf', 'hawaiinest.hiresf', 'priconest.hiresf', 'afwaca'])
[21]:
H, ds, ax = plot_product("conusnest.hiresf")
✅ Found ┊ model=nam ┊ product=conusnest.hiresf ┊ 2022-Aug-10 00:00 UTC F06GRIB2 @ awsIDX @ aws
../../_images/user_guide_notebooks_data_nam_8_1.png
[22]:
H, ds, ax = plot_product("firewxnest.hiresf")
✅ Found ┊ model=nam ┊ product=firewxnest.hiresf ┊ 2022-Aug-10 00:00 UTC F06GRIB2 @ awsIDX @ aws
../../_images/user_guide_notebooks_data_nam_9_1.png
[25]:
H, ds, ax = plot_product("alaskanest.hiresf")
✅ Found ┊ model=nam ┊ product=alaskanest.hiresf ┊ 2022-Aug-10 00:00 UTC F06GRIB2 @ awsIDX @ aws
../../_images/user_guide_notebooks_data_nam_10_1.png
[27]:
# NOTE: Weirdness with Hawaii not returning as a grid, but as a line
# NOTE: NEEDS TO BE RESHAPED

H, ds, ax = plot_product("hawaiinest.hiresf")
✅ Found ┊ model=nam ┊ product=hawaiinest.hiresf ┊ 2022-Aug-10 00:00 UTC F06GRIB2 @ awsIDX @ aws
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb Cell 13 in <cell line: 1>()
----> <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=0'>1</a> H, ds, ax = plot_product('hawaiinest.hiresf')

/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb Cell 13 in plot_product(product)
      <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=3'>4</a> ds = H.xarray("TMP:2 m")
      <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=5'>6</a> ax = common_features("50m", crs=ds.herbie.crs, figsize=[8, 8]).STATES().ax
----> <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=6'>7</a> p = ax.pcolormesh(
      <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=7'>8</a>     ds.longitude, ds.latitude, ds.t2m, transform=pc, **cm_tmp(units="K").cmap_kwargs
      <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=8'>9</a> )
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=9'>10</a> plt.colorbar(
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=10'>11</a>     p, ax=ax, orientation="horizontal", pad=0.05, **cm_tmp(units="K").cbar_kwargs
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=11'>12</a> )
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=13'>14</a> ax.set_title(
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=14'>15</a>     f"{ds.model.upper()}: {H.product_description} ({product})\nValid: {ds.valid_time.dt.strftime('%H:%M UTC %d %b %Y').item()}",
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=15'>16</a>     loc="left",
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=16'>17</a> )

File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:318, in _add_transform.<locals>.wrapper(self, *args, **kwargs)
    313     raise ValueError(f'Invalid transform: Spherical {func.__name__} '
    314                      'is not supported - consider using '
    315                      'PlateCarree/RotatedPole.')
    317 kwargs['transform'] = transform
--> 318 return func(self, *args, **kwargs)

File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:1796, in GeoAxes.pcolormesh(self, *args, **kwargs)
   1785 """
   1786 Add the "transform" keyword to :func:`~matplotlib.pyplot.pcolormesh`.
   1787
   (...)
   1792
   1793 """
   1794 # Add in an argument checker to handle Matplotlib's potential
   1795 # interpolation when coordinate wraps are involved
-> 1796 args, kwargs = self._wrap_args(*args, **kwargs)
   1797 result = matplotlib.axes.Axes.pcolormesh(self, *args, **kwargs)
   1798 # Wrap the quadrilaterals if necessary

File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:1825, in GeoAxes._wrap_args(self, *args, **kwargs)
   1823 X = np.asanyarray(args[0])
   1824 Y = np.asanyarray(args[1])
-> 1825 nrows, ncols = np.asanyarray(args[2]).shape
   1826 Nx = X.shape[-1]
   1827 Ny = Y.shape[0]

ValueError: not enough values to unpack (expected 2, got 1)
../../_images/user_guide_notebooks_data_nam_11_2.png
[29]:
ds = Herbie("2022-08-10", model="nam", product="hawaiinest.hiresf").xarray("TMP:2 m")
ds
✅ Found ┊ model=nam ┊ product=hawaiinest.hiresf ┊ 2022-Aug-10 00:00 UTC F00GRIB2 @ awsIDX @ aws
[29]:
<xarray.Dataset>
Dimensions:              (values: 72225)
Coordinates:
    time                 datetime64[ns] 2022-08-10
    step                 timedelta64[ns] 00:00:00
    heightAboveGround    float64 2.0
    latitude             (values) float64 18.07 18.07 18.07 ... 23.09 23.09
    longitude            (values) float64 198.5 198.5 198.5 ... 206.1 206.1
    valid_time           datetime64[ns] 2022-08-10
Dimensions without coordinates: values
Data variables:
    t2m                  (values) float32 299.8 299.8 299.8 ... 299.0 299.0
    gribfile_projection  object None
Attributes:
    GRIB_edition:            2
    GRIB_centre:             kwbc
    GRIB_centreDescription:  US National Weather Service - NCEP
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             US National Weather Service - NCEP
    model:                   nam
    product:                 hawaiinest.hiresf
    description:             North America Mesoscale - CONUS
    remote_grib:             https://noaa-nam-pds.s3.amazonaws.com/nam.202208...
    local_grib:              /p/cwfs/blaylock/data/nam/20220810/subset_93f271...
    searchString:            TMP:2 m
[35]:
plt.scatter(ds.longitude, ds.latitude, ds.t2m, c=ds.t2m, marker=".")
[35]:
<matplotlib.collections.PathCollection at 0x2b9d74366350>
../../_images/user_guide_notebooks_data_nam_13_1.png
[46]:
# NOTE: Weirdness with Puerto Rico not returning as a grid, but as a line

H, ds, ax = plot_product("priconest.hiresf")
✅ Found ┊ model=nam ┊ product=priconest.hiresf ┊ 2022-Aug-10 00:00 UTC F06GRIB2 @ awsIDX @ aws
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb Cell 16 in <cell line: 3>()
      <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=0'>1</a> # NOTE: Weirdness with Puerto Rico not returning as a grid, but as a line
----> <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=2'>3</a> H, ds, ax = plot_product('priconest.hiresf')

/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb Cell 16 in plot_product(product)
      <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=3'>4</a> ds = H.xarray("TMP:2 m above")
      <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=5'>6</a> ax = common_features("50m", crs=ds.herbie.crs, figsize=[8, 8]).STATES().ax
----> <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=6'>7</a> p = ax.pcolormesh(
      <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=7'>8</a>     ds.longitude, ds.latitude, ds.t2m, transform=pc, **cm_tmp(units="K").cmap_kwargs
      <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=8'>9</a> )
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=9'>10</a> plt.colorbar(
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=10'>11</a>     p, ax=ax, orientation="horizontal", pad=0.05, **cm_tmp(units="K").cbar_kwargs
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=11'>12</a> )
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=13'>14</a> ax.set_title(
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=14'>15</a>     f"{ds.model.upper()}: {H.product_description} ({product})\nValid: {ds.valid_time.dt.strftime('%H:%M UTC %d %b %Y').item()}",
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=15'>16</a>     loc="left",
     <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=16'>17</a> )

File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:318, in _add_transform.<locals>.wrapper(self, *args, **kwargs)
    313     raise ValueError(f'Invalid transform: Spherical {func.__name__} '
    314                      'is not supported - consider using '
    315                      'PlateCarree/RotatedPole.')
    317 kwargs['transform'] = transform
--> 318 return func(self, *args, **kwargs)

File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:1796, in GeoAxes.pcolormesh(self, *args, **kwargs)
   1785 """
   1786 Add the "transform" keyword to :func:`~matplotlib.pyplot.pcolormesh`.
   1787
   (...)
   1792
   1793 """
   1794 # Add in an argument checker to handle Matplotlib's potential
   1795 # interpolation when coordinate wraps are involved
-> 1796 args, kwargs = self._wrap_args(*args, **kwargs)
   1797 result = matplotlib.axes.Axes.pcolormesh(self, *args, **kwargs)
   1798 # Wrap the quadrilaterals if necessary

File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:1825, in GeoAxes._wrap_args(self, *args, **kwargs)
   1823 X = np.asanyarray(args[0])
   1824 Y = np.asanyarray(args[1])
-> 1825 nrows, ncols = np.asanyarray(args[2]).shape
   1826 Nx = X.shape[-1]
   1827 Ny = Y.shape[0]

ValueError: not enough values to unpack (expected 2, got 1)
../../_images/user_guide_notebooks_data_nam_14_2.png
[43]:
ds = Herbie("2022-08-10", model="nam", product="priconest.hiresf").xarray(
    "TMP:2 m above"
)
ds
✅ Found ┊ model=nam ┊ product=priconest.hiresf ┊ 2022-Aug-10 00:00 UTC F00GRIB2 @ awsIDX @ aws
[43]:
<xarray.Dataset>
Dimensions:              (values: 168640)
Coordinates:
    time                 datetime64[ns] 2022-08-10
    step                 timedelta64[ns] 00:00:00
    heightAboveGround    float64 2.0
    latitude             (values) float64 15.0 15.0 15.0 ... 22.01 22.01 22.01
    longitude            (values) float64 284.5 284.5 284.5 ... 297.5 297.5
    valid_time           datetime64[ns] 2022-08-10
Dimensions without coordinates: values
Data variables:
    t2m                  (values) float32 nan nan nan nan ... nan nan nan nan
    gribfile_projection  object None
Attributes:
    GRIB_edition:            2
    GRIB_centre:             kwbc
    GRIB_centreDescription:  US National Weather Service - NCEP
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             US National Weather Service - NCEP
    model:                   nam
    product:                 priconest.hiresf
    description:             North America Mesoscale - CONUS
    remote_grib:             https://noaa-nam-pds.s3.amazonaws.com/nam.202208...
    local_grib:              /p/cwfs/blaylock/data/nam/20220810/subset_93f271...
    searchString:            TMP:2 m above
[47]:
H, ds, ax = plot_product("afwaca")
✅ Found ┊ model=nam ┊ product=afwaca ┊ 2022-Aug-10 00:00 UTC F06GRIB2 @ awsIDX @ aws
../../_images/user_guide_notebooks_data_nam_16_1.png
[ ]: