{ "cells": [ { "cell_type": "markdown", "id": "84b2ed6d", "metadata": { "id": "84b2ed6d" }, "source": [ "# Exercise Sheet No. 1\n", "\n", "---\n", "\n", "> Machine Learning for Natural Sciences, Summer 2024, Jun.-Prof. Pascal Friederich, pascal.friederich@kit.edu\n", "\n", "> Instructor: André Eberhard (andre.eberhard@kit.edu)\n", "\n", "---\n", "\n", "**Topic**: This exercise sheet will not be graded and serves as an\n", "introduction to explain the online exercise regulations and to help you to\n", "familiarize yourself with Python, Jupyter and Numpy. The exercises in this\n", "sheet are meant as an appetizer to show you what future exercises could cover." ] }, { "cell_type": "markdown", "id": "eee3c2a3", "metadata": { "id": "eee3c2a3" }, "source": [ "## Preliminaries\n", "If you are not familiar with Python, you may want to learn more about Python\n", "and its basic syntax. Since there are a lof of free and well written tutorials\n", " online, we refer you to one of the following online tutorials:\n", "\n", "* http://www.datacamp.com/community/tutorials/tutorial-jupyter-notebook\n", "* https://www.learnpython.org/\n", "* https://automatetheboringstuff.com/" ] }, { "cell_type": "markdown", "id": "20c7a0a0", "metadata": { "id": "20c7a0a0" }, "source": [ "## 1.1 Corona (not graded)\n", "\n", "*Disclaimer*: If you are in any way personally affected by the Corona crisis,\n", "you do not have to participate in this exercise. It will not be graded or is\n", "necessary for the progress of this course.\n", "\n", "To get to know Python's data science workflows, we briefly analyze some data from the\n", "corona epidemic. First download a historical dataset on the corona\n", "infections worldwide from the European Centre for Disease Prevention and\n", "Control in 2020 ([link](https://www.ecdc.europa.eu/sites/default/files/documents/COVID-19-geographic-disbtribution-worldwide.xlsx)).\n", "We can do this in Python via the ``requests`` package." ] }, { "cell_type": "code", "execution_count": 1, "id": "84713313", "metadata": { "id": "84713313" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/lib/python3/dist-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.17.3 and <1.25.0 is required for this version of SciPy (detected version 1.26.4\n", " warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n" ] } ], "source": [ "import os\n", "from datetime import datetime\n", "\n", "import matplotlib.dates as mdates\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "import requests\n", "import scipy.optimize\n", "from sklearn.neural_network import MLPRegressor" ] }, { "cell_type": "code", "execution_count": 2, "id": "4e3050ba", "metadata": { "id": "4e3050ba" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading dataset ...\n", "Downloading dataset done.\n" ] } ], "source": [ "data_url = \"https://www.ecdc.europa.eu/sites/default/files/documents/COVID-19-geographic-disbtribution-worldwide.xlsx\"\n", "data_file = \"COVID-19-geographic-disbtribution-worldwide.xlsx\"\n", "if not os.path.exists(data_file):\n", " print(\"Downloading dataset ...\")\n", " with open(data_file, \"wb\") as f:\n", " f.write(requests.get(data_url).content)\n", " print(\"Downloading dataset done.\")" ] }, { "cell_type": "markdown", "id": "b38f90bf", "metadata": { "id": "b38f90bf" }, "source": [ "Now, we load the dataset via the data library ``pandas``, which will return a ``DataFrame`` object. We print the head of the table with ``.head()``:" ] }, { "cell_type": "code", "execution_count": 4, "id": "2c83c30e", "metadata": { "id": "2c83c30e" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dateRepdaymonthyearcasesdeathscountriesAndTerritoriesgeoIdcountryterritoryCodepopData2019continentExpCumulative_number_for_14_days_of_COVID-19_cases_per_100000
02020-12-14141220207466AfghanistanAFAFG38041757.0Asia9.013779
12020-12-13131220202989AfghanistanAFAFG38041757.0Asia7.052776
22020-12-121212202011311AfghanistanAFAFG38041757.0Asia6.868768
32020-12-11111220206310AfghanistanAFAFG38041757.0Asia7.134266
42020-12-101012202020216AfghanistanAFAFG38041757.0Asia6.968658
\n", "
" ], "text/plain": [ " dateRep day month year cases deaths countriesAndTerritories geoId \\\n", "0 2020-12-14 14 12 2020 746 6 Afghanistan AF \n", "1 2020-12-13 13 12 2020 298 9 Afghanistan AF \n", "2 2020-12-12 12 12 2020 113 11 Afghanistan AF \n", "3 2020-12-11 11 12 2020 63 10 Afghanistan AF \n", "4 2020-12-10 10 12 2020 202 16 Afghanistan AF \n", "\n", " countryterritoryCode popData2019 continentExp \\\n", "0 AFG 38041757.0 Asia \n", "1 AFG 38041757.0 Asia \n", "2 AFG 38041757.0 Asia \n", "3 AFG 38041757.0 Asia \n", "4 AFG 38041757.0 Asia \n", "\n", " Cumulative_number_for_14_days_of_COVID-19_cases_per_100000 \n", "0 9.013779 \n", "1 7.052776 \n", "2 6.868768 \n", "3 7.134266 \n", "4 6.968658 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "corona_world = pd.read_excel(data_file)\n", "corona_world.head()" ] }, { "cell_type": "markdown", "id": "14164182", "metadata": { "id": "14164182" }, "source": [ "The ``DataFrame`` allows access via index and columns.\n", "Basic Python operators ``[]`` and ``.`` are supported.\n", "**Warning**: Whether a copy or a reference is returned for a setting operation,\n", " may depend on the context." ] }, { "cell_type": "code", "execution_count": 5, "id": "7e4cdb0d", "metadata": { "id": "7e4cdb0d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RangeIndex(start=0, stop=61900, step=1)\n", "Index(['dateRep', 'day', 'month', 'year', 'cases', 'deaths',\n", " 'countriesAndTerritories', 'geoId', 'countryterritoryCode',\n", " 'popData2019', 'continentExp',\n", " 'Cumulative_number_for_14_days_of_COVID-19_cases_per_100000'],\n", " dtype='object')\n" ] } ], "source": [ "print(corona_world.index)\n", "print(corona_world.columns)" ] }, { "cell_type": "markdown", "id": "641daac8", "metadata": { "id": "641daac8" }, "source": [ "Now we will select a column, namely ``corona_world[\"countriesAndTerritories\"]``\n", "and then select the indices where we find ``\"Germany\"`` via ``corona_countries==\"Germany\"``\n", "not by numbers but by a boolean array. We can also do multi-indexing via a list\n", "``[[\"dateRep\", \"Cumulative_number_for_14_days_of_COVID-19_cases_per_100000\"]]``.\n", "The values for the sub-frame ``corona_germany`` is obtained by either ``.values``\n", "or ``.to_numpy``. Note that usually you will use a pandas ``DataFrame`` by the\n", "operators ``.iloc`` and ``.loc`` for index- and name-wise access of a group of\n", "rows and columns. They furthermore enable slicing. For convenience, we flip\n", "the final data so that they start from the past going forward." ] }, { "cell_type": "code", "execution_count": 6, "id": "1c2e6b0d", "metadata": { "id": "1c2e6b0d" }, "outputs": [], "source": [ "# Select data\n", "corona_countries = corona_world[\"countriesAndTerritories\"]\n", "corona_germany = corona_world[corona_countries == \"Germany\"]\n", "corona_germany = corona_germany[[\n", " \"dateRep\", \"cases\", \"deaths\",\n", " \"Cumulative_number_for_14_days_of_COVID-19_cases_per_100000\"\n", "]]\n", "time_germany = corona_germany[\"dateRep\"].values\n", "cc_germany = corona_germany[\n", " \"Cumulative_number_for_14_days_of_COVID-19_cases_per_100000\"\n", "].to_numpy()\n", "time_germany = np.flip(time_germany)\n", "cc_germany = np.flip(cc_germany)" ] }, { "cell_type": "markdown", "id": "a342c847", "metadata": { "id": "a342c847" }, "source": [ "To visualize the data, we exemplary plot the number of 14 days cumulative\n", "cases as a function of time for Germany. For this purpose we use\n", "``matplotlib.pyplot`` plotting tool. You can find a nice user guide with\n", "examples [here](https://matplotlib.org/stable/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py).\n", "We will use ``matplotlib`` very often in the next exercises." ] }, { "cell_type": "code", "execution_count": 7, "id": "6c59c0fc", "metadata": { "id": "6c59c0fc" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Date functionality\n", "months = mdates.MonthLocator() # every month\n", "# Make plot\n", "fig, ax = plt.subplots() # generate a new plot\n", "ax.plot(time_germany, cc_germany) # plot data\n", "ax.xaxis.set_major_locator(months) # modify axis\n", "fig.autofmt_xdate()\n", "plt.grid(True, \"both\")\n", "plt.title(\"Germany\")\n", "plt.ylabel(\"14 days cases per 100k\")\n", "plt.xlabel(\"Time [months]\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "04407f54", "metadata": { "id": "04407f54" }, "source": [ "Now it's time for you to answer the following questions, while using either\n", "pandas dataframes or convert to numpy and Python objects. Wherever possible,\n", "built-in functionality of libraries such as `Numpy`, `Pandas`,`TensorFlow`\n", "or `PyTorch` should be preferred over Python statements as these libraries\n", "are heavily optimized and run much faster than raw Python code in general.\n", "Have a look at the documentation of [numpy] (https://numpy.org/doc/) and\n", "[pandas](https://pandas.pydata.org/docs/getting_started/index.html#getting-started)\n", "if you want to know more. We will work with [numpy](https://numpy.org/doc/)\n", "methods in the next exercises in more detail.\n", "\n", "**1.1.1** List the number of the deceased in connection with Covid-19\n", "relative to the population for each country for 2020. What can you say\n", "about the mortality rate? Which country has the highest and which has\n", "the lowest mortality rate? To do this you first have to obtain the information\n", "of population per country for example in a python ``dict``. You may want to use\n", "the following pandas methods (if you don't know them, look them up\n", "at [pandas](https://pandas.pydata.org/docs/getting_started/index.html#getting-started)):\n", "``.unique``, ``.groupby``, ``.mean``, ``.sum``, ``.sort_values``, ``.get_group`` and ``.from_dict``:" ] }, { "cell_type": "code", "execution_count": 79, "id": "185fc3bd", "metadata": { "deletable": false, "id": "185fc3bd", "nbgrader": { "cell_type": "code", "checksum": "8c7139e68c33abdc31fd7090085110a3", "grade": false, "grade_id": "death_corona", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [ { "ename": "NotImplementedError", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNotImplementedError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_27657/1561095217.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mcountry_max_mortality\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrel_deaths_df\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlargest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNotImplementedError\u001b[0m: " ] } ], "source": [ "countries = []\n", "population = {}\n", "deaths = {}\n", "rel_deaths = {}\n", "country_max_mortality = \"\"\n", "\n", "countries = corona_world[\"countriesAndTerritories\"].unique()\n", "population_df = corona_world.groupby(\"countriesAndTerritories\")[\"popData2019\"].mean()\n", "population = population_df.to_dict()\n", "deaths_df = corona_world.groupby(\"countriesAndTerritories\")[\"deaths\"].sum()\n", "deaths = deaths_df.to_dict()\n", "\n", "rel_deaths_df = deaths_df/population_df\n", "rel_deaths = rel_deaths_df.to_dict()\n", "\n", "country_max_mortality = rel_deaths_df.nlargest(1).keys()[0]\n", "\n", "raise NotImplementedError()" ] }, { "cell_type": "markdown", "id": "40af3149", "metadata": { "id": "40af3149" }, "source": [ "**1.1.2** Plot the cumulative number of cases, deceased and number of recovered\n", "patients for Germany. Make sure that the data has the correct order for a\n", "cumulative sum. You can either again write your own function or simply use\n", "``np.cumsum`` to compute the cumulative sum of the number of cases and deaths\n", "in Germany." ] }, { "cell_type": "code", "execution_count": 84, "id": "ebee1bfd", "metadata": { "deletable": false, "id": "ebee1bfd", "nbgrader": { "cell_type": "code", "checksum": "248ec78d63f279595d18541aceed088a", "grade": false, "grade_id": "cum_corona", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "ename": "NotImplementedError", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNotImplementedError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_27657/1834303240.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNotImplementedError\u001b[0m: " ] } ], "source": [ "cum_death = np.array([])\n", "cum_cases = np.array([])\n", "\n", "cum_death = np.array(corona_germany.sort_values(\"dateRep\")['deaths'].cumsum())\n", "cum_cases = np.array(corona_germany.sort_values(\"dateRep\")['cases'].cumsum())\n", "\n", "plt.plot(cum_death)\n", "plt.title(\"Deaths\")\n", "plt.show()\n", "plt.plot(cum_cases-cum_death)\n", "plt.title(\"Recoveries\")\n", "plt.show()\n", "\n", "raise NotImplementedError()" ] }, { "cell_type": "markdown", "id": "9f46a3e7", "metadata": { "id": "9f46a3e7" }, "source": [ "There has been a discussion in Germany whether the 'second wave' of infections\n", "in the end of 2020 was underestimated by many political leaders. The chancellor\n", "of Germany, Angela Merkel and her team, warned the ministers and the public of\n", "a dire development in the beginning of october. In fact, the large increase of\n", "infections before Christmas turned out to be very serious, even with\n", "counter-measures. We want to see in the next task, if we can correctly predict\n", "the development.\n", "\n", "**1.1.3** First we select the data from the plot above between 01.08.2020\n", "and 01.10.2020. Note that we are using numpy arrays with number type ``dtype=\"datetime64[ns]\"``. We can use the package ``datetime`` and its class ``datetime`` for human-readable dates, that can be freely converted into strings, seconds or via ``np.datetime64()`` into numpy's ``dtype=\"datetime64[ns]\"``. We have to select the correct time-period and divide by the delta of ``np.timedelta64(1,\"D\")`` that corresponds to one day. Finally, we end up with an array counting the days with from 01.08.2020 onwards." ] }, { "cell_type": "code", "execution_count": 108, "id": "908c8566", "metadata": { "id": "908c8566" }, "outputs": [], "source": [ "# Select dates\n", "date_start = datetime(2020, 8, 1)\n", "date_stop = datetime(2020, 10, 1)\n", "selection = np.logical_and(time_germany >= np.datetime64(date_start),\n", " time_germany < np.datetime64(date_stop))\n", "\n", "# Select training data\n", "x_cases = np.array(time_germany[selection] - np.datetime64(date_start)) / np.timedelta64(1, \"D\")\n", "y_cases = np.array(cc_germany)[selection]\n", "x_test = time_germany[time_germany >= np.datetime64(date_start)]\n", "x_test_days = (x_test - np.datetime64(date_start)) / np.timedelta64(1, \"D\")" ] }, { "cell_type": "markdown", "id": "786ee1f6", "metadata": { "id": "786ee1f6" }, "source": [ "Try to fit the data with analytical expressions using for example\n", "``scipy.optimize.curve_fit``. If the fit does not work, try setting bounds\n", "and initial guesses. Try the following relations, with some initial guess for\n", "the free parameters $(a,b,\\dots)$. First implement the functions in Python\n", "with the help of ``numpy`` or ``scipy`` methods like:\n", "``np.square``, ``np.exp``, ``np.power``.\n", "\n", "* $f_1(x)= ax+b$\n", "* $f_2(x)= c e^{a (x-b)}$\n", "* $f_3(x)= a x^2 + b x + c$\n", "* $f_4(x)= a x^3 + b x^2 + cx + d$\n", "* $\\dots$" ] }, { "cell_type": "code", "execution_count": 109, "id": "9bbde8d0", "metadata": { "deletable": false, "id": "9bbde8d0", "lines_to_next_cell": 2, "nbgrader": { "cell_type": "code", "checksum": "deb03a3fb64e7f80a5f678ffb9a8caf1", "grade": false, "grade_id": "func_implement", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [], "source": [ "# Implement functions.\n", "def fun_1(x, a, b):\n", " return a * x + b\n", "\n", "\n", "def fun_2(x, a, b, c):\n", " return c*np.exp(a*(x-b))\n", "\n", "\n", "def fun_3(x, a, b, c):\n", " return a*x**2 + b*x + c\n", "\n", "\n", "def fun_4(x, a, b, c, d):\n", " return a*x**3 + b*x**2 + c*x + d" ] }, { "cell_type": "code", "execution_count": 110, "id": "fb6f3d87", "metadata": { "deletable": false, "id": "fb6f3d87", "nbgrader": { "cell_type": "code", "checksum": "627245b6fd20771f09e604d825ffba01", "grade": false, "grade_id": "func_test", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "\n", "\n", "param_1, _ = scipy.optimize.curve_fit(fun_1, x_cases, y_cases)\n", "param_2, _ = scipy.optimize.curve_fit(fun_2, x_cases, y_cases) # fit fun_2\n", "param_3, _ = scipy.optimize.curve_fit(fun_3, x_cases, y_cases) # fit fun_3\n", "param_4, _ = scipy.optimize.curve_fit(fun_4, x_cases, y_cases) # fit fun_4\n", "\n", "y_fit_1 = fun_1(x_test_days, *param_1)\n", "y_fit_2 = fun_2(x_test_days, *param_2) # evalute fit 2\n", "y_fit_3 = fun_3(x_test_days, *param_3) # evalute fit 3\n", "y_fit_4 = fun_4(x_test_days, *param_4) # evalute fit 4\n", "\n", "fig, ax = plt.subplots() # generate a new plot\n", "ax.plot(time_germany, cc_germany) # plot data\n", "ax.plot(x_test, y_fit_1, label=\"f1\") # plot data\n", "ax.plot(x_test, y_fit_2, label=\"f2\") # plot data\n", "ax.plot(x_test, y_fit_3, label=\"f3\") # plot data\n", "ax.plot(x_test, y_fit_4, label=\"f4\") # plot data\n", "\n", "ax.xaxis.set_major_locator(months) # modify axis\n", "fig.autofmt_xdate()\n", "plt.grid(True, \"both\")\n", "plt.ylim([-20, 370])\n", "plt.legend()\n", "plt.title(\"Germany\")\n", "plt.ylabel(\"Total cases\")\n", "plt.xlabel(\"Time [months]\")\n", "plt.show() # make plot" ] }, { "cell_type": "markdown", "id": "6338d23e", "metadata": { "id": "6338d23e" }, "source": [ "Which function extrapolates best to the subsequent development starting\n", "from 01.10.2020 to the end of the year? Can you quantify? Does this change\n", "if you only fit to the last 14 days from 17.09.2020 to the 01.10.2020?\n", "Which is the best function for 14 days extrapolation. Can you explain?" ] }, { "cell_type": "code", "execution_count": 111, "id": "50809ff5", "metadata": { "deletable": false, "id": "50809ff5", "nbgrader": { "cell_type": "code", "checksum": "f3ca8c1e0cb4c504bdd437ebbee17f6c", "grade": false, "grade_id": "extra_answer", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [], "source": [ "answer_best_fun = None # number of best function (int)\n", "answer_change_14_days = None # Does it change, answer with \"True\" or \"False\" (bool)\n", "answer_best_fun_14_days = None # best function within 14 days fit (int)\n", "answer_explanation = \"\" # Answer as string in free text.\n", "\n", "answer_best_fun = 4 # number of best function (int)\n", "answer_change_14_days = True # Does it change, answer with \"True\" or \"False\" (bool)\n", "answer_best_fun_14_days = 3 # best function within 14 days fit (int)\n", "answer_explanation = \"None of these functions is suitable for the task.Since the curvature in the 14 Days is negative the exponential function curves downwards as it can only fit curves in one direction\" # Answer as string in free text." ] }, { "cell_type": "markdown", "id": "1b65c392", "metadata": { "id": "1b65c392" }, "source": [ "**1.1.4** Finally, let us also try some machine learning to fit the data.\n", "You don't need to understand the code in detail, yet. We fit a small neural\n", "network on the time series prediction. We will have the neural network train\n", "on 14 previous days to predict the change of infections for the next day in\n", "the time period between 01.08.2020 and 01.10.2020. And then to predict the\n", "next days from 01.10.2020 onward. This is by far not a sophisticated model.\n", "We will learn more methods in the lectures." ] }, { "cell_type": "code", "execution_count": 112, "id": "91a1dab8", "metadata": { "id": "91a1dab8" }, "outputs": [], "source": [ "# Prepare and run training\n", "step_size = 14\n", "x_train = np.array(\n", " [y_cases[i:i + step_size]\n", " for i in range(len(x_cases) - step_size)]\n", ")\n", "y_train = np.array(\n", " [y_cases[step_size + i] - y_cases[step_size + i - 1]\n", " for i in range(len(x_cases) - step_size)]\n", ")\n", "nn = MLPRegressor(\n", " hidden_layer_sizes=(100, 100),\n", " random_state=1,\n", " max_iter=500).fit(x_train, y_train)\n", "\n", "# Predict the time-series\n", "y_test = y_cases[-step_size:]\n", "y_val = y_cases[:step_size]\n", "days_to_predict = 30\n", "for _ in range(days_to_predict):\n", " next_step = nn.predict(np.expand_dims(y_test[-step_size:], axis=0)) + y_test[-1]\n", " y_test = np.concatenate([y_test, next_step], axis=0)\n", " next_step = nn.predict(np.expand_dims(y_val[-step_size:], axis=0)) + y_val[-1]\n", " y_val = np.concatenate([y_val, next_step], axis=0)\n", "\n", "# Make time values for y_val and y_test\n", "x_test = np.arange(-step_size, days_to_predict) * np.timedelta64(1, \"D\") + np.datetime64(date_stop)\n", "x_val = np.arange(0, days_to_predict + step_size) * np.timedelta64(1, \"D\") + np.datetime64(date_start)" ] }, { "cell_type": "markdown", "id": "fc4b2bc5", "metadata": { "id": "fc4b2bc5" }, "source": [ "Plot the corona infections and evaluate the predictions for ``x_test``,\n", "``x_val`` and ``y_test``, ``y_val`` with the ground truth. You can play around with the hyper-parameters (parameters not optimized in training but used to control the learning process) and see how the result changes. What are problems and how would you improve the Machine Learning model?" ] }, { "cell_type": "code", "execution_count": 114, "id": "7c1266ac", "metadata": { "deletable": false, "id": "7c1266ac", "nbgrader": { "cell_type": "code", "checksum": "fd742102f2ef832a71ad60fa41ee9305", "grade": false, "grade_id": "answer_NN", "locked": false, "schema_version": 3, "solution": true, "task": false } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEUCAYAAADEGSquAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAAsTAAALEwEAmpwYAAA/A0lEQVR4nO3dd3gc1dX48e9Rb7ZkW7bcLTcM7rZsagIWvYQSmiEJIQmJgdDSeIH8EiCBJITwUhICAQIJhOKXEAjEmGIc2XSMe+9VrpJtWcXqe35/zEhey7K8snZmV6vzeZ55tDvt3Lva3bMzc+deUVWMMcYYgLhIF8AYY0z0sKRgjDGmkSUFY4wxjSwpGGOMaWRJwRhjTCNLCsYYYxpZUjDGGNPIkoLpkETkKhH5QkQqRGSX+/iHIiKRLpsxkWRJwXQ4IvJT4DHgD0BPIAe4ATgFSGrlvhLCXkBjIsiSgulQRCQT+DXwQ1V9TVXL1LFAVb+pqtUikiwiD4nIZhHZKSJ/EZFUd/tJIlIoIneIyA7gbyJyr4j8U0ReFJEyEVkiIseIyF3uUcgWETk7qAzfFZEV7rrrReT6oGUN+/+pu+12Efmuu2yiW574oPUvFZFFvr2AJuZZUjAdzUlAMvBmC+s8ABwDjAWGAH2Au4OW9wS6AgOAKe68C4F/AF2ABcB7OJ+vPjhJ6Kmg7XcBXwM6A98FHhGR8U32n+luex3wZxHpoqpfAruBs4PWvQZ44cjVNiY0lhRMR5MNFKtqXcMMEflUREpEpFJETsP5ov+xqu5R1TLgt8BVQfsIAPeoarWqVrrzPlLV99z9/hPoDjygqrXAVCBXRLIAVPVtVV3nHqHMBt4Hvhq0/1rg16paq6rTgXJgmLvseeBbbrm7AucAL4frxTHGzoeajmY3kC0iCQ2JQVVPBhCRQpzrC2nAvKBrzgLEB+2jSFWrmux3Z9DjSpzEUx/0HCADKBGR84B7cI5G4tx4S4LLGJy0gP3utgAvAitEJB24EicZbQ+18sYciR0pmI7mM6AauPgwy4txvsRHqGqWO2WqakbQOkfdtbCIJAP/Ah4CclQ1C5iOk3iOSFW34tThUpxTR/842rIY0xxLCqZDUdUS4FfAEyJyuYh0EpE4ERkLpOOcGnoG5zx/DwAR6SMi54SpCEk41zSKgDr3qOHsljc5xAvA/wCjgNfDVC5jAEsKpgNS1QeBn+B8se50p6eAO4BP3b9rgc9FpBT4gAPn9Nsauwy4FXgV2At8A3irlbt5A+ci9xuquj8c5TKmgdggO8a0PyKyDrheVT+IdFlMbLEjBWPaGRG5DOe6xn8jXRYTe6z1kTHtiIjMAoYD16hqIMLFMTHITh8ZY4xpZKePjDHGNGrXp4+ys7M1Nzf3oHkVFRWkp6f7Vga/4sVqvfyO5Xe8WK5bJGLG8uvpZ6x58+YVq2r3Zheqarud8vLytKmCgoJD5nnJr3ixWi+/Y/kdL5brFomYsfx6+hkLmKuH+V6100fGGGMaWVIwxhjTyJKCMcaYRu36QnNzRIQNGzZQVdW0E0tvZGZmsmLFCs/jZGRkUFtbS2JiouexjDEdV8wlhfT0dDp16kRubi5+DLdbVlZGp06dPI2hqhQWFlJYWMjAgQM9jWWM6dg8O30kIikiMkdEFonIMhH5lTv/7yKyQUQWutNYd76IyB9FZK2ILG4yElXI4uPj6datmy8JwS8iQmZmpm9HP8aYjsvLI4Vq4HRVLReRROBjEXnHXXa7qr7WZP3zgKHudALwpPu31WIpITSIxToZY6KPZ0cKbnPYcvdpoju11KfGxcAL7nafA1ki0sur8hljjDmUp62PRCReRBbiDFQ+Q1W/cBf9xj1F9Ig7EhU4g5RvCdq80J3XrpSUlPDEE08c1baPPvoo+/db9/jGmMjxpUM8d8DyN4BbcMbI3YEzAtXTwDpV/bWITMMZ6Pxjd5uZwB2qOrfJvqbgDKxOTk5O3tSpUw+K1blzZ4YOHepthYLU19cTH39g+N5NmzZx5ZVX8sUXX7SwVfNGjhzJ7Nmz6datW7NxNmzYwL59+9pU3lCVl5eTkZFx5BXbWSy/48Vy3SIRM5ZfTz9j5efnz1PVCc0uPNytzuGegLuBnzWZNwmY5j5+Crg6aNkqoFdL+2yum4v58+cfxU3fR6+0tPSg55MnT9aUlBQdM2aM/uxnP9MHH3xQJ0yYoKNGjdK7775bVVXLy8v1/PPP19GjR+uIESN06tSp+thjj2liYqKOHDlSJ02a1Gyc5cuX+1In1di9vd/veLFct0jEjOXXM1q6ufDsQrOIdAdqVbVERFKBs4Dfi0gvVd0uzpXTS4Cl7iZvATeLyFScC8z7VHV7mwrxzp2wY0mbdnGInqPgvAcOu/iBBx5g6dKlLFy4kPfff5/XXnuNOXPmoKpcdNFFfPjhhxQVFdG7d2/efvttAPbt20dmZiYPP/wwBQUFZGdnh7fMxhgTIi+vKfQCCkRkMfAlzjWFacBLIrIEWAJkA/e7608H1uOMjfsM8EMPy+aL999/n/fff59x48Yxfvx4Vq5cyZo1axg1ahQzZszgjjvu4KOPPiIzMzPSRTXGtCNXPf0Z//hsoyf79uxIQVUXA+OamX/6YdZX4KawFqKFX/R+UFXuuusurr/++kOWzZ8/n+nTp/OLX/yCM844g7vvvjsCJTTGtDcbiyv4fP0ezh/lTeNM6/sozDp16kRZWRkA55xzDs899xzl5U7L3K1bt7Jr1y62bdtGWloa3/rWt7j99tuZP3/+IdsaY0xzZq8uAuDUoc0Ph9BWMdfNRaR169aNU045hZEjR3LeeefxjW98g5NOOglw+i968cUXWbt2LbfffjtxcXEkJiby5JNPAjBlyhTOPfdcevfuTUFBQSSrYYyJUh+uLqJ/1zRys70ZkMeSggdefvnlg57fdtttBz0fPHgw55xzziHb3XLLLdxyyy2els0Y037V1AX4bP1uLhvf17MYdvrIGGPaibmb9rC/pp5Tj/Hm1BFYUjDGmHbjw9XFJMQJJw0+9AbXcLGkYIwx7cQna4sZP6ALGcnenfm3pGCMMe1AVW09K7aXMjG3i6dxLCkYY0w7sHTrPuoCyth+lhSMMabDW7C5BICx/bI8jWNJIcL87tHSGNM+LdxSQt8uqXTvlHzkldvAkoIxxrQDCzbvZVx/b08dgd28FnZ33nkn/fr146abnG6c7r33XhISEigoKGDv3r3U1tZy//33c/HFF0e4pMaY9mJnaRXb9lVxncenjiDGk8Lv5/yelXtWhnWfx3Y9ljuOv+OwyydPnsyPfvSjxqTw6quv8t5773HrrbfSuXNniouLOfHEE7nooots3GVjYpiqcv0/5jFn4x4mDOjCD/OHMP4of+k3XE8Y1z8rfAU8DDt9FGbjxo1r7PRu0aJFdOnShZ49e/Lzn/+c0aNHc+aZZ7J161Z27twZ6aIaY8JsfVE5gYAzmuVLX2zm/eU7Gd03i4VbSrjppflUVNe1ep+qyvQl20mKj2NE787hLvIhYvpIoaVf9F664ooreO2119ixYweTJ0/mpZdeoqioiHnz5pGYmEhubi5VVVURKZsxxhtvLdrGra8s4NwRPfn5+cfxh/dWcfLgbjz/3YnM27SXy//yGfe/vZybTx/KhqIKJg7sQnJC/BH3+8iM1by1aBs3nDY4pPXbKqaTQqRMnjyZH/zgBxQXFzN79mxeffVVevToQWJiIgUFBWzatCnSRTTGhFFNXYA/vOecqn532Q7eXbaDOIF7LhyBiDAhtys3ThrMk7PW8cqcLQD0ykzhx2cdw5UT+jW7z/01dTz70QYeL1jLpeP7cMe5w3ypi5fDcaYAHwLJbpzXVPUeERkITAW6AfOAa1S1RkSSgReAPGA3MFlVN3pVPi+NGDGCsrIy+vTpQ69evfjmN7/JhRdeyKhRo5gwYQLHHntspItojAmjaYu3sWVPJc99ZwLZGcl8sGIXXx2azbCenRrXuf3sYQzMTqe6tp5uGcn89aP1/M9ri0mMF74y5OAO7ipr6vnO375kzoY9nDKkG7+6aIRv1yC9PFKoBk5X1XIRSQQ+FpF3gJ8Aj6jqVBH5C3Ad8KT7d6+qDhGRq4DfA5M9LJ+nliw5MDZ0dnY2n332WbPrNQzAY4xpn1SV5z7ZwJAeGeQP64GIMLpv1iHrxcXJQUcFZx6Xw9f+9BE//r9FJMYL47rHsSt9CxMHduXx/67ly417+NPV47hwTG8fa+PtcJwKNHzjJbqTAqcD33DnPw/ci5MULnYfA7wGPC4i4u7HGGOi0ppd5SzdWsqvL27dr/mkhDj+8q08Pl5bzKodZUxfuIX/+dfixuU35Q/2PSGAx9cURCQe5xTREODPwDqgRFUbLsEXAn3cx32ALQCqWici+3BOMRV7WUZjjGmLD1Y4LQnPGdGz1dsO6p7BoO5OrwZnZhXTdcg4Vu8sY0C3dM87vjsc8eOHuIhkAW8AvwT+rqpD3Pn9gHdUdaSILAXOVdVCd9k64ARVLW6yrynAFICcnJy8qVOnHhSrU6dODB061Lfzb/X19cTHe98ioK6ujo0bN7Jv3z7PY4FzWsuvLjj8jOV3vFiuWyRiRuPref/nldQF4N6TUz2PFS75+fnzVHVCswtV1ZcJuBu4HeeXf4I77yTgPffxe8BJ7uMEdz1paZ95eXna1JdffqlFRUUaCAQOWeaF0tJSz2MEAgHdvHmzrl+/3vNYDQoKCmIylt/xYrlukYgZba9nUVmV5t45TR+ZscrzWOEEzNXDfK962fqoO1CrqiUikgqchXPxuAC4HKcF0rXAm+4mb7nPP3OX/9ctfKtUVFRQVlZGUVFRGGpxZFVVVaSkpHgep6KigjFjxngexxgTuoKVu1B1LhrHCi+vKfQCnnevK8QBr6rqNBFZDkwVkfuBBcCz7vrPAv8QkbXAHuCqowmqqgwcOLDtpQ/RrFmzGDdunC9xEhMTPY9jjAndzBW76Nk5xZc7jf3iZeujxcAh35aquh44vpn5VcAVXpXHGGPCad/+WgpW7eLKCf1iqh8z6/vIGGOOwusLCqmuCzB5YvN3JLdXlhSMMaaVVJWXv9jMmL6ZjOyTGenihJUlBWOMaaW5m/ayZlc53zihf6SLEnaWFIwxppWmztlCp+SEiNxx7DVLCsYY0wq19QFmLN/B2SN6kpYUex1NW1IwxphW+GL9Hkqr6jh7ROzcmxDMkoIxxrTC+8t3kJIYx6lDux955XbIkoIxxoQoEFDeX7aT047pTmqS932eRYIlBWOMCdGSrfvYUVrF2cNb3yNqe2FJwRhjQjR7dREicMZxPSJdFM9YUjDGmBCt3FFKbrd0stKSIl0Uz1hSMMaYEK3cUcYxOf6OV+E3SwrGGBOCqtp6NhZXMCynU6SL4ilLCsYYE4J1ReUEFI7paUnBGGM6vNU7ywA4xo4UjDHGrC+qIE4gt1t6pIviKc+Sgoj0E5ECEVkuIstE5DZ3/r0islVEFrrT+UHb3CUia0VklYic41XZjDGmtTYUV9C3SxpJCbH9W9rL3pzqgJ+q6nwR6QTME5EZ7rJHVPWh4JVFZDjOEJwjgN7AByJyjKrWe1hGY4wJycbdFeRmx/ZRAnh4pKCq21V1vvu4DFgB9Glhk4uBqaparaobgLU0M2ynMcb4TVXZUFTBIEsK4SEiuTjjNX/hzrpZRBaLyHMi0sWd1wfYErRZIS0nEWOM8UVReTUVNfXkdkuLdFE8J6rqbQCRDGA28BtVfV1EcoBiQIH7gF6q+j0ReRz4XFVfdLd7FnhHVV9rsr8pwBSAnJycvKlTpx4Ur7y8nIwM/24u8SterNbL71h+x4vlukUiZqRez1V76vndnCp+kpfM6O7enHX3s275+fnzVHVCswtV1bMJSATeA35ymOW5wFL38V3AXUHL3gNOamn/eXl52lRBQcEh87zkV7xYrZffsfyOF8t1i0TMSL2eL36+UQfcMU03767wPJYfgLl6mO9VL1sfCfAssEJVHw6a3ytota8DS93HbwFXiUiyiAwEhgJzvCqfMcaEavWOMjKSE+jbJTXSRfGcl62PTgGuAZaIyEJ33s+Bq0VkLM7po43A9QCqukxEXgWW47Rcukmt5ZExJgo09Hnk/NaNbZ4lBVX9GGjuFZzewja/AX7jVZmMMaa1VJXVO8s4d2TsjqEQLLbvwjDGmDYqKqtm7/7amO/eooElBWOMacEqt8+jYTHeEV4DSwrGGNOCVTvcpGBHCsYYY1btKCM7I5luGcmRLoovLCkYY0wLVu8sY1jP2B5tLZglBWOMOYyAKqt3lneYi8xgScEYYw6ruFKprK3n2A5ykRlCSAoi8qCIdBaRRBGZKSJFIvItPwpnjDGRVFgWAGJ/tLVgoRwpnK2qpcDXcO5AHgLc7mWhjDEmGhSWW1JoTsNdzxcA/1TVfR6WxxhjokZhWYB+XVNJT/ayR6DoEkpSmCYiK4E8YKaIdAeqvC2WMcZEXmF5oMPcn9DgiElBVe8ETgYmqGotsB9nlDRjjIlZ1XX17KzQDnMnc4NQLjSnAT8EnnRn9QaaH5zBGGNixIbiCuq1Y11PgNBOH/0NqME5WgDYCtzvWYmMMSYKNHRvcWzPzhEuib9CSQqDVfVBoBZAVffTfJfYxhgTM1btKCNeYGB2eqSL4qtQkkKNiKTiDIqDiAwGqj0tlTHGRNiqHWX0TBeSEjrWPb6htLO6B3gX6CciL+GMqPYdLwtljDGRtmpnGX0zOlZCgNBaH80ALsVJBK/gtEKadaTtRKSfiBSIyHIRWSYit7nzu4rIDBFZ4/7t4s4XEfmjiKwVkcUiMr4tFTPGmKNVXl1H4d5K+nSypHAIETkFqFLVt4Es4OciMiCEfdcBP1XV4cCJwE0iMhy4E5ipqkOBme5zgPOAoe40hQOtnYwxxler3YF1+llSaNaTwH4RGQP8BFgHvHCkjVR1u6rOdx+XASuAPjj3ODzvrvY8cIn7+GLgBXV8DmSJSK9W1MUYY8JitdvyqE8HPH0kqtryCiLzVXW8iNwNbFXVZxvmhRxEJBf4EBgJbFbVLHe+AHtVNUtEpgEPqOrH7rKZwB2qOrfJvqbgHEmQk5OTN3Xq1INilZeXk5HhX9/nfsWL1Xr5HcvveLFct0jE9CvWSyuq+bCwjj+cqHTuFFt1A8jPz5+nqs3fb6aqLU7AbOAuYDXQE+foYsmRtgvaPgOYB1zqPi9psnyv+3ca8JWg+TNxrl8cdt95eXnaVEFBwSHzvORXvFitl9+x/I4Xy3WLREy/Yl399Gd60eMfx2TdVFWBuXqY79VQjo0m4zRBvU5VdwB9gT+Eko1EJBH4F/CSqr7uzt7ZcFrI/bvLnb8V6Be0eV93njHG+Gp9UQWDu3es+xMahNL6aIeqPqyqH7nPN6vqEa8puKeGngVWqOrDQYveAq51H18LvBk0/9tuK6QTgX2qur0VdTHGmDarqq1nR2kVA7paUmiWiJwoIl+KSLmI1IhIvYiE0n32KcA1wOkistCdzgceAM4SkTXAme5zgOnAemAt8AxOf0vGGOOrwr2VAPTvlhrhkkRGKDevPQ5cBfwTpyO8bwPHHGkjdS4YH647jDOaWV+Bm0IojzHGeGbLnv0A9O+aRlkHHD0mpPZWqroWiFfVelX9G3Cut8UyxpjI2OwmhX5d0yJcksgI5Uhhv4gkAQtF5EFgOyEmE2OMaW8279lPSmIc3TOSI12UiAjly/0ad72bgQqcFkKXeVkoY4yJlM179tO/axpOW5mOJ5QjhWKgRlWrgF+JSDzQMVOoMSbmbXGTQkcVypHCTCD4FUoFPvCmOMYYEzmqypY9+zvs9QQILSmkqGp5wxP3ccd9xYwxMWtPRQ0VNfV2pHAEFcHdWItIHlDpXZGMMSYyNgc1R+2oQrmm8CPgnyKyDee+g544XV8YY0xMsaQQQlJQ1S9F5FhgmDtrlarWelssY4zxX8ONa327WFJokZsElnpcFmOMiahNu/fTvVMyqUnxkS5KxNhNaMYY49q4u4KB2R2zI7wGlhSMMca1vqiCQR08KRz29FFwi6PmqDvUpjHGxIJ9+2vZXVHDoA46jkKDlq4p/G8LyxQ4PcxlMcaYiFlf7NyONTDb3+FMo81hk4Kq5vtZEGOMiaQNxRUAdqQQykoiMhIYDqQ0zAtl9DVjjGkvNhRXEB8n9OvAzVEhtJHX7gH+5E75wIPARSFs95yI7BKRpUHz7hWRrU1GYmtYdpeIrBWRVSJyzlHVxhhjjtL6ogr6dUklKaFjt78JpfaX44yUtkNVvwuMATJD2O7vND8YzyOqOtadpgOIyHCc0d1GuNs84fbGaowxvlhfXMGg7h37egKElhQqVTUA1IlIZ2AXzpgKLVLVD4E9IZbjYmCqqlar6gaccZqPD3FbY4xpk0BA2VBc3uHvUQAQZ2jkFlYQeQL4Oc4v+Z8C5cBC96jhSNvmAtNUdaT7/F7gO0ApMBf4qaruFZHHgc9V9UV3vWeBd1T1tWb2OQWYApCTk5M3derUg5aXl5eTkeFftvcrXqzWy+9YfseL5bpFIqZXsXZXBvjp7EquHZ5Efv9Ez+M1x89Y+fn581R1QrMLVTXkCcgFRrdy/aVBz3OAeJwjlN8Az7nzHwe+FbTes8DlR9p/Xl6eNlVQUHDIPC/5FS9W6+V3LL/jxXLdIhHTq1gfrS7SAXdM00/WFvkSrzl+xgLm6mG+V0O50DwzKIFsVNXFwfNaQ1V3qmq9OqejnuHAKaKtHHxKqq87zxhjPNdwj8KgDn6PArRwTUFEUkSkK5AtIl1EpKs75QJ9jiaYiPQKevp1DnSy9xZwlYgki8hAYCgw52hiGGNMay3bWkqXtERyOttIwy3dp3A9zlgKvYHgLi1KcU73tEhEXgEm4SSVQuAeYJKIjMW5I3qjGwNVXSYirwLLgTrgJlWtb11VjDHm6CwqLGFU3yxEJNJFibiW7mh+DHhMRG5R1T+1dseqenUzs59tYf3f4FxnMMYY31TW1LNmVzlnDc+JdFGiQih3ND8lIrcCp7rPZwFPqQ20Y4yJAcu376M+oIzqE8rtV7EvlKTwBJDo/gW4BngS+L5XhTLGGL8s2FwCwNh+WREtR7RoqevsBFWtAyaq6pigRf8VkUXeF80YY7z3xYY95HZLo0fnlCOv3AG01CS1ofVPvYgMbpgpIoMAuwhsjGn3AgHly417mJjbNdJFiRotnT5quAz/M6BARNa7z3OBI97NbIwx0W5tUTkl+2s5fqAlhQYtJYXuIvIT9/FTOHcig3OUMA4o8LJgxhjjtYVbSgAYP6BLZAsSRVpKCvFABgeOGIK36eRZiYwxxifLtu4jPSmegd2sI7wGLSWF7ar6a99KYowxPlu6rZThvTsTF2c3rTVo6UKzvUrGmJhVH1BWbC9lRG+7PyFYS0nhDN9KYYwxPtu4u4L9NfWM6N050kWJKodNCqoa6gA5xhjT7qzb5fSMOjTHLpEG69iDkRpjOqwNxRUAdpG5CUsKxpgOaUNxBd3Sk8hMSzzyyh2IJQVjTIe0vqiCQd2bOUpYVwCbv/C/QFHCkoIxpkNaX1zBwOxmksIH98D7v/C/QFHCkoIxpsPZV1lLcXk1A5sOv7mvELYvgmPPj0zBooBnSUFEnhORXSKyNGheVxGZISJr3L9d3PkiIn8UkbUislhExntVLmOMWVxYAsDIPk2ao656x/k77AJ/CxRFvDxS+DtwbpN5dwIzVXUoMNN9DnAezrjMQ4EpOOM1GGOMJxa6YyiM7pt18IIVb0G3odD9GN/LFC08Swqq+iHQ9F6Hi4Hn3cfPA5cEzX9BHZ8DWSLSy6uyGWM6toVbShjcPZ3M1KCWR+VFsPFjGH5x5AoWBURVvdu5SC4wTVVHus9LVDXLfSzAXlXNEpFpwAOq+rG7bCZwh6rObWafU3COJsjJycmbOnXqQcvLy8vJyMhoupln/IoXq/XyO5bf8WK5bpGIGY5YqsqtBfsZnZ3AD0YnN87vte1dhq1+ki8nPEpFxsCwxQuVn7Hy8/PnqeqEZheqqmcTztgLS4OelzRZvtf9Ow34StD8mcCEI+0/Ly9PmyooKDhknpf8iher9fI7lt/xYrlukYgZjlibd1fogDum6QufbTx4wd8uUH1snGogENZ4ofIzFjBXD/O96nfro50Np4Xcv7vc+VuBfkHr9XXnGWNMWC1wx1AYFzwmc+k259TR6CtBOnZfoH4nhbeAa93H1wJvBs3/ttsK6URgn6pu97lsxpgOYOHmEpIT4hjWM6jPoyWvAQojL49YuaJFS+MptImIvAJMArJFpBC4B3gAeFVErgM2AVe6q08HzgfWAvux4T6NMR5ZuGUvo/pkkhjv/iZWhYUvQ9+JkD0ksoWLAp4lBVW9+jCLDumS2z3HdZNXZTHGGIC9FTUsKtzH9acOOjBz2wIoWgFfeyRyBYsiniUFEzvq6gPsKK1i1Y4yHp6xmtTEeCZP7McVE/odeWNjosh7y3ZQH1DOHxXU4n3+C5CQCiMujVzBooglBdOiLXv2c9mTn7KrrBqAQd3TqQ8ot7+2mN5ZqZwyJDvCJTQmdG8v2U7/rmkHBtapLocl/4SRl0JqVkTLFi2s7yPTogfeXUlpVS3/7/zjuPr4frx2w8m88cNTGNw9nev/MY//rtwZ6SIaE5K9FTV8um43F4zuhTS0MFryKtSUQ953Ilq2aGJJwTRLVXlnyXbeXryd608dzA9OHcTvLh1N1/QkUpPi+cd1J9C/axo/mrqQXWVVkS6uMUf0/nLn1NEFDaeOVOGLp6HnaOciswEsKZjDeGhuFTe+NJ/RfTO5Kf/QFhm9s1L50zfGUVUb4Nf/WR6BEhrTOv+at5UB3YJOHW2Y7VxgPuH6Dn9vQjBLCuYQW0sqWbY7wNfH9eFv35lIUkLzb5PB3TO4+fQhTFu8nVmrdjW7jjHR4MuNe5izcQ/XnpR74NTRp49Dene7N6EJSwrmEAUrnS/4m/IH0y0jucV1bzhtMLnd0njw3VUNXZQYE3X+XLCWbulJXH18f2fGzmWwdgYcPwUSUyJbuChjScEcYuaKnXRPFQZ3P3LnXEkJcdxy+lCWby9lxnK76Gyiz9Kt+5i1qojvfWUgqUnxzsyPHoakDJj4/cgWLgpZUjAH2VVaxYdripnQM+HAYfYRXDy2N7nd0nhs5ho7WjBRZ+qXm0lLiueakwY4M4pWw7LXYcL3IK1rZAsXhSwpmIO8Nr+Q+oByWt/Qb2FJiI/j5tOHsmxbKR+ssGsLJnqoKrNWFXHy4Gw6p7hjJ8x+wLlZ7ZTbIlu4KGVJwTRSVf7vyy0cP7ArPdNb99a4ZGxvBnRL49EPVtvRgoka64oqKNxbyaRh3Z0Z2xbC0n/BiTdAut142RxLCqbRZ+t3s2n3fq4+vvXdVyTEx3Fz/hA7WjBRpeHmytOO6e7cl/D+LyCtmx0ltMCSgmn0f19uoXNKAueNPLqRUL8+ro8dLZio8vbi7Yzqk0m/rmmw/E3Y+BFMugtSMiNdtKhlScEAULK/hneW7uDr4/qQkhh/VPsIPlqYaUcLJsI27a5gUeE+vja6F1SVwrt3Qc4o5wKzOSxLCgaAf83fSk1dgMkT+7dpPw1HC498sJr6gB0tmMiZttgZp+uC0b3gg3uhbDtc+CjEHd2Pno7CkoKhtj7Acx9vYGJuF4Y3dAFwlBLi4/jp2cNYtq2Uh2esClMJjWm9aYu3M75/Fn33fA5zn4UTb4S+zY9Vbw6ISFIQkY0iskREForIXHdeVxGZISJr3L9dIlG2juj9ZTvZWlLJDacNDsv+LhrTm6uP78efC9bx3rIdYdmnMa2xdlcZK7aXcvmxKfDGDZA9DM64O9LFahcieaSQr6pjVbUhdd8JzFTVocBM97nxQcGqXWSlJZI/rEfY9nnvRSMY0zeTn766iHVF5WHbrzGheO6TjaQmKJdvuBuq9sEVf4PE1EgXq12IptNHFwPPu4+fBy6JXFE6DlXl4zXFnDI4m7i48PUUmZwQz5PfyiM5IY5bX1lg1xeMbwr37udf8wr5a84bJG352BlmM2dEpIvVbkgkmg6KyAZgL6DAU6r6tIiUqGqWu1yAvQ3Pm2w7BZgCkJOTkzd16tSDlpeXl5ORceQ+e8LFr3hexdlWHuDnH1fynRFJTOqXGPZ4X2yv48lF1YfsP1is/s/8jhWJeH7HPFKsyjrloS+rOH3/dP5f/Ats6Xsx64YcfWujaKpbOOXn588LOktzMFX1fQL6uH97AIuAU4GSJuvsPdJ+8vLytKmCgoJD5nnJr3hexXl69jodcMc03by7wpN4gUBAr/jLpzru1+9rSUVNs+vE6v/M71iRiOd3zJZiVdbU6QV//FBv/3+3a+CeTNVXvqFaX+dZvHDzMxYwVw/zvRqR00equtX9uwt4Azge2CkivQDcv9bQ3Qczlu/kuF6dnZt7PCAi3HvhCEr21/DIB6s9iWEMwG+nr2D0jjd4MOEpZNAkuOyv1vz0KPieFEQkXUQ6NTwGzgaWAm8B17qrXQu86XfZOprd5dXM3bSHs4bneBpneO/OfOOE/vzj800sKdznaSzTMX26toisOY/w28RnYeg5cPUrdmH5KEXiSCEH+FhEFgFzgLdV9V3gAeAsEVkDnOk+Nx6auXIXAYWzPU4KAD89axhd05O44qlPbdwFE1b7K8qofOU7/CTxNepGXQVXvWQJoQ18Twqqul5Vx7jTCFX9jTt/t6qeoapDVfVMVd3jd9k6mhnLd9InK/XAmLUe6pKexNu3fIVhPTvzw5fm8dTsdQSsRZJpq93rKHn8dPLrPmHz+DtIuPQvEN98gwYTmmhqkmp8tK+ylo/WFHHmcT1CHkynrXp0TuGF7x3PpGE9+N07K7nxpXlU1tT7EtvEmEA9+sXT1D5xCun7C3l16IP0v+jn4NN7OZZZUuigfvWfZdTWK1dMaH032W2RmZrIM9+ewD0XDuf95Tu56pnPqayzIwYTIlXqV73HvsdOQd65nc9qhvDrvs9w2dU2rGa4hD68lokZm3ZX8Pr8rdw4aTAj+0SmC+HvnjKQXpmp3PTyfJ6ujuPcM9S3IxbTDgXq2TP3nwz55LfE122iTLP5fcKPOe6c7/CHEwaE9cbLjs6SQgf07wXbEIFvN4xZGyHnjuzJHecO47fTV/Lflbs44zjvL3ib9qG+ro4Vn0+nbNWH9Nk6nZ71O+kqdewN9OKPmT9i6Jnf475R/Ym3ZBB2lhQ6mEBAeWNBIScM7EqvzMi30PjuKQN5bvYq7n5zGSP7ZJLTOSXSRTJhVlNfwwebPuD1Na/zcP7DdE46fMOG0pLdrP1iOl2+eIiRgY0EVFiTOIx53U+lPHsMJWlDuPWCs3wsfcdjSaGDmbFiJxt37+fHZx0T6aIAkBgfxw2jk/nDvBoue/JT/nj1OMb3tw5y2ztVZWnxUqZvmM7b699mb/Ve+nfqz9ayrXTudiAp7Cxcx6Yvp1O/dzPpu+YxsnI+40XZJjnMHf97jsu/imGdshrXnzVrlv+V6WAsKXQgqsoTs9bRv2saF4w6uiE3vZCbGc+L3x/PLa8s4Iq/fMaPzhjKD/OH2KmBdqa6vpp5O+Yxu3A2s7bMYlvFNhLjEpnUbxKXDb2Mk3qfRJw4bVs2LZzF9k9eZNyuf5MjtQBskd580fda0oeeyvBTLqR3YlIEa9NxWVLoQD5bv5tFW0q4/5KRJMRHV8Ozcf27MP22r/LLfy/lf2es5qO1xTw6eSy9syJ/iqujqw8oa3eVs3F3BdV1Aapr66mqC1BaXca2ylWsL/qUJ958jnVly6mpryY5PpkTep3AjWNvJL9vPp2TO1NcXsP8TSVs2r2fT9YVc86S+8mPW8DizHyyz7uT3oNG0i85BX/bwpnmWFLoQJ7+cD3ZGclcntc30kVpVueURB6dPJZTh3bn7jeXct5jH/HApaM4L4qOajqKjcUVPPPRepZuK2X1jjIq66qIS95OfOpW4lK2Ep+yhbjkXYgoqkJgRy+0ciIDUseyvzSXGSsCfJmWyF1Vn1FTHzio6/S0pHgGjLmLE84Yy4Qu3SJYS9McSwodxJY9+5m9uohbTx9KSmL0dhImIlyW15e8AV24beoCbnxpPlfk9WXKqYMYmJ0edUc4saSmLsC/5m/kr5/PYVP5RpJT9tA1ay/dhm2jtL4QJQBA58RMhnUdzqjsSxjTfSwbF5XSf0geH68tZtm2fQztm8p5I1LYvq+KzNREMlISyOmUzIBu6fTvlkbfLqkkJ0Tve7Cjs6TQQfxzXiEAV05sHwfoudnpvHbjyTw8YzVPf7ief84rJDM1kfNH9WTyxP6M7ZcV6SK2ezV1tby+bA4z1i5gY/lKimrWEUjcjmTWk+revpKU1oNhXYZxbNdzGJE9guFdh9MzvedB95TM2jCLScNzONOHPrSM9ywpdBAzV+xkYm5X+rSjc/SJ8XHcce6xfPukAXy0uphP1xXz5sJtvDJnCwOz0xnRuzMjemfSt0sqA7qlMbJ3pt3EdAR19fW8u2Y+Lyx5g5Vls9H4UgAkkEpm8kDyep7MmYPHMShrEAM6DyA9MT3CJTZ+s6TQAZTsr2H59lJ+fGZ0NENtrV6ZqVw5sR9XTuxHeXUdr365hS827GbB5hKmLd7euF6/rql89+SBXDGhL51SrFO0+kA976yZy7TVH7Fy7xL21m2mXvYhcbWoxtElbgzn9D+Xy0efwLCug+yOcgNYUugQPl+/B1U4eXD7v6iXkZzA974ykO99ZSAApVW1bC+pYtm2fbz8xWZ+PW059729nNxu6RzbsxPj+3fhlCHZHNuzU0SOIvwam3p/TR0zVq/ghQ3T+fOuGRRWrKWc9RBXBUBcXTZdEgbSNbk7x3Y7huvGf43B3ex0jzmUJYUYN3fjHu6btpzOKQmM7psV6eKEXeeURDr3TGRYz05cOr4v8zfv5cPVRazaUcby7aW8s3QH4CSThHihf9c0AlVVLA2s4cRB3eiZmUKnlEQyU1t/ZFFWVcvKHWVsK6mkcG8lW0sqWb6tlN0V1eyvrqeipo6q2gDps95lZJ9MxvbLYky/LIb0yKBHp2QyUxNb/es8EFCWby9lxfZS9lTUsHF3Bcu3lbJsWymaspa0Ae+g++NJ0l4MSDmFMT3G8s1RZzE8p0+r62c6JksKMaqmLsCfC9byp/+uoW+XNF647gSSEmK/5c74/l0OuiN6+75KPlnr3J9Rr0rh3krWlwR46P2DhwbNSE4gMzWR1KR44sR5/U4eks3oPpnEuV/cAVW276ti0+4KVu8sZ+WOUoIPBLLSEjkmpxMTBnQlLSme9OQEirZtoVP33iwq3MffPtlITX2gcf2k+Dh6dE5maI8MstKSSE2KJzUxnqSEOGrqAuytqKGmPoACZVV17Ntfw5a9leypqDko5nE9O/ODUwcxIXcc5ZuP48IzzyAuLvb/18YbUZcURORc4DEgHvirqtoIbK1QH1D+vWArj3ywmsK9lVw6vg+/umhEhz3H3iszlcvz+h50b8asWbMYPfFk5m7cQ8n+Wkoqa9hWUkVZVR2VtXXU1SsBhTcXbOXlLzYftD8R6J2ZyqDu6dx8+lDG9cuiX9dUemelkpZ06Mdp1qydTJo0EoDqunpWbi9j0579FJVVU1RWzbaSStbsKmdtUTmVNfVU1tRTUx8gMT6OLmlJJCc6X+6dUhLJSkvimJxOnDS4G+P7dyG7UzLpSfEHtwTascoSgmmTqEoKIhIP/Bk4CygEvhSRt1R1eWRLFr3q6gPsqaihsKSSNTvLePbjDazeWc6oPpn89uujOPWY7pEuYlTqmp7E2SN6trhOTV2A4vJqgq8KdEtPOur7PJIT4hnjnkIyJlpFVVIAjgfWqup6ABGZClwMhDUprN1VzvvLd6BBn3Z1nzTM04MeH1imBzYAYMOmGuZWrzrsegftI2jfDTH1kHkH76fBlsJqCvYtJaDOuezdFTVsKK5gW0nlQacwBmWn88Q3x3PeyJ7WmqSNkhLirJsN0+GIqj+tI0IhIpcD56rq993n1wAnqOrNQetMAaYA5OTk5E2dOvWgfZSXl5ORkdFinDk76nhiYXXbyws4X+fSOAqgHLL8wAM50ryGRUEzDjx0BqERIDVByEgSctKE7qlxdEkRuqYIPdLi6JkujefA2yKU1zFc/Izld7xYrlskYsby6+lnrPz8/HmqOqHZhc6v1eiYgMtxriM0PL8GePxw6+fl5WlTBQUFh8xrqq4+oJU1dVpZU6dVtc5UXVuvNXXOVOtOdfUBrXenQMCZjiZeOPgVJxLxrG7tN57fMWP59fQzFjBXD/O9Gm2nj7bCQR0l9nXnhVV8nBAfZ32vGGNMU9HWTOFLYKiIDBSRJOAq4K0Il8kYYzqMqDpSUNU6EbkZeA+nSepzqroswsUyxpgOI6qSAoCqTgemR7ocxhjTEUXb6SNjjDERZEnBGGNMI0sKxhhjGllSMMYY0yiq7mhuLREpAjY1mZ0NFPtYDL/ixWq9/I7ld7xYrlskYsby6+lnrAGq2mzHaO06KTRHRObq4W7fbsfxYrVefsfyO14s1y0SMWP59YzE/645dvrIGGNMI0sKxhhjGsViUng6RuPFar38juV3vFiuWyRixvLrGYn/3SFi7pqCMcaYoxeLRwrGGGOOkiUFY4wxjSwpHIH4OKaln7EiEc+ER6y/T2L5fdke6tYuk4KI+FZuje2LLhkAIuL5iEMi0sfrGE3iHS8inX2KdZGIDPYjlqtx4Oj28CVzFBrfjzFYv6ivT7tJCu4H7yc+xrtARF4WkXtEZIjHsc4VkTeB+0TE05tXxNFDRGYBfwVQ1XoP450pIvOAG7yK0STeaSKyHGccb0+Tglu3z4BngV5exnLjXSAiHwB/FJFvgrc/WkTkQhF5BbhTRAZ4FScoXkP9HhaRU8Hz+l0iIvd5tf8msc53P+N/EJFJfsQ8WlGfFEQkQUTuAP4IPCQiY1U14NWvWxFJEZG/AHcDrwCDgBtEZGCY44gb6+/AL3C+WDKA60QkO5yxgrkfsip3Gi0i57nlCdt7wa1bkog8ATwE3KeqvwxeHq5YTeKmALcBv1bV76tqYbjjuXXLEJH/4PzffgF8Dgxwl3vymRKRs4F7gceAOcDpItLbi1huvDOBXwLP44y7couIXOAuC3sdRSQX+A3wJ2AFMEVEvu9FPBGJc/f9EE7C+2o4998kVqKI/C/O/+4vwD7gahE5wauYbRX1SUFV64BVwLHAT4Cn3Pme/LpV1SqcN+Xlqvof4HfAeJwv0XDGUTfWm8BpqvoW8DpOM2HP+j9xP2B9gYXAnTjJD1UNhCuGW7caIA34t6r+2/0gjmlYHq5YTfQBdqvqVBFJFZFLRaQ77umIcCQHt27lwIuqOklVZ+KMFHixuzxsr2MTpwHvue/JuUCiqm7zKBbAmcA0VX0X5zPXCfieiKR7VMfBwMeq+ibwN5yj2FtEpIv7IzBsid0t/xpgHPBDwLOjBVWtxfn+ulpV38GpVxbg2dF5W0VlUhCRW0XkARG50p31tqpWqeqjQA8R+Ya7XmKY413hznoaKBSRZFVdifMPDMvpgaZ1U9U3VLXeff4v4FgRuU9EvhLmeJe58QLANuAY4BNgu4jcICJDwxhrsjvrPuCrIvIQMB+4X0SeFpFz2hqrSbzL3Vm1QL772v0b+DbwKM6vtHDFugJAVf/PnR8H7AW2iEhyW+M0E6/xMwD8SER+jzMy4QAReUZEprjrt+lLs5l4nwKniEiKqu7C+VEUD3yvLXGC4l3e5NdyIXCZ+5mrUtVZbhnu9ijep6papqrPAOkicp27Xpu/E5uJ9Xdgg4gkuYm8E9CtrXE8o6pRM+FchPkxzpfV5Ti/2L8D9Aha5+vAVo/jdQ9ap5+7vLNHsXLc5ZOAUTiH6jfi/KLo7kG8rsAE4B53vZ8BFcB/3OcJYYp1nbvsFmAaMAznw3ArzmF0dpjr9n132f/i/DI7y31+HLAYGO7he+RkYKWH78nvu++LIcBzwFfcdc8H3gFywxzvWpwfDX8D3gIK3MffBX4OxLUhXg9gNs4Pk38H7wt4AXg0qFxjgNcaPiPhjOfuv+HxecAyoEsb/3eHixVcxy7ATKBnON4vXkwRL0AzL+xbQL77+FzgYeCaJusUAD9zH58Z5niPBMcDLgCecx/3BsaGOda1zaz3FeBlICPMdXsUmIxz+ugDnF+cy4D3gcfc9SRMsf4IXOk+zwha71S3bmlhrttjbt36ATXAuUHr/gUY49V7xJ3/AXBRW+p0hP/bN/XAe3+w+7gfzq/QAWGMd55bvytwjgzGARe4y74JPBOG+v0EGA08CdwYNH8wsBYY4T4fhpOM0sMdj6Dk4P59DbgD54fLFWGOJUHLxwKvu4/7AqeH4z0TzilqTh8FHbbNBb4KoM75zDXACBEZFrT6jcCDIrID5zxyOOOtduONcJdnA1UicgvOueN+YY51nIgc02STs4FKd2q1FuKtwvn1NQ7ncP1LVR0BXAVMEpE+6r5bwxBrBZAnIsPUOQff4CxgP0d5jaaFeCtxjoBKcS7+/kRERojIL4GROPUNV6yG98ix7nqd3fi1R1OnEOKtAsa5p/hmAg+6630X5/2/N4zx3sGp30RgiKouUNW33fXygC+OJlaTeH8CluP8GLlARHq5sdfhNLh4wj0F+C2cX99HdQ2jpXjqXKeI48Ap9Dtwrh+uAXqGOZaKSIK7vA8Q736fvH00sbwWsaQgbuuhhnOheuDi1Vqgk4iMcp/PBjJxMjgiMhZ4Buf8+3hVfd6jeA1twS/BaU45BOfX5388iNVZnNY614jIYiAXuEtDvJjeingf4ryOu4AbVPUed/09wCmqujXMdevMgf/bVSKyFKeVzs81xIuVRxFvoKo+CLwI3ITzf7tCVXeHOVYm7n0eqlqK86svJ5Q6HWW8NDfmE0CCOE2KR+AcsZR6EK8TB/5354vIHJz/3b/aWj9VrVWnAcmnOMn0toZtVPV3OInhOpwjhetUNaQfR62Id2vDcnWu5w3G+WX/b5zvlD95EKvO3fQs4EKc9+X5qvpyKHXzk+9JQUROEZHngV+ISNeGX6Zy4KLxHKAOOFtEElR1OU52bWi/vxv4oapeoSG0vmhDvOPd5f8AzlDV2470pdmGWHnqtNbZgnPI+W11Lu6Fu27LcD7Y41S1SkTig97U5c3FCEPdGv5vmzyu23KcxgAnu/V5AbhNVa9V1e0e1w3gKlX9+5Hq1YZ4/YDj3QR+Nc6pucmqusOjeH1wjhbA+fV8g6pepqpHPCppIV7j+81VjHPq6hgR6SvO/TNd3P/d9ap6ZRvrd7h4w9x42eIc5RUDN6vqpUf6TmlDrIYfDFOBs0P5PokUX5OCiAzC+aVTgPPldJ+InA+NTbdQ1bU4h7ODcZpMAlTjDrupqltUdYkP8da7y19X1QKf6jZLVT/xoW4b3eX1DW9qH+r2map+5EPd1jfsp2FdD2NtDIoV0umwNsSr4sB7cn8oiTVc9VPVNao6Pwzx6lVVRSRZnFZG9ar6Ic51raU4RyjZ7ro1PsT7COci9j5VXe1xrFkiMlRVP1fVD0KpW8SojxcwcM5dT3UfdwV+gHPY1suddz/OoWMuzn0JbwHzcNpJt7rFg5/xrG5WN4sXUrxf4xx957rPb8A5nfl7nHsvojae33WL1OTtzp1zZzcDJ7rPB+E0fevvPh8OPIDTJK6hxc2QoO0zgKxojGd1s7pZvLDEOzP4eTTF87tu0TJ5dUt+L3G6AfgfnHa5fxORc1R1PfAZTnM3cFpVLMO5QLhEVb+hqmvFvZKvquWqWhJN8axuVrdoq1s7jRfvxvtAndNXURPP77pFG6+uKUwAPlLVr6rqfThtyKe4yz4CRonICeq0rtkKnKqq+8Bp2qWtv43ez3hWN6ubxWt7vNZ28+BnPL/rFlXC2Qnat0Vkkji3+s/EObfWYDdO22dw2jkvwOkJMQOnWd0mEUmD0PuO8TOe1c3qFm11s3jt+70SzRKOvMrhiYjg3HzxMs4NJutwLr7cpqrbRSRRnRYOvXAOw1Cnidlj4nTF+xzOVfxvq+r+aIpndbO6RVvdLF77fq+0G3qUFyOAePfvMTg9RoJzW/yfOHAbd8M6/8HtjgK3HyOchNQpGuNZ3axuFi+24/ldt/Y0tfpIQZyLKPfh3Ko9HeciSz04bXVF5DZgm4icpqqzRSQJKAJWi8hvgK+JyCR1boIpi6Z4VjerW7TVzeK17/dKu9SaDILTp/tCnLa5P8DpNuFcYDPO3ZYN690AzHIfd8Y5NFuD00layD1/+hnP6mZ1s3ixHc/vurXXqXUrO51mBfcg+gRO53TfAea58+JwztO9itMfzPE4XeKObXXhfIxndbO6WbzYjud33drr1Np/YBqQzIFzbd8Efuc+Xgjc4j6egHvnX5sK52M8q5vVzeLFdjy/69Zep1Y1SVWnz5VqPdAO9yyc823gdON7nIhMwxnbeB4c6EXwaPgZz+pmdbN4sR3P77q1W0eZceNxDrPewb2NG6cr2Cyc2737hDNz+RnP6mZ1s3ixHc/vurW36WhvXgsAiTjdw452s+svgYCqfqzh7xLWz3hWt/YZL5brZvHa93ulfWlDtj0R58X9GHc8Xi8nP+NZ3dpnvFium8Vrv7Ha29SWF7UvcBeQ7EtBfYxndWuf8WK5bhav/cZqb1PDoNXGGGNM5MZoNsYYE30sKRhjjGlkScEYY0wjSwrGGGMaWVIwxhjTyJKCiQki0k1EFrrTDhHZ6j4uF5EnPIj3dxHZICI3hHvfTeJcIiLDg57PEpEJIW6b6r4GNSKS7V0pTSxp08hrxkQLVd0NjAUQkXuBclV9yOOwt6vqax7HuASYBixv7YaqWgmMFZGNYS6TiWF2pGBimjjj7k5zH98rIs+LyEcisklELhWRB0VkiYi8KyKJ7np5IjJbROaJyHsi0iuEOH8XkSdF5HMRWe/GfU5EVojI34PWu9qNt1REfh80v1xEfiMii9x95IjIycBFwB/cX/yD3dWvEJE5IrJaRL7qbj/CnbdQRBaLyNDwvYqmI7GkYDqawcDpOF+2LwIFqjoKqAQucBPDn4DLVTUPZxze34S47y7AScCPgbeAR3AGdh8lImNFpDfwezf+WGCiiFzibpsOfK6qY3AGf/mBqn7q7ud2VR2rquvcdRNU9XjgR8A97rwbgMdUdSxO18+FrXlRjGlgp49MR/OOqtaKyBKc3jLfdecvAXKBYcBIYIbba3I8sD3Eff9HVdXd905VXQIgIsvcfQ/AGdGryJ3/EnAq8G+gBuc0ETjdNp/VQpzXg9bLdR9/Bvw/EemLM8bwmhDLbMxBLCmYjqYaQFUDIlKrB/p5CeB8HgRYpqonHe2+3X1VB81v2HdtC9sGl6Welj+b1U3XU9WXReQL4AJguohcr6r/bWX5jbHTR8Y0sQroLiInAYhIooiMCNO+5wCniUi2OAPIXw3MPsI2ZUCnI+1YRAYB61X1j8CbwOi2FtZ0TJYUjAmiqjXA5cDvRWQRzjCNJ4dp39uBO4ECYBHOuMBvHmGzqcDtIrIg6EJzc64ElorIQpzTXy+EocimA7JeUo05Cm6Lomk+NEltM7dJ6gRVLY50WUz0syMFY47OPuA+r29ea4uGm9dwRhkLRLg4pp2wIwVjjDGN7EjBGGNMI0sKxhhjGllSMMYY08iSgjHGmEaWFIwxxjT6/+4imatSCKzcAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "answer_nn = \"\"\n", "\n", "fig, ax = plt.subplots() # generate a new plot\n", "ax.plot(time_germany, cc_germany) # plot data\n", "ax.plot(x_test, y_test, label=\"test\") # plot data\n", "ax.plot(x_val, y_val, label=\"val\") # plot data\n", "\n", "ax.xaxis.set_major_locator(months) # modify axis\n", "fig.autofmt_xdate()\n", "plt.grid(True, \"both\")\n", "plt.ylim([-20, 370])\n", "plt.legend()\n", "plt.title(\"Germany\")\n", "plt.ylabel(\"Total cases\")\n", "plt.xlabel(\"Time [months]\")\n", "plt.show() # make plot" ] }, { "cell_type": "code", "execution_count": null, "id": "0f6c880c", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "code", "checksum": "e801d1f0bf6f579c57e834bbbc40b734", "grade": true, "grade_id": "correct_death_corona", "locked": true, "points": 4, "schema_version": 3, "solution": false, "task": false }, "id": "0f6c880c" }, "outputs": [], "source": [ "##### DO NOT CHANGE #####\n", "\n", "# Tests for auto-grading (check variables to be graded).\n", "assert isinstance(countries, list) or isinstance(countries, np.ndarray)\n", "assert isinstance(rel_deaths, dict)\n", "assert isinstance(population, dict)\n", "assert isinstance(deaths, dict)\n", "assert isinstance(country_max_mortality, str)\n", "\n", "##### DO NOT CHANGE #####" ] }, { "cell_type": "code", "execution_count": null, "id": "1254277d", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "code", "checksum": "0a8c5a1b3378bd8470dca6ab753ea098", "grade": true, "grade_id": "correct_cum_corona", "locked": true, "points": 2, "schema_version": 3, "solution": false, "task": false }, "id": "1254277d" }, "outputs": [], "source": [ "##### DO NOT CHANGE #####\n", "\n", "assert isinstance(cum_death, np.ndarray)\n", "assert isinstance(cum_cases, np.ndarray)\n", "\n", "##### DO NOT CHANGE #####" ] }, { "cell_type": "code", "execution_count": null, "id": "8aebb170", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "code", "checksum": "b764165abb94b3ec6d612e3f42679323", "grade": true, "grade_id": "correct_func_implement", "locked": true, "points": 3, "schema_version": 3, "solution": false, "task": false }, "id": "8aebb170" }, "outputs": [], "source": [ "##### DO NOT CHANGE #####\n", "\n", "assert fun_1(0, 0, 0) == 0\n", "assert fun_2(0, 0, 0, 0) == 0\n", "assert fun_3(0, 0, 0, 0) == 0\n", "assert fun_4(0, 0, 0, 0, 0) == 0\n", "\n", "##### DO NOT CHANGE #####" ] }, { "cell_type": "code", "execution_count": null, "id": "14d12a08", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "code", "checksum": "7879ca6506901ef88df73f57fd0cd2ba", "grade": true, "grade_id": "correct_func_test", "locked": true, "points": 4, "schema_version": 3, "solution": false, "task": false }, "id": "14d12a08" }, "outputs": [], "source": [ "##### DO NOT CHANGE #####\n", "\n", "assert param_1 is not None\n", "assert param_2 is not None\n", "assert param_3 is not None\n", "assert param_4 is not None\n", "assert isinstance(answer_best_fun, int)\n", "assert isinstance(answer_change_14_days, bool)\n", "assert isinstance(answer_best_fun_14_days, int)\n", "assert isinstance(answer_explanation, str)\n", "\n", "##### DO NOT CHANGE #####" ] }, { "cell_type": "code", "execution_count": null, "id": "fa78b3b5", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "code", "checksum": "be2138f770e4b09679c5a041ad1216ef", "grade": true, "grade_id": "correct_NN", "locked": true, "points": 2, "schema_version": 3, "solution": false, "task": false }, "id": "fa78b3b5" }, "outputs": [], "source": [ "##### DO NOT CHANGE #####\n", "\n", "assert isinstance(answer_nn, str)\n", "\n", "##### DO NOT CHANGE #####" ] }, { "cell_type": "markdown", "id": "a56944cd", "metadata": { "id": "a56944cd" }, "source": [ "# Submitting your solution\n", "\n", "Often it is necessary to enable the nbgrader UI extension, such that blue cells with points appear. Under *View -> Cell Toolbar*, change the cell toolbar to \"Create Assignment\".\n", "\n", "Always, as a first step, use the local validation of your notebook provided by nbgrader (*Validate* button in toolbar).\n", "\n", "\n", "Ideally, the validation should pass without any errors. It should help to detect simple errors and also serves as a genereal sanity check for your notebook, based on the non-hidden assert statements. Passing the validation does not automatically mean that you will get any points. It asserts that your notebook can be run correctly. Buggy programs often result in 0 points.\n", "\n", "As a last step, the notebook should be uploaded to Ilias such that we can auto-grade it." ] } ], "metadata": { "jupytext": { "formats": "ipynb,py:percent" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "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.10.12" }, "colab": { "provenance": [] } }, "nbformat": 4, "nbformat_minor": 5 }