{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "view-in-github"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/purpal9/RF_FRP_v1/blob/main/Copy_of_final_of_ML_for_FRP_Modeling.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0d70R-p3Eie0",
        "outputId": "145797f6-4a41-4252-ef98-8e45baee1254"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Once deleted, variables cannot be recovered. Proceed (y/[n])? y\n"
          ]
        }
      ],
      "source": [
        "%reset"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EqcGiC95DJ3T"
      },
      "source": [
        "# Machine Learning for Fire Radiative Power Modeling\n",
        "\n",
        "- Creators: Christina Kumler<sup>1,2</sup>\n",
        "- Affiliation:\n",
        "    - <sup>1</sup>Cooperative Institute for Research in Environmental Sciences at the University of Colorado Boulder (CIRES), Boulder, CO\n",
        "    - <sup>2</sup>NOAA/OAR Global Systems Laboratory (GSL), Boulder, CO\n",
        "- History:\n",
        "    - January 22nd, 2025: Initial learning journey based on version from Fall 2023 -- Spring 2024\n",
        "---\n",
        "\n",
        "## Overview\n",
        "\n",
        "Welcome to the machine learning (ML) for Fire Radiative Power (FRP) notebook! In this two-part notebook, we will explore how to train a ML model called a Random Forest (RF) to model FRP one hour into the future. This notebook has several sections and two main parts. In the Environment Part 0, we will import all the necessary environments to run through the notebook.\n",
        "\n",
        "In Part 1, we will go through a small example to learn how to obtain the input files used to create a machine learning ready (ML-ready) dataset, and how to process the data into a dataset. This is the section that shows the process for developing the dataset, but to keep the notebook simple, this is not the dataset that will be used in part 2 when we learn how to train and test a RF model.\n",
        "\n",
        "In Part 2, we begin by importing a pre-processed, ML-ready dataset. Then, we will go through the steps on how to train and test a RF model to predict hourly FRP. After, we will demonstrate some package options for analyzing your RF model's performance.\n",
        "\n",
        "If you are interested in using a pre-processed dataset to train RF models, please run through section 0 and then skip forward to section 2.\n",
        "\n",
        "### Learning Outcomes\n",
        "By the end of this tutorial, you will have:\n",
        "* learned how to pull RAP data using Herbie\n",
        "* import RAVE data\n",
        "* process data into an ML-ready dataset.\n",
        "\n",
        "Additionally, you will have learned how to:\n",
        "* use that ML-ready dataset in practice to train a RF model\n",
        "* visualize the performance of that model.\n",
        "\n",
        "### Prerequisites\n",
        "This is considered a beginner to intermediate notebook for Python-based machine learning. It is helpful to have basic functioning knowledge of the python programming language. This includes using DataFrames. To learn more about any of the tools or more specifics on the machine learning methods in this notebook, please visit the provided references.\n",
        "\n",
        "## Background\n",
        "FRP detection of wildland fires is important in calculating a variety of variables, such as smoke emissions, which are necessary for fire weather and air quality simulations. FRP is derived from satellite observations of radiative energy emitted by fires. Modeling FRP into the future has impacts on fire behavior as well as aerosols and smoke modeling. There are challenges to modeling this in real-time, including both missed and false detections as well as errors in retrievals. Satellite scanning angles and resolutions, smoke plumes, and clouds can cause additional challenges. To use satellite data in modeling applications, typically averages over previous FRP instead of continuous FRP are used as inputs. To help provide more continuous FRP forecasts, modeling methods can be applied to previously observed satellite FRP. For this notebook, we look to model hourly FRP from previously observed satellite data combined with numerical weather model inputs.\n",
        "\n",
        "## Time Estimates\n",
        "- Estimated text reading time: 15 to 30 min\n",
        "- Estimated code reading time: 12 to 23 min\n",
        "- Estimated total reading time: 27 to 53 min\n",
        "\n",
        "Enjoy!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6EIFV3CkNfz5"
      },
      "source": [
        "# 0.1 Setting up a python environment\n",
        "\n",
        "**In this section, we will import some necessary tools to set up an environment that can download relevant input data, perform data analysis and processing steps, and train RF ML models. Because we are working in a Jupyter notebook, the environment and resources stay connected to this environment and will not impact your local machine. To the left of the notebook, you will find the toolbar that shows the layout of the notebook, a list of current variables, and any additional files contained in the notebook. Note, you should always practice caution when installing packages or tools onto a local machine, as version mismatches can sometimes impact previously developed code. Always practice good code and environment management.**"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "sirE4SusEOTs"
      },
      "source": [
        "The following will install wget, a useful tool for \"getting\" data stored on an internet server by pointing to its location and downloading it to this notebook. This is done directly from python with the following code. In this notebook, we will install each package step by step, however in this first example for `wget`, a loop is provided so that this can be used in other applications with one or multiple packages."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "CMw4NfdRdB30"
      },
      "outputs": [],
      "source": [
        "# sys provides access to system level information (i.e., the executable for the Python installation)\n",
        "import sys\n",
        "# subprocess makes system level calls\n",
        "import subprocess\n",
        "\n",
        "# PACKAGES is a list of non-standard library, scientific packages to install.\n",
        "# Note that packages should be pip installable\n",
        "PACKAGES = [\"wget\"]\n",
        "\n",
        "# Loop through each package to either import or install\n",
        "for package in PACKAGES:\n",
        "    try:\n",
        "        # First, attempt to import the package\n",
        "        __import__(package)\n",
        "    except ImportError:\n",
        "        # If package import is unsuccessful, install using pip\n",
        "        # The command structure is <python executable> -m pip install <package>\n",
        "        subprocess.check_call([sys.executable, '-m', 'pip', 'install', package])\n",
        "\n",
        "import wget"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "tEYwSgvqdG-t"
      },
      "source": [
        "Next, we check that things installed correctly"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ACeGewUtdLXP",
        "outputId": "120efd31-4c7f-4d82-c2bf-0262dc20b680"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "/usr/bin/python3\n"
          ]
        }
      ],
      "source": [
        "import sys\n",
        "print(sys.executable)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "bKe25h91dWet"
      },
      "source": [
        "Once we have confirmed that things installed correctly, we will install a tool developed for pulling a variety of weather model outputs called: HERBIE. The source code, documentation, and tutorials can be found here: [HERBIE](https://herbie.readthedocs.io/en/stable/user_guide/index.html). In section 1.1.2 we will practice using HERBIE to extract RAP files and store variables into datasets and xarrays. This is the documentation that will be referenced and can also be found in the references section at the end of the notebook.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "TC45yAMVDEl4",
        "outputId": "de0baada-9fd4-44cc-8bab-87a0b041673f"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0"
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "HERBIE_pack = 'git+https://github.com/blaylockbk/Carpenter_Workshop.git'\n",
        "subprocess.check_call([sys.executable, '-m', 'pip', 'install', HERBIE_pack])\n",
        "\n",
        "subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'ecmwflibs'])\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0mpPbZvtgav8",
        "outputId": "3d51a039-be2a-44d5-adf4-58fb7836f560"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Collecting herbie-data\n",
            "  Downloading herbie_data-2024.8.0-py3-none-any.whl.metadata (16 kB)\n",
            "Collecting cfgrib (from herbie-data)\n",
            "  Downloading cfgrib-0.9.14.0-py3-none-any.whl.metadata (54 kB)\n",
            "\u001b[?25l     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/55.0 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m55.0/55.0 kB\u001b[0m \u001b[31m4.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from herbie-data) (1.26.4)\n",
            "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from herbie-data) (2.1.4)\n",
            "Collecting pygrib (from herbie-data)\n",
            "  Downloading pygrib-2.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.8 kB)\n",
            "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from herbie-data) (2.32.3)\n",
            "Requirement already satisfied: toml in /usr/local/lib/python3.10/dist-packages (from herbie-data) (0.10.2)\n",
            "Requirement already satisfied: xarray in /usr/local/lib/python3.10/dist-packages (from herbie-data) (2024.6.0)\n",
            "Requirement already satisfied: attrs>=19.2 in /usr/local/lib/python3.10/dist-packages (from cfgrib->herbie-data) (24.2.0)\n",
            "Requirement already satisfied: click in /usr/local/lib/python3.10/dist-packages (from cfgrib->herbie-data) (8.1.7)\n",
            "Collecting eccodes>=0.9.8 (from cfgrib->herbie-data)\n",
            "  Downloading eccodes-1.7.1-py3-none-any.whl.metadata (10 kB)\n",
            "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->herbie-data) (2.8.2)\n",
            "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->herbie-data) (2024.1)\n",
            "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas->herbie-data) (2024.1)\n",
            "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from pygrib->herbie-data) (24.1)\n",
            "Requirement already satisfied: pyproj in /usr/local/lib/python3.10/dist-packages (from pygrib->herbie-data) (3.6.1)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->herbie-data) (3.3.2)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->herbie-data) (3.7)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->herbie-data) (2.0.7)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->herbie-data) (2024.7.4)\n",
            "Requirement already satisfied: cffi in /usr/local/lib/python3.10/dist-packages (from eccodes>=0.9.8->cfgrib->herbie-data) (1.17.0)\n",
            "Requirement already satisfied: findlibs in /usr/local/lib/python3.10/dist-packages (from eccodes>=0.9.8->cfgrib->herbie-data) (0.0.5)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->herbie-data) (1.16.0)\n",
            "Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi->eccodes>=0.9.8->cfgrib->herbie-data) (2.22)\n",
            "Downloading herbie_data-2024.8.0-py3-none-any.whl (100 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m101.0/101.0 kB\u001b[0m \u001b[31m10.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading cfgrib-0.9.14.0-py3-none-any.whl (48 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.6/48.6 kB\u001b[0m \u001b[31m4.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading pygrib-2.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.6 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m18.6/18.6 MB\u001b[0m \u001b[31m66.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading eccodes-1.7.1-py3-none-any.whl (41 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m41.3/41.3 kB\u001b[0m \u001b[31m3.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hInstalling collected packages: pygrib, eccodes, cfgrib, herbie-data\n",
            "Successfully installed cfgrib-0.9.14.0 eccodes-1.7.1 herbie-data-2024.8.0 pygrib-2.1.6\n"
          ]
        }
      ],
      "source": [
        "subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'herbie-data'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rrdu1s31QZJk"
      },
      "source": [
        "We will install one last python tool in this section for reading data that is collected in a specific format called NetCDF."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "8w1n3RK7io33",
        "outputId": "9d80c5a1-8de1-41b5-ce20-475ac52e7826"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'netCDF4'])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "3PSwsZPRKNlZ",
        "outputId": "e502427c-49ff-4252-dd9f-6047260029e7"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0"
            ]
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'xarray[complete]'])\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "TqJwFLEHeJnm",
        "outputId": "abcd8bbb-ff8b-48b3-e39f-3a58b1bb4510"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0"
            ]
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'cfgrib'])\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7j4O5lRiNwak"
      },
      "source": [
        "# 1.1 Importing desired data\n",
        "\n",
        "**In this section, we set up the code that gets the desired variable inputs. It is important to note that should you desire to train your own machine learning model, and later use this model in your own applications, which is referred to as _inference_ , then you will need to pull as much data as possible and keep the data inputs consistent.**\n",
        "\n",
        "**We will be extracting two types of data here. The first is the input data from the RAP weather model. These files are very large, so this code is designed to extract specific variables from the full RAP files. If you desire additional variables, please reference RAP's material to identify the variable names. The second data were are inputting is label for our ML model, which is the RAVE fire radiative power (FRP) data.**\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "trSZh48Yiq3F"
      },
      "source": [
        "1.1.1 Here we pull the RAVE data [Fangjun Li et al.] as our satellite FRP data source. While RAVE is fully operational, there is no online portal for making data requests or pulls. In this tutorial, we will collect a sample daily RAVE data file, from Zenodo, by using a wget command."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "j3rd4RjDCjKw"
      },
      "outputs": [],
      "source": [
        "RAVE_nc = wget.download('https://zenodo.org/records/10694507/files/RAVE-HrlyEmiss-3km_v2r0_blend_s202209010000000_e202209012359590_c202308071356470.nc?download=1')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "b9gFiJd4ffwY"
      },
      "source": [
        "In this notebook, we will be making a an example dataset that includes 2 hours of data. Since RAVE is stored in a daily netcdf file, we only need to read one file into the colab space. We will save this file into python using an extension called netCDF4. To learn more about the netcdf file structure, please visit: https://www.unidata.ucar.edu/software/netcdf/"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ehsXUonhR8vB",
        "outputId": "5c4637df-6c87-43f4-de36-e32f438f8b5f"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "opened RAVE file\n"
          ]
        }
      ],
      "source": [
        "import netCDF4 as nc\n",
        "\n",
        "rave_data = nc.Dataset(RAVE_nc)\n",
        "print ('opened RAVE file')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NgnbHeRd3LcM"
      },
      "source": [
        "Congratulations! We have successfully pulled a daily RAVE data file and stored it into our notebook space as \"rave_data\" which can be referenced later as we process our own miniature RF-ready dataset. If you'd like to see where the RAVE file went, you can look at the left of the Jupyter notebook and click the **folder icon** and see that the file now is saved into the Jupyter notebook space."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "OFSWt8LACrMR"
      },
      "source": [
        "1.1.2 Next, we use HERBIE in the processing script to access the RAP data. Note that documentation specific to HERBIE can be found in the previous section 0.1 as well as in the reference section at the end of the notebook. RAP data is fairly messy, with having different naming conventions and products, etc. HERBIE is a very useful tool at helping navigate some of these nuances. When building your own training dataset, be sure to know what input data you are using, if they change with model updates, if their naming changes, if they are not available on the time scale you need them, etc.\n",
        "\n",
        "There are two ways to use HERBIE. First, we could use HERBIE to save the raw RAP file into a working or subdirectory. However, this tutorial will use HERBIE to access the RAP data in a HERBIA object, which means we will never actually have to save and reopen the RAP data. We could download the whole RAP file to the notebook using a different method, referenced in section 1.1.3.\n",
        "\n",
        "Below is an example of how this will look later in the notebook. We are going to grab a single file for our date of interest: September 1, 2022.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "KmxTcEI3infm",
        "outputId": "be7761b7-0db4-4e48-eec1-b47106331944"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " ╭─\u001b[48;2;255;255;255m\u001b[38;2;136;33;27m▌\u001b[0m\u001b[38;2;12;53;118m\u001b[48;2;240;234;210m▌\u001b[38;2;0;0;0m\u001b[1mHerbie\u001b[0m─────────────────────────────────────────────╮\n",
            " │ INFO: Created a default config file.                 │\n",
            " │ You may view/edit Herbie's configuration here:       │\n",
            " │ \u001b[38;2;255;153;0m         /root/.config/herbie/config.toml         \u001b[0m   │\n",
            " ╰──────────────────────────────────────────────────────╯\n",
            "\n"
          ]
        }
      ],
      "source": [
        "from herbie import Herbie\n",
        "from toolbox import EasyMap, pc\n",
        "from paint.standard2 import cm_tmp\n",
        "import pandas as pd\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "import cartopy.crs as ccrs\n",
        "import xarray as xr"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LQ20sZ2rvTYS"
      },
      "source": [
        "Below is the code where HERBIE grabs a desired RAP file, based on initialization time and forecast hour. Certain variables are available in certain products, so please reference HERBIE's page on directions that explain the different models and products. We are interested in temperature, wind gust, and vegetation type. These are contained in two different products, so we read in both products into two HERBIE objects. In this example, we are using HERBIE to grab the RAP model output from Jan 1 2024 at 6UTC at the 0 forecast hour.\n",
        "\n",
        "For each model product, which is explained in the next text block, we save a HERBIE object, both H and G in this instance. From that object, we read the desired variables into xarray datasets."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "UP2bxem6yH5Q",
        "outputId": "b9e2254b-9c04-4704-e24f-95f651ec7b4e"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "✅ Found ┊ model=rap ┊ \u001b[3mproduct=awp130pgrb\u001b[0m ┊ \u001b[38;2;41;130;13m2024-Jan-01 06:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mGRIB2 @ aws\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mIDX @ aws\u001b[0m\n",
            "👨🏻‍🏭 Created directory: [/root/data/rap/20240101]\n",
            "Note: Returning a list of [3] xarray.Datasets because cfgrib opened with multiple hypercubes.\n",
            "H looks like:  ║HERBIE╠ RAP:awp130pgrb\n",
            "ds looks like:  [<xarray.Dataset> Size: 4MB\n",
            "Dimensions:              (y: 337, x: 451)\n",
            "Coordinates:\n",
            "    time                 datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    step                 timedelta64[ns] 8B 00:00:00\n",
            "    heightAboveGround    float64 8B 10.0\n",
            "    latitude             (y, x) float64 1MB 16.28 16.31 16.34 ... 55.51 55.48\n",
            "    longitude            (y, x) float64 1MB 233.9 234.0 234.1 ... 302.4 302.6\n",
            "    valid_time           datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    gribfile_projection  object 8B None\n",
            "Dimensions without coordinates: y, x\n",
            "Data variables:\n",
            "    u10                  (y, x) float32 608kB -6.786 -6.974 ... 12.71 12.15\n",
            "    v10                  (y, x) float32 608kB -4.955 -5.08 ... -4.455 -4.768\n",
            "Attributes:\n",
            "    GRIB_edition:            2\n",
            "    GRIB_centre:             kwbc\n",
            "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
            "    GRIB_subCentre:          0\n",
            "    Conventions:             CF-1.7\n",
            "    institution:             US National Weather Service - NCEP\n",
            "    model:                   rap\n",
            "    product:                 awp130pgrb\n",
            "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
            "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
            "    local_grib:              /root/data/rap/20240101/subset_33ef7551__rap.t06...\n",
            "    search:                  (?:TMP:2 m|GRD:10 m|DPT:2 m|GUST|RH: 2 m), <xarray.Dataset> Size: 4MB\n",
            "Dimensions:              (y: 337, x: 451)\n",
            "Coordinates:\n",
            "    time                 datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    step                 timedelta64[ns] 8B 00:00:00\n",
            "    heightAboveGround    float64 8B 2.0\n",
            "    latitude             (y, x) float64 1MB 16.28 16.31 16.34 ... 55.51 55.48\n",
            "    longitude            (y, x) float64 1MB 233.9 234.0 234.1 ... 302.4 302.6\n",
            "    valid_time           datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    gribfile_projection  object 8B None\n",
            "Dimensions without coordinates: y, x\n",
            "Data variables:\n",
            "    t2m                  (y, x) float32 608kB 297.1 296.9 296.8 ... 271.0 271.2\n",
            "    d2m                  (y, x) float32 608kB 292.1 292.5 292.7 ... 268.6 268.8\n",
            "Attributes:\n",
            "    GRIB_edition:            2\n",
            "    GRIB_centre:             kwbc\n",
            "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
            "    GRIB_subCentre:          0\n",
            "    Conventions:             CF-1.7\n",
            "    institution:             US National Weather Service - NCEP\n",
            "    model:                   rap\n",
            "    product:                 awp130pgrb\n",
            "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
            "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
            "    local_grib:              /root/data/rap/20240101/subset_33ef7551__rap.t06...\n",
            "    search:                  (?:TMP:2 m|GRD:10 m|DPT:2 m|GUST|RH: 2 m), <xarray.Dataset> Size: 3MB\n",
            "Dimensions:              (y: 337, x: 451)\n",
            "Coordinates:\n",
            "    time                 datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    step                 timedelta64[ns] 8B 00:00:00\n",
            "    surface              float64 8B 0.0\n",
            "    latitude             (y, x) float64 1MB 16.28 16.31 16.34 ... 55.51 55.48\n",
            "    longitude            (y, x) float64 1MB 233.9 234.0 234.1 ... 302.4 302.6\n",
            "    valid_time           datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    gribfile_projection  object 8B None\n",
            "Dimensions without coordinates: y, x\n",
            "Data variables:\n",
            "    gust                 (y, x) float32 608kB 8.732 8.982 9.044 ... 15.86 15.36\n",
            "Attributes:\n",
            "    GRIB_edition:            2\n",
            "    GRIB_centre:             kwbc\n",
            "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
            "    GRIB_subCentre:          0\n",
            "    Conventions:             CF-1.7\n",
            "    institution:             US National Weather Service - NCEP\n",
            "    model:                   rap\n",
            "    product:                 awp130pgrb\n",
            "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
            "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
            "    local_grib:              /root/data/rap/20240101/subset_33ef7551__rap.t06...\n",
            "    search:                  (?:TMP:2 m|GRD:10 m|DPT:2 m|GUST|RH: 2 m)]\n",
            "ds1 looks like:  <xarray.Dataset> Size: 4MB\n",
            "Dimensions:              (y: 337, x: 451)\n",
            "Coordinates:\n",
            "    time                 datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    step                 timedelta64[ns] 8B 00:00:00\n",
            "    heightAboveGround    float64 8B 2.0\n",
            "    latitude             (y, x) float64 1MB 16.28 16.31 16.34 ... 55.51 55.48\n",
            "    longitude            (y, x) float64 1MB 233.9 234.0 234.1 ... 302.4 302.6\n",
            "    valid_time           datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    gribfile_projection  object 8B None\n",
            "Dimensions without coordinates: y, x\n",
            "Data variables:\n",
            "    t2m                  (y, x) float32 608kB 297.1 296.9 296.8 ... 271.0 271.2\n",
            "    r2                   (y, x) float32 608kB 74.85 76.85 78.85 ... 85.85 84.85\n",
            "Attributes:\n",
            "    GRIB_edition:            2\n",
            "    GRIB_centre:             kwbc\n",
            "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
            "    GRIB_subCentre:          0\n",
            "    Conventions:             CF-1.7\n",
            "    institution:             US National Weather Service - NCEP\n",
            "    model:                   rap\n",
            "    product:                 awp130pgrb\n",
            "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
            "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
            "    local_grib:              /root/data/rap/20240101/subset_33ef968c__rap.t06...\n",
            "    search:                  :(?:TMP|RH):2 m\n",
            "ds2 looks like:  <xarray.Dataset> Size: 3MB\n",
            "Dimensions:              (y: 337, x: 451)\n",
            "Coordinates:\n",
            "    time                 datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    step                 timedelta64[ns] 8B 00:00:00\n",
            "    surface              float64 8B 0.0\n",
            "    latitude             (y, x) float64 1MB 16.28 16.31 16.34 ... 55.51 55.48\n",
            "    longitude            (y, x) float64 1MB 233.9 234.0 234.1 ... 302.4 302.6\n",
            "    valid_time           datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    gribfile_projection  object 8B None\n",
            "Dimensions without coordinates: y, x\n",
            "Data variables:\n",
            "    gust                 (y, x) float32 608kB 8.732 8.982 9.044 ... 15.86 15.36\n",
            "Attributes:\n",
            "    GRIB_edition:            2\n",
            "    GRIB_centre:             kwbc\n",
            "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
            "    GRIB_subCentre:          0\n",
            "    Conventions:             CF-1.7\n",
            "    institution:             US National Weather Service - NCEP\n",
            "    model:                   rap\n",
            "    product:                 awp130pgrb\n",
            "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
            "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
            "    local_grib:              /root/data/rap/20240101/subset_33ef56d5__rap.t06...\n",
            "    search:                  GUST\n",
            "ds3 looks like:  <xarray.Dataset> Size: 3MB\n",
            "Dimensions:              (y: 337, x: 451)\n",
            "Coordinates:\n",
            "    time                 datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    step                 timedelta64[ns] 8B 00:00:00\n",
            "    heightAboveGround    float64 8B 2.0\n",
            "    latitude             (y, x) float64 1MB 16.28 16.31 16.34 ... 55.51 55.48\n",
            "    longitude            (y, x) float64 1MB 233.9 234.0 234.1 ... 302.4 302.6\n",
            "    valid_time           datetime64[ns] 8B 2024-01-01T06:00:00\n",
            "    gribfile_projection  object 8B None\n",
            "Dimensions without coordinates: y, x\n",
            "Data variables:\n",
            "    d2m                  (y, x) float32 608kB 292.1 292.5 292.7 ... 268.6 268.8\n",
            "Attributes:\n",
            "    GRIB_edition:            2\n",
            "    GRIB_centre:             kwbc\n",
            "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
            "    GRIB_subCentre:          0\n",
            "    Conventions:             CF-1.7\n",
            "    institution:             US National Weather Service - NCEP\n",
            "    model:                   rap\n",
            "    product:                 awp130pgrb\n",
            "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
            "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
            "    local_grib:              /root/data/rap/20240101/subset_33ef73c2__rap.t06...\n",
            "    search:                  DPT:2 m\n",
            "✅ Found ┊ model=rap ┊ \u001b[3mproduct=awp130bgrb\u001b[0m ┊ \u001b[38;2;41;130;13m2024-Jan-01 06:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mGRIB2 @ aws\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mIDX @ aws\u001b[0m\n"
          ]
        }
      ],
      "source": [
        "#Create a Herbie object for specified date, model, and forecast\n",
        "H = Herbie(\"2024-01-01 06:00\", model=\"rap\", fxx=0)\n",
        "# store desired variables into a list containing multiple datasets\n",
        "ds = H.xarray(\"(?:TMP:2 m|GRD:10 m|DPT:2 m|GUST|RH: 2 m)\")\n",
        "# OR store desired variables into multiple datasets by like variables\n",
        "ds1 = H.xarray(\":(?:TMP|RH):2 m\")\n",
        "ds2 = H.xarray(\"GUST\")\n",
        "ds3 = H.xarray(\"DPT:2 m\")\n",
        "print(\"HERBIE object H: \", H)\n",
        "\n",
        "G = Herbie(\"2024-01-01 06:00\", model=\"rap\", fxx=0, product=\"awp130bgrb\")\n",
        "dg = G.xarray(\"(?:SOIL|TOSIL)\")\n",
        "print(\"HERBIE object G: \", G)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4DB3f5TayXi5"
      },
      "source": [
        "Above, we read in two RAP files, H and G, separately. This is because different variables are stored in different RAP files. The following will show all product options for RAP. Not all products contain the desired variables. We can see the \"awp130bgrb\" product listed here. To learn more about model products and how to list variables contained in each, please reference the HERBIE documentation.\n",
        "\n",
        "For this tutorial, we are interested in some near-ground level weather variables, stored in HERBIE object H, as well as soil information, which is contained in a separate RAP product and for which we have created a second G object."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "LUFTvJ5Qix_c",
        "outputId": "66de7638-116e-4cef-a128-5e9766fc4c40"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'awp130pgrb': 'CONUS Pressure levels; 13-km resolution',\n",
              " 'awp252pgrb': 'CONUS Pressure levels; 20-km resolution',\n",
              " 'awp236pgrb': 'CONUS Pressure levels; 40-km resolution',\n",
              " 'awp130bgrb': 'CONUS Native levels; 13-km resolution',\n",
              " 'awp252bgrb': 'CONUS Native levels; 20-km resolution',\n",
              " 'wrfprs': 'Full domain Pressure Levels; 13-km',\n",
              " 'wrfnat': 'Full domain Native Levels; 13-km',\n",
              " 'awip32': 'NOAMHI - High-Resolution North American Master Grid; 32-km resolution',\n",
              " 'awp242': 'Alaska Quadruple Resolution Pressure levels; 11-km resolution',\n",
              " 'awp200': 'Puerto Rico Pressure levels; 16-km resolution',\n",
              " 'awp243': 'Eastern North America Pressure levels, 0.4 degree resolution',\n",
              " 'wrfmsl': 'WRFMSL; 13-km resolution'}"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "H.PRODUCTS"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yegxecGrygog"
      },
      "source": [
        "You might have noticed the two different ways in which we saved desired variables into datasets. Either a lumped dataset object list, ds, or separate like-variables into their own datasets. Below we will look at the difference in output between these methods. For the multiple datasets method, note the names of the data variables, since this will be used in our data processing section."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 375
        },
        "id": "P46aBkQGqPbw",
        "outputId": "b7952dcb-9fe4-45f2-8faa-8f6547ac2478"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
              "<defs>\n",
              "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
              "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
              "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
              "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
              "</symbol>\n",
              "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
              "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
              "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "</symbol>\n",
              "</defs>\n",
              "</svg>\n",
              "<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
              " *\n",
              " */\n",
              "\n",
              ":root {\n",
              "  --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
              "  --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
              "  --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
              "  --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
              "  --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
              "  --xr-background-color: var(--jp-layout-color0, white);\n",
              "  --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
              "  --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
              "}\n",
              "\n",
              "html[theme=dark],\n",
              "body[data-theme=dark],\n",
              "body.vscode-dark {\n",
              "  --xr-font-color0: rgba(255, 255, 255, 1);\n",
              "  --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
              "  --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
              "  --xr-border-color: #1F1F1F;\n",
              "  --xr-disabled-color: #515151;\n",
              "  --xr-background-color: #111111;\n",
              "  --xr-background-color-row-even: #111111;\n",
              "  --xr-background-color-row-odd: #313131;\n",
              "}\n",
              "\n",
              ".xr-wrap {\n",
              "  display: block !important;\n",
              "  min-width: 300px;\n",
              "  max-width: 700px;\n",
              "}\n",
              "\n",
              ".xr-text-repr-fallback {\n",
              "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-header {\n",
              "  padding-top: 6px;\n",
              "  padding-bottom: 6px;\n",
              "  margin-bottom: 4px;\n",
              "  border-bottom: solid 1px var(--xr-border-color);\n",
              "}\n",
              "\n",
              ".xr-header > div,\n",
              ".xr-header > ul {\n",
              "  display: inline;\n",
              "  margin-top: 0;\n",
              "  margin-bottom: 0;\n",
              "}\n",
              "\n",
              ".xr-obj-type,\n",
              ".xr-array-name {\n",
              "  margin-left: 2px;\n",
              "  margin-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-obj-type {\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-sections {\n",
              "  padding-left: 0 !important;\n",
              "  display: grid;\n",
              "  grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
              "}\n",
              "\n",
              ".xr-section-item {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-section-item input {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-section-item input + label {\n",
              "  color: var(--xr-disabled-color);\n",
              "}\n",
              "\n",
              ".xr-section-item input:enabled + label {\n",
              "  cursor: pointer;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-section-item input:enabled + label:hover {\n",
              "  color: var(--xr-font-color0);\n",
              "}\n",
              "\n",
              ".xr-section-summary {\n",
              "  grid-column: 1;\n",
              "  color: var(--xr-font-color2);\n",
              "  font-weight: 500;\n",
              "}\n",
              "\n",
              ".xr-section-summary > span {\n",
              "  display: inline-block;\n",
              "  padding-left: 0.5em;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:disabled + label {\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-section-summary-in + label:before {\n",
              "  display: inline-block;\n",
              "  content: '►';\n",
              "  font-size: 11px;\n",
              "  width: 15px;\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:disabled + label:before {\n",
              "  color: var(--xr-disabled-color);\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked + label:before {\n",
              "  content: '▼';\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked + label > span {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-section-summary,\n",
              ".xr-section-inline-details {\n",
              "  padding-top: 4px;\n",
              "  padding-bottom: 4px;\n",
              "}\n",
              "\n",
              ".xr-section-inline-details {\n",
              "  grid-column: 2 / -1;\n",
              "}\n",
              "\n",
              ".xr-section-details {\n",
              "  display: none;\n",
              "  grid-column: 1 / -1;\n",
              "  margin-bottom: 5px;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked ~ .xr-section-details {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-array-wrap {\n",
              "  grid-column: 1 / -1;\n",
              "  display: grid;\n",
              "  grid-template-columns: 20px auto;\n",
              "}\n",
              "\n",
              ".xr-array-wrap > label {\n",
              "  grid-column: 1;\n",
              "  vertical-align: top;\n",
              "}\n",
              "\n",
              ".xr-preview {\n",
              "  color: var(--xr-font-color3);\n",
              "}\n",
              "\n",
              ".xr-array-preview,\n",
              ".xr-array-data {\n",
              "  padding: 0 5px !important;\n",
              "  grid-column: 2;\n",
              "}\n",
              "\n",
              ".xr-array-data,\n",
              ".xr-array-in:checked ~ .xr-array-preview {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-array-in:checked ~ .xr-array-data,\n",
              ".xr-array-preview {\n",
              "  display: inline-block;\n",
              "}\n",
              "\n",
              ".xr-dim-list {\n",
              "  display: inline-block !important;\n",
              "  list-style: none;\n",
              "  padding: 0 !important;\n",
              "  margin: 0;\n",
              "}\n",
              "\n",
              ".xr-dim-list li {\n",
              "  display: inline-block;\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "}\n",
              "\n",
              ".xr-dim-list:before {\n",
              "  content: '(';\n",
              "}\n",
              "\n",
              ".xr-dim-list:after {\n",
              "  content: ')';\n",
              "}\n",
              "\n",
              ".xr-dim-list li:not(:last-child):after {\n",
              "  content: ',';\n",
              "  padding-right: 5px;\n",
              "}\n",
              "\n",
              ".xr-has-index {\n",
              "  font-weight: bold;\n",
              "}\n",
              "\n",
              ".xr-var-list,\n",
              ".xr-var-item {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-var-item > div,\n",
              ".xr-var-item label,\n",
              ".xr-var-item > .xr-var-name span {\n",
              "  background-color: var(--xr-background-color-row-even);\n",
              "  margin-bottom: 0;\n",
              "}\n",
              "\n",
              ".xr-var-item > .xr-var-name:hover span {\n",
              "  padding-right: 5px;\n",
              "}\n",
              "\n",
              ".xr-var-list > li:nth-child(odd) > div,\n",
              ".xr-var-list > li:nth-child(odd) > label,\n",
              ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
              "  background-color: var(--xr-background-color-row-odd);\n",
              "}\n",
              "\n",
              ".xr-var-name {\n",
              "  grid-column: 1;\n",
              "}\n",
              "\n",
              ".xr-var-dims {\n",
              "  grid-column: 2;\n",
              "}\n",
              "\n",
              ".xr-var-dtype {\n",
              "  grid-column: 3;\n",
              "  text-align: right;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-var-preview {\n",
              "  grid-column: 4;\n",
              "}\n",
              "\n",
              ".xr-index-preview {\n",
              "  grid-column: 2 / 5;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-var-name,\n",
              ".xr-var-dims,\n",
              ".xr-var-dtype,\n",
              ".xr-preview,\n",
              ".xr-attrs dt {\n",
              "  white-space: nowrap;\n",
              "  overflow: hidden;\n",
              "  text-overflow: ellipsis;\n",
              "  padding-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-var-name:hover,\n",
              ".xr-var-dims:hover,\n",
              ".xr-var-dtype:hover,\n",
              ".xr-attrs dt:hover {\n",
              "  overflow: visible;\n",
              "  width: auto;\n",
              "  z-index: 1;\n",
              "}\n",
              "\n",
              ".xr-var-attrs,\n",
              ".xr-var-data,\n",
              ".xr-index-data {\n",
              "  display: none;\n",
              "  background-color: var(--xr-background-color) !important;\n",
              "  padding-bottom: 5px !important;\n",
              "}\n",
              "\n",
              ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
              ".xr-var-data-in:checked ~ .xr-var-data,\n",
              ".xr-index-data-in:checked ~ .xr-index-data {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              ".xr-var-data > table {\n",
              "  float: right;\n",
              "}\n",
              "\n",
              ".xr-var-name span,\n",
              ".xr-var-data,\n",
              ".xr-index-name div,\n",
              ".xr-index-data,\n",
              ".xr-attrs {\n",
              "  padding-left: 25px !important;\n",
              "}\n",
              "\n",
              ".xr-attrs,\n",
              ".xr-var-attrs,\n",
              ".xr-var-data,\n",
              ".xr-index-data {\n",
              "  grid-column: 1 / -1;\n",
              "}\n",
              "\n",
              "dl.xr-attrs {\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "  display: grid;\n",
              "  grid-template-columns: 125px auto;\n",
              "}\n",
              "\n",
              ".xr-attrs dt,\n",
              ".xr-attrs dd {\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "  float: left;\n",
              "  padding-right: 10px;\n",
              "  width: auto;\n",
              "}\n",
              "\n",
              ".xr-attrs dt {\n",
              "  font-weight: normal;\n",
              "  grid-column: 1;\n",
              "}\n",
              "\n",
              ".xr-attrs dt:hover span {\n",
              "  display: inline-block;\n",
              "  background: var(--xr-background-color);\n",
              "  padding-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-attrs dd {\n",
              "  grid-column: 2;\n",
              "  white-space: pre-wrap;\n",
              "  word-break: break-all;\n",
              "}\n",
              "\n",
              ".xr-icon-database,\n",
              ".xr-icon-file-text2,\n",
              ".xr-no-icon {\n",
              "  display: inline-block;\n",
              "  vertical-align: middle;\n",
              "  width: 1em;\n",
              "  height: 1.5em !important;\n",
              "  stroke-width: 0;\n",
              "  stroke: currentColor;\n",
              "  fill: currentColor;\n",
              "}\n",
              "</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt;\n",
              "Dimensions:              (y: 337, x: 451)\n",
              "Coordinates:\n",
              "    time                 datetime64[ns] 2024-01-01T06:00:00\n",
              "    step                 timedelta64[ns] 00:00:00\n",
              "    heightAboveGround    float64 2.0\n",
              "    latitude             (y, x) float64 16.28 16.31 16.34 ... 55.54 55.51 55.48\n",
              "    longitude            (y, x) float64 233.9 234.0 234.1 ... 302.3 302.4 302.6\n",
              "    valid_time           datetime64[ns] 2024-01-01T06:00:00\n",
              "    gribfile_projection  object None\n",
              "Dimensions without coordinates: y, x\n",
              "Data variables:\n",
              "    t2m                  (y, x) float32 297.1 296.9 296.8 ... 270.7 271.0 271.2\n",
              "    r2                   (y, x) float32 74.85 76.85 78.85 ... 85.85 85.85 84.85\n",
              "Attributes:\n",
              "    GRIB_edition:            2\n",
              "    GRIB_centre:             kwbc\n",
              "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "    GRIB_subCentre:          0\n",
              "    Conventions:             CF-1.7\n",
              "    institution:             US National Weather Service - NCEP\n",
              "    model:                   rap\n",
              "    product:                 awp130pgrb\n",
              "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "    local_grib:              /root/data/rap/20240101/subset_33ef968c__rap.t06...\n",
              "    search:                  :(?:TMP|RH):2 m</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-e041ce34-bc18-4653-930e-41a189fccac3' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-e041ce34-bc18-4653-930e-41a189fccac3' class='xr-section-summary'  title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span>y</span>: 337</li><li><span>x</span>: 451</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-be512c6b-cbeb-431a-898a-7dd6a0f02182' class='xr-section-summary-in' type='checkbox'  checked><label for='section-be512c6b-cbeb-431a-898a-7dd6a0f02182' class='xr-section-summary' >Coordinates: <span>(7)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>time</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2024-01-01T06:00:00</div><input id='attrs-5ff22c88-d93f-4de3-8de3-a11236c4f5b1' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-5ff22c88-d93f-4de3-8de3-a11236c4f5b1' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-2d7bb22f-0abc-47bf-97fe-c86acde0abec' class='xr-var-data-in' type='checkbox'><label for='data-2d7bb22f-0abc-47bf-97fe-c86acde0abec' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>initial time of forecast</dd><dt><span>standard_name :</span></dt><dd>forecast_reference_time</dd></dl></div><div class='xr-var-data'><pre>array(&#x27;2024-01-01T06:00:00.000000000&#x27;, dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>step</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>timedelta64[ns]</div><div class='xr-var-preview xr-preview'>00:00:00</div><input id='attrs-dcd11586-44aa-48c4-930b-f7e4b5bb957e' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-dcd11586-44aa-48c4-930b-f7e4b5bb957e' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-dd08dc37-9038-4450-9817-1e536c026338' class='xr-var-data-in' type='checkbox'><label for='data-dd08dc37-9038-4450-9817-1e536c026338' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>time since forecast_reference_time</dd><dt><span>standard_name :</span></dt><dd>forecast_period</dd></dl></div><div class='xr-var-data'><pre>array(0, dtype=&#x27;timedelta64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>heightAboveGround</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>2.0</div><input id='attrs-69c95828-9168-4bad-826e-2db5f5ac223f' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-69c95828-9168-4bad-826e-2db5f5ac223f' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-4aba11ff-fee8-4539-ae87-16a84c84301f' class='xr-var-data-in' type='checkbox'><label for='data-4aba11ff-fee8-4539-ae87-16a84c84301f' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>height above the surface</dd><dt><span>units :</span></dt><dd>m</dd><dt><span>positive :</span></dt><dd>up</dd><dt><span>standard_name :</span></dt><dd>height</dd></dl></div><div class='xr-var-data'><pre>array(2.)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>latitude</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>16.28 16.31 16.34 ... 55.51 55.48</div><input id='attrs-c75936d6-8118-42ae-859b-7a4cae51cb78' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-c75936d6-8118-42ae-859b-7a4cae51cb78' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-31cda932-f290-4453-8131-940819ec043f' class='xr-var-data-in' type='checkbox'><label for='data-31cda932-f290-4453-8131-940819ec043f' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>degrees_north</dd><dt><span>standard_name :</span></dt><dd>latitude</dd><dt><span>long_name :</span></dt><dd>latitude</dd></dl></div><div class='xr-var-data'><pre>array([[16.281     , 16.30836614, 16.33562845, ..., 17.38598091,\n",
              "        17.363161  , 17.34023363],\n",
              "       [16.39828505, 16.42568412, 16.45297923, ..., 17.50458529,\n",
              "        17.48173835, 17.45878381],\n",
              "       [16.51559943, 16.54303139, 16.57035924, ..., 17.62321703,\n",
              "        17.60034309, 17.57736144],\n",
              "       ...,\n",
              "       [53.97394127, 54.00790887, 54.04173934, ..., 55.33884573,\n",
              "        55.31079595, 55.2826082 ],\n",
              "       [54.07324369, 54.10721488, 54.14104889, ..., 55.43826705,\n",
              "        55.41021535, 55.38202566],\n",
              "       [54.17241813, 54.20639281, 54.24023027, ..., 55.53755643,\n",
              "        55.5095029 , 55.48131134]])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>longitude</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>233.9 234.0 234.1 ... 302.4 302.6</div><input id='attrs-5d39be33-9eb5-4cf8-a2a4-3b14c1d33739' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-5d39be33-9eb5-4cf8-a2a4-3b14c1d33739' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-6c2d599f-c9ed-470e-a1fb-3f31752c1af9' class='xr-var-data-in' type='checkbox'><label for='data-6c2d599f-c9ed-470e-a1fb-3f31752c1af9' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>degrees_east</dd><dt><span>standard_name :</span></dt><dd>longitude</dd><dt><span>long_name :</span></dt><dd>longitude</dd></dl></div><div class='xr-var-data'><pre>array([[233.862     , 233.98419514, 234.1064416 , ..., 290.71357615,\n",
              "        290.83782217, 290.96202426],\n",
              "       [233.83341078, 233.95571014, 234.07806096, ..., 290.73745411,\n",
              "        290.86180986, 290.98612158],\n",
              "       [233.80476994, 233.9271737 , 234.04962904, ..., 290.76137592,\n",
              "        290.8858416 , 291.01026312],\n",
              "       ...,\n",
              "       [220.2599064 , 220.42892476, 220.59808701, ..., 302.16983749,\n",
              "        302.34470507, 302.51944524],\n",
              "       [220.20196465, 220.37116928, 220.54051831, ..., 302.21910048,\n",
              "        302.3941759 , 302.56912343],\n",
              "       [220.14387816, 220.31326939, 220.48280555, ..., 302.26849092,\n",
              "        302.44377462, 302.61892995]])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>valid_time</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2024-01-01T06:00:00</div><input id='attrs-89bb851a-ae28-4276-8658-9885f24a9d0e' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-89bb851a-ae28-4276-8658-9885f24a9d0e' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-6f872785-1e40-4319-9da5-8dde85062d6e' class='xr-var-data-in' type='checkbox'><label for='data-6f872785-1e40-4319-9da5-8dde85062d6e' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>time</dd><dt><span>long_name :</span></dt><dd>time</dd></dl></div><div class='xr-var-data'><pre>array(&#x27;2024-01-01T06:00:00.000000000&#x27;, dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>gribfile_projection</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>object</div><div class='xr-var-preview xr-preview'>None</div><input id='attrs-2b9aa522-104f-4ae8-9581-96b4e4c17926' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-2b9aa522-104f-4ae8-9581-96b4e4c17926' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-adaaa329-f3f3-41f6-aed5-9dbf0332cf5f' class='xr-var-data-in' type='checkbox'><label for='data-adaaa329-f3f3-41f6-aed5-9dbf0332cf5f' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>crs_wkt :</span></dt><dd>PROJCRS[&quot;unknown&quot;,BASEGEOGCRS[&quot;unknown&quot;,DATUM[&quot;unknown&quot;,ELLIPSOID[&quot;unknown&quot;,6371229,0,LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]]],PRIMEM[&quot;Greenwich&quot;,0,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8901]]],CONVERSION[&quot;unknown&quot;,METHOD[&quot;Lambert Conic Conformal (2SP)&quot;,ID[&quot;EPSG&quot;,9802]],PARAMETER[&quot;Latitude of false origin&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8821]],PARAMETER[&quot;Longitude of false origin&quot;,265,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8822]],PARAMETER[&quot;Latitude of 1st standard parallel&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8823]],PARAMETER[&quot;Latitude of 2nd standard parallel&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8824]],PARAMETER[&quot;Easting at false origin&quot;,0,LENGTHUNIT[&quot;metre&quot;,1],ID[&quot;EPSG&quot;,8826]],PARAMETER[&quot;Northing at false origin&quot;,0,LENGTHUNIT[&quot;metre&quot;,1],ID[&quot;EPSG&quot;,8827]]],CS[Cartesian,2],AXIS[&quot;(E)&quot;,east,ORDER[1],LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]],AXIS[&quot;(N)&quot;,north,ORDER[2],LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]]]</dd><dt><span>semi_major_axis :</span></dt><dd>6371229.0</dd><dt><span>semi_minor_axis :</span></dt><dd>6371229.0</dd><dt><span>inverse_flattening :</span></dt><dd>0.0</dd><dt><span>reference_ellipsoid_name :</span></dt><dd>unknown</dd><dt><span>longitude_of_prime_meridian :</span></dt><dd>0.0</dd><dt><span>prime_meridian_name :</span></dt><dd>Greenwich</dd><dt><span>geographic_crs_name :</span></dt><dd>unknown</dd><dt><span>horizontal_datum_name :</span></dt><dd>unknown</dd><dt><span>projected_crs_name :</span></dt><dd>unknown</dd><dt><span>grid_mapping_name :</span></dt><dd>lambert_conformal_conic</dd><dt><span>standard_parallel :</span></dt><dd>(25.0, 25.0)</dd><dt><span>latitude_of_projection_origin :</span></dt><dd>25.0</dd><dt><span>longitude_of_central_meridian :</span></dt><dd>265.0</dd><dt><span>false_easting :</span></dt><dd>0.0</dd><dt><span>false_northing :</span></dt><dd>0.0</dd><dt><span>long_name :</span></dt><dd>RAP model grid projection</dd></dl></div><div class='xr-var-data'><pre>array(None, dtype=object)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-886b139f-3671-4a22-b211-6fda39f34cd1' class='xr-section-summary-in' type='checkbox'  checked><label for='section-886b139f-3671-4a22-b211-6fda39f34cd1' class='xr-section-summary' >Data variables: <span>(2)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>t2m</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>297.1 296.9 296.8 ... 271.0 271.2</div><input id='attrs-c59bad58-13d2-4f66-9bc6-3b197eb2a793' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-c59bad58-13d2-4f66-9bc6-3b197eb2a793' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-2aa395ab-5a8c-47ee-b51d-e5441f777e03' class='xr-var-data-in' type='checkbox'><label for='data-2aa395ab-5a8c-47ee-b51d-e5441f777e03' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>GRIB_paramId :</span></dt><dd>167</dd><dt><span>GRIB_dataType :</span></dt><dd>fc</dd><dt><span>GRIB_numberOfPoints :</span></dt><dd>151987</dd><dt><span>GRIB_typeOfLevel :</span></dt><dd>heightAboveGround</dd><dt><span>GRIB_stepUnits :</span></dt><dd>1</dd><dt><span>GRIB_stepType :</span></dt><dd>instant</dd><dt><span>GRIB_gridType :</span></dt><dd>lambert</dd><dt><span>GRIB_DxInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_DyInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_LaDInDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin1InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin2InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_LoVInDegrees :</span></dt><dd>265.0</dd><dt><span>GRIB_NV :</span></dt><dd>0</dd><dt><span>GRIB_Nx :</span></dt><dd>451</dd><dt><span>GRIB_Ny :</span></dt><dd>337</dd><dt><span>GRIB_cfName :</span></dt><dd>air_temperature</dd><dt><span>GRIB_cfVarName :</span></dt><dd>t2m</dd><dt><span>GRIB_gridDefinitionDescription :</span></dt><dd>Lambert Conformal can be secant or tangent, conical or bipolar</dd><dt><span>GRIB_iScansNegatively :</span></dt><dd>0</dd><dt><span>GRIB_jPointsAreConsecutive :</span></dt><dd>0</dd><dt><span>GRIB_jScansPositively :</span></dt><dd>1</dd><dt><span>GRIB_latitudeOfFirstGridPointInDegrees :</span></dt><dd>16.281</dd><dt><span>GRIB_latitudeOfSouthernPoleInDegrees :</span></dt><dd>-90.0</dd><dt><span>GRIB_longitudeOfFirstGridPointInDegrees :</span></dt><dd>233.862</dd><dt><span>GRIB_longitudeOfSouthernPoleInDegrees :</span></dt><dd>0.0</dd><dt><span>GRIB_missingValue :</span></dt><dd>3.4028234663852886e+38</dd><dt><span>GRIB_name :</span></dt><dd>2 metre temperature</dd><dt><span>GRIB_parameterName :</span></dt><dd>Temperature</dd><dt><span>GRIB_parameterUnits :</span></dt><dd>K</dd><dt><span>GRIB_shortName :</span></dt><dd>2t</dd><dt><span>GRIB_stepRange :</span></dt><dd>0</dd><dt><span>GRIB_units :</span></dt><dd>K</dd><dt><span>long_name :</span></dt><dd>2 metre temperature</dd><dt><span>units :</span></dt><dd>K</dd><dt><span>standard_name :</span></dt><dd>air_temperature</dd><dt><span>grid_mapping :</span></dt><dd>gribfile_projection</dd></dl></div><div class='xr-var-data'><pre>array([[297.10782, 296.92032, 296.79532, ..., 299.92032, 299.92032,\n",
              "        299.92032],\n",
              "       [297.04532, 296.98282, 296.85782, ..., 299.85782, 299.85782,\n",
              "        299.85782],\n",
              "       [296.98282, 296.98282, 296.92032, ..., 299.73282, 299.79532,\n",
              "        299.79532],\n",
              "       ...,\n",
              "       [279.29532, 279.35782, 279.42032, ..., 270.60782, 270.79532,\n",
              "        270.98282],\n",
              "       [279.17032, 279.17032, 279.29532, ..., 270.54532, 270.79532,\n",
              "        271.04532],\n",
              "       [279.04532, 279.04532, 279.10782, ..., 270.73282, 270.98282,\n",
              "        271.17032]], dtype=float32)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>r2</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>74.85 76.85 78.85 ... 85.85 84.85</div><input id='attrs-96bc8074-1b81-47bb-a94f-d7a4571811a4' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-96bc8074-1b81-47bb-a94f-d7a4571811a4' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-db3d5ddb-f8e3-4da4-94b3-9d30423ab690' class='xr-var-data-in' type='checkbox'><label for='data-db3d5ddb-f8e3-4da4-94b3-9d30423ab690' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>GRIB_paramId :</span></dt><dd>260242</dd><dt><span>GRIB_dataType :</span></dt><dd>fc</dd><dt><span>GRIB_numberOfPoints :</span></dt><dd>151987</dd><dt><span>GRIB_typeOfLevel :</span></dt><dd>heightAboveGround</dd><dt><span>GRIB_stepUnits :</span></dt><dd>1</dd><dt><span>GRIB_stepType :</span></dt><dd>instant</dd><dt><span>GRIB_gridType :</span></dt><dd>lambert</dd><dt><span>GRIB_DxInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_DyInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_LaDInDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin1InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin2InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_LoVInDegrees :</span></dt><dd>265.0</dd><dt><span>GRIB_NV :</span></dt><dd>0</dd><dt><span>GRIB_Nx :</span></dt><dd>451</dd><dt><span>GRIB_Ny :</span></dt><dd>337</dd><dt><span>GRIB_cfName :</span></dt><dd>relative_humidity</dd><dt><span>GRIB_cfVarName :</span></dt><dd>r2</dd><dt><span>GRIB_gridDefinitionDescription :</span></dt><dd>Lambert Conformal can be secant or tangent, conical or bipolar</dd><dt><span>GRIB_iScansNegatively :</span></dt><dd>0</dd><dt><span>GRIB_jPointsAreConsecutive :</span></dt><dd>0</dd><dt><span>GRIB_jScansPositively :</span></dt><dd>1</dd><dt><span>GRIB_latitudeOfFirstGridPointInDegrees :</span></dt><dd>16.281</dd><dt><span>GRIB_latitudeOfSouthernPoleInDegrees :</span></dt><dd>-90.0</dd><dt><span>GRIB_longitudeOfFirstGridPointInDegrees :</span></dt><dd>233.862</dd><dt><span>GRIB_longitudeOfSouthernPoleInDegrees :</span></dt><dd>0.0</dd><dt><span>GRIB_missingValue :</span></dt><dd>3.4028234663852886e+38</dd><dt><span>GRIB_name :</span></dt><dd>2 metre relative humidity</dd><dt><span>GRIB_parameterName :</span></dt><dd>Relative humidity</dd><dt><span>GRIB_parameterUnits :</span></dt><dd>%</dd><dt><span>GRIB_shortName :</span></dt><dd>2r</dd><dt><span>GRIB_stepRange :</span></dt><dd>0</dd><dt><span>GRIB_units :</span></dt><dd>%</dd><dt><span>long_name :</span></dt><dd>2 metre relative humidity</dd><dt><span>units :</span></dt><dd>%</dd><dt><span>standard_name :</span></dt><dd>relative_humidity</dd><dt><span>grid_mapping :</span></dt><dd>gribfile_projection</dd></dl></div><div class='xr-var-data'><pre>array([[74.847244, 76.847244, 78.847244, ..., 76.847244, 77.847244,\n",
              "        77.847244],\n",
              "       [72.847244, 73.847244, 76.847244, ..., 78.847244, 77.847244,\n",
              "        76.847244],\n",
              "       [69.847244, 70.847244, 71.847244, ..., 78.847244, 77.847244,\n",
              "        75.847244],\n",
              "       ...,\n",
              "       [89.847244, 88.847244, 88.847244, ..., 81.847244, 82.847244,\n",
              "        82.847244],\n",
              "       [91.847244, 90.847244, 89.847244, ..., 84.847244, 83.847244,\n",
              "        83.847244],\n",
              "       [92.847244, 91.847244, 91.847244, ..., 85.847244, 85.847244,\n",
              "        84.847244]], dtype=float32)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-90ead800-4817-41ae-a05c-56db2313ccfe' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-90ead800-4817-41ae-a05c-56db2313ccfe' class='xr-section-summary'  title='Expand/collapse section'>Indexes: <span>(0)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'></ul></div></li><li class='xr-section-item'><input id='section-e8036a84-04bb-4c08-a248-e8b1bdf191b8' class='xr-section-summary-in' type='checkbox'  ><label for='section-e8036a84-04bb-4c08-a248-e8b1bdf191b8' class='xr-section-summary' >Attributes: <span>(12)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>GRIB_edition :</span></dt><dd>2</dd><dt><span>GRIB_centre :</span></dt><dd>kwbc</dd><dt><span>GRIB_centreDescription :</span></dt><dd>US National Weather Service - NCEP</dd><dt><span>GRIB_subCentre :</span></dt><dd>0</dd><dt><span>Conventions :</span></dt><dd>CF-1.7</dd><dt><span>institution :</span></dt><dd>US National Weather Service - NCEP</dd><dt><span>model :</span></dt><dd>rap</dd><dt><span>product :</span></dt><dd>awp130pgrb</dd><dt><span>description :</span></dt><dd>Rapid Refresh (RAP) from NOMADS and Big Data Program</dd><dt><span>remote_grib :</span></dt><dd>https://noaa-rap-pds.s3.amazonaws.com/rap.20240101/rap.t06z.awp130pgrbf00.grib2</dd><dt><span>local_grib :</span></dt><dd>/root/data/rap/20240101/subset_33ef968c__rap.t06z.awp130pgrbf00.grib2</dd><dt><span>search :</span></dt><dd>:(?:TMP|RH):2 m</dd></dl></div></li></ul></div></div>"
            ],
            "text/plain": [
              "<xarray.Dataset>\n",
              "Dimensions:              (y: 337, x: 451)\n",
              "Coordinates:\n",
              "    time                 datetime64[ns] 2024-01-01T06:00:00\n",
              "    step                 timedelta64[ns] 00:00:00\n",
              "    heightAboveGround    float64 2.0\n",
              "    latitude             (y, x) float64 16.28 16.31 16.34 ... 55.54 55.51 55.48\n",
              "    longitude            (y, x) float64 233.9 234.0 234.1 ... 302.3 302.4 302.6\n",
              "    valid_time           datetime64[ns] 2024-01-01T06:00:00\n",
              "    gribfile_projection  object None\n",
              "Dimensions without coordinates: y, x\n",
              "Data variables:\n",
              "    t2m                  (y, x) float32 297.1 296.9 296.8 ... 270.7 271.0 271.2\n",
              "    r2                   (y, x) float32 74.85 76.85 78.85 ... 85.85 85.85 84.85\n",
              "Attributes:\n",
              "    GRIB_edition:            2\n",
              "    GRIB_centre:             kwbc\n",
              "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "    GRIB_subCentre:          0\n",
              "    Conventions:             CF-1.7\n",
              "    institution:             US National Weather Service - NCEP\n",
              "    model:                   rap\n",
              "    product:                 awp130pgrb\n",
              "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "    local_grib:              /root/data/rap/20240101/subset_33ef968c__rap.t06...\n",
              "    search:                  :(?:TMP|RH):2 m"
            ]
          },
          "execution_count": 14,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "## List the contents of the xarrays\n",
        "## note the variables we will reference are defined in 'Data Variables'\n",
        "print(\"ds1: \", ds1)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 354
        },
        "id": "P9A9xLbHvAd5",
        "outputId": "bda2c410-344e-4dd8-aa64-852a941605c0"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
              "<defs>\n",
              "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
              "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
              "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
              "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
              "</symbol>\n",
              "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
              "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
              "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "</symbol>\n",
              "</defs>\n",
              "</svg>\n",
              "<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
              " *\n",
              " */\n",
              "\n",
              ":root {\n",
              "  --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
              "  --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
              "  --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
              "  --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
              "  --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
              "  --xr-background-color: var(--jp-layout-color0, white);\n",
              "  --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
              "  --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
              "}\n",
              "\n",
              "html[theme=dark],\n",
              "body[data-theme=dark],\n",
              "body.vscode-dark {\n",
              "  --xr-font-color0: rgba(255, 255, 255, 1);\n",
              "  --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
              "  --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
              "  --xr-border-color: #1F1F1F;\n",
              "  --xr-disabled-color: #515151;\n",
              "  --xr-background-color: #111111;\n",
              "  --xr-background-color-row-even: #111111;\n",
              "  --xr-background-color-row-odd: #313131;\n",
              "}\n",
              "\n",
              ".xr-wrap {\n",
              "  display: block !important;\n",
              "  min-width: 300px;\n",
              "  max-width: 700px;\n",
              "}\n",
              "\n",
              ".xr-text-repr-fallback {\n",
              "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-header {\n",
              "  padding-top: 6px;\n",
              "  padding-bottom: 6px;\n",
              "  margin-bottom: 4px;\n",
              "  border-bottom: solid 1px var(--xr-border-color);\n",
              "}\n",
              "\n",
              ".xr-header > div,\n",
              ".xr-header > ul {\n",
              "  display: inline;\n",
              "  margin-top: 0;\n",
              "  margin-bottom: 0;\n",
              "}\n",
              "\n",
              ".xr-obj-type,\n",
              ".xr-array-name {\n",
              "  margin-left: 2px;\n",
              "  margin-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-obj-type {\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-sections {\n",
              "  padding-left: 0 !important;\n",
              "  display: grid;\n",
              "  grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
              "}\n",
              "\n",
              ".xr-section-item {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-section-item input {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-section-item input + label {\n",
              "  color: var(--xr-disabled-color);\n",
              "}\n",
              "\n",
              ".xr-section-item input:enabled + label {\n",
              "  cursor: pointer;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-section-item input:enabled + label:hover {\n",
              "  color: var(--xr-font-color0);\n",
              "}\n",
              "\n",
              ".xr-section-summary {\n",
              "  grid-column: 1;\n",
              "  color: var(--xr-font-color2);\n",
              "  font-weight: 500;\n",
              "}\n",
              "\n",
              ".xr-section-summary > span {\n",
              "  display: inline-block;\n",
              "  padding-left: 0.5em;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:disabled + label {\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-section-summary-in + label:before {\n",
              "  display: inline-block;\n",
              "  content: '►';\n",
              "  font-size: 11px;\n",
              "  width: 15px;\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:disabled + label:before {\n",
              "  color: var(--xr-disabled-color);\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked + label:before {\n",
              "  content: '▼';\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked + label > span {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-section-summary,\n",
              ".xr-section-inline-details {\n",
              "  padding-top: 4px;\n",
              "  padding-bottom: 4px;\n",
              "}\n",
              "\n",
              ".xr-section-inline-details {\n",
              "  grid-column: 2 / -1;\n",
              "}\n",
              "\n",
              ".xr-section-details {\n",
              "  display: none;\n",
              "  grid-column: 1 / -1;\n",
              "  margin-bottom: 5px;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked ~ .xr-section-details {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-array-wrap {\n",
              "  grid-column: 1 / -1;\n",
              "  display: grid;\n",
              "  grid-template-columns: 20px auto;\n",
              "}\n",
              "\n",
              ".xr-array-wrap > label {\n",
              "  grid-column: 1;\n",
              "  vertical-align: top;\n",
              "}\n",
              "\n",
              ".xr-preview {\n",
              "  color: var(--xr-font-color3);\n",
              "}\n",
              "\n",
              ".xr-array-preview,\n",
              ".xr-array-data {\n",
              "  padding: 0 5px !important;\n",
              "  grid-column: 2;\n",
              "}\n",
              "\n",
              ".xr-array-data,\n",
              ".xr-array-in:checked ~ .xr-array-preview {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-array-in:checked ~ .xr-array-data,\n",
              ".xr-array-preview {\n",
              "  display: inline-block;\n",
              "}\n",
              "\n",
              ".xr-dim-list {\n",
              "  display: inline-block !important;\n",
              "  list-style: none;\n",
              "  padding: 0 !important;\n",
              "  margin: 0;\n",
              "}\n",
              "\n",
              ".xr-dim-list li {\n",
              "  display: inline-block;\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "}\n",
              "\n",
              ".xr-dim-list:before {\n",
              "  content: '(';\n",
              "}\n",
              "\n",
              ".xr-dim-list:after {\n",
              "  content: ')';\n",
              "}\n",
              "\n",
              ".xr-dim-list li:not(:last-child):after {\n",
              "  content: ',';\n",
              "  padding-right: 5px;\n",
              "}\n",
              "\n",
              ".xr-has-index {\n",
              "  font-weight: bold;\n",
              "}\n",
              "\n",
              ".xr-var-list,\n",
              ".xr-var-item {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-var-item > div,\n",
              ".xr-var-item label,\n",
              ".xr-var-item > .xr-var-name span {\n",
              "  background-color: var(--xr-background-color-row-even);\n",
              "  margin-bottom: 0;\n",
              "}\n",
              "\n",
              ".xr-var-item > .xr-var-name:hover span {\n",
              "  padding-right: 5px;\n",
              "}\n",
              "\n",
              ".xr-var-list > li:nth-child(odd) > div,\n",
              ".xr-var-list > li:nth-child(odd) > label,\n",
              ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
              "  background-color: var(--xr-background-color-row-odd);\n",
              "}\n",
              "\n",
              ".xr-var-name {\n",
              "  grid-column: 1;\n",
              "}\n",
              "\n",
              ".xr-var-dims {\n",
              "  grid-column: 2;\n",
              "}\n",
              "\n",
              ".xr-var-dtype {\n",
              "  grid-column: 3;\n",
              "  text-align: right;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-var-preview {\n",
              "  grid-column: 4;\n",
              "}\n",
              "\n",
              ".xr-index-preview {\n",
              "  grid-column: 2 / 5;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-var-name,\n",
              ".xr-var-dims,\n",
              ".xr-var-dtype,\n",
              ".xr-preview,\n",
              ".xr-attrs dt {\n",
              "  white-space: nowrap;\n",
              "  overflow: hidden;\n",
              "  text-overflow: ellipsis;\n",
              "  padding-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-var-name:hover,\n",
              ".xr-var-dims:hover,\n",
              ".xr-var-dtype:hover,\n",
              ".xr-attrs dt:hover {\n",
              "  overflow: visible;\n",
              "  width: auto;\n",
              "  z-index: 1;\n",
              "}\n",
              "\n",
              ".xr-var-attrs,\n",
              ".xr-var-data,\n",
              ".xr-index-data {\n",
              "  display: none;\n",
              "  background-color: var(--xr-background-color) !important;\n",
              "  padding-bottom: 5px !important;\n",
              "}\n",
              "\n",
              ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
              ".xr-var-data-in:checked ~ .xr-var-data,\n",
              ".xr-index-data-in:checked ~ .xr-index-data {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              ".xr-var-data > table {\n",
              "  float: right;\n",
              "}\n",
              "\n",
              ".xr-var-name span,\n",
              ".xr-var-data,\n",
              ".xr-index-name div,\n",
              ".xr-index-data,\n",
              ".xr-attrs {\n",
              "  padding-left: 25px !important;\n",
              "}\n",
              "\n",
              ".xr-attrs,\n",
              ".xr-var-attrs,\n",
              ".xr-var-data,\n",
              ".xr-index-data {\n",
              "  grid-column: 1 / -1;\n",
              "}\n",
              "\n",
              "dl.xr-attrs {\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "  display: grid;\n",
              "  grid-template-columns: 125px auto;\n",
              "}\n",
              "\n",
              ".xr-attrs dt,\n",
              ".xr-attrs dd {\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "  float: left;\n",
              "  padding-right: 10px;\n",
              "  width: auto;\n",
              "}\n",
              "\n",
              ".xr-attrs dt {\n",
              "  font-weight: normal;\n",
              "  grid-column: 1;\n",
              "}\n",
              "\n",
              ".xr-attrs dt:hover span {\n",
              "  display: inline-block;\n",
              "  background: var(--xr-background-color);\n",
              "  padding-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-attrs dd {\n",
              "  grid-column: 2;\n",
              "  white-space: pre-wrap;\n",
              "  word-break: break-all;\n",
              "}\n",
              "\n",
              ".xr-icon-database,\n",
              ".xr-icon-file-text2,\n",
              ".xr-no-icon {\n",
              "  display: inline-block;\n",
              "  vertical-align: middle;\n",
              "  width: 1em;\n",
              "  height: 1.5em !important;\n",
              "  stroke-width: 0;\n",
              "  stroke: currentColor;\n",
              "  fill: currentColor;\n",
              "}\n",
              "</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt; Size: 3MB\n",
              "Dimensions:              (y: 337, x: 451)\n",
              "Coordinates:\n",
              "    time                 datetime64[ns] 8B 2024-01-01T06:00:00\n",
              "    step                 timedelta64[ns] 8B 00:00:00\n",
              "    surface              float64 8B 0.0\n",
              "    latitude             (y, x) float64 1MB 16.28 16.31 16.34 ... 55.51 55.48\n",
              "    longitude            (y, x) float64 1MB 233.9 234.0 234.1 ... 302.4 302.6\n",
              "    valid_time           datetime64[ns] 8B 2024-01-01T06:00:00\n",
              "    gribfile_projection  object 8B None\n",
              "Dimensions without coordinates: y, x\n",
              "Data variables:\n",
              "    gust                 (y, x) float32 608kB 8.732 8.982 9.044 ... 15.86 15.36\n",
              "Attributes:\n",
              "    GRIB_edition:            2\n",
              "    GRIB_centre:             kwbc\n",
              "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "    GRIB_subCentre:          0\n",
              "    Conventions:             CF-1.7\n",
              "    institution:             US National Weather Service - NCEP\n",
              "    model:                   rap\n",
              "    product:                 awp130pgrb\n",
              "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "    local_grib:              /root/data/rap/20240101/subset_33ef56d5__rap.t06...\n",
              "    search:                  GUST</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-de242125-2c1c-488b-bf4e-a7daae0359cb' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-de242125-2c1c-488b-bf4e-a7daae0359cb' class='xr-section-summary'  title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span>y</span>: 337</li><li><span>x</span>: 451</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-cb919117-a8af-42c0-a90a-34709a78cd8f' class='xr-section-summary-in' type='checkbox'  checked><label for='section-cb919117-a8af-42c0-a90a-34709a78cd8f' class='xr-section-summary' >Coordinates: <span>(7)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>time</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2024-01-01T06:00:00</div><input id='attrs-fa5d551b-91be-41fb-914e-e6f0eb6aab14' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-fa5d551b-91be-41fb-914e-e6f0eb6aab14' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-a64c161c-6925-4af4-a97c-4c6f368fbea3' class='xr-var-data-in' type='checkbox'><label for='data-a64c161c-6925-4af4-a97c-4c6f368fbea3' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>initial time of forecast</dd><dt><span>standard_name :</span></dt><dd>forecast_reference_time</dd></dl></div><div class='xr-var-data'><pre>array(&#x27;2024-01-01T06:00:00.000000000&#x27;, dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>step</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>timedelta64[ns]</div><div class='xr-var-preview xr-preview'>00:00:00</div><input id='attrs-134f8fa1-2788-45fb-9f38-63f3684e9285' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-134f8fa1-2788-45fb-9f38-63f3684e9285' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-52fd3b94-a836-49a7-8ea8-c90bebe6a754' class='xr-var-data-in' type='checkbox'><label for='data-52fd3b94-a836-49a7-8ea8-c90bebe6a754' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>time since forecast_reference_time</dd><dt><span>standard_name :</span></dt><dd>forecast_period</dd></dl></div><div class='xr-var-data'><pre>array(0, dtype=&#x27;timedelta64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>surface</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>0.0</div><input id='attrs-c2c68d97-e571-4f0a-bf03-52bb427a8552' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-c2c68d97-e571-4f0a-bf03-52bb427a8552' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-478066c4-b73c-4df4-b6e0-6b2774367bd7' class='xr-var-data-in' type='checkbox'><label for='data-478066c4-b73c-4df4-b6e0-6b2774367bd7' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>original GRIB coordinate for key: level(surface)</dd><dt><span>units :</span></dt><dd>1</dd></dl></div><div class='xr-var-data'><pre>array(0.)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>latitude</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>16.28 16.31 16.34 ... 55.51 55.48</div><input id='attrs-83fc914d-df6e-4483-b53d-e7757524be9b' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-83fc914d-df6e-4483-b53d-e7757524be9b' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-d6203a83-2c10-4605-b533-dd97e611b14e' class='xr-var-data-in' type='checkbox'><label for='data-d6203a83-2c10-4605-b533-dd97e611b14e' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>degrees_north</dd><dt><span>standard_name :</span></dt><dd>latitude</dd><dt><span>long_name :</span></dt><dd>latitude</dd></dl></div><div class='xr-var-data'><pre>array([[16.281     , 16.30836614, 16.33562845, ..., 17.38598091,\n",
              "        17.363161  , 17.34023363],\n",
              "       [16.39828505, 16.42568412, 16.45297923, ..., 17.50458529,\n",
              "        17.48173835, 17.45878381],\n",
              "       [16.51559943, 16.54303139, 16.57035924, ..., 17.62321703,\n",
              "        17.60034309, 17.57736144],\n",
              "       ...,\n",
              "       [53.97394127, 54.00790887, 54.04173934, ..., 55.33884573,\n",
              "        55.31079595, 55.2826082 ],\n",
              "       [54.07324369, 54.10721488, 54.14104889, ..., 55.43826705,\n",
              "        55.41021535, 55.38202566],\n",
              "       [54.17241813, 54.20639281, 54.24023027, ..., 55.53755643,\n",
              "        55.5095029 , 55.48131134]])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>longitude</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>233.9 234.0 234.1 ... 302.4 302.6</div><input id='attrs-3b1c1268-9eeb-44f7-95af-b1faaa297d8a' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-3b1c1268-9eeb-44f7-95af-b1faaa297d8a' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-49c31e12-532a-450d-b67f-96850871b14a' class='xr-var-data-in' type='checkbox'><label for='data-49c31e12-532a-450d-b67f-96850871b14a' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>degrees_east</dd><dt><span>standard_name :</span></dt><dd>longitude</dd><dt><span>long_name :</span></dt><dd>longitude</dd></dl></div><div class='xr-var-data'><pre>array([[233.862     , 233.98419514, 234.1064416 , ..., 290.71357615,\n",
              "        290.83782217, 290.96202426],\n",
              "       [233.83341078, 233.95571014, 234.07806096, ..., 290.73745411,\n",
              "        290.86180986, 290.98612158],\n",
              "       [233.80476994, 233.9271737 , 234.04962904, ..., 290.76137592,\n",
              "        290.8858416 , 291.01026312],\n",
              "       ...,\n",
              "       [220.2599064 , 220.42892476, 220.59808701, ..., 302.16983749,\n",
              "        302.34470507, 302.51944524],\n",
              "       [220.20196465, 220.37116928, 220.54051831, ..., 302.21910048,\n",
              "        302.3941759 , 302.56912343],\n",
              "       [220.14387816, 220.31326939, 220.48280555, ..., 302.26849092,\n",
              "        302.44377462, 302.61892995]])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>valid_time</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2024-01-01T06:00:00</div><input id='attrs-d3d748f7-7837-4826-86c5-4538a268d41f' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-d3d748f7-7837-4826-86c5-4538a268d41f' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-e83df533-7949-4028-9407-006d58d8d005' class='xr-var-data-in' type='checkbox'><label for='data-e83df533-7949-4028-9407-006d58d8d005' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>time</dd><dt><span>long_name :</span></dt><dd>time</dd></dl></div><div class='xr-var-data'><pre>array(&#x27;2024-01-01T06:00:00.000000000&#x27;, dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>gribfile_projection</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>object</div><div class='xr-var-preview xr-preview'>None</div><input id='attrs-0fac9c4c-8a70-4e1b-851b-0ed4c2dab906' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-0fac9c4c-8a70-4e1b-851b-0ed4c2dab906' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-8f80e37b-ec0d-4c75-93a6-7bdac4fe7eb7' class='xr-var-data-in' type='checkbox'><label for='data-8f80e37b-ec0d-4c75-93a6-7bdac4fe7eb7' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>crs_wkt :</span></dt><dd>PROJCRS[&quot;unknown&quot;,BASEGEOGCRS[&quot;unknown&quot;,DATUM[&quot;unknown&quot;,ELLIPSOID[&quot;unknown&quot;,6371229,0,LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]]],PRIMEM[&quot;Greenwich&quot;,0,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8901]]],CONVERSION[&quot;unknown&quot;,METHOD[&quot;Lambert Conic Conformal (2SP)&quot;,ID[&quot;EPSG&quot;,9802]],PARAMETER[&quot;Latitude of false origin&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8821]],PARAMETER[&quot;Longitude of false origin&quot;,265,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8822]],PARAMETER[&quot;Latitude of 1st standard parallel&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8823]],PARAMETER[&quot;Latitude of 2nd standard parallel&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8824]],PARAMETER[&quot;Easting at false origin&quot;,0,LENGTHUNIT[&quot;metre&quot;,1],ID[&quot;EPSG&quot;,8826]],PARAMETER[&quot;Northing at false origin&quot;,0,LENGTHUNIT[&quot;metre&quot;,1],ID[&quot;EPSG&quot;,8827]]],CS[Cartesian,2],AXIS[&quot;(E)&quot;,east,ORDER[1],LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]],AXIS[&quot;(N)&quot;,north,ORDER[2],LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]]]</dd><dt><span>semi_major_axis :</span></dt><dd>6371229.0</dd><dt><span>semi_minor_axis :</span></dt><dd>6371229.0</dd><dt><span>inverse_flattening :</span></dt><dd>0.0</dd><dt><span>reference_ellipsoid_name :</span></dt><dd>unknown</dd><dt><span>longitude_of_prime_meridian :</span></dt><dd>0.0</dd><dt><span>prime_meridian_name :</span></dt><dd>Greenwich</dd><dt><span>geographic_crs_name :</span></dt><dd>unknown</dd><dt><span>horizontal_datum_name :</span></dt><dd>unknown</dd><dt><span>projected_crs_name :</span></dt><dd>unknown</dd><dt><span>grid_mapping_name :</span></dt><dd>lambert_conformal_conic</dd><dt><span>standard_parallel :</span></dt><dd>(25.0, 25.0)</dd><dt><span>latitude_of_projection_origin :</span></dt><dd>25.0</dd><dt><span>longitude_of_central_meridian :</span></dt><dd>265.0</dd><dt><span>false_easting :</span></dt><dd>0.0</dd><dt><span>false_northing :</span></dt><dd>0.0</dd><dt><span>long_name :</span></dt><dd>RAP model grid projection</dd></dl></div><div class='xr-var-data'><pre>array(None, dtype=object)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-68003b87-d3ac-4c76-bfee-4b3a96892a9f' class='xr-section-summary-in' type='checkbox'  checked><label for='section-68003b87-d3ac-4c76-bfee-4b3a96892a9f' class='xr-section-summary' >Data variables: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>gust</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>8.732 8.982 9.044 ... 15.86 15.36</div><input id='attrs-34db8f23-262c-4f21-ab85-2ec7c510b931' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-34db8f23-262c-4f21-ab85-2ec7c510b931' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-8c6824a7-14bf-4912-ae48-d4f24d114312' class='xr-var-data-in' type='checkbox'><label for='data-8c6824a7-14bf-4912-ae48-d4f24d114312' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>GRIB_paramId :</span></dt><dd>260065</dd><dt><span>GRIB_dataType :</span></dt><dd>fc</dd><dt><span>GRIB_numberOfPoints :</span></dt><dd>151987</dd><dt><span>GRIB_typeOfLevel :</span></dt><dd>surface</dd><dt><span>GRIB_stepUnits :</span></dt><dd>1</dd><dt><span>GRIB_stepType :</span></dt><dd>instant</dd><dt><span>GRIB_gridType :</span></dt><dd>lambert</dd><dt><span>GRIB_uvRelativeToGrid :</span></dt><dd>1</dd><dt><span>GRIB_DxInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_DyInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_LaDInDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin1InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin2InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_LoVInDegrees :</span></dt><dd>265.0</dd><dt><span>GRIB_NV :</span></dt><dd>0</dd><dt><span>GRIB_Nx :</span></dt><dd>451</dd><dt><span>GRIB_Ny :</span></dt><dd>337</dd><dt><span>GRIB_cfName :</span></dt><dd>unknown</dd><dt><span>GRIB_cfVarName :</span></dt><dd>gust</dd><dt><span>GRIB_gridDefinitionDescription :</span></dt><dd>Lambert Conformal can be secant or tangent, conical or bipolar</dd><dt><span>GRIB_iScansNegatively :</span></dt><dd>0</dd><dt><span>GRIB_jPointsAreConsecutive :</span></dt><dd>0</dd><dt><span>GRIB_jScansPositively :</span></dt><dd>1</dd><dt><span>GRIB_latitudeOfFirstGridPointInDegrees :</span></dt><dd>16.281</dd><dt><span>GRIB_latitudeOfSouthernPoleInDegrees :</span></dt><dd>-90.0</dd><dt><span>GRIB_longitudeOfFirstGridPointInDegrees :</span></dt><dd>233.862</dd><dt><span>GRIB_longitudeOfSouthernPoleInDegrees :</span></dt><dd>0.0</dd><dt><span>GRIB_missingValue :</span></dt><dd>3.4028234663852886e+38</dd><dt><span>GRIB_name :</span></dt><dd>Wind speed (gust)</dd><dt><span>GRIB_parameterName :</span></dt><dd>Wind speed (gust)</dd><dt><span>GRIB_parameterUnits :</span></dt><dd>m s-1</dd><dt><span>GRIB_shortName :</span></dt><dd>gust</dd><dt><span>GRIB_stepRange :</span></dt><dd>0</dd><dt><span>GRIB_units :</span></dt><dd>m s**-1</dd><dt><span>long_name :</span></dt><dd>Wind speed (gust)</dd><dt><span>units :</span></dt><dd>m s**-1</dd><dt><span>standard_name :</span></dt><dd>unknown</dd><dt><span>grid_mapping :</span></dt><dd>gribfile_projection</dd></dl></div><div class='xr-var-data'><pre>array([[ 8.731921,  8.981921,  9.044421, ...,  9.606921,  9.544421,\n",
              "         9.481921],\n",
              "       [ 8.856921,  8.919421,  8.919421, ...,  9.419421,  9.481921,\n",
              "         9.419421],\n",
              "       [ 8.856921,  8.856921,  8.794421, ...,  9.419421,  9.294421,\n",
              "         9.231921],\n",
              "       ...,\n",
              "       [ 5.794421,  5.919421,  5.919421, ..., 16.04442 , 15.794421,\n",
              "        15.544421],\n",
              "       [ 6.106921,  6.231921,  6.231921, ..., 16.41942 , 16.04442 ,\n",
              "        15.669421],\n",
              "       [ 6.419421,  6.606921,  6.544421, ..., 16.29442 , 15.856921,\n",
              "        15.356921]], dtype=float32)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-e7d85beb-72b7-4704-8f67-304c8d2808a8' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-e7d85beb-72b7-4704-8f67-304c8d2808a8' class='xr-section-summary'  title='Expand/collapse section'>Indexes: <span>(0)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'></ul></div></li><li class='xr-section-item'><input id='section-096388dc-5b63-4fdc-a9d7-b485c122e891' class='xr-section-summary-in' type='checkbox'  ><label for='section-096388dc-5b63-4fdc-a9d7-b485c122e891' class='xr-section-summary' >Attributes: <span>(12)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>GRIB_edition :</span></dt><dd>2</dd><dt><span>GRIB_centre :</span></dt><dd>kwbc</dd><dt><span>GRIB_centreDescription :</span></dt><dd>US National Weather Service - NCEP</dd><dt><span>GRIB_subCentre :</span></dt><dd>0</dd><dt><span>Conventions :</span></dt><dd>CF-1.7</dd><dt><span>institution :</span></dt><dd>US National Weather Service - NCEP</dd><dt><span>model :</span></dt><dd>rap</dd><dt><span>product :</span></dt><dd>awp130pgrb</dd><dt><span>description :</span></dt><dd>Rapid Refresh (RAP) from NOMADS and Big Data Program</dd><dt><span>remote_grib :</span></dt><dd>https://noaa-rap-pds.s3.amazonaws.com/rap.20240101/rap.t06z.awp130pgrbf00.grib2</dd><dt><span>local_grib :</span></dt><dd>/root/data/rap/20240101/subset_33ef56d5__rap.t06z.awp130pgrbf00.grib2</dd><dt><span>search :</span></dt><dd>GUST</dd></dl></div></li></ul></div></div>"
            ],
            "text/plain": [
              "<xarray.Dataset> Size: 3MB\n",
              "Dimensions:              (y: 337, x: 451)\n",
              "Coordinates:\n",
              "    time                 datetime64[ns] 8B 2024-01-01T06:00:00\n",
              "    step                 timedelta64[ns] 8B 00:00:00\n",
              "    surface              float64 8B 0.0\n",
              "    latitude             (y, x) float64 1MB 16.28 16.31 16.34 ... 55.51 55.48\n",
              "    longitude            (y, x) float64 1MB 233.9 234.0 234.1 ... 302.4 302.6\n",
              "    valid_time           datetime64[ns] 8B 2024-01-01T06:00:00\n",
              "    gribfile_projection  object 8B None\n",
              "Dimensions without coordinates: y, x\n",
              "Data variables:\n",
              "    gust                 (y, x) float32 608kB 8.732 8.982 9.044 ... 15.86 15.36\n",
              "Attributes:\n",
              "    GRIB_edition:            2\n",
              "    GRIB_centre:             kwbc\n",
              "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "    GRIB_subCentre:          0\n",
              "    Conventions:             CF-1.7\n",
              "    institution:             US National Weather Service - NCEP\n",
              "    model:                   rap\n",
              "    product:                 awp130pgrb\n",
              "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "    local_grib:              /root/data/rap/20240101/subset_33ef56d5__rap.t06...\n",
              "    search:                  GUST"
            ]
          },
          "execution_count": 15,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "## List the contents of the xarrays\n",
        "## note the variables we will reference are defined in 'Data Variables'\n",
        "print(\"ds2: \", ds2)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 354
        },
        "id": "FWauPk2BvC96",
        "outputId": "f21dcae3-5b4b-4284-fe5b-d58d2b57e48f"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
              "<defs>\n",
              "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
              "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
              "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
              "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
              "</symbol>\n",
              "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
              "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
              "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "</symbol>\n",
              "</defs>\n",
              "</svg>\n",
              "<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
              " *\n",
              " */\n",
              "\n",
              ":root {\n",
              "  --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
              "  --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
              "  --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
              "  --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
              "  --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
              "  --xr-background-color: var(--jp-layout-color0, white);\n",
              "  --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
              "  --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
              "}\n",
              "\n",
              "html[theme=dark],\n",
              "body[data-theme=dark],\n",
              "body.vscode-dark {\n",
              "  --xr-font-color0: rgba(255, 255, 255, 1);\n",
              "  --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
              "  --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
              "  --xr-border-color: #1F1F1F;\n",
              "  --xr-disabled-color: #515151;\n",
              "  --xr-background-color: #111111;\n",
              "  --xr-background-color-row-even: #111111;\n",
              "  --xr-background-color-row-odd: #313131;\n",
              "}\n",
              "\n",
              ".xr-wrap {\n",
              "  display: block !important;\n",
              "  min-width: 300px;\n",
              "  max-width: 700px;\n",
              "}\n",
              "\n",
              ".xr-text-repr-fallback {\n",
              "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-header {\n",
              "  padding-top: 6px;\n",
              "  padding-bottom: 6px;\n",
              "  margin-bottom: 4px;\n",
              "  border-bottom: solid 1px var(--xr-border-color);\n",
              "}\n",
              "\n",
              ".xr-header > div,\n",
              ".xr-header > ul {\n",
              "  display: inline;\n",
              "  margin-top: 0;\n",
              "  margin-bottom: 0;\n",
              "}\n",
              "\n",
              ".xr-obj-type,\n",
              ".xr-array-name {\n",
              "  margin-left: 2px;\n",
              "  margin-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-obj-type {\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-sections {\n",
              "  padding-left: 0 !important;\n",
              "  display: grid;\n",
              "  grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
              "}\n",
              "\n",
              ".xr-section-item {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-section-item input {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-section-item input + label {\n",
              "  color: var(--xr-disabled-color);\n",
              "}\n",
              "\n",
              ".xr-section-item input:enabled + label {\n",
              "  cursor: pointer;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-section-item input:enabled + label:hover {\n",
              "  color: var(--xr-font-color0);\n",
              "}\n",
              "\n",
              ".xr-section-summary {\n",
              "  grid-column: 1;\n",
              "  color: var(--xr-font-color2);\n",
              "  font-weight: 500;\n",
              "}\n",
              "\n",
              ".xr-section-summary > span {\n",
              "  display: inline-block;\n",
              "  padding-left: 0.5em;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:disabled + label {\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-section-summary-in + label:before {\n",
              "  display: inline-block;\n",
              "  content: '►';\n",
              "  font-size: 11px;\n",
              "  width: 15px;\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:disabled + label:before {\n",
              "  color: var(--xr-disabled-color);\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked + label:before {\n",
              "  content: '▼';\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked + label > span {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-section-summary,\n",
              ".xr-section-inline-details {\n",
              "  padding-top: 4px;\n",
              "  padding-bottom: 4px;\n",
              "}\n",
              "\n",
              ".xr-section-inline-details {\n",
              "  grid-column: 2 / -1;\n",
              "}\n",
              "\n",
              ".xr-section-details {\n",
              "  display: none;\n",
              "  grid-column: 1 / -1;\n",
              "  margin-bottom: 5px;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked ~ .xr-section-details {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-array-wrap {\n",
              "  grid-column: 1 / -1;\n",
              "  display: grid;\n",
              "  grid-template-columns: 20px auto;\n",
              "}\n",
              "\n",
              ".xr-array-wrap > label {\n",
              "  grid-column: 1;\n",
              "  vertical-align: top;\n",
              "}\n",
              "\n",
              ".xr-preview {\n",
              "  color: var(--xr-font-color3);\n",
              "}\n",
              "\n",
              ".xr-array-preview,\n",
              ".xr-array-data {\n",
              "  padding: 0 5px !important;\n",
              "  grid-column: 2;\n",
              "}\n",
              "\n",
              ".xr-array-data,\n",
              ".xr-array-in:checked ~ .xr-array-preview {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-array-in:checked ~ .xr-array-data,\n",
              ".xr-array-preview {\n",
              "  display: inline-block;\n",
              "}\n",
              "\n",
              ".xr-dim-list {\n",
              "  display: inline-block !important;\n",
              "  list-style: none;\n",
              "  padding: 0 !important;\n",
              "  margin: 0;\n",
              "}\n",
              "\n",
              ".xr-dim-list li {\n",
              "  display: inline-block;\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "}\n",
              "\n",
              ".xr-dim-list:before {\n",
              "  content: '(';\n",
              "}\n",
              "\n",
              ".xr-dim-list:after {\n",
              "  content: ')';\n",
              "}\n",
              "\n",
              ".xr-dim-list li:not(:last-child):after {\n",
              "  content: ',';\n",
              "  padding-right: 5px;\n",
              "}\n",
              "\n",
              ".xr-has-index {\n",
              "  font-weight: bold;\n",
              "}\n",
              "\n",
              ".xr-var-list,\n",
              ".xr-var-item {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-var-item > div,\n",
              ".xr-var-item label,\n",
              ".xr-var-item > .xr-var-name span {\n",
              "  background-color: var(--xr-background-color-row-even);\n",
              "  margin-bottom: 0;\n",
              "}\n",
              "\n",
              ".xr-var-item > .xr-var-name:hover span {\n",
              "  padding-right: 5px;\n",
              "}\n",
              "\n",
              ".xr-var-list > li:nth-child(odd) > div,\n",
              ".xr-var-list > li:nth-child(odd) > label,\n",
              ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
              "  background-color: var(--xr-background-color-row-odd);\n",
              "}\n",
              "\n",
              ".xr-var-name {\n",
              "  grid-column: 1;\n",
              "}\n",
              "\n",
              ".xr-var-dims {\n",
              "  grid-column: 2;\n",
              "}\n",
              "\n",
              ".xr-var-dtype {\n",
              "  grid-column: 3;\n",
              "  text-align: right;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-var-preview {\n",
              "  grid-column: 4;\n",
              "}\n",
              "\n",
              ".xr-index-preview {\n",
              "  grid-column: 2 / 5;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-var-name,\n",
              ".xr-var-dims,\n",
              ".xr-var-dtype,\n",
              ".xr-preview,\n",
              ".xr-attrs dt {\n",
              "  white-space: nowrap;\n",
              "  overflow: hidden;\n",
              "  text-overflow: ellipsis;\n",
              "  padding-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-var-name:hover,\n",
              ".xr-var-dims:hover,\n",
              ".xr-var-dtype:hover,\n",
              ".xr-attrs dt:hover {\n",
              "  overflow: visible;\n",
              "  width: auto;\n",
              "  z-index: 1;\n",
              "}\n",
              "\n",
              ".xr-var-attrs,\n",
              ".xr-var-data,\n",
              ".xr-index-data {\n",
              "  display: none;\n",
              "  background-color: var(--xr-background-color) !important;\n",
              "  padding-bottom: 5px !important;\n",
              "}\n",
              "\n",
              ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
              ".xr-var-data-in:checked ~ .xr-var-data,\n",
              ".xr-index-data-in:checked ~ .xr-index-data {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              ".xr-var-data > table {\n",
              "  float: right;\n",
              "}\n",
              "\n",
              ".xr-var-name span,\n",
              ".xr-var-data,\n",
              ".xr-index-name div,\n",
              ".xr-index-data,\n",
              ".xr-attrs {\n",
              "  padding-left: 25px !important;\n",
              "}\n",
              "\n",
              ".xr-attrs,\n",
              ".xr-var-attrs,\n",
              ".xr-var-data,\n",
              ".xr-index-data {\n",
              "  grid-column: 1 / -1;\n",
              "}\n",
              "\n",
              "dl.xr-attrs {\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "  display: grid;\n",
              "  grid-template-columns: 125px auto;\n",
              "}\n",
              "\n",
              ".xr-attrs dt,\n",
              ".xr-attrs dd {\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "  float: left;\n",
              "  padding-right: 10px;\n",
              "  width: auto;\n",
              "}\n",
              "\n",
              ".xr-attrs dt {\n",
              "  font-weight: normal;\n",
              "  grid-column: 1;\n",
              "}\n",
              "\n",
              ".xr-attrs dt:hover span {\n",
              "  display: inline-block;\n",
              "  background: var(--xr-background-color);\n",
              "  padding-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-attrs dd {\n",
              "  grid-column: 2;\n",
              "  white-space: pre-wrap;\n",
              "  word-break: break-all;\n",
              "}\n",
              "\n",
              ".xr-icon-database,\n",
              ".xr-icon-file-text2,\n",
              ".xr-no-icon {\n",
              "  display: inline-block;\n",
              "  vertical-align: middle;\n",
              "  width: 1em;\n",
              "  height: 1.5em !important;\n",
              "  stroke-width: 0;\n",
              "  stroke: currentColor;\n",
              "  fill: currentColor;\n",
              "}\n",
              "</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt;\n",
              "Dimensions:              (y: 337, x: 451)\n",
              "Coordinates:\n",
              "    time                 datetime64[ns] 2024-01-01T06:00:00\n",
              "    step                 timedelta64[ns] 00:00:00\n",
              "    heightAboveGround    float64 2.0\n",
              "    latitude             (y, x) float64 16.28 16.31 16.34 ... 55.54 55.51 55.48\n",
              "    longitude            (y, x) float64 233.9 234.0 234.1 ... 302.3 302.4 302.6\n",
              "    valid_time           datetime64[ns] 2024-01-01T06:00:00\n",
              "    gribfile_projection  object None\n",
              "Dimensions without coordinates: y, x\n",
              "Data variables:\n",
              "    d2m                  (y, x) float32 292.1 292.5 292.7 ... 268.5 268.6 268.8\n",
              "Attributes:\n",
              "    GRIB_edition:            2\n",
              "    GRIB_centre:             kwbc\n",
              "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "    GRIB_subCentre:          0\n",
              "    Conventions:             CF-1.7\n",
              "    institution:             US National Weather Service - NCEP\n",
              "    model:                   rap\n",
              "    product:                 awp130pgrb\n",
              "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "    local_grib:              /root/data/rap/20240101/subset_33ef73c2__rap.t06...\n",
              "    search:                  DPT:2 m</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-2d3c5352-1a46-4add-b51a-1ba9e8d0ecf1' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-2d3c5352-1a46-4add-b51a-1ba9e8d0ecf1' class='xr-section-summary'  title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span>y</span>: 337</li><li><span>x</span>: 451</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-c939276b-5770-44e5-bfa4-824021547d5d' class='xr-section-summary-in' type='checkbox'  checked><label for='section-c939276b-5770-44e5-bfa4-824021547d5d' class='xr-section-summary' >Coordinates: <span>(7)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>time</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2024-01-01T06:00:00</div><input id='attrs-26c8b437-23ab-4cca-8b86-e862668463c6' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-26c8b437-23ab-4cca-8b86-e862668463c6' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-53d6d12f-07c3-43ae-b79d-da513ca2e06f' class='xr-var-data-in' type='checkbox'><label for='data-53d6d12f-07c3-43ae-b79d-da513ca2e06f' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>initial time of forecast</dd><dt><span>standard_name :</span></dt><dd>forecast_reference_time</dd></dl></div><div class='xr-var-data'><pre>array(&#x27;2024-01-01T06:00:00.000000000&#x27;, dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>step</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>timedelta64[ns]</div><div class='xr-var-preview xr-preview'>00:00:00</div><input id='attrs-324f03c1-eb7e-4a8d-9d91-a564c2911fc1' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-324f03c1-eb7e-4a8d-9d91-a564c2911fc1' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-dc6e452c-31a7-432d-b6be-a5368e9e1a05' class='xr-var-data-in' type='checkbox'><label for='data-dc6e452c-31a7-432d-b6be-a5368e9e1a05' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>time since forecast_reference_time</dd><dt><span>standard_name :</span></dt><dd>forecast_period</dd></dl></div><div class='xr-var-data'><pre>array(0, dtype=&#x27;timedelta64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>heightAboveGround</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>2.0</div><input id='attrs-36ab1092-cb7a-4323-a289-ee583dd91b20' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-36ab1092-cb7a-4323-a289-ee583dd91b20' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-bec17e62-579a-4cc4-a4a7-8668a4d88b08' class='xr-var-data-in' type='checkbox'><label for='data-bec17e62-579a-4cc4-a4a7-8668a4d88b08' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>height above the surface</dd><dt><span>units :</span></dt><dd>m</dd><dt><span>positive :</span></dt><dd>up</dd><dt><span>standard_name :</span></dt><dd>height</dd></dl></div><div class='xr-var-data'><pre>array(2.)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>latitude</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>16.28 16.31 16.34 ... 55.51 55.48</div><input id='attrs-81186770-43da-4c0f-80fe-4b53cd518eb7' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-81186770-43da-4c0f-80fe-4b53cd518eb7' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-bce3ee2c-887e-436e-aadf-acdcbe743b87' class='xr-var-data-in' type='checkbox'><label for='data-bce3ee2c-887e-436e-aadf-acdcbe743b87' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>degrees_north</dd><dt><span>standard_name :</span></dt><dd>latitude</dd><dt><span>long_name :</span></dt><dd>latitude</dd></dl></div><div class='xr-var-data'><pre>array([[16.281     , 16.30836614, 16.33562845, ..., 17.38598091,\n",
              "        17.363161  , 17.34023363],\n",
              "       [16.39828505, 16.42568412, 16.45297923, ..., 17.50458529,\n",
              "        17.48173835, 17.45878381],\n",
              "       [16.51559943, 16.54303139, 16.57035924, ..., 17.62321703,\n",
              "        17.60034309, 17.57736144],\n",
              "       ...,\n",
              "       [53.97394127, 54.00790887, 54.04173934, ..., 55.33884573,\n",
              "        55.31079595, 55.2826082 ],\n",
              "       [54.07324369, 54.10721488, 54.14104889, ..., 55.43826705,\n",
              "        55.41021535, 55.38202566],\n",
              "       [54.17241813, 54.20639281, 54.24023027, ..., 55.53755643,\n",
              "        55.5095029 , 55.48131134]])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>longitude</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>233.9 234.0 234.1 ... 302.4 302.6</div><input id='attrs-119af44e-1fd8-4862-a523-341cf39b48aa' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-119af44e-1fd8-4862-a523-341cf39b48aa' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-afd32099-b1a5-4503-ba02-1ad6c59d55e1' class='xr-var-data-in' type='checkbox'><label for='data-afd32099-b1a5-4503-ba02-1ad6c59d55e1' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>degrees_east</dd><dt><span>standard_name :</span></dt><dd>longitude</dd><dt><span>long_name :</span></dt><dd>longitude</dd></dl></div><div class='xr-var-data'><pre>array([[233.862     , 233.98419514, 234.1064416 , ..., 290.71357615,\n",
              "        290.83782217, 290.96202426],\n",
              "       [233.83341078, 233.95571014, 234.07806096, ..., 290.73745411,\n",
              "        290.86180986, 290.98612158],\n",
              "       [233.80476994, 233.9271737 , 234.04962904, ..., 290.76137592,\n",
              "        290.8858416 , 291.01026312],\n",
              "       ...,\n",
              "       [220.2599064 , 220.42892476, 220.59808701, ..., 302.16983749,\n",
              "        302.34470507, 302.51944524],\n",
              "       [220.20196465, 220.37116928, 220.54051831, ..., 302.21910048,\n",
              "        302.3941759 , 302.56912343],\n",
              "       [220.14387816, 220.31326939, 220.48280555, ..., 302.26849092,\n",
              "        302.44377462, 302.61892995]])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>valid_time</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2024-01-01T06:00:00</div><input id='attrs-ff7e36a8-519b-4cd3-91b2-ba33ad7a096e' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-ff7e36a8-519b-4cd3-91b2-ba33ad7a096e' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-5cf85adc-ac89-4d93-8aa8-e5fc551c02d3' class='xr-var-data-in' type='checkbox'><label for='data-5cf85adc-ac89-4d93-8aa8-e5fc551c02d3' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>time</dd><dt><span>long_name :</span></dt><dd>time</dd></dl></div><div class='xr-var-data'><pre>array(&#x27;2024-01-01T06:00:00.000000000&#x27;, dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>gribfile_projection</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>object</div><div class='xr-var-preview xr-preview'>None</div><input id='attrs-18d87e77-6397-479c-8feb-44391b1e44d5' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-18d87e77-6397-479c-8feb-44391b1e44d5' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-c0df86f1-9fd5-471f-9ebe-ac01d76f6820' class='xr-var-data-in' type='checkbox'><label for='data-c0df86f1-9fd5-471f-9ebe-ac01d76f6820' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>crs_wkt :</span></dt><dd>PROJCRS[&quot;unknown&quot;,BASEGEOGCRS[&quot;unknown&quot;,DATUM[&quot;unknown&quot;,ELLIPSOID[&quot;unknown&quot;,6371229,0,LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]]],PRIMEM[&quot;Greenwich&quot;,0,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8901]]],CONVERSION[&quot;unknown&quot;,METHOD[&quot;Lambert Conic Conformal (2SP)&quot;,ID[&quot;EPSG&quot;,9802]],PARAMETER[&quot;Latitude of false origin&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8821]],PARAMETER[&quot;Longitude of false origin&quot;,265,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8822]],PARAMETER[&quot;Latitude of 1st standard parallel&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8823]],PARAMETER[&quot;Latitude of 2nd standard parallel&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8824]],PARAMETER[&quot;Easting at false origin&quot;,0,LENGTHUNIT[&quot;metre&quot;,1],ID[&quot;EPSG&quot;,8826]],PARAMETER[&quot;Northing at false origin&quot;,0,LENGTHUNIT[&quot;metre&quot;,1],ID[&quot;EPSG&quot;,8827]]],CS[Cartesian,2],AXIS[&quot;(E)&quot;,east,ORDER[1],LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]],AXIS[&quot;(N)&quot;,north,ORDER[2],LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]]]</dd><dt><span>semi_major_axis :</span></dt><dd>6371229.0</dd><dt><span>semi_minor_axis :</span></dt><dd>6371229.0</dd><dt><span>inverse_flattening :</span></dt><dd>0.0</dd><dt><span>reference_ellipsoid_name :</span></dt><dd>unknown</dd><dt><span>longitude_of_prime_meridian :</span></dt><dd>0.0</dd><dt><span>prime_meridian_name :</span></dt><dd>Greenwich</dd><dt><span>geographic_crs_name :</span></dt><dd>unknown</dd><dt><span>horizontal_datum_name :</span></dt><dd>unknown</dd><dt><span>projected_crs_name :</span></dt><dd>unknown</dd><dt><span>grid_mapping_name :</span></dt><dd>lambert_conformal_conic</dd><dt><span>standard_parallel :</span></dt><dd>(25.0, 25.0)</dd><dt><span>latitude_of_projection_origin :</span></dt><dd>25.0</dd><dt><span>longitude_of_central_meridian :</span></dt><dd>265.0</dd><dt><span>false_easting :</span></dt><dd>0.0</dd><dt><span>false_northing :</span></dt><dd>0.0</dd><dt><span>long_name :</span></dt><dd>RAP model grid projection</dd></dl></div><div class='xr-var-data'><pre>array(None, dtype=object)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-be717f25-081f-4e00-9bd4-4b8f05c72f35' class='xr-section-summary-in' type='checkbox'  checked><label for='section-be717f25-081f-4e00-9bd4-4b8f05c72f35' class='xr-section-summary' >Data variables: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>d2m</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>292.1 292.5 292.7 ... 268.6 268.8</div><input id='attrs-44eb0464-9468-4d6f-b3d4-169162813fe1' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-44eb0464-9468-4d6f-b3d4-169162813fe1' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-6337150f-2776-4784-8518-863a95cfb78d' class='xr-var-data-in' type='checkbox'><label for='data-6337150f-2776-4784-8518-863a95cfb78d' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>GRIB_paramId :</span></dt><dd>168</dd><dt><span>GRIB_dataType :</span></dt><dd>fc</dd><dt><span>GRIB_numberOfPoints :</span></dt><dd>151987</dd><dt><span>GRIB_typeOfLevel :</span></dt><dd>heightAboveGround</dd><dt><span>GRIB_stepUnits :</span></dt><dd>1</dd><dt><span>GRIB_stepType :</span></dt><dd>instant</dd><dt><span>GRIB_gridType :</span></dt><dd>lambert</dd><dt><span>GRIB_DxInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_DyInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_LaDInDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin1InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin2InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_LoVInDegrees :</span></dt><dd>265.0</dd><dt><span>GRIB_NV :</span></dt><dd>0</dd><dt><span>GRIB_Nx :</span></dt><dd>451</dd><dt><span>GRIB_Ny :</span></dt><dd>337</dd><dt><span>GRIB_cfName :</span></dt><dd>unknown</dd><dt><span>GRIB_cfVarName :</span></dt><dd>d2m</dd><dt><span>GRIB_gridDefinitionDescription :</span></dt><dd>Lambert Conformal can be secant or tangent, conical or bipolar</dd><dt><span>GRIB_iScansNegatively :</span></dt><dd>0</dd><dt><span>GRIB_jPointsAreConsecutive :</span></dt><dd>0</dd><dt><span>GRIB_jScansPositively :</span></dt><dd>1</dd><dt><span>GRIB_latitudeOfFirstGridPointInDegrees :</span></dt><dd>16.281</dd><dt><span>GRIB_latitudeOfSouthernPoleInDegrees :</span></dt><dd>-90.0</dd><dt><span>GRIB_longitudeOfFirstGridPointInDegrees :</span></dt><dd>233.862</dd><dt><span>GRIB_longitudeOfSouthernPoleInDegrees :</span></dt><dd>0.0</dd><dt><span>GRIB_missingValue :</span></dt><dd>3.4028234663852886e+38</dd><dt><span>GRIB_name :</span></dt><dd>2 metre dewpoint temperature</dd><dt><span>GRIB_parameterName :</span></dt><dd>Dew point temperature</dd><dt><span>GRIB_parameterUnits :</span></dt><dd>K</dd><dt><span>GRIB_shortName :</span></dt><dd>2d</dd><dt><span>GRIB_stepRange :</span></dt><dd>0</dd><dt><span>GRIB_units :</span></dt><dd>K</dd><dt><span>long_name :</span></dt><dd>2 metre dewpoint temperature</dd><dt><span>units :</span></dt><dd>K</dd><dt><span>standard_name :</span></dt><dd>unknown</dd><dt><span>grid_mapping :</span></dt><dd>gribfile_projection</dd></dl></div><div class='xr-var-data'><pre>array([[292.14563, 292.52063, 292.70813, ..., 295.39563, 295.45813,\n",
              "        295.45813],\n",
              "       [291.64563, 291.95813, 292.20813, ..., 295.52063, 295.39563,\n",
              "        295.20813],\n",
              "       [291.08313, 291.20813, 291.52063, ..., 295.58313, 295.39563,\n",
              "        295.08313],\n",
              "       ...,\n",
              "       [277.77063, 277.64563, 277.64563, ..., 267.70813, 267.95813,\n",
              "        268.27063],\n",
              "       [277.77063, 277.70813, 277.70813, ..., 268.02063, 268.27063,\n",
              "        268.52063],\n",
              "       [277.89563, 277.83313, 277.83313, ..., 268.52063, 268.64563,\n",
              "        268.77063]], dtype=float32)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-15f10965-07f0-4c1d-9bc8-e2d0bccfe54f' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-15f10965-07f0-4c1d-9bc8-e2d0bccfe54f' class='xr-section-summary'  title='Expand/collapse section'>Indexes: <span>(0)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'></ul></div></li><li class='xr-section-item'><input id='section-abe95fd6-cf6a-41d9-9ea2-c15a84a66a68' class='xr-section-summary-in' type='checkbox'  ><label for='section-abe95fd6-cf6a-41d9-9ea2-c15a84a66a68' class='xr-section-summary' >Attributes: <span>(12)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>GRIB_edition :</span></dt><dd>2</dd><dt><span>GRIB_centre :</span></dt><dd>kwbc</dd><dt><span>GRIB_centreDescription :</span></dt><dd>US National Weather Service - NCEP</dd><dt><span>GRIB_subCentre :</span></dt><dd>0</dd><dt><span>Conventions :</span></dt><dd>CF-1.7</dd><dt><span>institution :</span></dt><dd>US National Weather Service - NCEP</dd><dt><span>model :</span></dt><dd>rap</dd><dt><span>product :</span></dt><dd>awp130pgrb</dd><dt><span>description :</span></dt><dd>Rapid Refresh (RAP) from NOMADS and Big Data Program</dd><dt><span>remote_grib :</span></dt><dd>https://noaa-rap-pds.s3.amazonaws.com/rap.20240101/rap.t06z.awp130pgrbf00.grib2</dd><dt><span>local_grib :</span></dt><dd>/root/data/rap/20240101/subset_33ef73c2__rap.t06z.awp130pgrbf00.grib2</dd><dt><span>search :</span></dt><dd>DPT:2 m</dd></dl></div></li></ul></div></div>"
            ],
            "text/plain": [
              "<xarray.Dataset>\n",
              "Dimensions:              (y: 337, x: 451)\n",
              "Coordinates:\n",
              "    time                 datetime64[ns] 2024-01-01T06:00:00\n",
              "    step                 timedelta64[ns] 00:00:00\n",
              "    heightAboveGround    float64 2.0\n",
              "    latitude             (y, x) float64 16.28 16.31 16.34 ... 55.54 55.51 55.48\n",
              "    longitude            (y, x) float64 233.9 234.0 234.1 ... 302.3 302.4 302.6\n",
              "    valid_time           datetime64[ns] 2024-01-01T06:00:00\n",
              "    gribfile_projection  object None\n",
              "Dimensions without coordinates: y, x\n",
              "Data variables:\n",
              "    d2m                  (y, x) float32 292.1 292.5 292.7 ... 268.5 268.6 268.8\n",
              "Attributes:\n",
              "    GRIB_edition:            2\n",
              "    GRIB_centre:             kwbc\n",
              "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "    GRIB_subCentre:          0\n",
              "    Conventions:             CF-1.7\n",
              "    institution:             US National Weather Service - NCEP\n",
              "    model:                   rap\n",
              "    product:                 awp130pgrb\n",
              "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "    local_grib:              /root/data/rap/20240101/subset_33ef73c2__rap.t06...\n",
              "    search:                  DPT:2 m"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "## List the contents of the xarrays\n",
        "## note the variables we will reference are defined in 'Data Variables'\n",
        "print(\"ds3: \", ds3)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 375
        },
        "id": "vgzZ4vuwzQYB",
        "outputId": "a8e62d23-4719-445c-faf0-68ae84304f34"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
              "<defs>\n",
              "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
              "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
              "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
              "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
              "</symbol>\n",
              "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
              "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
              "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
              "</symbol>\n",
              "</defs>\n",
              "</svg>\n",
              "<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
              " *\n",
              " */\n",
              "\n",
              ":root {\n",
              "  --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
              "  --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
              "  --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
              "  --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
              "  --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
              "  --xr-background-color: var(--jp-layout-color0, white);\n",
              "  --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
              "  --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
              "}\n",
              "\n",
              "html[theme=dark],\n",
              "body[data-theme=dark],\n",
              "body.vscode-dark {\n",
              "  --xr-font-color0: rgba(255, 255, 255, 1);\n",
              "  --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
              "  --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
              "  --xr-border-color: #1F1F1F;\n",
              "  --xr-disabled-color: #515151;\n",
              "  --xr-background-color: #111111;\n",
              "  --xr-background-color-row-even: #111111;\n",
              "  --xr-background-color-row-odd: #313131;\n",
              "}\n",
              "\n",
              ".xr-wrap {\n",
              "  display: block !important;\n",
              "  min-width: 300px;\n",
              "  max-width: 700px;\n",
              "}\n",
              "\n",
              ".xr-text-repr-fallback {\n",
              "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-header {\n",
              "  padding-top: 6px;\n",
              "  padding-bottom: 6px;\n",
              "  margin-bottom: 4px;\n",
              "  border-bottom: solid 1px var(--xr-border-color);\n",
              "}\n",
              "\n",
              ".xr-header > div,\n",
              ".xr-header > ul {\n",
              "  display: inline;\n",
              "  margin-top: 0;\n",
              "  margin-bottom: 0;\n",
              "}\n",
              "\n",
              ".xr-obj-type,\n",
              ".xr-array-name {\n",
              "  margin-left: 2px;\n",
              "  margin-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-obj-type {\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-sections {\n",
              "  padding-left: 0 !important;\n",
              "  display: grid;\n",
              "  grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
              "}\n",
              "\n",
              ".xr-section-item {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-section-item input {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-section-item input + label {\n",
              "  color: var(--xr-disabled-color);\n",
              "}\n",
              "\n",
              ".xr-section-item input:enabled + label {\n",
              "  cursor: pointer;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-section-item input:enabled + label:hover {\n",
              "  color: var(--xr-font-color0);\n",
              "}\n",
              "\n",
              ".xr-section-summary {\n",
              "  grid-column: 1;\n",
              "  color: var(--xr-font-color2);\n",
              "  font-weight: 500;\n",
              "}\n",
              "\n",
              ".xr-section-summary > span {\n",
              "  display: inline-block;\n",
              "  padding-left: 0.5em;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:disabled + label {\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-section-summary-in + label:before {\n",
              "  display: inline-block;\n",
              "  content: '►';\n",
              "  font-size: 11px;\n",
              "  width: 15px;\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:disabled + label:before {\n",
              "  color: var(--xr-disabled-color);\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked + label:before {\n",
              "  content: '▼';\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked + label > span {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-section-summary,\n",
              ".xr-section-inline-details {\n",
              "  padding-top: 4px;\n",
              "  padding-bottom: 4px;\n",
              "}\n",
              "\n",
              ".xr-section-inline-details {\n",
              "  grid-column: 2 / -1;\n",
              "}\n",
              "\n",
              ".xr-section-details {\n",
              "  display: none;\n",
              "  grid-column: 1 / -1;\n",
              "  margin-bottom: 5px;\n",
              "}\n",
              "\n",
              ".xr-section-summary-in:checked ~ .xr-section-details {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-array-wrap {\n",
              "  grid-column: 1 / -1;\n",
              "  display: grid;\n",
              "  grid-template-columns: 20px auto;\n",
              "}\n",
              "\n",
              ".xr-array-wrap > label {\n",
              "  grid-column: 1;\n",
              "  vertical-align: top;\n",
              "}\n",
              "\n",
              ".xr-preview {\n",
              "  color: var(--xr-font-color3);\n",
              "}\n",
              "\n",
              ".xr-array-preview,\n",
              ".xr-array-data {\n",
              "  padding: 0 5px !important;\n",
              "  grid-column: 2;\n",
              "}\n",
              "\n",
              ".xr-array-data,\n",
              ".xr-array-in:checked ~ .xr-array-preview {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              ".xr-array-in:checked ~ .xr-array-data,\n",
              ".xr-array-preview {\n",
              "  display: inline-block;\n",
              "}\n",
              "\n",
              ".xr-dim-list {\n",
              "  display: inline-block !important;\n",
              "  list-style: none;\n",
              "  padding: 0 !important;\n",
              "  margin: 0;\n",
              "}\n",
              "\n",
              ".xr-dim-list li {\n",
              "  display: inline-block;\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "}\n",
              "\n",
              ".xr-dim-list:before {\n",
              "  content: '(';\n",
              "}\n",
              "\n",
              ".xr-dim-list:after {\n",
              "  content: ')';\n",
              "}\n",
              "\n",
              ".xr-dim-list li:not(:last-child):after {\n",
              "  content: ',';\n",
              "  padding-right: 5px;\n",
              "}\n",
              "\n",
              ".xr-has-index {\n",
              "  font-weight: bold;\n",
              "}\n",
              "\n",
              ".xr-var-list,\n",
              ".xr-var-item {\n",
              "  display: contents;\n",
              "}\n",
              "\n",
              ".xr-var-item > div,\n",
              ".xr-var-item label,\n",
              ".xr-var-item > .xr-var-name span {\n",
              "  background-color: var(--xr-background-color-row-even);\n",
              "  margin-bottom: 0;\n",
              "}\n",
              "\n",
              ".xr-var-item > .xr-var-name:hover span {\n",
              "  padding-right: 5px;\n",
              "}\n",
              "\n",
              ".xr-var-list > li:nth-child(odd) > div,\n",
              ".xr-var-list > li:nth-child(odd) > label,\n",
              ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
              "  background-color: var(--xr-background-color-row-odd);\n",
              "}\n",
              "\n",
              ".xr-var-name {\n",
              "  grid-column: 1;\n",
              "}\n",
              "\n",
              ".xr-var-dims {\n",
              "  grid-column: 2;\n",
              "}\n",
              "\n",
              ".xr-var-dtype {\n",
              "  grid-column: 3;\n",
              "  text-align: right;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-var-preview {\n",
              "  grid-column: 4;\n",
              "}\n",
              "\n",
              ".xr-index-preview {\n",
              "  grid-column: 2 / 5;\n",
              "  color: var(--xr-font-color2);\n",
              "}\n",
              "\n",
              ".xr-var-name,\n",
              ".xr-var-dims,\n",
              ".xr-var-dtype,\n",
              ".xr-preview,\n",
              ".xr-attrs dt {\n",
              "  white-space: nowrap;\n",
              "  overflow: hidden;\n",
              "  text-overflow: ellipsis;\n",
              "  padding-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-var-name:hover,\n",
              ".xr-var-dims:hover,\n",
              ".xr-var-dtype:hover,\n",
              ".xr-attrs dt:hover {\n",
              "  overflow: visible;\n",
              "  width: auto;\n",
              "  z-index: 1;\n",
              "}\n",
              "\n",
              ".xr-var-attrs,\n",
              ".xr-var-data,\n",
              ".xr-index-data {\n",
              "  display: none;\n",
              "  background-color: var(--xr-background-color) !important;\n",
              "  padding-bottom: 5px !important;\n",
              "}\n",
              "\n",
              ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
              ".xr-var-data-in:checked ~ .xr-var-data,\n",
              ".xr-index-data-in:checked ~ .xr-index-data {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              ".xr-var-data > table {\n",
              "  float: right;\n",
              "}\n",
              "\n",
              ".xr-var-name span,\n",
              ".xr-var-data,\n",
              ".xr-index-name div,\n",
              ".xr-index-data,\n",
              ".xr-attrs {\n",
              "  padding-left: 25px !important;\n",
              "}\n",
              "\n",
              ".xr-attrs,\n",
              ".xr-var-attrs,\n",
              ".xr-var-data,\n",
              ".xr-index-data {\n",
              "  grid-column: 1 / -1;\n",
              "}\n",
              "\n",
              "dl.xr-attrs {\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "  display: grid;\n",
              "  grid-template-columns: 125px auto;\n",
              "}\n",
              "\n",
              ".xr-attrs dt,\n",
              ".xr-attrs dd {\n",
              "  padding: 0;\n",
              "  margin: 0;\n",
              "  float: left;\n",
              "  padding-right: 10px;\n",
              "  width: auto;\n",
              "}\n",
              "\n",
              ".xr-attrs dt {\n",
              "  font-weight: normal;\n",
              "  grid-column: 1;\n",
              "}\n",
              "\n",
              ".xr-attrs dt:hover span {\n",
              "  display: inline-block;\n",
              "  background: var(--xr-background-color);\n",
              "  padding-right: 10px;\n",
              "}\n",
              "\n",
              ".xr-attrs dd {\n",
              "  grid-column: 2;\n",
              "  white-space: pre-wrap;\n",
              "  word-break: break-all;\n",
              "}\n",
              "\n",
              ".xr-icon-database,\n",
              ".xr-icon-file-text2,\n",
              ".xr-no-icon {\n",
              "  display: inline-block;\n",
              "  vertical-align: middle;\n",
              "  width: 1em;\n",
              "  height: 1.5em !important;\n",
              "  stroke-width: 0;\n",
              "  stroke: currentColor;\n",
              "  fill: currentColor;\n",
              "}\n",
              "</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt;\n",
              "Dimensions:              (depthBelowLandLayer: 9, y: 337, x: 451)\n",
              "Coordinates:\n",
              "    time                 datetime64[ns] 2024-01-01T06:00:00\n",
              "    step                 timedelta64[ns] 00:00:00\n",
              "  * depthBelowLandLayer  (depthBelowLandLayer) float64 0.0 0.01 0.04 ... 1.6 3.0\n",
              "    latitude             (y, x) float64 16.28 16.31 16.34 ... 55.54 55.51 55.48\n",
              "    longitude            (y, x) float64 233.9 234.0 234.1 ... 302.3 302.4 302.6\n",
              "    valid_time           datetime64[ns] 2024-01-01T06:00:00\n",
              "    gribfile_projection  object None\n",
              "Dimensions without coordinates: y, x\n",
              "Data variables:\n",
              "    st                   (depthBelowLandLayer, y, x) float32 298.3 ... 272.5\n",
              "    soilw                (depthBelowLandLayer, y, x) float32 0.9999 ... 1.0\n",
              "Attributes:\n",
              "    GRIB_edition:            2\n",
              "    GRIB_centre:             kwbc\n",
              "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "    GRIB_subCentre:          0\n",
              "    Conventions:             CF-1.7\n",
              "    institution:             US National Weather Service - NCEP\n",
              "    model:                   rap\n",
              "    product:                 awp130bgrb\n",
              "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "    local_grib:              /root/data/rap/20240101/subset_33ef08dd__rap.t06...\n",
              "    search:                  (?:SOIL|TOSIL)</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-e5acf8e8-71af-4fd7-86a2-3f1768b96b4e' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-e5acf8e8-71af-4fd7-86a2-3f1768b96b4e' class='xr-section-summary'  title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>depthBelowLandLayer</span>: 9</li><li><span>y</span>: 337</li><li><span>x</span>: 451</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-2a575686-3771-4783-afdf-510a16579672' class='xr-section-summary-in' type='checkbox'  checked><label for='section-2a575686-3771-4783-afdf-510a16579672' class='xr-section-summary' >Coordinates: <span>(7)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>time</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2024-01-01T06:00:00</div><input id='attrs-755e8720-7079-4677-8f6b-2b5aa7a5df30' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-755e8720-7079-4677-8f6b-2b5aa7a5df30' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-2df3f110-7f0e-4428-af70-7024ae3a36d0' class='xr-var-data-in' type='checkbox'><label for='data-2df3f110-7f0e-4428-af70-7024ae3a36d0' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>initial time of forecast</dd><dt><span>standard_name :</span></dt><dd>forecast_reference_time</dd></dl></div><div class='xr-var-data'><pre>array(&#x27;2024-01-01T06:00:00.000000000&#x27;, dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>step</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>timedelta64[ns]</div><div class='xr-var-preview xr-preview'>00:00:00</div><input id='attrs-51c4513f-6c65-47c3-b788-c056865669a5' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-51c4513f-6c65-47c3-b788-c056865669a5' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-6251d36f-afc1-4139-a967-00b7555cec49' class='xr-var-data-in' type='checkbox'><label for='data-6251d36f-afc1-4139-a967-00b7555cec49' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>time since forecast_reference_time</dd><dt><span>standard_name :</span></dt><dd>forecast_period</dd></dl></div><div class='xr-var-data'><pre>array(0, dtype=&#x27;timedelta64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>depthBelowLandLayer</span></div><div class='xr-var-dims'>(depthBelowLandLayer)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>0.0 0.01 0.04 0.1 ... 1.0 1.6 3.0</div><input id='attrs-7bf3cf1e-a015-4257-87ea-dac77ffe2fc2' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-7bf3cf1e-a015-4257-87ea-dac77ffe2fc2' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-7a32fd16-291d-4d22-8725-2c9fc1be839a' class='xr-var-data-in' type='checkbox'><label for='data-7a32fd16-291d-4d22-8725-2c9fc1be839a' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>soil depth</dd><dt><span>units :</span></dt><dd>m</dd><dt><span>positive :</span></dt><dd>down</dd><dt><span>standard_name :</span></dt><dd>depth</dd></dl></div><div class='xr-var-data'><pre>array([0.  , 0.01, 0.04, 0.1 , 0.3 , 0.6 , 1.  , 1.6 , 3.  ])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>latitude</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>16.28 16.31 16.34 ... 55.51 55.48</div><input id='attrs-718a6e3c-59db-432e-8e2d-b6461cbe7367' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-718a6e3c-59db-432e-8e2d-b6461cbe7367' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-3d874700-494b-4f09-8354-c652976c208d' class='xr-var-data-in' type='checkbox'><label for='data-3d874700-494b-4f09-8354-c652976c208d' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>degrees_north</dd><dt><span>standard_name :</span></dt><dd>latitude</dd><dt><span>long_name :</span></dt><dd>latitude</dd></dl></div><div class='xr-var-data'><pre>array([[16.281     , 16.30836614, 16.33562845, ..., 17.38598091,\n",
              "        17.363161  , 17.34023363],\n",
              "       [16.39828505, 16.42568412, 16.45297923, ..., 17.50458529,\n",
              "        17.48173835, 17.45878381],\n",
              "       [16.51559943, 16.54303139, 16.57035924, ..., 17.62321703,\n",
              "        17.60034309, 17.57736144],\n",
              "       ...,\n",
              "       [53.97394127, 54.00790887, 54.04173934, ..., 55.33884573,\n",
              "        55.31079595, 55.2826082 ],\n",
              "       [54.07324369, 54.10721488, 54.14104889, ..., 55.43826705,\n",
              "        55.41021535, 55.38202566],\n",
              "       [54.17241813, 54.20639281, 54.24023027, ..., 55.53755643,\n",
              "        55.5095029 , 55.48131134]])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>longitude</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>233.9 234.0 234.1 ... 302.4 302.6</div><input id='attrs-c1ae57ac-bd1d-4ee4-9ad7-26854a9cf37b' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-c1ae57ac-bd1d-4ee4-9ad7-26854a9cf37b' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-57b95e19-2808-488a-b4fb-4f183f883879' class='xr-var-data-in' type='checkbox'><label for='data-57b95e19-2808-488a-b4fb-4f183f883879' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>degrees_east</dd><dt><span>standard_name :</span></dt><dd>longitude</dd><dt><span>long_name :</span></dt><dd>longitude</dd></dl></div><div class='xr-var-data'><pre>array([[233.862     , 233.98419514, 234.1064416 , ..., 290.71357615,\n",
              "        290.83782217, 290.96202426],\n",
              "       [233.83341078, 233.95571014, 234.07806096, ..., 290.73745411,\n",
              "        290.86180986, 290.98612158],\n",
              "       [233.80476994, 233.9271737 , 234.04962904, ..., 290.76137592,\n",
              "        290.8858416 , 291.01026312],\n",
              "       ...,\n",
              "       [220.2599064 , 220.42892476, 220.59808701, ..., 302.16983749,\n",
              "        302.34470507, 302.51944524],\n",
              "       [220.20196465, 220.37116928, 220.54051831, ..., 302.21910048,\n",
              "        302.3941759 , 302.56912343],\n",
              "       [220.14387816, 220.31326939, 220.48280555, ..., 302.26849092,\n",
              "        302.44377462, 302.61892995]])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>valid_time</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2024-01-01T06:00:00</div><input id='attrs-992aaf31-ec73-4d55-8610-0bc5e7494e51' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-992aaf31-ec73-4d55-8610-0bc5e7494e51' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-e49a9974-57da-47c3-af29-f2f800d7c3fe' class='xr-var-data-in' type='checkbox'><label for='data-e49a9974-57da-47c3-af29-f2f800d7c3fe' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>time</dd><dt><span>long_name :</span></dt><dd>time</dd></dl></div><div class='xr-var-data'><pre>array(&#x27;2024-01-01T06:00:00.000000000&#x27;, dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>gribfile_projection</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>object</div><div class='xr-var-preview xr-preview'>None</div><input id='attrs-c9f682d7-8a5a-4781-bdea-83bd5a15bd40' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-c9f682d7-8a5a-4781-bdea-83bd5a15bd40' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-883351d0-9e65-4f90-8d93-d8436514180d' class='xr-var-data-in' type='checkbox'><label for='data-883351d0-9e65-4f90-8d93-d8436514180d' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>crs_wkt :</span></dt><dd>PROJCRS[&quot;unknown&quot;,BASEGEOGCRS[&quot;unknown&quot;,DATUM[&quot;unknown&quot;,ELLIPSOID[&quot;unknown&quot;,6371229,0,LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]]],PRIMEM[&quot;Greenwich&quot;,0,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8901]]],CONVERSION[&quot;unknown&quot;,METHOD[&quot;Lambert Conic Conformal (2SP)&quot;,ID[&quot;EPSG&quot;,9802]],PARAMETER[&quot;Latitude of false origin&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8821]],PARAMETER[&quot;Longitude of false origin&quot;,265,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8822]],PARAMETER[&quot;Latitude of 1st standard parallel&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8823]],PARAMETER[&quot;Latitude of 2nd standard parallel&quot;,25,ANGLEUNIT[&quot;degree&quot;,0.0174532925199433],ID[&quot;EPSG&quot;,8824]],PARAMETER[&quot;Easting at false origin&quot;,0,LENGTHUNIT[&quot;metre&quot;,1],ID[&quot;EPSG&quot;,8826]],PARAMETER[&quot;Northing at false origin&quot;,0,LENGTHUNIT[&quot;metre&quot;,1],ID[&quot;EPSG&quot;,8827]]],CS[Cartesian,2],AXIS[&quot;(E)&quot;,east,ORDER[1],LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]],AXIS[&quot;(N)&quot;,north,ORDER[2],LENGTHUNIT[&quot;metre&quot;,1,ID[&quot;EPSG&quot;,9001]]]]</dd><dt><span>semi_major_axis :</span></dt><dd>6371229.0</dd><dt><span>semi_minor_axis :</span></dt><dd>6371229.0</dd><dt><span>inverse_flattening :</span></dt><dd>0.0</dd><dt><span>reference_ellipsoid_name :</span></dt><dd>unknown</dd><dt><span>longitude_of_prime_meridian :</span></dt><dd>0.0</dd><dt><span>prime_meridian_name :</span></dt><dd>Greenwich</dd><dt><span>geographic_crs_name :</span></dt><dd>unknown</dd><dt><span>horizontal_datum_name :</span></dt><dd>unknown</dd><dt><span>projected_crs_name :</span></dt><dd>unknown</dd><dt><span>grid_mapping_name :</span></dt><dd>lambert_conformal_conic</dd><dt><span>standard_parallel :</span></dt><dd>(25.0, 25.0)</dd><dt><span>latitude_of_projection_origin :</span></dt><dd>25.0</dd><dt><span>longitude_of_central_meridian :</span></dt><dd>265.0</dd><dt><span>false_easting :</span></dt><dd>0.0</dd><dt><span>false_northing :</span></dt><dd>0.0</dd><dt><span>long_name :</span></dt><dd>RAP model grid projection</dd></dl></div><div class='xr-var-data'><pre>array(None, dtype=object)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-f5c24ce5-31fd-4104-be87-b49c29e61c13' class='xr-section-summary-in' type='checkbox'  checked><label for='section-f5c24ce5-31fd-4104-be87-b49c29e61c13' class='xr-section-summary' >Data variables: <span>(2)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>st</span></div><div class='xr-var-dims'>(depthBelowLandLayer, y, x)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>298.3 298.3 298.3 ... 272.5 272.5</div><input id='attrs-3760df32-fde4-4354-8239-1d9407e4250b' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-3760df32-fde4-4354-8239-1d9407e4250b' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-69c37b11-c257-4129-bcd1-5361663bf5be' class='xr-var-data-in' type='checkbox'><label for='data-69c37b11-c257-4129-bcd1-5361663bf5be' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>GRIB_paramId :</span></dt><dd>228139</dd><dt><span>GRIB_dataType :</span></dt><dd>fc</dd><dt><span>GRIB_numberOfPoints :</span></dt><dd>151987</dd><dt><span>GRIB_typeOfLevel :</span></dt><dd>depthBelowLandLayer</dd><dt><span>GRIB_stepUnits :</span></dt><dd>1</dd><dt><span>GRIB_stepType :</span></dt><dd>instant</dd><dt><span>GRIB_gridType :</span></dt><dd>lambert</dd><dt><span>GRIB_DxInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_DyInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_LaDInDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin1InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin2InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_LoVInDegrees :</span></dt><dd>265.0</dd><dt><span>GRIB_NV :</span></dt><dd>0</dd><dt><span>GRIB_Nx :</span></dt><dd>451</dd><dt><span>GRIB_Ny :</span></dt><dd>337</dd><dt><span>GRIB_cfName :</span></dt><dd>unknown</dd><dt><span>GRIB_cfVarName :</span></dt><dd>st</dd><dt><span>GRIB_gridDefinitionDescription :</span></dt><dd>Lambert Conformal can be secant or tangent, conical or bipolar</dd><dt><span>GRIB_iScansNegatively :</span></dt><dd>0</dd><dt><span>GRIB_jPointsAreConsecutive :</span></dt><dd>0</dd><dt><span>GRIB_jScansPositively :</span></dt><dd>1</dd><dt><span>GRIB_latitudeOfFirstGridPointInDegrees :</span></dt><dd>16.281</dd><dt><span>GRIB_latitudeOfSouthernPoleInDegrees :</span></dt><dd>-90.0</dd><dt><span>GRIB_longitudeOfFirstGridPointInDegrees :</span></dt><dd>233.862</dd><dt><span>GRIB_longitudeOfSouthernPoleInDegrees :</span></dt><dd>0.0</dd><dt><span>GRIB_missingValue :</span></dt><dd>3.4028234663852886e+38</dd><dt><span>GRIB_name :</span></dt><dd>Soil temperature</dd><dt><span>GRIB_parameterName :</span></dt><dd>Soil temperature</dd><dt><span>GRIB_parameterUnits :</span></dt><dd>K</dd><dt><span>GRIB_shortName :</span></dt><dd>st</dd><dt><span>GRIB_stepRange :</span></dt><dd>0</dd><dt><span>GRIB_units :</span></dt><dd>K</dd><dt><span>long_name :</span></dt><dd>Soil temperature</dd><dt><span>units :</span></dt><dd>K</dd><dt><span>standard_name :</span></dt><dd>unknown</dd><dt><span>grid_mapping :</span></dt><dd>gribfile_projection</dd></dl></div><div class='xr-var-data'><pre>array([[[298.33688, 298.32687, 298.31686, ..., 301.14688, 301.14688,\n",
              "         301.14688],\n",
              "        [298.20688, 298.19687, 298.1869 , ..., 301.12686, 301.13687,\n",
              "         301.13687],\n",
              "        [298.04688, 298.0269 , 298.01688, ..., 301.10687, 301.11688,\n",
              "         301.10687],\n",
              "        ...,\n",
              "        [279.39688, 279.4969 , 279.62686, ..., 272.41687, 272.44687,\n",
              "         272.4669 ],\n",
              "        [279.37686, 279.4369 , 279.5269 , ..., 272.44687, 272.47687,\n",
              "         272.48688],\n",
              "        [279.35687, 279.39688, 279.44687, ..., 272.4969 , 272.5269 ,\n",
              "         272.53687]],\n",
              "\n",
              "       [[298.33496, 298.33496, 298.32495, ..., 301.15497, 301.15497,\n",
              "         301.14496],\n",
              "        [298.20496, 298.19495, 298.19495, ..., 301.13495, 301.14496,\n",
              "         301.13495],\n",
              "        [298.04495, 298.03497, 298.01495, ..., 301.10495, 301.11496,\n",
              "         301.10495],\n",
              "...\n",
              "        [279.39633, 279.49634, 279.62634, ..., 272.41632, 272.44632,\n",
              "         272.46634],\n",
              "        [279.37634, 279.43634, 279.53632, ..., 272.44632, 272.47632,\n",
              "         272.48633],\n",
              "        [279.36633, 279.39633, 279.44632, ..., 272.50632, 272.52634,\n",
              "         272.53632]],\n",
              "\n",
              "       [[298.33774, 298.32773, 298.31775, ..., 301.14774, 301.14774,\n",
              "         301.14774],\n",
              "        [298.20773, 298.19772, 298.18774, ..., 301.12775, 301.13773,\n",
              "         301.13773],\n",
              "        [298.04773, 298.02774, 298.01773, ..., 301.10773, 301.11774,\n",
              "         301.09775],\n",
              "        ...,\n",
              "        [279.39774, 279.49774, 279.62775, ..., 272.41772, 272.44772,\n",
              "         272.45773],\n",
              "        [279.37775, 279.43774, 279.52774, ..., 272.44772, 272.47772,\n",
              "         272.48773],\n",
              "        [279.35773, 279.39774, 279.44772, ..., 272.49774, 272.52774,\n",
              "         272.53772]]], dtype=float32)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>soilw</span></div><div class='xr-var-dims'>(depthBelowLandLayer, y, x)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>0.9999 0.9999 0.9999 ... 1.0 1.0</div><input id='attrs-eaef6c3e-78d6-4cad-93a9-ed8eadd8c451' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-eaef6c3e-78d6-4cad-93a9-ed8eadd8c451' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-94ccc6f9-6671-41fb-864c-ee0a85eb60cf' class='xr-var-data-in' type='checkbox'><label for='data-94ccc6f9-6671-41fb-864c-ee0a85eb60cf' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>GRIB_paramId :</span></dt><dd>260185</dd><dt><span>GRIB_dataType :</span></dt><dd>fc</dd><dt><span>GRIB_numberOfPoints :</span></dt><dd>151987</dd><dt><span>GRIB_typeOfLevel :</span></dt><dd>depthBelowLandLayer</dd><dt><span>GRIB_stepUnits :</span></dt><dd>1</dd><dt><span>GRIB_stepType :</span></dt><dd>instant</dd><dt><span>GRIB_gridType :</span></dt><dd>lambert</dd><dt><span>GRIB_DxInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_DyInMetres :</span></dt><dd>13545.0</dd><dt><span>GRIB_LaDInDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin1InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_Latin2InDegrees :</span></dt><dd>25.0</dd><dt><span>GRIB_LoVInDegrees :</span></dt><dd>265.0</dd><dt><span>GRIB_NV :</span></dt><dd>0</dd><dt><span>GRIB_Nx :</span></dt><dd>451</dd><dt><span>GRIB_Ny :</span></dt><dd>337</dd><dt><span>GRIB_cfName :</span></dt><dd>unknown</dd><dt><span>GRIB_cfVarName :</span></dt><dd>unknown</dd><dt><span>GRIB_gridDefinitionDescription :</span></dt><dd>Lambert Conformal can be secant or tangent, conical or bipolar</dd><dt><span>GRIB_iScansNegatively :</span></dt><dd>0</dd><dt><span>GRIB_jPointsAreConsecutive :</span></dt><dd>0</dd><dt><span>GRIB_jScansPositively :</span></dt><dd>1</dd><dt><span>GRIB_latitudeOfFirstGridPointInDegrees :</span></dt><dd>16.281</dd><dt><span>GRIB_latitudeOfSouthernPoleInDegrees :</span></dt><dd>-90.0</dd><dt><span>GRIB_longitudeOfFirstGridPointInDegrees :</span></dt><dd>233.862</dd><dt><span>GRIB_longitudeOfSouthernPoleInDegrees :</span></dt><dd>0.0</dd><dt><span>GRIB_missingValue :</span></dt><dd>3.4028234663852886e+38</dd><dt><span>GRIB_name :</span></dt><dd>Volumetric soil moisture content</dd><dt><span>GRIB_parameterName :</span></dt><dd>192</dd><dt><span>GRIB_parameterUnits :</span></dt><dd>192</dd><dt><span>GRIB_shortName :</span></dt><dd>soilw</dd><dt><span>GRIB_stepRange :</span></dt><dd>0</dd><dt><span>GRIB_units :</span></dt><dd>Proportion</dd><dt><span>long_name :</span></dt><dd>Volumetric soil moisture content</dd><dt><span>units :</span></dt><dd>Proportion</dd><dt><span>standard_name :</span></dt><dd>unknown</dd><dt><span>grid_mapping :</span></dt><dd>gribfile_projection</dd></dl></div><div class='xr-var-data'><pre>array([[[0.999899 , 0.999899 , 0.999899 , ..., 0.999899 , 0.999899 ,\n",
              "         0.999899 ],\n",
              "        [0.999899 , 0.999899 , 0.999899 , ..., 0.999899 , 0.999899 ,\n",
              "         0.999899 ],\n",
              "        [0.999899 , 0.999899 , 0.999899 , ..., 0.999899 , 0.999899 ,\n",
              "         0.999899 ],\n",
              "        ...,\n",
              "        [0.999899 , 0.999899 , 0.999899 , ..., 0.999899 , 0.999899 ,\n",
              "         0.999899 ],\n",
              "        [0.999899 , 0.999899 , 0.999899 , ..., 0.999899 , 0.999899 ,\n",
              "         0.999899 ],\n",
              "        [0.999899 , 0.999899 , 0.999899 , ..., 0.999899 , 0.999899 ,\n",
              "         0.999899 ]],\n",
              "\n",
              "       [[1.00019  , 1.00019  , 1.00019  , ..., 1.00019  , 1.00019  ,\n",
              "         1.00019  ],\n",
              "        [1.00019  , 1.00019  , 1.00019  , ..., 1.00019  , 1.00019  ,\n",
              "         1.00019  ],\n",
              "        [1.00019  , 1.00019  , 1.00019  , ..., 1.00019  , 1.00019  ,\n",
              "         1.00019  ],\n",
              "...\n",
              "        [1.       , 1.       , 1.       , ..., 1.       , 1.       ,\n",
              "         1.       ],\n",
              "        [1.       , 1.       , 1.       , ..., 1.       , 1.       ,\n",
              "         1.       ],\n",
              "        [1.       , 1.       , 1.       , ..., 1.       , 1.       ,\n",
              "         1.       ]],\n",
              "\n",
              "       [[1.0003946, 1.0003946, 1.0003946, ..., 1.0003946, 1.0003946,\n",
              "         1.0003946],\n",
              "        [1.0003946, 1.0003946, 1.0003946, ..., 1.0003946, 1.0003946,\n",
              "         1.0003946],\n",
              "        [1.0003946, 1.0003946, 1.0003946, ..., 1.0003946, 1.0003946,\n",
              "         1.0003946],\n",
              "        ...,\n",
              "        [1.0003946, 1.0003946, 1.0003946, ..., 1.0003946, 1.0003946,\n",
              "         1.0003946],\n",
              "        [1.0003946, 1.0003946, 1.0003946, ..., 1.0003946, 1.0003946,\n",
              "         1.0003946],\n",
              "        [1.0003946, 1.0003946, 1.0003946, ..., 1.0003946, 1.0003946,\n",
              "         1.0003946]]], dtype=float32)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-e9dc67fb-7d75-4400-be69-a826c8a02d7d' class='xr-section-summary-in' type='checkbox'  ><label for='section-e9dc67fb-7d75-4400-be69-a826c8a02d7d' class='xr-section-summary' >Indexes: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-index-name'><div>depthBelowLandLayer</div></div><div class='xr-index-preview'>PandasIndex</div><div></div><input id='index-2ae5e459-a1b3-422c-8dea-7ca460e4fcdf' class='xr-index-data-in' type='checkbox'/><label for='index-2ae5e459-a1b3-422c-8dea-7ca460e4fcdf' title='Show/Hide index repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-index-data'><pre>PandasIndex(Index([0.0, 0.01, 0.04, 0.1, 0.3, 0.6, 1.0, 1.6, 3.0], dtype=&#x27;float64&#x27;, name=&#x27;depthBelowLandLayer&#x27;))</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-85276353-fc2f-4007-a4e2-e09180f4643b' class='xr-section-summary-in' type='checkbox'  ><label for='section-85276353-fc2f-4007-a4e2-e09180f4643b' class='xr-section-summary' >Attributes: <span>(12)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>GRIB_edition :</span></dt><dd>2</dd><dt><span>GRIB_centre :</span></dt><dd>kwbc</dd><dt><span>GRIB_centreDescription :</span></dt><dd>US National Weather Service - NCEP</dd><dt><span>GRIB_subCentre :</span></dt><dd>0</dd><dt><span>Conventions :</span></dt><dd>CF-1.7</dd><dt><span>institution :</span></dt><dd>US National Weather Service - NCEP</dd><dt><span>model :</span></dt><dd>rap</dd><dt><span>product :</span></dt><dd>awp130bgrb</dd><dt><span>description :</span></dt><dd>Rapid Refresh (RAP) from NOMADS and Big Data Program</dd><dt><span>remote_grib :</span></dt><dd>https://noaa-rap-pds.s3.amazonaws.com/rap.20240101/rap.t06z.awp130bgrbf00.grib2</dd><dt><span>local_grib :</span></dt><dd>/root/data/rap/20240101/subset_33ef08dd__rap.t06z.awp130bgrbf00.grib2</dd><dt><span>search :</span></dt><dd>(?:SOIL|TOSIL)</dd></dl></div></li></ul></div></div>"
            ],
            "text/plain": [
              "<xarray.Dataset>\n",
              "Dimensions:              (depthBelowLandLayer: 9, y: 337, x: 451)\n",
              "Coordinates:\n",
              "    time                 datetime64[ns] 2024-01-01T06:00:00\n",
              "    step                 timedelta64[ns] 00:00:00\n",
              "  * depthBelowLandLayer  (depthBelowLandLayer) float64 0.0 0.01 0.04 ... 1.6 3.0\n",
              "    latitude             (y, x) float64 16.28 16.31 16.34 ... 55.54 55.51 55.48\n",
              "    longitude            (y, x) float64 233.9 234.0 234.1 ... 302.3 302.4 302.6\n",
              "    valid_time           datetime64[ns] 2024-01-01T06:00:00\n",
              "    gribfile_projection  object None\n",
              "Dimensions without coordinates: y, x\n",
              "Data variables:\n",
              "    st                   (depthBelowLandLayer, y, x) float32 298.3 ... 272.5\n",
              "    soilw                (depthBelowLandLayer, y, x) float32 0.9999 ... 1.0\n",
              "Attributes:\n",
              "    GRIB_edition:            2\n",
              "    GRIB_centre:             kwbc\n",
              "    GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "    GRIB_subCentre:          0\n",
              "    Conventions:             CF-1.7\n",
              "    institution:             US National Weather Service - NCEP\n",
              "    model:                   rap\n",
              "    product:                 awp130bgrb\n",
              "    description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "    remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "    local_grib:              /root/data/rap/20240101/subset_33ef08dd__rap.t06...\n",
              "    search:                  (?:SOIL|TOSIL)"
            ]
          },
          "execution_count": 17,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "## List the contents of the xarrays\n",
        "## note the variables we will reference are defined in 'Data Variables'\n",
        "print(\"dg: \", dg)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DT6ZH-fCKL-9"
      },
      "source": [
        "If we print the contents of the ds list that we created, we notice that the output is different. For more information on reading model data output and selecting model variables, reference the HERBIE documentation and tutorials."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "O7DxeqaNKdet",
        "outputId": "a7384f43-c747-40da-fb36-2788c6a108f8"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[<xarray.Dataset>\n",
              " Dimensions:              (y: 337, x: 451)\n",
              " Coordinates:\n",
              "     time                 datetime64[ns] 2024-01-01T06:00:00\n",
              "     step                 timedelta64[ns] 00:00:00\n",
              "     heightAboveGround    float64 10.0\n",
              "     latitude             (y, x) float64 16.28 16.31 16.34 ... 55.54 55.51 55.48\n",
              "     longitude            (y, x) float64 233.9 234.0 234.1 ... 302.3 302.4 302.6\n",
              "     valid_time           datetime64[ns] 2024-01-01T06:00:00\n",
              "     gribfile_projection  object None\n",
              " Dimensions without coordinates: y, x\n",
              " Data variables:\n",
              "     u10                  (y, x) float32 -6.786 -6.974 -6.974 ... 12.71 12.15\n",
              "     v10                  (y, x) float32 -4.955 -5.08 -5.33 ... -4.455 -4.768\n",
              " Attributes:\n",
              "     GRIB_edition:            2\n",
              "     GRIB_centre:             kwbc\n",
              "     GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "     GRIB_subCentre:          0\n",
              "     Conventions:             CF-1.7\n",
              "     institution:             US National Weather Service - NCEP\n",
              "     model:                   rap\n",
              "     product:                 awp130pgrb\n",
              "     description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "     remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "     local_grib:              /root/data/rap/20240101/subset_33ef7551__rap.t06...\n",
              "     search:                  (?:TMP:2 m|GRD:10 m|DPT:2 m|GUST|RH: 2 m),\n",
              " <xarray.Dataset>\n",
              " Dimensions:              (y: 337, x: 451)\n",
              " Coordinates:\n",
              "     time                 datetime64[ns] 2024-01-01T06:00:00\n",
              "     step                 timedelta64[ns] 00:00:00\n",
              "     heightAboveGround    float64 2.0\n",
              "     latitude             (y, x) float64 16.28 16.31 16.34 ... 55.54 55.51 55.48\n",
              "     longitude            (y, x) float64 233.9 234.0 234.1 ... 302.3 302.4 302.6\n",
              "     valid_time           datetime64[ns] 2024-01-01T06:00:00\n",
              "     gribfile_projection  object None\n",
              " Dimensions without coordinates: y, x\n",
              " Data variables:\n",
              "     t2m                  (y, x) float32 297.1 296.9 296.8 ... 270.7 271.0 271.2\n",
              "     d2m                  (y, x) float32 292.1 292.5 292.7 ... 268.5 268.6 268.8\n",
              " Attributes:\n",
              "     GRIB_edition:            2\n",
              "     GRIB_centre:             kwbc\n",
              "     GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "     GRIB_subCentre:          0\n",
              "     Conventions:             CF-1.7\n",
              "     institution:             US National Weather Service - NCEP\n",
              "     model:                   rap\n",
              "     product:                 awp130pgrb\n",
              "     description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "     remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "     local_grib:              /root/data/rap/20240101/subset_33ef7551__rap.t06...\n",
              "     search:                  (?:TMP:2 m|GRD:10 m|DPT:2 m|GUST|RH: 2 m),\n",
              " <xarray.Dataset>\n",
              " Dimensions:              (y: 337, x: 451)\n",
              " Coordinates:\n",
              "     time                 datetime64[ns] 2024-01-01T06:00:00\n",
              "     step                 timedelta64[ns] 00:00:00\n",
              "     surface              float64 0.0\n",
              "     latitude             (y, x) float64 16.28 16.31 16.34 ... 55.54 55.51 55.48\n",
              "     longitude            (y, x) float64 233.9 234.0 234.1 ... 302.3 302.4 302.6\n",
              "     valid_time           datetime64[ns] 2024-01-01T06:00:00\n",
              "     gribfile_projection  object None\n",
              " Dimensions without coordinates: y, x\n",
              " Data variables:\n",
              "     gust                 (y, x) float32 8.732 8.982 9.044 ... 16.29 15.86 15.36\n",
              " Attributes:\n",
              "     GRIB_edition:            2\n",
              "     GRIB_centre:             kwbc\n",
              "     GRIB_centreDescription:  US National Weather Service - NCEP\n",
              "     GRIB_subCentre:          0\n",
              "     Conventions:             CF-1.7\n",
              "     institution:             US National Weather Service - NCEP\n",
              "     model:                   rap\n",
              "     product:                 awp130pgrb\n",
              "     description:             Rapid Refresh (RAP) from NOMADS and Big Data Pro...\n",
              "     remote_grib:             https://noaa-rap-pds.s3.amazonaws.com/rap.202401...\n",
              "     local_grib:              /root/data/rap/20240101/subset_33ef7551__rap.t06...\n",
              "     search:                  (?:TMP:2 m|GRD:10 m|DPT:2 m|GUST|RH: 2 m)]"
            ]
          },
          "execution_count": 18,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "## List the contents of the xarrays read in one lump\n",
        "print(\"ds: \", ds)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FSG-VvjLSvl5"
      },
      "source": [
        "Below is a demonstration on how we will use HERBIE in the processing code to extract specific variables from the RAP data from the previously created datasets. In this example, we are extracting data from RAP's 2m temperature, as well as the latitude and longitude values, on September 1 2022 at 0UTC."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "KqfA4YExQIoO",
        "outputId": "5c94d56f-4420-4722-8c55-6f0c500905b4"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Print a single temp from index [260,34]:  282.67032\n"
          ]
        }
      ],
      "source": [
        "# these are all numpy vectors\n",
        "lat = ds1.latitude.values\n",
        "lon = ds1.longitude.values\n",
        "tmp_2m = ds1.t2m.values\n",
        "rh_2m = ds1.r2.values\n",
        "gust = ds2.gust.values\n",
        "d2m = ds3.d2m.values\n",
        "print('Print a single temp from index [260,34]: ', tmp_2m[260, 34])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "sjcFRXHexX70"
      },
      "outputs": [],
      "source": [
        "## Store additional varibles into numpy vectors\n",
        "soilw = dg.soilw.values\n",
        "soilt = dg.st.values"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LCm9Mrr1CoZa"
      },
      "source": [
        "Congratulations, we have successfully grabbed input variables from a RAP file using the HERBIE tool. This is the same method that will be used in the next section of this notebook."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Jcntv1Fou7GN"
      },
      "source": [
        "1.1.3 We will use similar commands and tools in section 1.2 when we process the dataset. But reminder that HERBIE is a tool. If you prefer to substitute this method with pynio in your own practice outside of this colab notebook, that would work the same way. Below is code how to open a RAP grib2 file called *RAP_FILE* and store it into a dataset grbs:\n",
        "\n",
        "\n",
        "```\n",
        "grbs = xr.open_dataset(RAP_FILE,\n",
        "         engine='pynio',\n",
        "         lock=False,\n",
        "         backend_kwargs=dict(format=\"grib2\"),\n",
        "         )\n",
        "```\n",
        "\n",
        "If you have exatracted the whole RAP file, or even a subset, then you will be able to reference variables by the names provided in RAP documentation: https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table4-2.shtml. When you know which variables are of interest, then this is code on how to select specific varialbes and their values to store into a xarray.\n",
        "\n",
        "```\n",
        "temp2m_var = grbs['TMP_P0_L103_GRLL0'].values\n",
        "```\n",
        "\n",
        "would store temperature at 2m into a variable named *temp2m_var*"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WVX__HnUntiS"
      },
      "source": [
        "# 1.2 Processing the Data\n",
        "\n",
        "**In this section, we will process the RAVE data that we imported with RAP variables to create an ML ready dataset. There are different ways we could choose to build an ML-ready dataset based on what type of ML model we would like to train. For modeling hourly FRP, we are interested in each grid cell where there is a non-zero FRP point from the time step before. We could either design an ML-ready dataset on the whole domain or we can store data in a tabular method where each hour there are entries where there are non-zero FRP points. To train the RF ML model, we can choose to store the ML-ready dataset in a tabular method. This means that we will process the inputs for each non-zero FRP point in the RAVE dataset, by each hour, and pair it with the corresponding RAP gridcell weather variable data and the latitude/longitude location and hour of day. As we do this, we will then store the combined data into a tabular CSV format. For this notebook, we made this choice because we seek to model hourly FRP once a fire is burning. We are not interested in zero values for FRP and therefore not interested in RAP gridcells that have zero values for FRP.**\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6jIlzhjG57aj"
      },
      "source": [
        "1.2.0 First, we will load the Python tools needed to perform the data merge"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "cSXYJyoM57G2"
      },
      "outputs": [],
      "source": [
        "import xarray as xr\n",
        "import netCDF4 as nc\n",
        "import datetime\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import datetime\n",
        "import netCDF4 as nc\n",
        "from pyproj import Proj\n",
        "import os\n",
        "from datetime import datetime, timedelta\n",
        "from scipy.spatial.distance import cdist\n",
        "import gc\n",
        "import numpy.ma as ma\n",
        "import pygrib\n",
        "import glob\n",
        "import matplotlib.pyplot as plt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MIz_wignPFeE"
      },
      "source": [
        "Then we create a colab folder to store, or output, the processed hourly CSV files in once they have been created."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ozMigCCJPMk5"
      },
      "outputs": [],
      "source": [
        "# Check to see if the subdirectory exists already\n",
        "# If it does not, make a new subdirectory\n",
        "if not os.path.exists(\"RAVE_RAP_proc\"):\n",
        "    os.makedirs(\"RAVE_RAP_proc\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pTraYmjA6Irt"
      },
      "source": [
        "1.2.1 In the following subsection, we will write program blocks that will be used in a main coding block in section 1.2.2 that will merge RAP and RAVE data by hour and location to make hourly files that contain an FRP, location, time of day, and weather variables. But first, we start with defining the location of the output csv files and the columns, which is the future list of inputs, of the dataframes that we will store into the csv files. We have restated the file names, mostly for the benefit of this notebook and keeping track of which files we are using. If more files are wished to be used in an iterative process, this block of code could be modified with directory locations instead of specific file names or variables."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "uwBsh7PUw2cd"
      },
      "outputs": [],
      "source": [
        "# Where to store the files?\n",
        "out_directory = './RAVE_RAP_proc'\n",
        "# What was the input RAVE file?"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "KYmX82wd7U5L"
      },
      "outputs": [],
      "source": [
        "# define columns to be output with files\n",
        "columns = ['dateTime', 'id', 'lat', 'lon', 'FRP',\n",
        "        'temp2m', 'rh_2m', 'd2m',\n",
        "        'gust', 'soilw', 'soilt']"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "TTV_4gLw89oi"
      },
      "source": [
        "Next, we define some *functions* that are used by the main code to process the files together. Functions are useful in python because they can be used at any part of the code and called by different scripts and codes.\n",
        "\n",
        "The first function is called:\n",
        "\n",
        "```\n",
        "non_zero()\n",
        "```\n",
        "\n",
        "This function will locate all non-zero FRP points and store them into a python object called a tuple.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "JKPYZNjo89Be"
      },
      "outputs": [],
      "source": [
        "def non_zero(rave_frp):\n",
        "    \"\"\"\n",
        "    Locates nonzero FRP.\n",
        "\n",
        "    Locates all indicies for RAVE nc file that have non-zero FRP\n",
        "    andstores these in a tuple nzi\n",
        "\n",
        "    Parameters\n",
        "    ----------\n",
        "    rave_frp : array-like\n",
        "        Array of RAVE FRP values\n",
        "\n",
        "    Returns\n",
        "    -------\n",
        "    nzi : array-like\n",
        "        Nonzero FRP index values\n",
        "    \"\"\"\n",
        "\n",
        "    frp_0 = rave_frp[:,:]\n",
        "    ff = frp_0 > 0\n",
        "    ff.astype(np.int_)\n",
        "    # Non-zero FRP index values from files\n",
        "    nzi = np.nonzero(ff)\n",
        "\n",
        "    return nzi"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fWq5nSGHHs-p"
      },
      "source": [
        "The next function is called\n",
        "\n",
        "```\n",
        "mergedata\n",
        "```\n",
        "\n",
        "as is the will confirm we have two input files ready to be used. It then calls a function called\n",
        "\n",
        "```\n",
        "create_proc\n",
        "```\n",
        "\n",
        "that returns a completed dataframe object. The dataframe object, called\n",
        "\n",
        "```\n",
        "df\n",
        "```\n",
        "\n",
        "will be the merged RAVE-RAP dataset for a specified hour. At the end of this function, we save and export the dataframe into a csv file. Note that create_proc takes two different RAP HERBIE files because our desired processing code wants variables in different products. If you wish to add more or less, you might need to modify create_proc to take additional or fewer rap_file names.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "8offRd4Ul76P"
      },
      "outputs": [],
      "source": [
        "def mergedata(date, h, RAVE_file, outfile):\n",
        "    \"\"\"\n",
        "    Merges RAVE FRP and RAP variables by date into dataframe\n",
        "\n",
        "    Opens files, exactract variables,\n",
        "\n",
        "    Writes to dataframe in csv\n",
        "\n",
        "    Deletes dataframe\n",
        "\n",
        "    Parameters\n",
        "    ----------\n",
        "    rave_data : file object\n",
        "        Data from rave file for given time\n",
        "    rap_file_* : file object\n",
        "        Data from RAP files for given time\n",
        "    df : dataframe\n",
        "        Dataframe containing variables from same timestamp\n",
        "\n",
        "    \"\"\"\n",
        "\n",
        "    # open RAVE file\n",
        "    rave_data = nc.Dataset(RAVE_file)\n",
        "    # Confirm that the file we are looking for exists\n",
        "    print ('opened RAVE file')\n",
        "\n",
        "    #open RAP files via HERBIE\n",
        "    rap_file_1 = Herbie(date, model=\"rap\" , fxx=0)\n",
        "    rap_file_2 = Herbie(date, model=\"rap\" , fxx=0, product=\"awp130bgrb\")\n",
        "    # Confirm that the file we are looking for exists\n",
        "    print(\"I found the RAP data: \", rap_file_1 , \" and : \", rap_file_2)\n",
        "\n",
        "    # call the processing program and save dataframe to csv\n",
        "    df = create_proc(date, h, rap_file_1, rap_file_2, rave_data)\n",
        "    df.to_csv(outfile, index=False)\n",
        "\n",
        "    # Delete old dataframe\n",
        "    del df\n",
        "    gc.collect()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JaUXvLVns2XG"
      },
      "source": [
        "Below is the last function that we will define, called\n",
        "\n",
        "```\n",
        "create_proc\n",
        "```\n",
        "\n",
        "and will do the bulk of the data processing. Here, we read through the RAVE file and for each FRP point, we go into the RAP file and pull the closest latitude and longitude point as well as the variables of interest. We only do a small subset here, but this is where code could be modified to pull any variables contained in the RAP files.\n",
        "\n",
        "The function states with creating an empty dataframe object to populate with all the current hour's FRP values and RAP variables.\n",
        "\n",
        "The function then reads in all RAVE data, removes the mask that the data are provided with, and collects the non-zero FRP values. It stores these FRP values and the corresponding latitude and longitude values into a little dataframe that is looped through by index.\n",
        "\n",
        "Next, the function enters the loop that cycles through the non-zero FRP values. First in this loop, a few lines of code are dictated to finding the nearest latitude and longitude RAP grid-cell points to the corresponding FRP latitude and longitude. Once those are found, their indices are saved into a variable called\n",
        "\n",
        "```\n",
        "rap_close\n",
        "```\n",
        "\n",
        "that will be used to extract the closest RAP grid variable(s) to the RAVE FRP observation. This is done in an \"if\" loop because we are appending this information into the larger dataframe object. This is just one way in which to pair the data."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "GXVUytGpsJRr"
      },
      "outputs": [],
      "source": [
        "def create_proc(date, h, rap_file_1, rap_file_2, rave_data):\n",
        "    \"\"\"\n",
        "    Takes variables from RAVE and RAP files of same timestamp to return a dataframe\n",
        "\n",
        "    Exactracts and removes mask the RAVE observations, latitude, and longitude\n",
        "    Stores all RAVE observations from that timestep into objects\n",
        "    Sets up and writes RAVE data to the dataframe\n",
        "    Extracts the specified gridded variables from RAP\n",
        "    Loops through entire RAVE dataframe and finds nearest RAP gridcell location\n",
        "    Extracts variable information from corresponding gridcell and writes\n",
        "      to the RAVE row within dataframe\n",
        "\n",
        "\n",
        "    Parameters\n",
        "    ----------\n",
        "    rave_frp : array-like\n",
        "        Array of RAVE FRP values\n",
        "    rave_df: dataframe\n",
        "        Dataframe of non-zero RAVE observations and corresponding RAP variables\n",
        "    rap_close: array-like\n",
        "        Indices of the closest RAP gridded location to current RAVE observation\n",
        "\n",
        "    Returns\n",
        "    -------\n",
        "    df : dataframe\n",
        "        Dataframe for specific timestep\n",
        "    \"\"\"\n",
        "\n",
        "    df = pd.DataFrame(columns=columns)\n",
        "\n",
        "    rave_frp = rave_data.variables['FRP_MEAN'][h,:,:] #masked size (1, 1133, 2500) MW\n",
        "    rave_latt = rave_data.variables['grid_latt'][:] #size (1133, 2500) #center grid that is 3km\n",
        "    rave_lont = rave_data.variables['grid_lont'][:] #size (1133, 2500) #center grid that is 3km\n",
        "\n",
        "    # remove the mask, which fills the null values with -1, and keeps values\n",
        "    rave_frp = rave_frp.filled()\n",
        "\n",
        "    # find the non-zero FRP indicies in RAVE\n",
        "    nzi = non_zero(rave_frp)\n",
        "\n",
        "    # storing all non-zero FRP points from other variables\n",
        "    frp_rave = rave_frp[(nzi[0]),(nzi[1])] # will be the length of the number of non-zero FRP points\n",
        "    frplatt_rave = rave_latt[(nzi[0]),(nzi[1])] # will be the length of the number of non-zero FRP points\n",
        "    frplont_rave = rave_lont[(nzi[0]),(nzi[1])] # will be the length of the number of non-zero FRP points\n",
        "\n",
        "    # set up dataframe of the non-zero RAVE variables for current hour and RAP variables\n",
        "    rave_df = pd.DataFrame(columns = ['grid_lont', 'grid_latt', 'FRP'])\n",
        "\n",
        "    # storing all those variables into the beginning of a dataframe\n",
        "    rave_df['FRP'] = frp_rave\n",
        "    rave_df['grid_latt'] = frplatt_rave\n",
        "    rave_df['grid_lont'] = frplont_rave\n",
        "\n",
        "    print('made rave dataframe rave_df')\n",
        "\n",
        "    first = int(0)\n",
        "\n",
        "    # Make a dataset from desired variables in HERBIE\n",
        "    H = rap_file_1\n",
        "    ds1 = H.xarray(\":(?:TMP|RH):2 m\")\n",
        "    ds2 = H.xarray(\"GUST\")\n",
        "    ds3 = H.xarray(\"DPT:2 m\")\n",
        "\n",
        "    G = rap_file_2\n",
        "    dg = G.xarray(\"(?:SOIL|TOSIL)\")\n",
        "\n",
        "    # loop through the RAVE FRP dataframe\n",
        "    for ind in rave_df.index:\n",
        "\n",
        "        lat_test = ds1.latitude.values.flatten()\n",
        "        lon_test = ds1.longitude.values.flatten()\n",
        "        rap_map = pd.DataFrame({\"raplat\": lat_test, \"raplon\": lon_test})\n",
        "\n",
        "        frp_lat = rave_df['grid_latt']\n",
        "        frp_lon = rave_df['grid_lont']\n",
        "        frp_pt = pd.DataFrame({\"Lat\": frp_lat, \"Lon\": frp_lon})\n",
        "        single = np.array((frp_pt.at[ind,'Lat'], frp_pt.at[ind,'Lon']))\n",
        "        single = single.reshape(1,2)\n",
        "\n",
        "        # single is [lat lont]\n",
        "#        print('single: ', single)\n",
        "\n",
        "        # find the nearest RAP grid indicies to match RAVE data lat and lon\n",
        "        ln_test = lon_test-360\n",
        "        lt_test = lat_test-360\n",
        "        frp_lt = frp_pt.at[ind,'Lat']-360\n",
        "        frp_ln = frp_pt.at[ind,'Lon']-360\n",
        "        abslon = np.abs(ln_test - frp_ln)\n",
        "        abslat = np.abs(lt_test - frp_lt)\n",
        "        c = np.maximum(abslon, abslat)\n",
        "\n",
        "        idx = np.argmin(c)\n",
        "#        print('idx: ', idx)\n",
        "        rap_close = idx\n",
        "#        print('rap_close: ', rap_close)\n",
        "\n",
        "        if np.isnan(frp_lat[ind]):\n",
        "            rap_close = float(\"NAN\")\n",
        "        # For the first time, we build a df. All other times, we will append\n",
        "        if first == 0:\n",
        "            first = int(1)\n",
        "            # check for NaN and fill with NaN\n",
        "            if np.isnan(rap_close):\n",
        "                data_df = pd.DataFrame({\"lat\": float(\"NAN\"),\n",
        "                                        \"lon\": float(\"NAN\"),\n",
        "                                        \"temp2m\": float(\"NAN\"),\n",
        "                                        \"rh_2m\": float(\"NAN\"),\n",
        "                                        \"d2m\": float(\"NAN\"),\n",
        "                                        \"gust\": float(\"NAN\"),\n",
        "                                        \"soilw\": float(\"NAN\"),\n",
        "                                        \"soilt\": float(\"NAN\"),\n",
        "                                        \"FRP\": float(\"NAN\"),\n",
        "                                        \"id\": float(\"NAN\"),\n",
        "                                        \"dateTime\": float(\"NAN\")}, index=[0])\n",
        "            else:\n",
        "                # Store the closest-matched RAP grid cell variable with the RAVE FRP\n",
        "                data_df = pd.DataFrame({\"lat\": ds1.latitude.values.flatten()[rap_close],\n",
        "                                        \"lon\": ds1.longitude.values.flatten()[rap_close],\n",
        "                                        \"temp2m\": ds1.t2m.values.flatten()[rap_close],\n",
        "                                        \"rh_2m\": ds1.r2.values.flatten()[rap_close],\n",
        "                                        \"d2m\": ds3.d2m.values.flatten()[rap_close],\n",
        "                                        \"gust\": ds2.gust.values.flatten()[rap_close],\n",
        "                                        \"soilw\": dg.soilw.values.flatten()[rap_close],\n",
        "                                        \"soilt\": dg.st.values.flatten()[rap_close],\n",
        "                                        \"FRP\": rave_df['FRP'][ind],\n",
        "                                        \"id\": rap_close,\n",
        "                                        \"dateTime\": [date]}, index=[0])\n",
        "            df = pd.DataFrame(data=data_df, index=[0])\n",
        "            del data_df\n",
        "        else:\n",
        "        # Append FRP and RAP together in a dataframe\n",
        "            if np.isnan(rap_close):\n",
        "                data_df2 = pd.DataFrame({\"lat\": float(\"NAN\"),\n",
        "                                        \"lon\": float(\"NAN\"),\n",
        "                                        \"temp2m\": float(\"NAN\"),\n",
        "                                        \"rh_2m\": float(\"NAN\"),\n",
        "                                        \"d2m\": float(\"NAN\"),\n",
        "                                        \"gust\": float(\"NAN\"),\n",
        "                                        \"soilw\": float(\"NAN\"),\n",
        "                                        \"soilt\": float(\"NAN\"),\n",
        "                                        \"FRP\": float(\"NAN\"),\n",
        "                                        \"id\": float(\"NAN\"),\n",
        "                                        \"dateTime\": float(\"NAN\")}, index=[0])\n",
        "            else:\n",
        "                data_df2 = pd.DataFrame({\"lat\": ds1.latitude.values.flatten()[rap_close],\n",
        "                                        \"lon\": ds1.longitude.values.flatten()[rap_close],\n",
        "                                        \"temp2m\": ds1.t2m.values.flatten()[rap_close],\n",
        "                                        \"rh_2m\": ds1.r2.values.flatten()[rap_close],\n",
        "                                        \"d2m\": ds3.d2m.values.flatten()[rap_close],\n",
        "                                        \"gust\": ds2.gust.values.flatten()[rap_close],\n",
        "                                        \"soilw\": dg.soilw.values.flatten()[rap_close],\n",
        "                                        \"soilt\": dg.st.values.flatten()[rap_close],\n",
        "                                        \"FRP\": rave_df['FRP'][ind],\n",
        "                                        \"id\": rap_close,\n",
        "                                        \"dateTime\": [date]}, index=[0])\n",
        "            hold_df_2 = pd.DataFrame(data=data_df2, index=[0])\n",
        "#            df = df.append(hold_df_2, ignore_index=True)\n",
        "            df = pd.concat([df, hold_df_2], ignore_index=True)\n",
        "\n",
        "            del hold_df_2\n",
        "        # else it was a missing RAP and should be NAN\n",
        "    else:\n",
        "        data_df = pd.DataFrame({\"lat\": float(\"NAN\"),\n",
        "                                        \"lon\": float(\"NAN\"),\n",
        "                                        \"temp2m\": float(\"NAN\"),\n",
        "                                        \"rh_2m\": float(\"NAN\"),\n",
        "                                        \"d2m\": float(\"NAN\"),\n",
        "                                        \"gust\": float(\"NAN\"),\n",
        "                                        \"soilw\": float(\"NAN\"),\n",
        "                                        \"soilt\": float(\"NAN\"),\n",
        "                                        \"FRP\": float(\"NAN\"),\n",
        "                                        \"id\": float(\"NAN\"),\n",
        "                                        \"dateTime\": float(\"NAN\")}, index=[0])\n",
        "    return df"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DQUEB1gI9Sc7"
      },
      "source": [
        "1.2.2 Lastly, this is our main function. The main function allows us to loop through multiple files at multiple time steps to create RAVE-RAP hourly files. We will process two hours of files to create the ML and RF ready dataset.\n",
        "\n",
        "In the following code, we define our main function. In that main function, we loop through time. We check and grab our desired input data files. We then run a function, called\n",
        "\n",
        "```\n",
        "mergedata()\n",
        "```\n",
        "\n",
        "This function is where we call that large, the longest function called\n",
        "\n",
        "```\n",
        "create_proc()\n",
        "```\n",
        "\n",
        "That is the function that we defined earlier in the notebook that does our heavy lifting. This function takes the date, RAP file, RAVE file, and output file name as inputs. With these inputs, it will check and read both the selected RAVE and RAP files for the same hour. It will then match the RAVE data location with RAP gridcell, select the RAP variables of interest for the location, create a dataframe object listed by the non-zero FRP points, and finally export/save the dataframe into a csv format.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "YpTaDQpP9bBb",
        "outputId": "ef5bc9f5-537f-4442-bd7f-f9ab591712c6"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Working on date:  2021-09-01 01:00:00\n",
            "pulled RAVE file RAVE-HrlyEmiss-3km_v2r0_blend_s202209010000000_e202209012359590_c202308071356470 (1).nc\n",
            "opened RAVE file\n",
            "✅ Found ┊ model=rap ┊ \u001b[3mproduct=awp130pgrb\u001b[0m ┊ \u001b[38;2;41;130;13m2021-Sep-01 01:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mGRIB2 @ aws\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mIDX @ aws\u001b[0m\n",
            "✅ Found ┊ model=rap ┊ \u001b[3mproduct=awp130bgrb\u001b[0m ┊ \u001b[38;2;41;130;13m2021-Sep-01 01:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mGRIB2 @ aws\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mIDX @ aws\u001b[0m\n",
            "I found the RAP data:  ║HERBIE╠ RAP:awp130pgrb  and :  ║HERBIE╠ RAP:awp130bgrb\n",
            "made rave dataframe rave_df\n",
            "Wrote to ./RAVE_RAP_proc/21090101.csv\n",
            "Working on date:  2021-09-01 02:00:00\n",
            "pulled RAVE file RAVE-HrlyEmiss-3km_v2r0_blend_s202209010000000_e202209012359590_c202308071356470 (1).nc\n",
            "opened RAVE file\n",
            "✅ Found ┊ model=rap ┊ \u001b[3mproduct=awp130pgrb\u001b[0m ┊ \u001b[38;2;41;130;13m2021-Sep-01 02:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mGRIB2 @ aws\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mIDX @ aws\u001b[0m\n",
            "✅ Found ┊ model=rap ┊ \u001b[3mproduct=awp130bgrb\u001b[0m ┊ \u001b[38;2;41;130;13m2021-Sep-01 02:00 UTC\u001b[92m F00\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mGRIB2 @ aws\u001b[0m ┊ \u001b[38;2;255;153;0m\u001b[3mIDX @ aws\u001b[0m\n",
            "I found the RAP data:  ║HERBIE╠ RAP:awp130pgrb  and :  ║HERBIE╠ RAP:awp130bgrb\n",
            "made rave dataframe rave_df\n",
            "Wrote to ./RAVE_RAP_proc/21090102.csv\n"
          ]
        }
      ],
      "source": [
        "# define a main function %\n",
        "def main(year, months, days, hours, outfile=None):\n",
        "    \"\"\"\n",
        "    The main function, which will execute the processing code\n",
        "    and call the previously defined functions\n",
        "\n",
        "    Exactracts and removes mask the RAVE observations, latitude, and longitude\n",
        "    Stores all RAVE observations from that timestep into objects\n",
        "    Sets up and writes RAVE data to the dataframe\n",
        "    Extracts the specified gridded variables from RAP\n",
        "    Loops through entire RAVE dataframe and finds nearest RAP gridcell location\n",
        "    Extracts variable information from corresponding gridcell and writes\n",
        "      to the RAVE row within dataframe\n",
        "\n",
        "\n",
        "    Parameters\n",
        "    ----------\n",
        "    months : list of integers\n",
        "        loop index for the month integer values desired\n",
        "    days: list of integers\n",
        "        loop index for the day integer values desired\n",
        "    hours: list of integers\n",
        "        loop index for the hour integer values desired\n",
        "    outfile: string, optional\n",
        "        location and name of the output csv file\n",
        "    \"\"\"\n",
        "    for m in months:\n",
        "        for d in days:\n",
        "            for h in hours:\n",
        "                try:\n",
        "                    date = datetime(year, m, d, h)\n",
        "                    print('Working on date: ', date)\n",
        "                    # recall that we have already saved the RAVE file in a 1.1.1 as \"RAVE_nc\"\n",
        "                    RAVE_file = RAVE_nc\n",
        "                    print ('pulled RAVE file', RAVE_file)\n",
        "                    if outfile is None:\n",
        "                        # Make the name and location of the output processed file we will save\n",
        "                        outfile = os.path.join(out_directory, \"%s.csv\" % (date.strftime(\"%y%m%d%H\")))\n",
        "\n",
        "                    # Run the merging functions\n",
        "                    mergedata(date, h, RAVE_file, outfile)\n",
        "\n",
        "                    # confirm the output file\n",
        "                    print(\"Wrote to %s\" % outfile)\n",
        "\n",
        "                except ValueError as e:\n",
        "                    pass\n",
        "                    print(\"date for file doesn't exist\")\n",
        "\n",
        "if __name__ == '__main__':\n",
        "    # We are only processing two hours of files from 9-1-22\n",
        "    year = 2021\n",
        "    months = [9]  # specify your month range\n",
        "    days = [1]  # specify your day range\n",
        "    hours = [1, 2]  # the files are daily for RAVE but we want hourly files produced\n",
        "    main(year, months, days, hours)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3X3codJF7XdG"
      },
      "source": [
        "Congratulations! You have now exported hourly csv files, containing the hourly dataframe tables of FRP and RAP data, which can be used to train a machine learning model such as the random forest.\n",
        "\n",
        "From these files, a number of computations can be made and/or applications could be done. For instance, one computation can be if we are interested in calculating a rolling 24-hour average FRP value, then we can write code to read each hour for 24 hours, sum the non-zero FRP for a same latitude and longitude grid value, and then finally the mean over that grid. In fact, that is a value found in section 2 as an input into a demo RF model.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "HFhmy0FLG3Ga"
      },
      "source": [
        "1.2.3 If you desire to merge these csv files into a larger, singular dataset csv file. The code can be found below."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "UQBiILaQle62"
      },
      "outputs": [],
      "source": [
        "path = './RAVE_RAP_proc'\n",
        "extension = '.csv'\n",
        "\n",
        "files = [file for file in os.listdir(path) if file.endswith(extension)]\n",
        "\n",
        "dfs = []\n",
        "for file in files:\n",
        "    df = pd.read_csv(os.path.join(path, file))\n",
        "    dfs.append(df)\n",
        "#    dfs.concat(df)\n",
        "\n",
        "frp_all = pd.concat(dfs, ignore_index=True)\n",
        "\n",
        "frp_all.to_csv('./RAVE_RAP_dataset.csv', index = False)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YoVppmquB-PX"
      },
      "source": [
        "# 2.1 Training a Random Forest for FRP from the RAVE-RAP Dataset Example\n",
        "\n",
        "**In this section, we import a large RAVE-RAP dataset created from data in July 2018 through December 2021. We will then train RF models from this dataset and visualize their performance on blind validation datasets and datasets that meet certain specified credentials.**\n",
        "\n",
        "**MUST DO BEFORE PROCEEDING**: You are going to need to change the colab compute resources to complete the model training in this colab workspace in a timely manner. To do this:\n",
        "\n",
        "> 1) Look to the upper right, possibly below comment and share if you have not hidden the colab header, where it shows the RAM and Disk icons. **Click the RAM and Disk icons**, not the dropdown arrow, to reveal the Resources tab.\n",
        "\n",
        "> 2) At the bottom of that tab is an option that says Change runtime type. Click **Change runtime type** and select **T4GPU** and then select okay, and then finally press save.\n",
        "\n",
        "You can then close the Resources tab by clicking the X next to Resources.\n",
        "\n",
        "To do this, we first need to gather the AI ready dataset from Zenodo: https://zenodo.org/records/10463552 . Note that this step might take several minutes in total. The first wget request will get the dataset, which we will call:\n",
        "\n",
        "```\n",
        "frp_all\n",
        "```\n",
        "\n",
        "Before we make the wget request, we will start from scratch and clear out everything we did in our working space from sections 0 and 1. This includes removing from the working space all previous variables and ensuring that all python tools have been re-imported. You will want to type \"y\" once prompted."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "A0ti5Sbn12EW",
        "outputId": "8bbcf752-ca2d-40ce-9ea3-a5b0d0eab0c0"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Once deleted, variables cannot be recovered. Proceed (y/[n])? y\n",
            "Requirement already satisfied: wget in /usr/local/lib/python3.10/dist-packages (3.2)\n"
          ]
        }
      ],
      "source": [
        "%reset\n",
        "\n",
        "!pip install wget\n",
        "\n",
        "import sys\n",
        "import wget\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import time\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.ensemble import RandomForestRegressor\n",
        "from sklearn import metrics\n",
        "import pickle\n",
        "from sklearn.model_selection import cross_val_score\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "import matplotlib.lines as mlines"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mjIcZo9R-TZP"
      },
      "source": [
        "2.1.1 Next, we will get and download the RF-ready dataset and save it as a dataframe object."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "4KeSXybe-auo"
      },
      "outputs": [],
      "source": [
        "frp_csv = wget.download('https://zenodo.org/records/10790965/files/RAVE_RAP_2019_2021.csv?download=1')\n",
        "frp_all = pd.read_csv(frp_csv)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CdVJARzWulu7"
      },
      "source": [
        "You can click the folder icon on the far left to see that the csv file has been got from the Zenodo database and saved to the colab space. You can also note how large the file is.\n",
        "\n",
        "Lastly, we will check for any NaN values and drop those rows from the dataset."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_g4Ai108k1EE"
      },
      "outputs": [],
      "source": [
        "## drop the rows with NaNs\n",
        "frp_all.dropna(axis=0, subset=['rave_frp', 'time','lat', 'lon', 'hour', 'temp2m', 'wind_gust', 'precip', 'dpt', 'uwind', 'vwind',\n",
        "                                'temp_surf', 'snod', 'spfh', 'pwat', 'weasd', 'dswrf', 'uswrf', 'dlwrf', 'ulwrf',\n",
        "                                'cape', 'ltng', 'tsoil', 'soilw', 'vgtyp', 'sotyp',\n",
        "                                'yester_frp', '24hr_roll_frp'], inplace=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QU_akQUgktZI"
      },
      "source": [
        "2.1.2. In this section, here is where we can modify the dataset for whatever training conditions we wish to apply. This is where understanding your input data becomes important. In our example, the RAVE dataset includes all observed hourly FRP detections, and while it is a well created dataset, it can include false observations and detections as well as encounter other errors and biases associated with satellite retrieved FRP values. One such example might be satellite signatures such as bright flares, etc. can register as weaker FRP values.\n",
        "\n",
        "In this training this ML model, we are attempting to model hourly FRP with known previous FRP information as well as current weather information from RAP. As is similarly seen in other operations, a good way to ensure a comprehensive understanding of previous FRP on a gridded domain is to take a mean of previously observed FRP over some period of time. This helps avoid missed hourly intervals due to cloud or smoke blocking, satellite orbit, etc. There are two mean values included in this dataset:\n",
        "> **yester_frp** which is a mean FRP value that was calculated from 0-23 UTC of the day-before hourly observed FRPs from the corresponding gridcell of the current hour FRP.\n",
        "\n",
        "> **24hr_roll_frp** which is a mean FRP value that was was calculated as a mean up to the hour before the listed FRP value and observation.\n",
        "\n",
        "These pre-calculated values can help refine our ML model training process to make sure that is could perform in real time, since it isn't dependent on a singular previous hour FRP, and help compensate for some of the satellite and/or missing value issues.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "NvA8FagNlB11"
      },
      "outputs": [],
      "source": [
        "## Create a dataset for training data with conditionals\n",
        "\n",
        "## REQUIRED: drop rows where 24hr_roll_frp = 0\n",
        "frp_all = frp_all.loc[~((frp_all['24hr_roll_frp'] <= 0))]\n",
        "frp_all['24hr_roll_frp'] = frp_all['24hr_roll_frp'].fillna(0)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ZsU-P3W5kuB-"
      },
      "source": [
        "The following code block is optional code and all commented out. We can specify any additional conditionals to apply to our dataset, if we have interest in training a model that specifically looks at certain regions or has certain conditions. This can include location, input variable thresholds, etc. In this case, there is an example of how to specify a certain region. To add conditionals, either uncomment the single \"#\" existing code below, or inset your own. Then execute the block.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "E35Cxf_WlNt-"
      },
      "outputs": [],
      "source": [
        "## -- Here are examples where we can specify the region -- ##\n",
        "## drop the lons east of 105\n",
        "\n",
        "#indexNames = frp_all[frp_all['lon'] >= -105 ].index\n",
        "#frp_all.drop(indexNames , inplace=True)\n",
        "#size_frp_all_3 = frp_all.shape\n",
        "#print('size of western lons: ', size_frp_all_3)\n",
        "## drop the lats south of 25\n",
        "#indexNames = frp_all[frp_all['lat'] <= 25 ].index\n",
        "#frp_all.drop(indexNames , inplace=True)\n",
        "#size_frp_all_3 = frp_all.shape\n",
        "#print('size of northern lats: ', size_frp_all_3)\n",
        "\n",
        "## -- Here are examples where we can specify other conditionals, like\n",
        "## -- selecting points only where a fire was burning the time before -- ##\n",
        "## drop rows where 24hr_roll_frp = 0\n",
        "#frp_all = frp_all.loc[~((frp_all['24hr_roll_frp'] <= 0))]\n",
        "#frp_all['24hr_roll_frp'] = frp_all['24hr_roll_frp'].fillna(0)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_xMfWK4lHbVp"
      },
      "source": [
        "Lastly, we will extract some specific dates to remove from our machine learning training and testing process. These dates can later be referenced for the final blind-validation of the model performance."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "467l-rQvH7wx"
      },
      "outputs": [],
      "source": [
        "# Specify the desired time(s) to withold for validation\n",
        "t1 = frp_all[(frp_all['time'] <= '2019-11-01') & (frp_all['time'] > '2019-08-01')]\n",
        "t2 = frp_all[(frp_all['time'] <= '2020-09-25') & (frp_all['time'] > '2020-08-25')]\n",
        "frp_validate = pd.concat([t1, t2])\n",
        "\n",
        "# Remove those same times from the main dataset\n",
        "frp_all=frp_all[~(frp_all['time'] <= '2019-11-01') & (frp_all['time'] > '2019-08-01')]\n",
        "frp_all=frp_all[~(frp_all['time'] <= '2020-09-25') & (frp_all['time'] > '2020-08-25')]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "-NBtLAP3_peG"
      },
      "outputs": [],
      "source": [
        "## check the number of total samples for testing and training\n",
        "n_samples = frp_all.shape[0]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dVlmd28BkuR0"
      },
      "source": [
        "2.1.3 Here is where we will train the RF model to predict the next-hour FRP. This time, we are using the pre-loaded machine-learning ready dataset that we just created. To reference Regressor options in depth, please visit: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html\n",
        "\n",
        "This code takes around 15-20 minutes to run as written. If you changed the estimators and random state, it might take your model less or more time to train."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "9JLBj9yNm0PV",
        "outputId": "ed9c3957-6d67-4611-a69f-34c64fbc7b94"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Training Features Shape: (292532, 25)\n",
            "Training Labels Shape: (292532,)\n",
            "Testing Features Shape: (125372, 25)\n",
            "Testing Labels Shape: (125372,)\n"
          ]
        }
      ],
      "source": [
        "## Create the list of features we will have as inputs\n",
        "feature_list = list(['lat', 'lon', 'hour', 'temp2m', 'wind_gust', 'precip', 'dpt', 'uwind', 'vwind',\n",
        "                                'temp_surf', 'snod', 'spfh', 'pwat', 'weasd', 'dswrf', 'uswrf', 'dlwrf', 'ulwrf',\n",
        "                                'cape', 'ltng', 'tsoil', 'soilw', 'vgtyp', 'sotyp', '24hr_roll_frp'])\n",
        "\n",
        "## Create the features dataframe we will use as inputs\n",
        "features = frp_all[['lat', 'lon', 'hour', 'temp2m', 'wind_gust', 'precip', 'dpt', 'uwind', 'vwind',\n",
        "                                'temp_surf', 'snod', 'spfh', 'pwat', 'weasd', 'dswrf', 'uswrf', 'dlwrf', 'ulwrf',\n",
        "                                'cape', 'ltng', 'tsoil', 'soilw', 'vgtyp', 'sotyp', '24hr_roll_frp']]\n",
        "\n",
        "## Labels\n",
        "labels=frp_all['rave_frp']\n",
        "\n",
        "\n",
        "## Split dataset into training set and test set\n",
        "indices = np.arange(n_samples)\n",
        "train_features, test_features, train_labels, test_labels, idx1, idx2 = train_test_split(features, labels, indices, test_size=0.3) # 70% training and 30% test\n",
        "\n",
        "print('Training Features Shape:', train_features.shape)\n",
        "print('Training Labels Shape:', train_labels.shape)\n",
        "print('Testing Features Shape:', test_features.shape)\n",
        "print('Testing Labels Shape:', test_labels.shape)\n",
        "\n",
        "## RF model where we can specify any number of parameters.\n",
        "## n_estimators = number of trees in the forest\n",
        "## random_state = integer chosen to insure reproducable results\n",
        "rf_model = RandomForestRegressor(n_estimators = 100, random_state = 10)\n",
        "\n",
        "## Train the model on training data\n",
        "rf_model.fit(train_features, train_labels);\n",
        "\n",
        "## Use the forest's predict method on the test data\n",
        "predictions = rf_model.predict(test_features)\n",
        "all_frp = rf_model.predict(features)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GmvXIQmFlWIa"
      },
      "source": [
        "\n",
        "Congratulations, you have trained your first random forest model to take a set of inputs from current hour weather conditions and previous hours' FRP information, and model the current hour FRP.\n",
        "\n",
        "To see how the model did on the testing dataset, run the following code to check out the errors of the trained model.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Ft1ZgAdGm-Gf",
        "outputId": "0788e636-810f-4436-97fb-c923acb414b2"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Mean Absolute Error for FRP: 156.37\n",
            "Mean Squared Error: 599814.8922963786\n"
          ]
        }
      ],
      "source": [
        "## Calculate the absolute errors\n",
        "errors = abs(predictions - test_labels)\n",
        "## Print out the mean absolute error (mae)\n",
        "print('Mean Absolute Error for FRP:', round(np.mean(errors), 2))\n",
        "print('Mean Squared Error:', metrics.mean_squared_error(test_labels, predictions))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8caHgq7anHHM"
      },
      "source": [
        "\n",
        "If you want to save the model, this is how to do it. Trained ML models are large files. In the next sub-section, we will practice opening the saved model and using it to make hourly FRP predictions on the validation data.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "kZkIhPDEnNyN",
        "outputId": "fe4a29f6-5237-443e-88c1-c55206eecbbb"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "saving model:  ./RF_RAVE_RAP_MODEL_TUTORIAL.sav\n"
          ]
        }
      ],
      "source": [
        "## Save the model to disk\n",
        "filename = './RF_RAVE_RAP_MODEL_TUTORIAL.sav'\n",
        "\n",
        "print('saving model: ', filename)\n",
        "n_bytes = 2**31\n",
        "max_bytes = 2**31 - 1\n",
        "data = bytearray(n_bytes)\n",
        "## write to the file\n",
        "bytes_out = pickle.dumps(rf_model)\n",
        "with open(filename, 'wb') as f_out:\n",
        "    for idx in range(0, len(bytes_out), max_bytes):\n",
        "        f_out.write(bytes_out[idx:idx+max_bytes])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2UdMu3B_nVId"
      },
      "source": [
        "2.1.4 We can also check the errors of the trained model against the dataset that we held back. Since this data was completely withheld, this process is called *inference* and is an example how a pretrained model can be used on future or unseen data in application. As is the case with any pretrained models, our input variable selection must be the same input variable selection as the trained model. We cannot only add a few inputs or add extra inputs. It will cause an error.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "QIbkbioDnUv2",
        "outputId": "8d9512a3-8adb-4f11-96d4-f0f0acc0b4ac"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "finished creating the RF FRP values\n",
            "Mean Absolute Error for FRP for validation dataset: 344.7\n",
            "Mean Squared Error for validation dataset: 2128113.6861477955\n"
          ]
        }
      ],
      "source": [
        "## define the input variables\n",
        "validate_features = frp_validate[['lat', 'lon', 'hour', 'temp2m', 'wind_gust', 'precip', 'dpt', 'uwind', 'vwind',\n",
        "                                'temp_surf', 'snod', 'spfh', 'pwat', 'weasd', 'dswrf', 'uswrf', 'dlwrf', 'ulwrf',\n",
        "                                'cape', 'ltng', 'tsoil', 'soilw', 'vgtyp', 'sotyp', '24hr_roll_frp']]\n",
        "\n",
        "## define the target or output variable\n",
        "validate_labels = frp_validate['rave_frp']\n",
        "\n",
        "## run the inference stage and save output into a new column in the validate dataframe\n",
        "validate_result = rf_model.predict(validate_features)\n",
        "frp_validate['RF_FRP'] = validate_result\n",
        "print('finished creating the RF FRP values')\n",
        "\n",
        "## Calculate the absolute errors\n",
        "errors = abs(validate_result - validate_labels)\n",
        "## Print out the mean absolute error (mae)\n",
        "print('Mean Absolute Error for FRP for validation dataset:', round(np.mean(errors), 2))\n",
        "print('Mean Squared Error for validation dataset:', metrics.mean_squared_error(validate_labels, validate_result))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-LVm_r8t0734"
      },
      "source": [
        "Below is example code that shows how to open a previously saved RF model, saved with the name/location of *filename*, and run the inference stage on a set of input variables called *test_features*.\n",
        "\n",
        "```\n",
        "## open the previously saved RF model\n",
        "loaded_model = pickle.load(open(filename, 'rb'))\n",
        "result = loaded_model.predict(test_features)\n",
        "```\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dVYqIJ67odoa"
      },
      "source": [
        "Congratulations! You have successfully completed the interference stage. Remember, you can return to the beginning of section 2.1.2 to apply more conditionals to the dataset. Try rerunning section 2.1 with different inputs and conditionals!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Zd21SHsoIb3p"
      },
      "source": [
        "# 2.2 Analyze the performance of the RF Model\n",
        "\n",
        "In this section, we will apply different tools to the trained RF model to analyze its performance. You will have needed to train the RF model in section 2.1 to apply these tools to the RF model.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Upi1D_2dCF2t"
      },
      "source": [
        "# Next Steps\n",
        "\n",
        "By creating an ML-ready dataset, we can apply this to all sorts of ML modeling methods. For instance, the dataset and pretrained model used in section two are used to create a complete hourly FRP variable. This variable can now be used as a consistent FRP variable for future time steps in another, potentially ML, model."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "M_W1rNiG0a57"
      },
      "source": [
        "2.2.1 In this subsection, we will step through the short code to calculate the importances of the input variables, or features, in the RF model. The importances will sum to 1 and are ranked as most important in determining the hourly FRP value to least important. It is not a direct scientific correlation to hourly FRP and the variables we have used to train the mode. It is a direct measure of what the model has determined as the most important to least important features in calculating the hourly FRP. To learn more about this tool in python, please reference:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0WbB1_vToKcv",
        "outputId": "1ed2d79e-61be-4d94-e577-41a0a70784be"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Variable: 24hr_roll_frp        Importance: 0.54\n",
            "Variable: hour                 Importance: 0.06\n",
            "Variable: vwind                Importance: 0.05\n",
            "Variable: uwind                Importance: 0.04\n",
            "Variable: wind_gust            Importance: 0.03\n",
            "Variable: dpt                  Importance: 0.03\n",
            "Variable: pwat                 Importance: 0.03\n",
            "Variable: lat                  Importance: 0.02\n",
            "Variable: lon                  Importance: 0.02\n",
            "Variable: temp2m               Importance: 0.02\n",
            "Variable: spfh                 Importance: 0.02\n",
            "Variable: dswrf                Importance: 0.02\n",
            "Variable: dlwrf                Importance: 0.02\n",
            "Variable: soilw                Importance: 0.02\n",
            "Variable: temp_surf            Importance: 0.01\n",
            "Variable: uswrf                Importance: 0.01\n",
            "Variable: ulwrf                Importance: 0.01\n",
            "Variable: cape                 Importance: 0.01\n",
            "Variable: tsoil                Importance: 0.01\n",
            "Variable: sotyp                Importance: 0.01\n",
            "Variable: precip               Importance: 0.0\n",
            "Variable: snod                 Importance: 0.0\n",
            "Variable: weasd                Importance: 0.0\n",
            "Variable: ltng                 Importance: 0.0\n",
            "Variable: vgtyp                Importance: 0.0\n"
          ]
        }
      ],
      "source": [
        "## Get numerical feature importances\n",
        "importances = list(rf_model.feature_importances_)\n",
        "\n",
        "## List of tuples with variable and importance\n",
        "feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list, importances)]\n",
        "\n",
        "## Sort the feature importances by most important first\n",
        "feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True)\n",
        "\n",
        "## Print out the feature and importances\n",
        "[print('Variable: {:20} Importance: {}'.format(*pair)) for pair in feature_importances];"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1J1u1Zue7uBF"
      },
      "source": [
        "2.2.2 Here, we can visualize the performance of the model on the blind validation dataset we reserved. This plotting code will plot the truth, or the FRP retrieval for that gridcell at that hour, compared to our RF modeled FRP value for that hour."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 543
        },
        "id": "MQX6X2zEm4o9",
        "outputId": "12bf0374-0013-4ffc-83b8-de917b9ff4ed"
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "<ipython-input-42-a2cf63f0b17d>:9: UserWarning: color is redundantly defined by the 'color' keyword argument and the fmt string \"k-\" (-> color='k'). The keyword argument will take precedence.\n",
            "  plt.plot([lineStart, lineEnd], [lineStart, lineEnd], 'k-', color = 'r')\n"
          ]
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3hTZfvHv0napou20L3ZArJBoAL6okj1Le9PXlEREAHBgfCqoIg4wI24F4iTISCC4ERBREARZIMsEaFQ6EY6oHQleX5/3D45J6Nt0iZN2t6f68rVJnlyznPOSfJ8c0+NEEKAYRiGYRiGafBoPT0BhmEYhmEYxjWwsGMYhmEYhmkksLBjGIZhGIZpJLCwYxiGYRiGaSSwsGMYhmEYhmkksLBjGIZhGIZpJLCwYxiGYRiGaSSwsGMYhmEYhmkksLBjGIZhGIZpJLCwYxjGLqdOnYJGo8Err7zi6anUO+PGjUPLli09PQ1GRcuWLTFu3LhavVaj0eCpp55y2Vw2b94MjUaDzZs3u2ybDOMqWNgxjAMsWrQIGo3GfPPx8UF8fDzGjRuHzMzMKl83f/58aDQa9O3b1+LxNWvWQKPR4MMPP6zytRs2bIBGo8Fbb70FgMSGeg7qm7+/v0PHUVJSgmeffRZdu3ZFYGAgQkNDMXDgQCxZsgTcXdBx8vLy4OPjg9tvv73KMRcuXEBAQABuuummepyZe5GCRqPRYOnSpXbH9O/fHxqNBp07d67n2Xkf1t8b6tujjz5qHteyZUuL54KCgtCnTx8sWbLEZpvqa6DRaODr64vWrVvjjjvuwMmTJ+vz8BgvxcfTE2CYhsQzzzyDVq1aoaysDL/99hsWLVqErVu34tChQ3bF1bJly9CyZUvs3LkTf/31F9q2bQsASEtLQ2hoKJYvX46JEyfa3dfy5cuh0+lw2223mR/T6/V2xaBOp6tx7rm5ubj22mtx9OhR3HbbbZgyZQrKysqwevVqjB07Ft999x2WLVvm0LaaOlFRUbjuuuvw1Vdf4dKlSwgMDLQZs2bNGpSVlVUr/hoq/v7+WL58uc2xnTp1Ctu2bXP4h0ZTQX5vqLEWvt27d8dDDz0EAMjOzsaHH36IsWPHory8HHfddZfNNu+//35cccUVqKysxN69e/H+++9j7dq1OHjwIOLi4tx3MIz3IxiGqZGFCxcKAGLXrl0Wj8+YMUMAEJ999pnNa06ePCkAiDVr1ojIyEjx1FNPWTw/YcIEodVqRWZmps1rS0tLRWhoqLj++uvNj40dO1YEBQXV+hhSU1OFVqsVX331lc1zDz/8sAAgXnzxRfNj6enpAoB4+eWXa71PV3Hx4sV63d/YsWNFcnJytWM++eQTAUB8+umndp8fMmSICA0NFWVlZXWaS30fe3Vs2rRJABA33XST8PHxEfn5+RbPP//88yI6OloMGDBAXH755S7dd3Jyshg7dmytXgtAzJ4922Vzkedh06ZN1Y6r6nvDmuTkZJGWlmbxWF5enggODhYdO3a0u+9Vq1ZZPP7WW28JAOKFF15w/ECYRgm7YhmmDgwcOBAAcOLECZvnli1bhubNmyMtLQ0333wzli1bZvH87bffDpPJhBUrVti8du3atSgqKsLo0aNdMs/ffvsN69evx7hx4/B///d/Ns/PmTMH7dq1w9y5c1FaWmrz/Ouvv47k5GQEBATg6quvxqFDhyyez8nJwfjx45GQkAC9Xo/Y2FjceOONOHXqlMW477//HgMHDkRQUBCaNWuGtLQ0HD582GLMuHHjEBwcjBMnTuDf//43mjVrhtGjR2PKlCkIDg7GpUuXbOY3cuRIxMTEwGg0OrUvAPjyyy/RuXNn+Pv7o3Pnzvjiiy+qPZeS//73vwgKCsLy5cttnsvLy8PGjRtx8803Q6/XAwB27NiB66+/HqGhoQgMDMTVV1+NX3/91eJ1Tz31FDQaDY4cOYJRo0ahefPmGDBggMPnuKpYMuv4tMrKSjz99NNo164d/P39ER4ejgEDBmDDhg0OHfuNN94IvV6PVatWWTy+fPly3HrrrXatvgaDAc8++yzatGkDvV6Pli1b4rHHHkN5ebnFOCEEnnvuOSQkJCAwMBCDBg2ye90AoLCwEA8++CASExOh1+vRtm1bzJ07FyaTqcZjyMzMxJ133ono6Gjo9Xpcfvnl+Pjjj23GnT17FsOGDUNQUBCioqIwdepUmzm7g8jISHTo0MHud4s9rrnmGgBAenq6O6fFNABY2DFMHZCLavPmzW2eW7ZsGW666Sb4+flh5MiROH78OHbt2mV+/qqrrkJCQoJdYbB8+XIEBgZi2LBhNs+dO3fO5lZcXFztPL/55hsAwB133GH3eR8fH4waNQoFBQU2YmPJkiV46623MHnyZMycOROHDh3CNddcg9zcXPOY4cOH44svvsD48eMxf/583H///bhw4QIyMjLMYz755BOkpaUhODgYc+fOxZNPPokjR45gwIABNgLQYDAgNTUVUVFReOWVVzB8+HCMGDECJSUlWLt2rcXYS5cu4ZtvvsHNN99sFhSO7uuHH37A8OHDodFoMGfOHAwbNgzjx4/H7t27qz2fABAUFIQbb7wR69evx/nz5y2e++yzz2A0Gs3C/KeffsJVV12F4uJizJ49Gy+88AIKCwtxzTXXYOfOnTbbvuWWW3Dp0iW88MILZjecI+fYUZ566ik8/fTTGDRoEN555x08/vjjSEpKwt69ex16fWBgIG688UZ8+umn5scOHDiAw4cPY9SoUXZfM3HiRMyaNQs9e/bE66+/jquvvhpz5syxCDUAgFmzZuHJJ59Et27d8PLLL6N169YYMmQISkpKLMZdunQJV199NZYuXYo77rgDb731Fvr374+ZM2di2rRp1c4/NzcX/fr1w48//ogpU6bgzTffRNu2bTFhwgS88cYb5nGlpaW49tprsX79ekyZMgWPP/44fvnlFzzyyCMOnSdJUVGRzWe2JgwGA86ePWv3u8UeUgCGh4c7NTemEeJpkyHDNASkS+XHH38U+fn54syZM+Lzzz8XkZGRQq/XizNnzliM3717twAgNmzYIIQQwmQyiYSEBPHAAw9YjJs+fboAII4dO2Z+rKioSPj7+4uRI0dajB07dqwAYPeWmppa7fyHDRsmAIiCgoIqx6xZs0YAEG+99ZYQQnHFBgQEiLNnz5rH7dixQwAQU6dOFUIIUVBQUKPL9sKFCyIsLEzcddddFo/n5OSI0NBQi8flcT766KMWY00mk4iPjxfDhw+3eHzlypUCgPj555+d3lf37t1FbGysKCwsND/2ww8/CAA1umKFEGLt2rUCgHjvvfcsHu/Xr5+Ij48XRqNRmEwm0a5dO5GamipMJpN5zKVLl0SrVq3EddddZ35s9uzZAoDNtXfkHAtRtcvR2o3ZrVs3G9efI6jdgN9++63QaDQiIyNDCEHv5datWwshhLj66qstXLH79+8XAMTEiRMttidDAH766SchBLkf/fz8RFpamsW5euyxxwQAi2N49tlnRVBQkPjzzz8ttvnoo48KnU5nnpcQtudlwoQJIjY2Vpw7d87itbfddpsIDQ0Vly5dEkII8cYbbwgAYuXKleYxJSUlom3btk65Yu3d1CQnJ4shQ4aI/Px8kZ+fLw4ePCjGjBkjAIjJkydbjJXX4OOPPxb5+fkiKytLrF27VrRs2VJoNJoa3b5M44ctdgzjBIMHD0ZkZCQSExNx8803IygoCF9//TUSEhIsxi1btgzR0dEYNGgQAHKRjRgxAitWrLBwF8rgc7XVbvXq1SgrK7PrhvX398eGDRtsbi+++GK1875w4QIAoFmzZlWOkc9ZW/+GDRuG+Ph48/0+ffqgb9+++O677wAAAQEB8PPzw+bNm1FQUGB32xs2bEBhYSFGjhxpYbXQ6XTo27cvNm3aZPOaSZMmWdzXaDS45ZZb8N133+HixYvmxz/77DPEx8ebXZaO7is7Oxv79+/H2LFjERoaat7eddddh06dOlV5ntQMGTIEkZGRFtcvPT0dv/32G0aOHAmtVov9+/fj+PHjGDVqFP7++2/zfEpKSnDttdfi559/tnEd3nvvvRb3HTnHzhAWFobDhw/j+PHjtd7GkCFD0KJFC6xYsQJCCKxYsQIjR460O1a+V6wtaTJZQFphf/zxR1RUVOB///sfNBqNedyDDz5os81Vq1Zh4MCBaN68ucV1Hjx4MIxGI37++We7cxFCYPXq1fjPf/4DIYTFa1NTU1FUVGS2XH733XeIjY3FzTffbH59YGAg7r77bgfPEjFv3jybz6w1P/zwAyIjIxEZGYkuXbrgk08+wfjx4/Hyyy/b3eadd96JyMhIxMXFIS0tDSUlJVi8eDF69+7t1NyYxgdnxTKME8ybNw/t27dHUVERPv74Y/z888/mGCqJ0WjEihUrMGjQIIt4l759++LVV1/Fxo0bMWTIEABA165d0blzZ3z66afm2Kjly5cjIiICqampNvvX6XQYPHiw0/OWou3ChQsICwuzO6Yq8deuXTubse3bt8fKlSsBUKbu3Llz8dBDDyE6Ohr9+vXD0KFDcccddyAmJgYAzAJCxgFZExISYnHfx8fHRiwDwIgRI/DGG2/g66+/xqhRo3Dx4kV89913uOeee8xCwNF9nT59usrju+yyyxxyS/r4+GDEiBGYP38+MjMzER8fbxZ5UpjL+YwdO7bK7RQVFVm43KwzKB05x87wzDPP4MYbb0T79u3RuXNnXH/99RgzZgy6du3q8DZ8fX1xyy23YPny5ejTpw/OnDlTpRv29OnT0Gq15qxwSUxMDMLCwszXoqprEhkZaeOSPH78OH7//XdERkba3WdeXp7dx/Pz81FYWIj3338f77//frWvPX36NNq2bWshMgF6fzhDnz59ahRcffv2xXPPPQej0YhDhw7hueeeQ0FBAfz8/OyOnzVrFgYOHAidToeIiAh07NgRPj68pDMs7BjGKdRf0MOGDcOAAQMwatQoHDt2DMHBwQAonio7OxsrVqywmxixbNkys7ADyGr36KOPYvfu3UhISMCmTZtwzz33uPRLumPHjvjyyy/x+++/46qrrrI75vfffwcAh61Vah588EH85z//wZdffon169fjySefxJw5c/DTTz+hR48eZovUJ598YleIWB+rXq+HVmvrUOjXrx9atmyJlStXYtSoUfjmm29QWlqKESNGmMc4u6+6cvvtt+Odd97Bp59+iocffhiffvopOnXqhO7du1vM5+WXXzY/Zo1870gCAgJsxtR0jqtDbSUGKL7zxIkT+Oqrr/DDDz/gww8/xOuvv44FCxZUWX7HHqNGjcKCBQvw1FNPoVu3bjW+d6wFUl0wmUy47rrrqox3a9++fZWvA+i6VSW2nRG4riIiIsL8oy01NRUdOnTA0KFD8eabb9qNGezSpUutfuQxjR8WdgxTS3Q6HebMmWMOQJcFR5ctW4aoqCjMmzfP5jVr1qzBF198gQULFpgX75EjR2LmzJlYvnw5kpOTLYLuXcXQoUMxZ84cLFmyxK6wMxqNWL58OZo3b47+/ftbPGfPXffnn3/adGZo06YNHnroITz00EM4fvw4unfvjldffRVLly5FmzZtAFD9t7ouRrfeeivefPNNFBcX47PPPkPLli3Rr18/i3k4sq/k5OQqj+/YsWMOz6dv375o06YNli9fjuuuuw6HDx/G888/bzOfkJCQOh97decYoCSewsJCi9dUVFQgOzvbZlstWrTA+PHjMX78eFy8eBFXXXUVnnrqKaeE3YABA5CUlITNmzdj7ty5VY5LTk6GyWTC8ePH0bFjR/Pjubm5KCwsNF8L9TVp3bq1eVx+fr6NC7pNmza4ePGi0+c0MjISzZo1g9ForPG1ycnJOHToEIQQFqLUmfdHbUlLS8PVV1+NF154Affccw+CgoLcvk+mccAxdgxTB/71r3+hT58+eOONN1BWVobS0lKsWbMGQ4cOxc0332xzmzJlCi5cuICvv/7avI2kpCQMHDgQn332GZYuXYpWrVrhyiuvdOk8r7zySgwePBgLFy7Et99+a/P8448/jj///BOPPPKIjbXoyy+/tOiusXPnTuzYsQM33HADAMpOLCsrs3hNmzZt0KxZM3NZiNTUVISEhOCFF15AZWWlzf7z8/MdPpYRI0agvLwcixcvxrp163DrrbdaPO/ovmJjY9G9e3csXrwYRUVF5uc3bNiAI0eOODwfgNyu+/btw+zZs6HRaCxckr169UKbNm3wyiuvWMQGWs+nOhw5x/Ix69iy999/38Zi9/fff1vcDw4ORtu2bZ0u4yE7o8yePRtjxoypcty///1vALDIOAWA1157DQCJGIBiWH19ffH2229bdEKxfh1AAn/79u1Yv369zXOFhYUwGAx256LT6TB8+HCsXr3apmwPYHk9/v3vfyMrKwuff/65+bFLly5V6cJ1NTNmzMDff/+NDz74oF72xzQO2GLHMHVk+vTpuOWWW7Bo0SI0b94cFy5csFsrDiBXYmRkJJYtW2bhPrz99ttx9913IysrC48//niV+zIYDFW2cpJ11apiyZIluPbaa3HjjTdi1KhRGDhwIMrLy7FmzRps3rwZI0aMwPTp021e17ZtWwwYMACTJk1CeXk53njjDYSHh5tdYH/++SeuvfZa3HrrrejUqRN8fHzwxRdfIDc311zKIiQkBO+++y7GjBmDnj174rbbbkNkZCQyMjKwdu1a9O/fH++8806Vc1fTs2dPtG3bFo8//jjKy8stzqOz+5ozZw7S0tIwYMAA3HnnnTh//jzefvttXH755XZFWFXcfvvteOaZZ/DVV1+hf//+FtZMrVaLDz/8EDfccAMuv/xyjB8/HvHx8cjMzMSmTZsQEhJiLkdTFY6cY4BKitx7770YPnw4rrvuOhw4cADr169HRESExfY6deqEf/3rX+jVqxdatGiB3bt34/PPP8eUKVMcPmbJjTfeiBtvvLHaMd26dcPYsWPx/vvvo7CwEFdffTV27tyJxYsXY9iwYeYko8jISDz88MOYM2cOhg4din//+9/Yt28fvv/+e5tjmD59Or7++msMHToU48aNQ69evVBSUoKDBw/i888/x6lTp2xeI3nxxRexadMm9O3bF3fddRc6deqE8+fPY+/evfjxxx/N5WvuuusuvPPOO7jjjjuwZ88exMbG4pNPPrHbacQd3HDDDejcuTNe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K6VNc3OzXHvtteL1eqW4uFg+85nPSNxcX0dE1q1bJ+ecc464XC6ZM2eOPPLII0eM54c//KHU1taK2+2Wc889VzZu3Djlcz4aHnzwQVm6dOmYZtTatWvlmWeeGTs+k9YiEx544AGxWCxy9913j70309bkK1/5ilgslpSfBQsWjB2faeshItLW1iYf/OAHpbCwUDwejyxZskQ2bdo0dnwmfa7W1tYe8XxYLBa54447RGRmPh/TAkND4208/fTTxhe+8AXjd7/7nSEixu9///uU4w888ICRl5dnPPnkk8b27duNd73rXUZdXZ0RDofH2lxzzTXGsmXLjDfeeMN45ZVXjDlz5hg33HDD2PFQKGSUlJQYN910k7Fr1y7jscceMzwej/GjH/1orM1rr71m2Gw24xvf+IaxZ88e44tf/KLhcDiMnTt3TvsamHH11VcbDz/8sLFr1y5j27Ztxjvf+U6jurraGBoaGmvziU98wqiqqjKef/55Y9OmTcZ5551nnH/++WPH4/G4sXjxYuPKK680tm7dajz99NOG3+83Pve5z421OXTokOH1eo1PfepTxp49e4wf/OAHhs1mM5599tmxNo8//rjhdDqNn//858bu3buN22+/3fD5fEZXV9fJWQzDMP74xz8aTz31lLF//35j3759xuc//3nD4XAYu3btmnFrkY6NGzcatbW1xtKlS4277rpr7P2Ztib333+/sWjRIqOjo2PsJxgMjh2faevR29tr1NTUGLfccouxYcMG49ChQ8Zf/vIX48CBA2NtZtLnaiAQSHk2nnvuOUNEjBdffNEwjJn3fEwXNLHTyIh0YpdMJo3S0lLjm9/85th7/f39hsvlMh577DHDMAxjz549hogYb7755libZ555xrBYLEZbW5thGIbxP//zP0Z+fr4RjUbH2tx7773G/Pnzx16/733vM6699tqU8Zx77rnGxz/+8Smd42QRCAQMETFeeuklwzAwf4fDYTzxxBNjbfbu3WuIiLF+/XrDMECWrVar0dnZOdbmwQcfNHJzc8fW4LOf/ayxaNGilGu9//3vN66++uqx12vWrDHuuOOOsdeJRMIoLy83vv71r0/9RCeB/Px846c//emMXovBwUFj7ty5xnPPPWdccsklY8RuJq7J/fffbyxbtizjsZm4Hvfee69x4YUXjnt8pn+u3nXXXcbs2bONZDI5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",
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "## Define the 1:1 line\n",
        "lineStart = validate_labels.min()\n",
        "lineEnd = validate_labels.max()\n",
        "\n",
        "## Check out the actual test versus predictors with 1:1 line\n",
        "fig1 = plt.gcf()\n",
        "plt.scatter(validate_labels, validate_result, c='b', marker='x', alpha=0.15, label='RF')\n",
        "line = mlines.Line2D([0, 1], [0, 1], color='red')\n",
        "plt.plot([lineStart, lineEnd], [lineStart, lineEnd], 'k-', color = 'r')\n",
        "plt.xlim(lineStart, lineEnd)\n",
        "plt.ylim(lineStart, lineEnd)\n",
        "plt.xlabel('Truth FRP (MW)'); plt.ylabel('Predicted FRP (MW)')\n",
        "plt.title('RAVE Observed Versus Modeled FRP')\n",
        "plt.legend(loc=\"upper left\", title='Models')\n",
        "plt.tight_layout()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DEhPiWaWNe4G"
      },
      "source": [
        "Congratulations! You have finished the Machine Learning for Fire Radiative Power Modeling notebook."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5OIYsLmYB4IH"
      },
      "source": [
        "# References\n",
        "\n",
        "Blaylock, B. K. (2022). Herbie: Retrieve Numerical Weather Prediction Model Data (Version 2022.9.0) [Computer software]. https://doi.org/10.5281/zenodo.4567540\n",
        "\n",
        "Fangjun Li, Xiaoyang Zhang, Shobha Kondragunta, Xiaoman Lu, Ivan Csiszar, Christopher C. Schmidt, Hourly biomass burning emissions product from blended geostationary and polar-orbiting satellites for air quality forecasting applications, Remote Sensing of Environment, Volume 281, 2022,113237, ISSN 0034-4257, https://doi.org/10.1016/j.rse.2022.113237.\n",
        "(https://www.sciencedirect.com/science/article/pii/S0034425722003431)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3CMl55oZBV0b"
      },
      "source": [
        "# Data Statement\n",
        "\n",
        "Data and pretrained model storage located on zenodo at DOI https://doi.org/10.5281/zenodo.10463552\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ShrlqM-_Ge0i"
      },
      "source": [
        "## Disclaimer\n",
        "This  Jupyter notebook is a scientific product and is not official communication of the National Oceanic and Atmospheric Administration, or the United States Department of Commerce. All NOAA Jupyter notebooks are provided on an 'as is' basis and the user assumes responsibility for its use. Any claims against the Department of Commerce or Department of Commerce bureaus stemming from the use of this Jupyter notebook will be governed by all applicable Federal law. Any reference to specific commercial products, processes, or services by service mark, trademark, manufacturer, or otherwise does not constitute or imply their endorsement, recommendation or favoring by the Department of Commerce. The Department of Commerce seal and logo, or the seal and logo of a DOC bureau, shall not be used in any manner to imply endorsement of any commercial product or activity by DOC or the United States Government."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": []
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "gpuType": "T4",
      "include_colab_link": true,
      "provenance": [],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
