{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "name": "S+P Week 1 - Lesson 3 - Notebook.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "id": "zX4Kg8DUTKWO"
      },
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/lmoroney/dlaicourse/blob/master/TensorFlow%20In%20Practice/Course%204%20-%20S%2BP/S%2BP%20Week%201%20-%20Lesson%203%20-%20Notebook.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "y7QztBIVR1tb"
      },
      "source": [
        "try:\n",
        "  # %tensorflow_version only exists in Colab.\n",
        "  %tensorflow_version 2.x\n",
        "except Exception:\n",
        "  pass\n"
      ],
      "execution_count": 1,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "t9HrvPfrSlzS",
        "outputId": "824935ab-bceb-4dbe-9cb5-1e13aa17432b"
      },
      "source": [
        "import tensorflow as tf\n",
        "print(tf.__version__)\n"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "2.5.0\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "I9x4GjlEVTQN"
      },
      "source": [
        "The next code block will set up the time series with seasonality, trend and a bit of noise. "
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 388
        },
        "id": "gqWabzlJ63nL",
        "outputId": "6f28a2e3-906d-4a4d-a0b2-0f46ff8fa265"
      },
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import tensorflow as tf\n",
        "from tensorflow import keras\n",
        "\n",
        "def plot_series(time, series, format=\"-\", start=0, end=None):\n",
        "    plt.plot(time[start:end], series[start:end], format)\n",
        "    plt.xlabel(\"Time\")\n",
        "    plt.ylabel(\"Value\")\n",
        "    plt.grid(True)\n",
        "\n",
        "def trend(time, slope=0):\n",
        "    return slope * time\n",
        "\n",
        "def seasonal_pattern(season_time):\n",
        "    \"\"\"Just an arbitrary pattern, you can change it if you wish\"\"\"\n",
        "    return np.where(season_time < 0.4,\n",
        "                    np.cos(season_time * 2 * np.pi),\n",
        "                    1 / np.exp(3 * season_time))\n",
        "\n",
        "def seasonality(time, period, amplitude=1, phase=0):\n",
        "    \"\"\"Repeats the same pattern at each period\"\"\"\n",
        "    season_time = ((time + phase) % period) / period\n",
        "    return amplitude * seasonal_pattern(season_time)\n",
        "\n",
        "def noise(time, noise_level=1, seed=None):\n",
        "    rnd = np.random.RandomState(seed)\n",
        "    return rnd.randn(len(time)) * noise_level\n",
        "\n",
        "time = np.arange(4 * 365 + 1, dtype=\"float32\")\n",
        "baseline = 10\n",
        "series = trend(time, 0.1)  \n",
        "baseline = 10\n",
        "amplitude = 40\n",
        "slope = 0.05\n",
        "noise_level = 5\n",
        "\n",
        "# Create the series\n",
        "series = baseline + trend(time, slope) + seasonality(time, period=365, amplitude=amplitude)\n",
        "# Update with noise\n",
        "series += noise(time, noise_level, seed=42)\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plot_series(time, series)\n",
        "plt.show()"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 720x432 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UfdyqJJ1VZVu"
      },
      "source": [
        "Now that we have the time series, let's split it so we can start forecasting"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_w0eKap5uFNP"
      },
      "source": [
        "split_time = 1000\n",
        "time_train = time[:split_time]\n",
        "x_train = series[:split_time]\n",
        "time_valid = time[split_time:]\n",
        "x_valid = series[split_time:]\n",
        "plt.figure(figsize=(10, 6))\n",
        "plot_series(time_train, x_train)\n",
        "plt.show()\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plot_series(time_valid, x_valid)\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "bjD8ncEZbjEW"
      },
      "source": [
        "# Naive Forecast"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Pj_-uCeYxcAb"
      },
      "source": [
        "naive_forecast = series[split_time - 1:-1]"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JtxwHj9Ig0jT"
      },
      "source": [
        "plt.figure(figsize=(10, 6))\n",
        "plot_series(time_valid, x_valid)\n",
        "plot_series(time_valid, naive_forecast)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fw1SP5WeuixH"
      },
      "source": [
        "Let's zoom in on the start of the validation period:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "D0MKg7FNug9V"
      },
      "source": [
        "plt.figure(figsize=(10, 6))\n",
        "plot_series(time_valid, x_valid, start=0, end=150)\n",
        "plot_series(time_valid, naive_forecast, start=1, end=151)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "35gIlQLfu0TT"
      },
      "source": [
        "You can see that the naive forecast lags 1 step behind the time series."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Uh_7244Gsxfx"
      },
      "source": [
        "Now let's compute the mean squared error and the mean absolute error between the forecasts and the predictions in the validation period:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "byNnC7IbsnMZ"
      },
      "source": [
        "print(keras.metrics.mean_squared_error(x_valid, naive_forecast).numpy())\n",
        "print(keras.metrics.mean_absolute_error(x_valid, naive_forecast).numpy())"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WGPBC9QttI1u"
      },
      "source": [
        "That's our baseline, now let's try a moving average:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "YGz5UsUdf2tV"
      },
      "source": [
        "def moving_average_forecast(series, window_size):\n",
        "  \"\"\"Forecasts the mean of the last few values.\n",
        "     If window_size=1, then this is equivalent to naive forecast\"\"\"\n",
        "  forecast = []\n",
        "  for time in range(len(series) - window_size):\n",
        "    forecast.append(series[time:time + window_size].mean())\n",
        "  return np.array(forecast)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "HHFhGXQji7_r"
      },
      "source": [
        "moving_avg = moving_average_forecast(series, 30)[split_time - 30:]\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plot_series(time_valid, x_valid)\n",
        "plot_series(time_valid, moving_avg)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wG7pTAd7z0e8"
      },
      "source": [
        "print(keras.metrics.mean_squared_error(x_valid, moving_avg).numpy())\n",
        "print(keras.metrics.mean_absolute_error(x_valid, moving_avg).numpy())"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JMYPnJqwz8nS"
      },
      "source": [
        "That's worse than naive forecast! The moving average does not anticipate trend or seasonality, so let's try to remove them by using differencing. Since the seasonality period is 365 days, we will subtract the value at time *t* – 365 from the value at time *t*."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "5pqySF7-rJR4"
      },
      "source": [
        "diff_series = (series[365:] - series[:-365])\n",
        "diff_time = time[365:]\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plot_series(diff_time, diff_series)\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xPlPlS7DskWg"
      },
      "source": [
        "Great, the trend and seasonality seem to be gone, so now we can use the moving average:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QmZpz7arsjbb"
      },
      "source": [
        "diff_moving_avg = moving_average_forecast(diff_series, 50)[split_time - 365 - 50:]\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plot_series(time_valid, diff_series[split_time - 365:])\n",
        "plot_series(time_valid, diff_moving_avg)\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Gno9S2lyecnc"
      },
      "source": [
        "Now let's bring back the trend and seasonality by adding the past values from t – 365:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Dv6RWFq7TFGB"
      },
      "source": [
        "diff_moving_avg_plus_past = series[split_time - 365:-365] + diff_moving_avg\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plot_series(time_valid, x_valid)\n",
        "plot_series(time_valid, diff_moving_avg_plus_past)\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "59jmBrwcTFCx"
      },
      "source": [
        "print(keras.metrics.mean_squared_error(x_valid, diff_moving_avg_plus_past).numpy())\n",
        "print(keras.metrics.mean_absolute_error(x_valid, diff_moving_avg_plus_past).numpy())"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vx9Et1Hkeusl"
      },
      "source": [
        "Better than naive forecast, good. However the forecasts look a bit too random, because we're just adding past values, which were noisy. Let's use a moving averaging on past values to remove some of the noise:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "K81dtROoTE_r"
      },
      "source": [
        "diff_moving_avg_plus_smooth_past = moving_average_forecast(series[split_time - 370:-360], 10) + diff_moving_avg\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plot_series(time_valid, x_valid)\n",
        "plot_series(time_valid, diff_moving_avg_plus_smooth_past)\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "iN2MsBxWTE3m"
      },
      "source": [
        "print(keras.metrics.mean_squared_error(x_valid, diff_moving_avg_plus_smooth_past).numpy())\n",
        "print(keras.metrics.mean_absolute_error(x_valid, diff_moving_avg_plus_smooth_past).numpy())"
      ],
      "execution_count": null,
      "outputs": []
    }
  ]
}