{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n",
      "/Users/jpolikov/anaconda2/lib/python2.7/site-packages/sklearn/utils/validation.py:475: DataConversionWarning: Data with input dtype int64 was converted to float64 by MinMaxScaler.\n",
      "  warnings.warn(msg, DataConversionWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "t+1 RMSE: 3674.515538\n",
      "t+2 RMSE: 5978.034445\n",
      "t+3 RMSE: 6779.316759\n",
      "t+4 RMSE: 7299.182726\n",
      "t+5 RMSE: 7125.772147\n",
      "t+6 RMSE: 5522.152390\n",
      "t+7 RMSE: 3206.071172\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nW1lF3cLtAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a254de590>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from pandas import DataFrame\n",
    "from pandas import Series\n",
    "from pandas import concat\n",
    "from pandas import read_csv\n",
    "from pandas import datetime\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dense\n",
    "from keras.layers import LSTM\n",
    "from math import sqrt\n",
    "from matplotlib import pyplot\n",
    "from numpy import array\n",
    " \n",
    "# date-time parsing function for loading the dataset\n",
    "# def parser(x):\n",
    "# \treturn datetime.strptime('190'+x, '%Y-%m')\n",
    " \n",
    "# convert time series into supervised learning problem\n",
    "def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):\n",
    "\tn_vars = 1 if type(data) is list else data.shape[1]\n",
    "\tdf = DataFrame(data)\n",
    "\tcols, names = list(), list()\n",
    "\t# input sequence (t-n, ... t-1)\n",
    "\tfor i in range(n_in, 0, -1):\n",
    "\t\tcols.append(df.shift(i))\n",
    "\t\tnames += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]\n",
    "\t# forecast sequence (t, t+1, ... t+n)\n",
    "\tfor i in range(0, n_out):\n",
    "\t\tcols.append(df.shift(-i))\n",
    "\t\tif i == 0:\n",
    "\t\t\tnames += [('var%d(t)' % (j+1)) for j in range(n_vars)]\n",
    "\t\telse:\n",
    "\t\t\tnames += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]\n",
    "\t# put it all together\n",
    "\tagg = concat(cols, axis=1)\n",
    "\tagg.columns = names\n",
    "\t# drop rows with NaN values\n",
    "\tif dropnan:\n",
    "\t\tagg.dropna(inplace=True)\n",
    "\treturn agg\n",
    " \n",
    "# create a differenced series\n",
    "def difference(dataset, interval=1):\n",
    "\tdiff = list()\n",
    "\tfor i in range(interval, len(dataset)):\n",
    "\t\tvalue = dataset[i] - dataset[i - interval]\n",
    "\t\tdiff.append(value)\n",
    "\treturn Series(diff)\n",
    " \n",
    "# transform series into train and test sets for supervised learning\n",
    "def prepare_data(series, n_test, n_lag, n_seq):\n",
    "\t# extract raw values\n",
    "\traw_values = series.values\n",
    "\t# transform data to be stationary\n",
    "\tdiff_series = difference(raw_values, 1)\n",
    "\tdiff_values = diff_series.values\n",
    "\tdiff_values = diff_values.reshape(len(diff_values), 1)\n",
    "\t# rescale values to -1, 1\n",
    "\tscaler = MinMaxScaler(feature_range=(-1, 1))\n",
    "\tscaled_values = scaler.fit_transform(diff_values)\n",
    "\tscaled_values = scaled_values.reshape(len(scaled_values), 1)\n",
    "\t# transform into supervised learning problem X, y\n",
    "\tsupervised = series_to_supervised(scaled_values, n_lag, n_seq)\n",
    "\tsupervised_values = supervised.values\n",
    "\t# split into train and test sets\n",
    "\ttrain, test = supervised_values[0:-n_test], supervised_values[-n_test:]\n",
    "\treturn scaler, train, test\n",
    " \n",
    "# fit an LSTM network to training data\n",
    "def fit_lstm(train, n_lag, n_seq, n_batch, nb_epoch, n_neurons):\n",
    "\t# reshape training into [samples, timesteps, features]\n",
    "\tX, y = train[:, 0:n_lag], train[:, n_lag:]\n",
    "\tX = X.reshape(X.shape[0], 1, X.shape[1])\n",
    "\t# design network\n",
    "\tmodel = Sequential()\n",
    "\tmodel.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True))\n",
    "\tmodel.add(Dense(y.shape[1]))\n",
    "\t\n",
    "\tmodel.compile(loss='mean_squared_error', optimizer='adam')\n",
    "\t\t#model.compile(loss='mean_absolute_error', optimizer='adam')\n",
    "\t\t#model.compile(loss='logcosh', optimizer='adam')\n",
    "\t\t#model.compile(loss='cosine_proximity', optimizer='adam')\n",
    "\n",
    "\n",
    "\t\n",
    "\t# fit network\n",
    "\tfor i in range(nb_epoch):\n",
    "\t\tmodel.fit(X, y, epochs=1, batch_size=n_batch, verbose=0, shuffle=False)\n",
    "\t\tmodel.reset_states()\n",
    "\treturn model\n",
    " \n",
    "# make one forecast with an LSTM,\n",
    "def forecast_lstm(model, X, n_batch):\n",
    "\t# reshape input pattern to [samples, timesteps, features]\n",
    "\tX = X.reshape(1, 1, len(X))\n",
    "\t# make forecast\n",
    "\tforecast = model.predict(X, batch_size=n_batch)\n",
    "\t# convert to array\n",
    "\treturn [x for x in forecast[0, :]]\n",
    " \n",
    "# evaluate the persistence model\n",
    "def make_forecasts(model, n_batch, train, test, n_lag, n_seq):\n",
    "\tforecasts = list()\n",
    "\tfor i in range(len(test)):\n",
    "\t\tX, y = test[i, 0:n_lag], test[i, n_lag:]\n",
    "\t\t# make forecast\n",
    "\t\tforecast = forecast_lstm(model, X, n_batch)\n",
    "\t\t# store the forecast\n",
    "\t\tforecasts.append(forecast)\n",
    "\treturn forecasts\n",
    " \n",
    "# invert differenced forecast\n",
    "def inverse_difference(last_ob, forecast):\n",
    "\t# invert first forecast\n",
    "\tinverted = list()\n",
    "\tinverted.append(forecast[0] + last_ob)\n",
    "\t# propagate difference forecast using inverted first value\n",
    "\tfor i in range(1, len(forecast)):\n",
    "\t\tinverted.append(forecast[i] + inverted[i-1])\n",
    "\treturn inverted\n",
    " \n",
    "# inverse data transform on forecasts\n",
    "def inverse_transform(series, forecasts, scaler, n_test):\n",
    "\tinverted = list()\n",
    "\tfor i in range(len(forecasts)):\n",
    "\t\t# create array from forecast\n",
    "\t\tforecast = array(forecasts[i])\n",
    "\t\tforecast = forecast.reshape(1, len(forecast))\n",
    "\t\t# invert scaling\n",
    "\t\tinv_scale = scaler.inverse_transform(forecast)\n",
    "\t\tinv_scale = inv_scale[0, :]\n",
    "\t\t# invert differencing\n",
    "\t\tindex = len(series) - n_test + i - 1\n",
    "\t\tlast_ob = series.values[index]\n",
    "\t\tinv_diff = inverse_difference(last_ob, inv_scale)\n",
    "\t\t# store\n",
    "\t\tinverted.append(inv_diff)\n",
    "\treturn inverted\n",
    " \n",
    "# evaluate the RMSE for each forecast time step\n",
    "def evaluate_forecasts(test, forecasts, n_lag, n_seq):\n",
    "\tfor i in range(n_seq):\n",
    "\t\tactual = [row[i] for row in test]\n",
    "\t\tpredicted = [forecast[i] for forecast in forecasts]\n",
    "\t\trmse = sqrt(mean_squared_error(actual, predicted))\n",
    "\t\tprint('t+%d RMSE: %f' % ((i+1), rmse))\n",
    " \n",
    "# plot the forecasts in the context of the original dataset\n",
    "def plot_forecasts(series, forecasts, n_test):\n",
    "\t# plot the entire dataset in blue\n",
    "\tpyplot.plot(series.values)\n",
    "\t# plot the forecasts in red\n",
    "\tfor i in range(len(forecasts)):\n",
    "\t\toff_s = len(series) - n_test + i - 1\n",
    "\t\toff_e = off_s + len(forecasts[i]) + 1\n",
    "\t\txaxis = [x for x in range(off_s, off_e)]\n",
    "\t\tyaxis = [series.values[off_s]] + forecasts[i]\n",
    "\t\tpyplot.plot(xaxis, yaxis, color='red')\n",
    "\t# show the plot\n",
    "\tpyplot.show()\n",
    " \n",
    "# load dataset\n",
    "series = read_csv('snap_yo_fingers_lstm.csv', header=0, parse_dates=[0], index_col=0, squeeze=True)\n",
    "# configure\n",
    "n_lag = 30\n",
    "n_seq = 7\n",
    "n_test = 100\n",
    "n_epochs = 30\n",
    "n_batch = 1\n",
    "n_neurons = 3\n",
    "# prepare data\n",
    "scaler, train, test = prepare_data(series, n_test, n_lag, n_seq)\n",
    "# fit model\n",
    "model = fit_lstm(train, n_lag, n_seq, n_batch, n_epochs, n_neurons)\n",
    "# make forecasts\n",
    "forecasts = make_forecasts(model, n_batch, train, test, n_lag, n_seq)\n",
    "# inverse transform forecasts and test\n",
    "forecasts = inverse_transform(series, forecasts, scaler, n_test+2)\n",
    "actual = [row[n_lag:] for row in test]\n",
    "actual = inverse_transform(series, actual, scaler, n_test+2)\n",
    "# evaluate forecasts\n",
    "evaluate_forecasts(actual, forecasts, n_lag, n_seq)\n",
    "# plot forecasts\n",
    "plot_forecasts(series, forecasts, n_test+2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
