{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/ourownstory/neural_prophet/blob/master/tutorials/feature-use/global_modeling.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0Krto6fIvHit"
   },
   "source": [
    "# Global Model\n",
    "When fitting a single forecasting model with shared weights using a dataset composed of many time series, we can achieve what is known as a **global model**. It is specially useful in cases in which a single time series may not reflect the entire time series dynamics. In addition, global models provide better generalization and model size saving. In this notebook, we will build a global model using data from the hourly load of the ERCOT region."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, we load the data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Ywzhdfn2uqLf",
    "outputId": "95decf15-d410-45c9-b703-91fd68891e7f"
   },
   "outputs": [],
   "source": [
    "if 'google.colab' in str(get_ipython()):\n",
    "    !pip install git+https://github.com/ourownstory/neural_prophet.git # may take a while\n",
    "    #!pip install neuralprophet # much faster, but may not have the latest upgrades/bugfixes\n",
    "\n",
    "import pandas as pd\n",
    "from neuralprophet import NeuralProphet, set_log_level\n",
    "from neuralprophet import set_random_seed\n",
    "set_random_seed(10)\n",
    "set_log_level(\"ERROR\", \"INFO\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 140
    },
    "id": "TvrgKVWIuxFJ",
    "outputId": "99908203-2022-456a-9d05-73c3d0e6731e"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ds</th>\n",
       "      <th>COAST</th>\n",
       "      <th>EAST</th>\n",
       "      <th>FAR_WEST</th>\n",
       "      <th>NORTH</th>\n",
       "      <th>NORTH_C</th>\n",
       "      <th>SOUTHERN</th>\n",
       "      <th>SOUTH_C</th>\n",
       "      <th>WEST</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2004-01-01 01:00:00</td>\n",
       "      <td>7225.09</td>\n",
       "      <td>877.79</td>\n",
       "      <td>1044.89</td>\n",
       "      <td>745.79</td>\n",
       "      <td>7124.21</td>\n",
       "      <td>1660.45</td>\n",
       "      <td>3639.12</td>\n",
       "      <td>654.61</td>\n",
       "      <td>22971.94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2004-01-01 02:00:00</td>\n",
       "      <td>6994.25</td>\n",
       "      <td>850.75</td>\n",
       "      <td>1032.04</td>\n",
       "      <td>721.34</td>\n",
       "      <td>6854.58</td>\n",
       "      <td>1603.52</td>\n",
       "      <td>3495.16</td>\n",
       "      <td>639.88</td>\n",
       "      <td>22191.52</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2004-01-01 03:00:00</td>\n",
       "      <td>6717.42</td>\n",
       "      <td>831.63</td>\n",
       "      <td>1021.10</td>\n",
       "      <td>699.70</td>\n",
       "      <td>6639.48</td>\n",
       "      <td>1527.99</td>\n",
       "      <td>3322.70</td>\n",
       "      <td>623.42</td>\n",
       "      <td>21383.44</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2004-01-01 04:00:00</td>\n",
       "      <td>6554.27</td>\n",
       "      <td>823.56</td>\n",
       "      <td>1015.41</td>\n",
       "      <td>691.84</td>\n",
       "      <td>6492.39</td>\n",
       "      <td>1473.89</td>\n",
       "      <td>3201.72</td>\n",
       "      <td>613.49</td>\n",
       "      <td>20866.56</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2004-01-01 05:00:00</td>\n",
       "      <td>6511.19</td>\n",
       "      <td>823.38</td>\n",
       "      <td>1009.74</td>\n",
       "      <td>686.76</td>\n",
       "      <td>6452.26</td>\n",
       "      <td>1462.76</td>\n",
       "      <td>3163.74</td>\n",
       "      <td>613.32</td>\n",
       "      <td>20723.15</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    ds    COAST    EAST  FAR_WEST   NORTH  NORTH_C  SOUTHERN  \\\n",
       "0  2004-01-01 01:00:00  7225.09  877.79   1044.89  745.79  7124.21   1660.45   \n",
       "1  2004-01-01 02:00:00  6994.25  850.75   1032.04  721.34  6854.58   1603.52   \n",
       "2  2004-01-01 03:00:00  6717.42  831.63   1021.10  699.70  6639.48   1527.99   \n",
       "3  2004-01-01 04:00:00  6554.27  823.56   1015.41  691.84  6492.39   1473.89   \n",
       "4  2004-01-01 05:00:00  6511.19  823.38   1009.74  686.76  6452.26   1462.76   \n",
       "\n",
       "   SOUTH_C    WEST         y  \n",
       "0  3639.12  654.61  22971.94  \n",
       "1  3495.16  639.88  22191.52  \n",
       "2  3322.70  623.42  21383.44  \n",
       "3  3201.72  613.49  20866.56  \n",
       "4  3163.74  613.32  20723.15  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_location = \"https://raw.githubusercontent.com/ourownstory/neuralprophet-data/main/datasets/\"\n",
    "df_ercot = pd.read_csv(data_location + \"energy/ERCOT_load.csv\")\n",
    "df_ercot.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We extract the name of the regions which will be later used in the model creation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "regions = list(df_ercot)[1:-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We select data from a three years interval in our example (from 2004 to 2007). A list of dataframes is created which will be used in case of global normalization. We also create a dict of dataframes which will be later used in case of local normalization. Each list term or dict term represents a region."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_list = list()\n",
    "df_dict = {}\n",
    "for cols in regions:\n",
    "    aux = df_ercot[['ds', cols]].copy() #select column associated with region\n",
    "    aux = aux.iloc[:26301, :].copy() #selects data up to 26301 row (2004 to 2007 time stamps)\n",
    "    aux = aux.rename(columns = {cols: 'y'}) #rename column of data to 'y' which is compatible with Neural Prophet\n",
    "    df_list.append(aux)\n",
    "    df_dict[cols] = aux"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are going to define a model which predicts the next hour based on the last 24 hours. At first, we are going to split our data into train and test (with a 33% test proportion - 2 years train and 1 year test)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "m = NeuralProphet(n_lags = 24)\n",
    "df_train_dict, df_test_dict = m.split_df(df_dict, valid_p = 0.33, local_split = True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Global modeling lets us train our model based on a global or a local normalization. In the latter, each time series is normalized locally (each time series has its respective data params). In the former, we have unique data params which will be used in all the time series at hand. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Global modeling - Global Normalization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, we call NeuralProphet and fit the model with the list of dataframes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 148,
     "referenced_widgets": [
      "4ac0917121f8498698e087259b787dcf",
      "94108fe9090f47c7ba2216479e0d3fac",
      "2d8235496ec642af8192f52d9f2692b1",
      "c94a8ae41b994c55a96ad44806b0f1c7",
      "24bf564f55644476911a6cf004a395e7",
      "87c170d1e00742a29e7f797e98c49cc2",
      "8a192ccc35e94e9f8be85898ed583e2c",
      "9467345334da47a8beadc770feef952a",
      "dc468cd35d2b4f0e8eb287689ac15412",
      "f35fc9cbd82c4187a4cdc08c3ac26998",
      "aab682cd3df24821a80331720f7c24e5"
     ]
    },
    "id": "s7faUgnrvGFN",
    "outputId": "50da2450-767f-4e3b-f03d-d03226d24ff8"
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d8cd0fffbb8e4b0f99f2b883e8e5f58e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/357 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "670aaf89befe4d9bb826d5f62ed5f959",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/357 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2d1298f08fbc4946afa61a2389ea802c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/357 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                                                      \r"
     ]
    }
   ],
   "source": [
    "m = NeuralProphet(n_lags = 24, global_normalization = True)\n",
    "metrics = m.fit(df_train_dict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can visualize the parameters of the trained models."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "id": "G0E4dLGxcbsO",
    "outputId": "9590ed3b-6e76-4fdd-d4bf-c310c04ac7ec"
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 140088 characters]",
      "text/plain": [
       "<Figure size 720x1296 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig_param = m.plot_parameters()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can evaluate the test metrics considering the list of dataframes of all regions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 111
    },
    "id": "OnEPYrkscVtf",
    "outputId": "fe0218f4-0fbe-4d74-86f3-0e74195681a7"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SmoothL1Loss</th>\n",
       "      <th>MAE</th>\n",
       "      <th>RMSE</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.000084</td>\n",
       "      <td>125.888714</td>\n",
       "      <td>147.113843</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   SmoothL1Loss         MAE        RMSE\n",
       "0      0.000084  125.888714  147.113843"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_metrics = m.test(df_test_dict)\n",
    "test_metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 440
    },
    "id": "5v-4bpNUvELW",
    "outputId": "089e3649-a238-4ec1-9593-32c2844d0ee4"
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 167956 characters]",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "future = m.make_future_dataframe(df_test_dict, n_historic_predictions = True)\n",
    "forecast = m.predict(future)\n",
    "fig = m.plot(forecast['NORTH'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Global Modeling - Local normalization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When using local normalization, a dict of dataframes is adopted, so each of the dict cells is associated with each respective name. Notice that we will split the data again, so the dict structure is preserved to train and test data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "m = NeuralProphet(n_lags = 24)\n",
    "df_train_dict, df_test_dict = m.split_df(df_dict, freq = 'H', valid_p = 0.33, local_split = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 148,
     "referenced_widgets": [
      "4ac0917121f8498698e087259b787dcf",
      "94108fe9090f47c7ba2216479e0d3fac",
      "2d8235496ec642af8192f52d9f2692b1",
      "c94a8ae41b994c55a96ad44806b0f1c7",
      "24bf564f55644476911a6cf004a395e7",
      "87c170d1e00742a29e7f797e98c49cc2",
      "8a192ccc35e94e9f8be85898ed583e2c",
      "9467345334da47a8beadc770feef952a",
      "dc468cd35d2b4f0e8eb287689ac15412",
      "f35fc9cbd82c4187a4cdc08c3ac26998",
      "aab682cd3df24821a80331720f7c24e5"
     ]
    },
    "id": "s7faUgnrvGFN",
    "outputId": "50da2450-767f-4e3b-f03d-d03226d24ff8"
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a5a9cd093fa3484d9d74478821293a82",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/357 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "71946103508d48fd9c2916d03eba5861",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/357 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b70ee8552b1c411a9f1c59ec5b984895",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/357 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                                                        \r"
     ]
    }
   ],
   "source": [
    "metrics = m.fit(df_train_dict, freq = 'H')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Please note that in the case of local normalization, the test metrics are not re-scaled but displayed on a normalized scale."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 111
    },
    "id": "OnEPYrkscVtf",
    "outputId": "fe0218f4-0fbe-4d74-86f3-0e74195681a7"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SmoothL1Loss</th>\n",
       "      <th>MAE</th>\n",
       "      <th>RMSE</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.000273</td>\n",
       "      <td>0.017326</td>\n",
       "      <td>0.023038</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   SmoothL1Loss       MAE      RMSE\n",
       "0      0.000273  0.017326  0.023038"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_metrics = m.test(df_test_dict)\n",
    "test_metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 440
    },
    "id": "5v-4bpNUvELW",
    "outputId": "089e3649-a238-4ec1-9593-32c2844d0ee4"
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 175160 characters]",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "future = m.make_future_dataframe(df_test_dict, n_historic_predictions = True)\n",
    "forecast = m.predict(future)\n",
    "fig = m.plot(forecast['NORTH'])"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "energy_data_example.ipynb",
   "provenance": []
  },
  "interpreter": {
   "hash": "a0cc853011ef980c4b8f418823bbf3f2541e5cb637d13026231ecb3c9704807f"
  },
  "kernelspec": {
   "display_name": "Python 3.8.10 64-bit ('NP_env': venv)",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "24bf564f55644476911a6cf004a395e7": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_aab682cd3df24821a80331720f7c24e5",
      "placeholder": "​",
      "style": "IPY_MODEL_f35fc9cbd82c4187a4cdc08c3ac26998",
      "value": " 264/297 [00:04&lt;00:00, 59.93it/s]"
     }
    },
    "2d8235496ec642af8192f52d9f2692b1": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_8a192ccc35e94e9f8be85898ed583e2c",
      "placeholder": "​",
      "style": "IPY_MODEL_87c170d1e00742a29e7f797e98c49cc2",
      "value": " 89%"
     }
    },
    "4ac0917121f8498698e087259b787dcf": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_2d8235496ec642af8192f52d9f2692b1",
       "IPY_MODEL_c94a8ae41b994c55a96ad44806b0f1c7",
       "IPY_MODEL_24bf564f55644476911a6cf004a395e7"
      ],
      "layout": "IPY_MODEL_94108fe9090f47c7ba2216479e0d3fac"
     }
    },
    "87c170d1e00742a29e7f797e98c49cc2": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "8a192ccc35e94e9f8be85898ed583e2c": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "94108fe9090f47c7ba2216479e0d3fac": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "9467345334da47a8beadc770feef952a": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "aab682cd3df24821a80331720f7c24e5": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "c94a8ae41b994c55a96ad44806b0f1c7": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "danger",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_dc468cd35d2b4f0e8eb287689ac15412",
      "max": 297,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_9467345334da47a8beadc770feef952a",
      "value": 264
     }
    },
    "dc468cd35d2b4f0e8eb287689ac15412": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "f35fc9cbd82c4187a4cdc08c3ac26998": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    }
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
