{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyOtPkqto1j0fYdUgt4DrT3X",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"source": [
"# LSTM WITH TENSORFLOW FOR AUSGAS"
],
"metadata": {
"id": "UHdN78XRcpJ8"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "eV_qqGQ6b_7m",
"outputId": "c931f8db-04d2-45fa-88e6-b2271f8e1249"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Mounted at /content/drive\n"
]
}
],
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')\n"
]
},
{
"cell_type": "code",
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"from sklearn.metrics import mean_squared_error\n",
"import tensorflow as tf\n"
],
"metadata": {
"id": "wTntdzjAcG0N"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"aus_path = '/content/drive/MyDrive/Datasets/AusGas.csv'\n",
"datasets_ts = pd.read_csv(aus_path)\n",
"datasets_ts.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "MGrwFf_2cSPs",
"outputId": "ac27e3b0-f97d-4ffa-c970-0ebf38a07d13"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Month GasProd\n",
"0 Jan-1956 1709\n",
"1 Feb-1956 1646\n",
"2 Mar-1956 1794\n",
"3 Apr-1956 1878\n",
"4 May-1956 2173"
],
"text/html": [
"\n",
"
\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Month | \n",
" GasProd | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Jan-1956 | \n",
" 1709 | \n",
"
\n",
" \n",
" 1 | \n",
" Feb-1956 | \n",
" 1646 | \n",
"
\n",
" \n",
" 2 | \n",
" Mar-1956 | \n",
" 1794 | \n",
"
\n",
" \n",
" 3 | \n",
" Apr-1956 | \n",
" 1878 | \n",
"
\n",
" \n",
" 4 | \n",
" May-1956 | \n",
" 2173 | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"\n",
" \n",
"
\n",
"
\n",
" "
]
},
"metadata": {},
"execution_count": 3
}
]
},
{
"cell_type": "code",
"source": [
"datasets_ts.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "592ZCzXmceYb",
"outputId": "e67e6c9d-a675-46b9-ae25-b8aa979afccb"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(476, 2)"
]
},
"metadata": {},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"source": [
"datasets_ts.plot()\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"id": "KBsaZjZFchxm",
"outputId": "86167687-c460-4370-8a52-5a5479290d51"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"### PART 1: PREPROCESSING"
],
"metadata": {
"id": "S3XGxx2y6KEt"
}
},
{
"cell_type": "code",
"source": [
"dataset_train = datasets_ts.iloc[:450, :]\n",
"dataset_train.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "OzWRMi5WczSM",
"outputId": "66f1217b-1c99-473f-db4c-5f5cfc27d447"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(450, 2)"
]
},
"metadata": {},
"execution_count": 9
}
]
},
{
"cell_type": "code",
"source": [
"#converting pandas type data to numpy type as numpy type required for tensorflow\n",
"training_set = dataset_train.iloc[:,1].values\n",
"training_set[:5]"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "sFuKirradTH6",
"outputId": "7ae916da-18ff-4552-9981-7951f31bffab"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([1709, 1646, 1794, 1878, 2173])"
]
},
"metadata": {},
"execution_count": 10
}
]
},
{
"cell_type": "code",
"source": [
"training_set.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "BEGTDsCydiNp",
"outputId": "7792e375-7b5b-49f7-f946-ca4cc1cc22df"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(450,)"
]
},
"metadata": {},
"execution_count": 12
}
]
},
{
"cell_type": "code",
"source": [
"training_set[-1]"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "azeeE4B0vppb",
"outputId": "803b0e0e-d42e-441f-9acc-232e4bb101d7"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([56977])"
]
},
"metadata": {},
"execution_count": 56
}
]
},
{
"cell_type": "code",
"source": [
"training_set = training_set.reshape(-1,1)\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"mm = MinMaxScaler()\n",
"trn_set_scl = mm.fit_transform(training_set)\n",
"print(trn_set_scl[:5])\n",
"print(type(trn_set_scl))\n",
"print(trn_set_scl.ndim)\n",
"print(trn_set_scl.shape)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "qGu9hgfReLE4",
"outputId": "0b2e940d-1cfd-4fb8-ff76-5b84b3bdaa07"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[[0.00103697]\n",
" [0. ]\n",
" [0.00243605]\n",
" [0.00381868]\n",
" [0.00867433]]\n",
"\n",
"2\n",
"(450, 1)\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"timesteps = 10\n",
"trn_size = dataset_train.shape[0]\n",
"trn_size"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "VToLPCNnero3",
"outputId": "57182750-541c-42d1-973b-7d93310a40f5"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"450"
]
},
"metadata": {},
"execution_count": 19
}
]
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "Vdmuq1DxvoYk"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"X_train = []\n",
"y_train = []\n",
"for i in range(timesteps, trn_size):\n",
" X_train.append(trn_set_scl[i-timesteps:i, 0])\n",
" y_train.append(trn_set_scl[i,0])\n",
"X_train, y_train = np.array(X_train), np.array(y_train)"
],
"metadata": {
"id": "122g5-oEe_DG"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"X_train[:10]"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XET7n5-6fgfV",
"outputId": "64b8e79a-fb20-49dd-d596-8eb7975595f3"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[0.00103697, 0. , 0.00243605, 0.00381868, 0.00867433,\n",
" 0.01111038, 0.01352997, 0.01267406, 0.00885538, 0.00781842],\n",
" [0. , 0.00243605, 0.00381868, 0.00867433, 0.01111038,\n",
" 0.01352997, 0.01267406, 0.00885538, 0.00781842, 0.0052013 ],\n",
" [0.00243605, 0.00381868, 0.00867433, 0.01111038, 0.01352997,\n",
" 0.01267406, 0.00885538, 0.00781842, 0.0052013 , 0.00294631],\n",
" [0.00381868, 0.00867433, 0.01111038, 0.01352997, 0.01267406,\n",
" 0.00885538, 0.00781842, 0.0052013 , 0.00294631, 0.00172828],\n",
" [0.00867433, 0.01111038, 0.01352997, 0.01267406, 0.00885538,\n",
" 0.00781842, 0.0052013 , 0.00294631, 0.00172828, 0.00069131],\n",
" [0.01111038, 0.01352997, 0.01267406, 0.00885538, 0.00781842,\n",
" 0.0052013 , 0.00294631, 0.00172828, 0.00069131, 0.00450999],\n",
" [0.01352997, 0.01267406, 0.00885538, 0.00781842, 0.0052013 ,\n",
" 0.00294631, 0.00172828, 0.00069131, 0.00450999, 0.00485565],\n",
" [0.01267406, 0.00885538, 0.00781842, 0.0052013 , 0.00294631,\n",
" 0.00172828, 0.00069131, 0.00450999, 0.00485565, 0.01094578],\n",
" [0.00885538, 0.00781842, 0.0052013 , 0.00294631, 0.00172828,\n",
" 0.00069131, 0.00450999, 0.00485565, 0.01094578, 0.01041907],\n",
" [0.00781842, 0.0052013 , 0.00294631, 0.00172828, 0.00069131,\n",
" 0.00450999, 0.00485565, 0.01094578, 0.01041907, 0.01632814]])"
]
},
"metadata": {},
"execution_count": 30
}
]
},
{
"cell_type": "code",
"source": [
"print(X_train.shape)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "0MQ9zcXZfiIU",
"outputId": "add55415-e9cf-4983-f6a1-322d00d8e21c"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"(440, 10)\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"X_train.shape[0]"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "eTQEqNNYio-H",
"outputId": "fcdeb5ea-fad9-418a-efa9-38560659266e"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"440"
]
},
"metadata": {},
"execution_count": 36
}
]
},
{
"cell_type": "code",
"source": [
"X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))\n",
"X_train.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "6lI8oVt5e9L2",
"outputId": "1d83438f-28fa-42bd-e5b2-6d7dd30d2732"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(440, 10, 1)"
]
},
"metadata": {},
"execution_count": 40
}
]
},
{
"cell_type": "markdown",
"source": [
"### PART 2: BUILD RNN - LSTM \n",
"[Wiki Page for LSTM](https://en.wikipedia.org/wiki/Long_short-term_memory)"
],
"metadata": {
"id": "5-mWXBPWkZyi"
}
},
{
"cell_type": "code",
"source": [
"import tensorflow as tf\n",
"from tensorflow import keras"
],
"metadata": {
"id": "ZFjIILc2ehCX"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"### INITIALIZE RNN\n",
"tf.random.set_seed(seed = 2022)\n",
"model = keras.Sequential([\n",
" keras.layers.LSTM(units = 100, return_sequences=True, \n",
" input_shape=(X_train.shape[1], X_train.shape[2])),\n",
" keras.layers.LSTM(units = 70, return_sequences=True),\n",
" keras.layers.LSTM(units = 50), \n",
" keras.layers.Dense(1) \n",
"])\n",
"model.compile(optimizer= 'adam', loss = 'mean_squared_error')"
],
"metadata": {
"id": "AfM8jZRVkZcL"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"model.fit(X_train, y_train, epochs = 50, batch_size= 25)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Tr7Wek6aefMX",
"outputId": "13e915cd-5175-4297-836d-5cda3fd9e3b6"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch 1/50\n",
"18/18 [==============================] - 6s 22ms/step - loss: 0.0495\n",
"Epoch 2/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0110\n",
"Epoch 3/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0089\n",
"Epoch 4/50\n",
"18/18 [==============================] - 0s 22ms/step - loss: 0.0074\n",
"Epoch 5/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0073\n",
"Epoch 6/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0072\n",
"Epoch 7/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0073\n",
"Epoch 8/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0075\n",
"Epoch 9/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0072\n",
"Epoch 10/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0077\n",
"Epoch 11/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0087\n",
"Epoch 12/50\n",
"18/18 [==============================] - 0s 22ms/step - loss: 0.0080\n",
"Epoch 13/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0074\n",
"Epoch 14/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0072\n",
"Epoch 15/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0071\n",
"Epoch 16/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0076\n",
"Epoch 17/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0074\n",
"Epoch 18/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0085\n",
"Epoch 19/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0073\n",
"Epoch 20/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0072\n",
"Epoch 21/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0071\n",
"Epoch 22/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0076\n",
"Epoch 23/50\n",
"18/18 [==============================] - 0s 22ms/step - loss: 0.0073\n",
"Epoch 24/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0068\n",
"Epoch 25/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0070\n",
"Epoch 26/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0066\n",
"Epoch 27/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0067\n",
"Epoch 28/50\n",
"18/18 [==============================] - 0s 22ms/step - loss: 0.0069\n",
"Epoch 29/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0069\n",
"Epoch 30/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0065\n",
"Epoch 31/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0067\n",
"Epoch 32/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0064\n",
"Epoch 33/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0058\n",
"Epoch 34/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0064\n",
"Epoch 35/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0056\n",
"Epoch 36/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0051\n",
"Epoch 37/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0040\n",
"Epoch 38/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0033\n",
"Epoch 39/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0031\n",
"Epoch 40/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0023\n",
"Epoch 41/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0018\n",
"Epoch 42/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0019\n",
"Epoch 43/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0022\n",
"Epoch 44/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0017\n",
"Epoch 45/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0019\n",
"Epoch 46/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0015\n",
"Epoch 47/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0013\n",
"Epoch 48/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0013\n",
"Epoch 49/50\n",
"18/18 [==============================] - 0s 20ms/step - loss: 0.0014\n",
"Epoch 50/50\n",
"18/18 [==============================] - 0s 21ms/step - loss: 0.0013\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
""
]
},
"metadata": {},
"execution_count": 47
}
]
},
{
"cell_type": "markdown",
"source": [
"### Part 3: RESULTS"
],
"metadata": {
"id": "ArhXCMzIrrf-"
}
},
{
"cell_type": "code",
"source": [
"dataset_test = datasets_ts.iloc[450:,:]\n",
"dataset_test.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "F1irLa9Fl-c2",
"outputId": "a7114472-8603-4135-8a5f-20c916ec2350"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(26, 2)"
]
},
"metadata": {},
"execution_count": 50
}
]
},
{
"cell_type": "code",
"source": [
"test_set = dataset_test.iloc[:, 1].values\n",
"test_set"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "8HObKDjcsd_o",
"outputId": "16a70f79-b470-4091-a3db-d74153724816"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([56807, 54634, 51367, 48073, 46251, 43736, 39975, 40478, 46895,\n",
" 46147, 55011, 57799, 62450, 63896, 57784, 53231, 50354, 38410,\n",
" 41600, 41471, 46287, 49013, 56624, 61739, 66600, 60054])"
]
},
"metadata": {},
"execution_count": 51
}
]
},
{
"cell_type": "code",
"source": [
"dataset_total = pd.concat((dataset_train['GasProd'], dataset_test['GasProd']), axis = 0)\n",
"dataset_total"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "SiIHBXVMsqgI",
"outputId": "5a58f7ba-be6a-4695-982d-965a347609a0"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 1709\n",
"1 1646\n",
"2 1794\n",
"3 1878\n",
"4 2173\n",
" ... \n",
"471 49013\n",
"472 56624\n",
"473 61739\n",
"474 66600\n",
"475 60054\n",
"Name: GasProd, Length: 476, dtype: int64"
]
},
"metadata": {},
"execution_count": 52
}
]
},
{
"cell_type": "code",
"source": [
"dataset_total.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "klHrbJAnxDB3",
"outputId": "9de068b2-76bb-44b9-e584-329ed1e9913c"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(476,)"
]
},
"metadata": {},
"execution_count": 61
}
]
},
{
"cell_type": "code",
"source": [
"# we take 10 extra from train set to get them as part of test set\n",
"inputs = dataset_total[len(dataset_total) - len(dataset_test) - timesteps:].values\n",
"inputs = inputs.reshape(-1, 1)\n",
"len(inputs)\n",
"print(inputs.shape)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XFX7k4BNsbbo",
"outputId": "181a6099-72b9-4b6a-ce9f-22f87b78179c"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"(36, 1)\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"inputs_scl = mm.transform(inputs)\n",
"X_test = []\n",
"for i in range(timesteps, len(inputs_scl)):\n",
" X_test.append(inputs_scl[i-timesteps:i,0])\n",
"X_test = np.array(X_test)\n",
"X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1],1))\n",
"X_test.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "0iZlqmkTv5DK",
"outputId": "38865547-f2fc-42b1-b1b5-1953cdecd7e1"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(26, 10, 1)"
]
},
"metadata": {},
"execution_count": 63
}
]
},
{
"cell_type": "code",
"source": [
"len(X_test)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "xnqIwDmAwifu",
"outputId": "083cdd8a-4153-4476-9a41-1be0c79da9a1"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"26"
]
},
"metadata": {},
"execution_count": 64
}
]
},
{
"cell_type": "code",
"source": [
"predicted_values = model.predict(X_test)\n",
"predicted_values"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "vYz8-mHdw3Ju",
"outputId": "d39cb30b-8201-45ae-b28a-432454067f04"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"1/1 [==============================] - 1s 1s/step\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[0.9448642 ],\n",
" [0.9393854 ],\n",
" [0.84788895],\n",
" [0.7300566 ],\n",
" [0.6365161 ],\n",
" [0.59788865],\n",
" [0.5923539 ],\n",
" [0.62368196],\n",
" [0.65269816],\n",
" [0.7293409 ],\n",
" [0.78864384],\n",
" [0.87034726],\n",
" [0.91909623],\n",
" [0.9322104 ],\n",
" [0.9092065 ],\n",
" [0.82623047],\n",
" [0.734792 ],\n",
" [0.6868149 ],\n",
" [0.61729074],\n",
" [0.59133595],\n",
" [0.6262625 ],\n",
" [0.7192022 ],\n",
" [0.8436632 ],\n",
" [0.96191865],\n",
" [1.0090406 ],\n",
" [1.0018649 ]], dtype=float32)"
]
},
"metadata": {},
"execution_count": 65
}
]
},
{
"cell_type": "code",
"source": [
"predicted_values.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "9ibx4KIeyUw7",
"outputId": "5fcb0df6-8655-4b1c-d7cf-01a825451859"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(26, 1)"
]
},
"metadata": {},
"execution_count": 66
}
]
},
{
"cell_type": "code",
"source": [
"predicted_values = mm.inverse_transform( predicted_values)\n"
],
"metadata": {
"id": "wbWedo7ByXrb"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"plt.plot(test_set, color = 'red', label = 'Real Gas Prod')\n",
"plt.plot(predicted_values, color = 'blue', label = 'Predicted Gas Prod')\n",
"plt.title('Gas Prod Prediction')\n",
"plt.xlabel('Time')\n",
"plt.ylabel('Gas Production')\n",
"plt.legend()\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
},
"id": "iYJhmi9JypGa",
"outputId": "91376ac0-1795-4ca2-bfde-fcaf5ae1660b"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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2zNr1izKly/P9OnTAasLlh7Tpk2jVq1ap96XKlWKpUuX8ueff9K4cWOWLFlCiRIliImJYcqUKTRq1IghQ4awZMkSihUrRosWLbjssssC+4eEk1274JZbYNMmi85J4+/qiFI+/th8IhmZsiCsJVCcEskh+ErBg61E+vTpww8//EDDhg1PlXn/+uuvWbly5Sl/x969e1m7di3z5s3jlltuIW/evJQvX56WLVueNv+CBQto2rTpqbl8JdpT8s033yTzoezbt48DBw5kqWT7M888w+TJk9mxYwd//vknqspjjz3GvHnzyJMnD1u3bmX79u3UqlWLhx56iMGDB3PDDTdw9dVXpzrfwIEDefrppylTpkwyJda1a1cAFi9eTPPmzfGFcffo0YN58+YBJBvv2rUrv/32W4byh5UVK6BjR/B1nly82J42HbmHceOgZk17Cg2EmBiYOhXWrYOLLgqtbH44JZKCMFWCP+UTSYl/OXVV5fXXXz/V68PHjBkzgiZHUlISCxYs4Kyzzsr0uTVq1GDFihUkJSWRJ08eHn/8cR5//HEKFy4MwIQJE9i5cydLliwhf/78VKpUiSNHjlCtWjWWLl3KjBkzeOKJJ2jVqhVPPvnkafOPGDGCG2+88bTxqCs5P3ky9O5t0TgzZ0LbtjB9ulMiuYnffoMFC2DEiMBXFf4lULJRibj1cQTRunVr3nrrLY57mam//fYbBw8epGnTpnz88cecPHmSbdu28d133512buPGjZk3b96par8+Z3eRIkVOVewFiImJ4fXXXz/13qfYAinZXrVqVRo0aMATTzxxysl95MiRU/6TvXv3UrZsWfLnz893333HH3/8AcCff/7J2Wefza233srAgQNZunRplv4+DRs2ZO7cuezatYuTJ08yceJEmjVrRqNGjZg7dy6JiYkcP378VGn9HMfJk/D441bqu04dSEiANm3giitMiThyDx9+aObL7t0DP6dKFahcOdv9Im4lEkH07duXjRs3Uq9ePVSVMmXKMGXKFDp16sScOXOoUaMGF1xwAVdcccVp55YpU4Z33nmHzp07k5SURNmyZZk9ezbt2rXjxhtvZOrUqbz++uu89tpr3HvvvdSuXZsTJ07QtGlTRo0aFXDJ9vfee4+BAwdStWpVSpUqRaFChXjxxRcBMy+1a9eOWrVq0aBBAy6++GIAVq1axcCBA8mT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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"np.sqrt(mean_squared_error(predicted_values, test_set))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "v4bP5gls07oY",
"outputId": "9aed470f-e4e1-482a-d29b-bda78314b5ed"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"3873.1714158644168"
]
},
"metadata": {},
"execution_count": 71
}
]
},
{
"cell_type": "markdown",
"source": [
"# LSTM with FRED-NROUST.csv"
],
"metadata": {
"id": "DzfPs7d602ea"
}
},
{
"cell_type": "code",
"source": [
"aus_path = '/content/drive/MyDrive/Datasets/FRED-NROUST.csv'\n",
"datasets_ts = pd.read_csv(aus_path)\n",
"datasets_ts.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "ECrhkMlfz71m",
"outputId": "05c8b303-2bc8-4ea7-f34f-fcfe83f8cf1b"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Date Value\n",
"0 01-01-1949 5.255053\n",
"1 01-04-1949 5.261516\n",
"2 01-07-1949 5.268013\n",
"3 01-10-1949 5.274564\n",
"4 01-01-1950 5.281182"
],
"text/html": [
"\n",
" \n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Date | \n",
" Value | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 01-01-1949 | \n",
" 5.255053 | \n",
"
\n",
" \n",
" 1 | \n",
" 01-04-1949 | \n",
" 5.261516 | \n",
"
\n",
" \n",
" 2 | \n",
" 01-07-1949 | \n",
" 5.268013 | \n",
"
\n",
" \n",
" 3 | \n",
" 01-10-1949 | \n",
" 5.274564 | \n",
"
\n",
" \n",
" 4 | \n",
" 01-01-1950 | \n",
" 5.281182 | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"\n",
" \n",
"
\n",
"
\n",
" "
]
},
"metadata": {},
"execution_count": 95
}
]
},
{
"cell_type": "code",
"source": [
"datasets_ts.info()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "E8gP3sVH4R5K",
"outputId": "3f7c7394-861f-4d39-e250-006a57074688"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"RangeIndex: 296 entries, 0 to 295\n",
"Data columns (total 2 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Date 296 non-null object \n",
" 1 Value 296 non-null float64\n",
"dtypes: float64(1), object(1)\n",
"memory usage: 4.8+ KB\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"### PREPROCESSING\n",
"datasets_ts.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "CQF8m-fB1P-k",
"outputId": "abbc7d9e-8e99-45dd-c772-25469d6d0030"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(296, 2)"
]
},
"metadata": {},
"execution_count": 96
}
]
},
{
"cell_type": "code",
"source": [
"dataset_train = datasets_ts.iloc[:288, :]\n",
"dataset_train.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "855c72e0-99f7-4ac0-8cfe-92e275a903f2",
"id": "nHlaCXwd1g16"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(288, 2)"
]
},
"metadata": {},
"execution_count": 97
}
]
},
{
"cell_type": "code",
"source": [
"#converting pandas type data to numpy type as numpy type required for tensorflow\n",
"training_set = dataset_train.iloc[:,1].values\n",
"training_set[:5]"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "f93a95b0-8bb7-454a-c440-99fa9d3c4e31",
"id": "A9pgAnDQ1g17"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([5.25505257, 5.26151562, 5.268013 , 5.274564 , 5.281182 ])"
]
},
"metadata": {},
"execution_count": 98
}
]
},
{
"cell_type": "code",
"source": [
"training_set.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "496e3605-4bce-4674-efe1-fa27ffc04e93",
"id": "1WESepdA1g17"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(288,)"
]
},
"metadata": {},
"execution_count": 99
}
]
},
{
"cell_type": "code",
"source": [
"training_set[-1]"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "a76f292c-4796-4729-c42b-203ebe596459",
"id": "CB-gokgJ1g18"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"4.480756"
]
},
"metadata": {},
"execution_count": 100
}
]
},
{
"cell_type": "code",
"source": [
"training_set = training_set.reshape(-1,1)\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"mm = MinMaxScaler()\n",
"trn_set_scl = mm.fit_transform(training_set)\n",
"print(trn_set_scl[:5])\n",
"print(type(trn_set_scl))\n",
"print(trn_set_scl.ndim)\n",
"print(trn_set_scl.shape)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "6cd77a3f-cfc2-4863-8a7e-e1ae0d090ca3",
"id": "k-y9K2pF1g18"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[[0.44014855]\n",
" [0.44382247]\n",
" [0.4475159 ]\n",
" [0.45123982]\n",
" [0.45500182]]\n",
"\n",
"2\n",
"(288, 1)\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"X_train = []\n",
"y_train = []\n",
"timesteps = 5\n",
"trn_size = dataset_train.shape[0]\n",
"for i in range(timesteps, trn_size):\n",
" X_train.append(trn_set_scl[i-timesteps:i, 0])\n",
" y_train.append(trn_set_scl[i,0])\n",
"X_train, y_train = np.array(X_train), np.array(y_train)"
],
"metadata": {
"id": "_isUMoW11g19"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))\n",
"X_train.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "8dccd2a1-3f0b-46b3-9864-21a85355aea5",
"id": "HxWXK43o1g19"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(283, 5, 1)"
]
},
"metadata": {},
"execution_count": 103
}
]
},
{
"cell_type": "code",
"source": [
"import tensorflow as tf\n",
"from tensorflow import keras"
],
"metadata": {
"id": "MFPujQxV3sO1"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"### INITIALIZE RNN\n",
"tf.random.set_seed(seed = 2022)\n",
"model = keras.Sequential([\n",
" keras.layers.LSTM(units = 100, return_sequences=True, \n",
" input_shape=(X_train.shape[1], X_train.shape[2])),\n",
" keras.layers.LSTM(units = 70, return_sequences=True),\n",
" keras.layers.LSTM(units = 50), \n",
" keras.layers.Dense(1) \n",
"])\n",
"model.compile(optimizer= 'adam', loss = 'mean_squared_error')"
],
"metadata": {
"id": "mZW9INDA3sO1"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"model.fit(X_train, y_train, epochs = 50, batch_size= 25)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "4ce90893-ae3a-4cab-8708-bccec71407bf",
"id": "7haIg-dP3sO1"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch 1/50\n",
"12/12 [==============================] - 6s 14ms/step - loss: 0.2336\n",
"Epoch 2/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0328\n",
"Epoch 3/50\n",
"12/12 [==============================] - 0s 15ms/step - loss: 0.0233\n",
"Epoch 4/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0128\n",
"Epoch 5/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0089\n",
"Epoch 6/50\n",
"12/12 [==============================] - 0s 15ms/step - loss: 0.0057\n",
"Epoch 7/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0042\n",
"Epoch 8/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0036\n",
"Epoch 9/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0039\n",
"Epoch 10/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0036\n",
"Epoch 11/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0035\n",
"Epoch 12/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0035\n",
"Epoch 13/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0035\n",
"Epoch 14/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0034\n",
"Epoch 15/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0034\n",
"Epoch 16/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0034\n",
"Epoch 17/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0034\n",
"Epoch 18/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0034\n",
"Epoch 19/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0033\n",
"Epoch 20/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0034\n",
"Epoch 21/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0034\n",
"Epoch 22/50\n",
"12/12 [==============================] - 0s 15ms/step - loss: 0.0034\n",
"Epoch 23/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0033\n",
"Epoch 24/50\n",
"12/12 [==============================] - 0s 15ms/step - loss: 0.0033\n",
"Epoch 25/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0035\n",
"Epoch 26/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0034\n",
"Epoch 27/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0034\n",
"Epoch 28/50\n",
"12/12 [==============================] - 0s 16ms/step - loss: 0.0035\n",
"Epoch 29/50\n",
"12/12 [==============================] - 0s 15ms/step - loss: 0.0032\n",
"Epoch 30/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0033\n",
"Epoch 31/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0034\n",
"Epoch 32/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0035\n",
"Epoch 33/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0032\n",
"Epoch 34/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0032\n",
"Epoch 35/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0032\n",
"Epoch 36/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0031\n",
"Epoch 37/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0032\n",
"Epoch 38/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0035\n",
"Epoch 39/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0032\n",
"Epoch 40/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0032\n",
"Epoch 41/50\n",
"12/12 [==============================] - 0s 14ms/step - loss: 0.0032\n",
"Epoch 42/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0031\n",
"Epoch 43/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0034\n",
"Epoch 44/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0031\n",
"Epoch 45/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0032\n",
"Epoch 46/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0031\n",
"Epoch 47/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0031\n",
"Epoch 48/50\n",
"12/12 [==============================] - 0s 15ms/step - loss: 0.0030\n",
"Epoch 49/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0031\n",
"Epoch 50/50\n",
"12/12 [==============================] - 0s 13ms/step - loss: 0.0030\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
""
]
},
"metadata": {},
"execution_count": 106
}
]
},
{
"cell_type": "code",
"source": [
"dataset_test = datasets_ts.iloc[288:,:]\n",
"dataset_test.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "f7e28cce-cc1f-4349-f27c-a6c1bd2ab973",
"id": "E5WhUc1D4LZy"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(8, 2)"
]
},
"metadata": {},
"execution_count": 107
}
]
},
{
"cell_type": "code",
"source": [
"test_set = dataset_test.iloc[:, 1].values\n",
"test_set.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "ead0f322-085d-4c3e-f944-44e764d9c571",
"id": "i1W4JCXh4LZy"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(8,)"
]
},
"metadata": {},
"execution_count": 120
}
]
},
{
"cell_type": "code",
"source": [
"dataset_total = pd.concat((dataset_train['Value'], dataset_test['Value']), axis = 0)\n",
"dataset_total"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "42144104-8f55-4e68-fc1c-c3891b24aaa2",
"id": "S27Rx8nr4LZz"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 5.255053\n",
"1 5.261516\n",
"2 5.268013\n",
"3 5.274564\n",
"4 5.281182\n",
" ... \n",
"291 4.450651\n",
"292 4.445137\n",
"293 4.440214\n",
"294 4.435784\n",
"295 4.431760\n",
"Name: Value, Length: 296, dtype: float64"
]
},
"metadata": {},
"execution_count": 110
}
]
},
{
"cell_type": "code",
"source": [
"dataset_total.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "1c1d1a3f-7cbd-4c98-8ed1-21d0c4e78406",
"id": "uc1FWAms4LZz"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(296,)"
]
},
"metadata": {},
"execution_count": 111
}
]
},
{
"cell_type": "code",
"source": [
"# we take 10 extra from train set to get them as part of test set\n",
"inputs = dataset_total[len(dataset_total) - len(dataset_test) - timesteps:].values\n",
"inputs = inputs.reshape(-1, 1)\n",
"len(inputs)\n",
"print(inputs.shape)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2c7d30f3-e4c3-410a-b614-a3b271aa49e4",
"id": "4k83Pb8q4LZz"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"(13, 1)\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"inputs_scl = mm.transform(inputs)\n",
"X_test = []\n",
"for i in range(timesteps, len(inputs_scl)):\n",
" X_test.append(inputs_scl[i-timesteps:i,0])\n",
"X_test = np.array(X_test)\n",
"X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1],1))\n",
"X_test.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "6bcb247e-6dab-4ce3-9b68-3a929bf25725",
"id": "Vx6oJL-H4LZz"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(8, 5, 1)"
]
},
"metadata": {},
"execution_count": 113
}
]
},
{
"cell_type": "code",
"source": [
"len(X_test)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "7c70d5f1-a2be-4da8-b2f3-134b20271bae",
"id": "gifsaNah4LZ0"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"8"
]
},
"metadata": {},
"execution_count": 114
}
]
},
{
"cell_type": "code",
"source": [
"predicted_values = model.predict(X_test)\n",
"predicted_values"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "8b2ede2e-14a0-441a-f092-da8b4209fba5",
"id": "HMBr08LY4LZ0"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"1/1 [==============================] - 1s 1s/step\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[ 0.00885722],\n",
" [ 0.00287885],\n",
" [-0.00272651],\n",
" [-0.00786749],\n",
" [-0.01250179],\n",
" [-0.01663146],\n",
" [-0.02029072],\n",
" [-0.0235314 ]], dtype=float32)"
]
},
"metadata": {},
"execution_count": 115
}
]
},
{
"cell_type": "code",
"source": [
"predicted_values.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "e99bc688-3f2c-48b1-b841-88f1e9b3f79e",
"id": "L5nKBaE84LZ0"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(8, 1)"
]
},
"metadata": {},
"execution_count": 116
}
]
},
{
"cell_type": "code",
"source": [
"predicted_values = mm.inverse_transform( predicted_values)\n",
"predicted_values"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "lAuRq1W-4LZ0",
"outputId": "36c783ec-9a40-42df-89f3-e9c32f4413c0"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[12.390582],\n",
" [12.372082],\n",
" [12.354734],\n",
" [12.338824],\n",
" [12.324484],\n",
" [12.311703],\n",
" [12.300379],\n",
" [12.29035 ]], dtype=float32)"
]
},
"metadata": {},
"execution_count": 121
}
]
},
{
"cell_type": "code",
"source": [
"plt.plot(test_set, color = 'red', label = 'Real Value')\n",
"plt.plot(predicted_values, color = 'blue', label = 'Predicted Value')\n",
"plt.title('FRED')\n",
"plt.xlabel('Time')\n",
"plt.ylabel('Value')\n",
"plt.legend()\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
},
"outputId": "8d7deb11-5c34-4131-c713-d60f4550c247",
"id": "4q9aeYLL4LZ1"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"