{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Plotting NBEATS output\nAn example plot of :class:`autopycoin.models.NBEATS`\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import tensorflow as tf\nfrom matplotlib import pyplot as plt\nimport pandas as pd\n\nfrom autopycoin.data import random_ts\nfrom autopycoin.dataset import WindowGenerator\nfrom autopycoin.models import nbeats\n\n\ntf.random.set_seed(0)\n\ndata = random_ts(n_steps=400, # Number of steps (second dimension)\n                 trend_degree=2,\n                 periods=[10], # We can combine multiple periods, period is the time length for a cyclical function to reproduce a similar output\n                 fourier_orders=[10], # higher is this number, more complex is the output\n                 trend_mean=0,\n                 trend_std=1,\n                 seasonality_mean=0,\n                 seasonality_std=1,\n                 batch_size=1, # Generate a batch of data (first dimension)\n                 n_variables=1, # Number of variables (last dimension)\n                 noise=True, # add normal centered noise\n                 seed=42)\n\n\nw = WindowGenerator(\n        input_width=80,\n        label_width=40,\n        shift=40,\n        test_size=50,\n        valid_size=10,\n        flat=True,\n        batch_size=16,\n        preprocessing = lambda x,y: (x, (x,y)) # NBEATS output\n    )\n\ndata = pd.DataFrame(data.numpy()[0], columns=['test'])\n\nw = w.from_array(data=data, # Has to be 2D array\n        input_columns=['test'],\n        known_columns=[],\n        label_columns=['test'],\n        date_columns=[],)\n\nmodel1 = nbeats.create_interpretable_nbeats(\n            label_width=40,\n            forecast_periods=[10],\n            backcast_periods=[10],\n            forecast_fourier_order=[10],\n            backcast_fourier_order=[10],\n            p_degree=1,\n            trend_n_neurons=200,\n            seasonality_n_neurons=200,\n            drop_rate=0.,\n            share=True)\n\nmodel1.compile(tf.keras.optimizers.Adam(\n    learning_rate=0.0015, beta_1=0.9, beta_2=0.999, epsilon=1e-07, amsgrad=True,\n    name='Adam'),\n    loss='mse',\n    loss_weights=[1, 1], # In the paper = [0, 1]\n    metrics=[\"mae\"])\n\nmodel1.fit(w.train, validation_data=w.valid, epochs=20)\n\niterator = iter(w.train)\nx, y = iterator.get_next()\n\ninput_width = 80\n\nplt.plot(range(input_width, input_width + 40), model1.predict(x)[1].values[0], label='forecast')\n# Usefull only if stack = True\nplt.plot(range(input_width), model1.predict(x)[0].values[0], label='backcast')\nplt.plot(range(input_width, input_width + 40), y[1][0], label='labels')\nplt.plot(range(input_width), x[0], label='inputs')\nplt.legend()"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "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.7.9"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}