{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport random\nfrom datetime import datetime, timedelta\nfrom tqdm import tqdm\nfrom sklearn.preprocessing import MinMaxScaler\n\nimport os\nimport tensorflow as tf\n\ndata_di = {}\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        path = os.path.join(dirname, filename)\n        print(path)\n        name = path.split('/')[-1].split('.')[0]\n        try:\n            data_di[name] = pd.read_csv(path, parse_dates=['date'])\n        except:\n            data_di[name] = pd.read_csv(path)\n        \n        # Rename columns to prophet standards\n        if 'sales' in data_di[name].columns:\n            data_di[name] = data_di[name].rename(columns={'sales': 'y'})\n        if 'date' in data_di[name].columns:\n            data_di[name] = data_di[name].rename(columns={'date': 'ds'})\n            \n            \ndef rmsle(y_hat, y):\n    \"\"\"Compute Root Mean Squared Logarithmic Error\"\"\"\n    metric = np.sqrt(sum((np.array(list(map(lambda x : np.log(x + 1), y_hat)))\n                         - np.array(list(map(lambda x : np.log(x + 1), y))))**2)/len(y))\n                \n    return round(metric, 4)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:29:12.061356Z","iopub.execute_input":"2022-07-31T06:29:12.061735Z","iopub.status.idle":"2022-07-31T06:29:14.645371Z","shell.execute_reply.started":"2022-07-31T06:29:12.061706Z","shell.execute_reply":"2022-07-31T06:29:14.644152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class WindowGenerator():\n    def __init__(self, input_width, label_width, shift, train_df, val_df, test_df, label_columns=None):\n        self.train_df = train_df\n        self.val_df = val_df\n        self.test_df = test_df\n\n        self.label_columns = label_columns\n        if label_columns is not None:\n            self.label_columns_indices = {name: i for i, name in enumerate(label_columns)}\n        self.column_indices = {name: i for i, name in enumerate(train_df.columns)}\n\n        self.input_width = input_width\n        self.label_width = label_width\n        self.shift = shift\n\n        self.total_window_size = input_width + shift\n\n        self.input_slice = slice(0, input_width)\n        self.input_indices = np.arange(self.total_window_size)[self.input_slice]\n\n        self.label_start = self.total_window_size - self.label_width\n        self.labels_slice = slice(self.label_start, None)\n        self.label_indices = np.arange(self.total_window_size)[self.labels_slice]\n\n    def __repr__(self):\n        return '\\n'.join([\n            f'Total window size: {self.total_window_size}',\n            f'Input indices: {self.input_indices}',\n            f'Label indices: {self.label_indices}',\n            f'Label column name(s): {self.label_columns}'])\n    \ndef split_window(self, features):\n    inputs = features[:, self.input_slice, :]\n    labels = features[:, self.labels_slice, :]\n    if self.label_columns is not None:\n        labels = tf.stack(\n            [labels[:, :, self.column_indices[name]] for name in self.label_columns], axis=-1)\n \n    inputs.set_shape([None, self.input_width, None])\n    labels.set_shape([None, self.label_width, None])\n\n    return inputs, labels\n\n\ndef plot(self, model=None, plot_col='T (degC)', max_subplots=3):\n    inputs, labels = self.example\n    \n    \n    \n    plt.figure(figsize=(12, 8))\n    plot_col_index = self.column_indices[plot_col]\n          \n    max_n = min(max_subplots, len(inputs))\n    for n in range(max_n):\n        plt.subplot(max_n, 1, n+1)\n        plt.ylabel(f'{plot_col} [normed]')\n        plt.plot(self.input_indices, inputs[n, :, plot_col_index],\n                 label='Inputs', marker='.', zorder=-10)\n\n        if self.label_columns:\n            label_col_index = self.label_columns_indices.get(plot_col, None)\n        else:\n            label_col_index = plot_col_index\n\n        if label_col_index is None:\n            continue\n\n        plt.scatter(self.label_indices, labels[n, :, label_col_index], edgecolors='k', label='Labels', c='#2ca02c', s=64)\n        if model is not None:\n            predictions = model(inputs)\n            plt.scatter(self.label_indices, predictions[n, :, label_col_index],\n                      marker='X', edgecolors='k', label='Predictions',\n                      c='#ff7f0e', s=64)\n\n        if n == 0:\n            plt.legend()\n\n    plt.xlabel('Days')\n\n    \ndef make_dataset(self, data):\n    data = np.array(data, dtype=np.float32)\n    ds = tf.keras.utils.timeseries_dataset_from_array(data=data, targets=None, sequence_length=self.total_window_size,\n                                                      sequence_stride=1, shuffle=True, batch_size=32,)\n\n    ds = ds.map(self.split_window)\n\n    return ds\n\n@property\ndef train(self):\n    return self.make_dataset(self.train_df)\n\n@property\ndef val(self):\n    return self.make_dataset(self.val_df)\n\n@property\ndef test(self):\n    return self.make_dataset(self.test_df)\n\n@property\ndef example(self):\n    result = getattr(self, '_example', None)\n    if result is None:\n        result = next(iter(self.train))\n        self._example = result\n    return result\n\n\ndef compile_and_fit(model, window, MAX_EPOCHS=20, learning_rate=0.2, patience=10):\n    early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=patience, mode='min')\n\n    model.compile(loss=tf.losses.MeanSquaredError(),\n                optimizer=tf.optimizers.Adam(learning_rate=learning_rate),\n                metrics=[tf.metrics.MeanAbsoluteError()])\n\n    history = model.fit(window.train, epochs=MAX_EPOCHS,\n                      validation_data=window.val,\n                      callbacks=[early_stopping])\n\n    return history","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:29:14.647750Z","iopub.execute_input":"2022-07-31T06:29:14.648125Z","iopub.status.idle":"2022-07-31T06:29:14.676751Z","shell.execute_reply.started":"2022-07-31T06:29:14.648095Z","shell.execute_reply":"2022-07-31T06:29:14.675344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nimport os\ndata_di = {}\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        path = os.path.join(dirname, filename)\n        print(path)\n        name = path.split('/')[-1].split('.')[0]\n        try:\n            data_di[name] = pd.read_csv(path, parse_dates=['date'])\n        except:\n            data_di[name] = pd.read_csv(path)\n        \n        if 'sales' in data_di[name].columns:\n            data_di[name] = data_di[name].rename(columns={'sales': 'y'})\n        if 'date' in data_di[name].columns:\n            data_di[name] = data_di[name].rename(columns={'date': 'ds'})\ntrain_df, test_df = data_di['train'], data_di['test']\n\nval_df = train_df[(train_df.ds >= '2017-08-01') & (train_df.ds <= '2017-08-15')]\n ","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:29:14.678563Z","iopub.execute_input":"2022-07-31T06:29:14.679039Z","iopub.status.idle":"2022-07-31T06:29:17.280179Z","shell.execute_reply.started":"2022-07-31T06:29:14.678996Z","shell.execute_reply":"2022-07-31T06:29:17.278989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Parameters\nstart_training_ds = '2017-01-01'\ninput_width = 16\nlabel_width = 16\n\nMAX_EPOCHS = 50\nlearning_rate = 0.001\nscaling = ['standardization', 'normalization'][1]\n\n# Reshape the dataframe\ndf = data_di['train'][data_di['train'].ds >= start_training_ds].assign(key=data_di['train']['store_nbr'].astype('str') + '~' + data_di['train']['family'])\ndf = pd.pivot_table(df, values = 'y', index=['ds'], columns='key').reset_index()\ndate_time = df.ds\ndf = df.drop('ds', axis=1)\ndf = df.iloc[:, :df.shape[1]]\ncolumn_indices = {name: i for i, name in enumerate(df.columns)}\n\n# Split into train, val and test set\nn = len(df)\ntest_df = df[-label_width:]\nval_df = df[-(input_width + 2*label_width):-label_width]\ntrain_df = df[:-(input_width + label_width)]\n\nprint(\"Train set size: (%s, %s)\" %(train_df.shape[0], train_df.shape[1]))\nprint(\"Validation set size: (%s, %s)\"  %(test_df.shape[0], test_df.shape[1]))\nprint(\"Test set size: (%s, %s) \\n\"  %(val_df.shape[0], val_df.shape[1]))\n\nnum_features = df.shape[1]\ntrain_mean = train_df.mean()\ntrain_std = train_df.std()\n\nscaler = MinMaxScaler(feature_range=(0,1))\ntrain_df = pd.DataFrame(scaler.fit_transform(train_df), columns=train_df.columns)\nval_df = pd.DataFrame(scaler.transform(val_df), columns=val_df.columns)\ntest_df = pd.DataFrame(scaler.transform(test_df), columns=test_df.columns)\n\nWindowGenerator.train = train\nWindowGenerator.val = val\nWindowGenerator.test = test\nWindowGenerator.example = example\nWindowGenerator.make_dataset = make_dataset\nWindowGenerator.split_window = split_window\nWindowGenerator.plot = plot","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:29:17.305759Z","iopub.execute_input":"2022-07-31T06:29:17.307003Z","iopub.status.idle":"2022-07-31T06:29:21.661713Z","shell.execute_reply.started":"2022-07-31T06:29:17.306951Z","shell.execute_reply":"2022-07-31T06:29:21.660466Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Linear Model","metadata":{}},{"cell_type":"code","source":"# Generate windows for training batches\nwindow = WindowGenerator(input_width=label_width, label_width=label_width, shift=label_width,train_df=train_df, val_df=val_df, test_df=test_df)\n\n\nlinear = tf.keras.Sequential([\n    tf.keras.layers.Dense(num_features, kernel_initializer=tf.initializers.zeros())\n])\n\nhistory = compile_and_fit(linear, window, 5, learning_rate)\npd.DataFrame(history.history).plot(figsize=(8,5))\nplt.show()\nwindow.plot(linear, plot_col=random.choice(train_df.columns))\n\n","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:29:21.708905Z","iopub.execute_input":"2022-07-31T06:29:21.709630Z","iopub.status.idle":"2022-07-31T06:29:25.901214Z","shell.execute_reply.started":"2022-07-31T06:29:21.709578Z","shell.execute_reply":"2022-07-31T06:29:25.899861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## DNN\n","metadata":{}},{"cell_type":"code","source":"dense = tf.keras.Sequential([\n    tf.keras.layers.Dense(units=num_features, activation='relu'),\n    tf.keras.layers.Dense(units=num_features, activation='relu'),\n    tf.keras.layers.Dense(units=num_features),\n])\n\nhistory = compile_and_fit(dense, window, MAX_EPOCHS, learning_rate)\npd.DataFrame(history.history).plot(figsize=(8, 5))\nplt.show()\nwindow.plot(dense, plot_col=random.choice(train_df.columns))","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:29:25.903064Z","iopub.execute_input":"2022-07-31T06:29:25.903399Z","iopub.status.idle":"2022-07-31T06:30:17.414229Z","shell.execute_reply.started":"2022-07-31T06:29:25.903370Z","shell.execute_reply":"2022-07-31T06:30:17.412894Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## LSTM","metadata":{}},{"cell_type":"code","source":"# Generate windows for training batches\nwindow = WindowGenerator(input_width=label_width, label_width=label_width, shift=label_width,\n                         train_df=train_df, val_df=val_df, test_df=test_df)\n\n\nlstm = tf.keras.Sequential([\n    # Shape [batch, time, features] => [batch, lstm_units].\n    tf.keras.layers.LSTM(128, return_sequences=False),\n    tf.keras.layers.Dense(label_width*num_features,\n                          kernel_initializer=tf.initializers.zeros()),\n    tf.keras.layers.Reshape([label_width, num_features])\n])\n\nhistory = compile_and_fit(lstm, window, 10, learning_rate)\npd.DataFrame(history.history).plot(figsize=(8,5))\nplt.title('Train and Val loss')\nplt.show()\nwindow.plot(lstm, plot_col=random.choice(train_df.columns))\n","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:30:17.416116Z","iopub.execute_input":"2022-07-31T06:30:17.417093Z","iopub.status.idle":"2022-07-31T06:30:26.975655Z","shell.execute_reply.started":"2022-07-31T06:30:17.417054Z","shell.execute_reply":"2022-07-31T06:30:26.974434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## GRU","metadata":{}},{"cell_type":"code","source":"window = WindowGenerator(input_width=label_width, label_width=label_width, shift=label_width,\n                         train_df=train_df, val_df=val_df, test_df=test_df)\n\ngru = tf.keras.Sequential([\n        tf.keras.layers.GRU(20, return_sequences=True),\n        tf.keras.layers.GRU(20, return_sequences=True),\n        tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(num_features))]\n)\n\nhistory = compile_and_fit(gru, window, 10, learning_rate)\npd.DataFrame(history.history).plot(figsize=(8,5))\nplt.title('Train and Val loss')\nwindow.plot(gru, plot_col=random.choice(train_df.columns))","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:30:26.979099Z","iopub.execute_input":"2022-07-31T06:30:26.979592Z","iopub.status.idle":"2022-07-31T06:30:37.047908Z","shell.execute_reply.started":"2022-07-31T06:30:26.979555Z","shell.execute_reply":"2022-07-31T06:30:37.046015Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"window.plot(gru, plot_col=random.choice(train_df.columns))","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:30:37.049244Z","iopub.execute_input":"2022-07-31T06:30:37.049542Z","iopub.status.idle":"2022-07-31T06:30:37.632428Z","shell.execute_reply.started":"2022-07-31T06:30:37.049515Z","shell.execute_reply":"2022-07-31T06:30:37.631235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate predictions for the tesddt period taking the last values of the validation period\ny_hat = dense.predict(val_df.values[-label_width:, :].reshape(1, input_width, num_features))\npredict_df = (pd.DataFrame(y_hat.reshape(label_width, num_features), columns=df.columns)*train_std + train_mean).assign(ds=date_time[-label_width:].values)\ncolumns_to_keep = [e for e in predict_df.columns if '~' in e or e == 'ds'] \npredict_df = predict_df[columns_to_keep]\npredict_df = predict_df.melt(id_vars =['ds'], value_vars =[c for c in predict_df.columns if c != 'ds'])\npredict_df[['store_nbr', 'family']] = predict_df.key.str.split('~', expand=True)\npredict_df = predict_df.rename(columns={'value': 'y_hat'})\npredict_df['store_nbr'] = predict_df.store_nbr.astype('int')\npredict_df.drop('key', axis=1, inplace=True)\n\npredict_df = pd.merge(data_di['train'].drop('id', axis=1), predict_df, on=['ds', 'store_nbr', 'family'], how='left')\npredict_df['y_hat'] = np.clip(predict_df.y_hat, 0, np.inf)\n\npredict_df.tail()\nplot_ds_range = ['2017-07-01', predict_df.ds.iloc[-1]]\nfig, axes = plt.subplots(nrows=10, ncols=1, figsize=(20, 50))\nunique_keys = set(zip(data_di['train'].store_nbr, data_di['train'].family))\nkey = random.choice(list(unique_keys))\nfamilies = list(predict_df.family.unique())[-10:]\npredict_df['error'] = (np.log(1 + predict_df[~predict_df.y_hat.isnull()].y) - np.log(1 + predict_df[~predict_df.y_hat.isnull()].y_hat))**2\nprint(\"RMSLE: %s\" %rmsle(predict_df[~predict_df.y_hat.isnull()].y, predict_df[~predict_df.y_hat.isnull()].y_hat))\n\nfor i, f in enumerate(families):\n    key = [7, f]\n\n    ts = predict_df[(predict_df.store_nbr == key[0]) & (predict_df.family == key[1])]\n    ts = ts[(ts.ds >= plot_ds_range[0]) & (ts.ds <= plot_ds_range[1])]\n \n    plt.legend()\n    if i == 0:\n        plt.title(\"Store: \" + str(key[0]) + \", Family: \" + key[1])\n    axes[i].plot(ts.ds, ts.y_hat,label='y_hat', linestyle='--')\n    axes[i].plot(ts.ds, ts.y, label='y')\n    axes[i].set_xticks(np.array(ts.ds)[::5])\n    axes[i].tick_params(axis='x')\n    axes[i].legend()\n    axes[i].axvline(x=datetime(2017, 7, 31), linestyle='--', color='r')\n    axes[i].text(x=datetime(2017, 7, 31), y=ts.y_hat.max(), s='Prediction Start')","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:30:37.634213Z","iopub.execute_input":"2022-07-31T06:30:37.634930Z","iopub.status.idle":"2022-07-31T06:30:47.900602Z","shell.execute_reply.started":"2022-07-31T06:30:37.634883Z","shell.execute_reply":"2022-07-31T06:30:47.899403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate predictions for the tesddt period taking the last values of the validation period\ny_hat = dense.predict(val_df.values[-label_width:, :].reshape(1, input_width, num_features))\npredict_df = (pd.DataFrame(y_hat.reshape(label_width, num_features), columns=df.columns)*train_std + train_mean).assign(ds=date_time[-label_width:].values)\ncolumns_to_keep = [e for e in predict_df.columns if '~' in e or e == 'ds'] \npredict_df = predict_df[columns_to_keep]\npredict_df = predict_df.melt(id_vars =['ds'], value_vars =[c for c in predict_df.columns if c != 'ds'])\npredict_df[['store_nbr', 'family']] = predict_df.key.str.split('~', expand=True)\npredict_df = predict_df.rename(columns={'value': 'y_hat'})\npredict_df['store_nbr'] = predict_df.store_nbr.astype('int')\npredict_df.drop('key', axis=1, inplace=True)\n\npredict_df = pd.merge(data_di['train'].drop('id', axis=1), predict_df, on=['ds', 'store_nbr', 'family'], how='left')\npredict_df['y_hat'] = np.clip(predict_df.y_hat, 0, np.inf)\n\npredict_df.tail()\nplot_ds_range = ['2017-07-01', predict_df.ds.iloc[-1]]\nfig, axes = plt.subplots(nrows=10, ncols=1, figsize=(20, 50))\nunique_keys = set(zip(data_di['train'].store_nbr, data_di['train'].family))\nkey = random.choice(list(unique_keys))\nfamilies = list(predict_df.family.unique())[-10:]\npredict_df['error'] = (np.log(1 + predict_df[~predict_df.y_hat.isnull()].y) - np.log(1 + predict_df[~predict_df.y_hat.isnull()].y_hat))**2\nprint(\"RMSLE: %s\" %rmsle(predict_df[~predict_df.y_hat.isnull()].y, predict_df[~predict_df.y_hat.isnull()].y_hat))\n\nfor i, f in enumerate(families):\n    key = [7, f]\n\n    ts = predict_df[(predict_df.store_nbr == key[0]) & (predict_df.family == key[1])]\n    ts = ts[(ts.ds >= plot_ds_range[0]) & (ts.ds <= plot_ds_range[1])]\n \n    plt.legend()\n    if i == 0:\n        plt.title(\"Store: \" + str(key[0]) + \", Family: \" + key[1])\n    axes[i].plot(ts.ds, ts.y_hat,label='y_hat', linestyle='--')\n    axes[i].plot(ts.ds, ts.y, label='y')\n    axes[i].set_xticks(np.array(ts.ds)[::5])\n    axes[i].tick_params(axis='x')\n    axes[i].legend()\n    axes[i].axvline(x=datetime(2017, 7, 31), linestyle='--', color='r')\n    axes[i].text(x=datetime(2017, 7, 31), y=ts.y_hat.max(), s='Prediction Start')","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:30:47.902538Z","iopub.execute_input":"2022-07-31T06:30:47.903751Z","iopub.status.idle":"2022-07-31T06:30:57.750925Z","shell.execute_reply.started":"2022-07-31T06:30:47.903704Z","shell.execute_reply":"2022-07-31T06:30:57.749328Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate predictions for the tesddt period taking the last values of the validation period\ny_hat = lstm.predict(val_df.values[-label_width:, :].reshape(1, input_width, num_features))\npredict_df = (pd.DataFrame(y_hat.reshape(label_width, num_features), columns=df.columns)*train_std + train_mean).assign(ds=date_time[-label_width:].values)\ncolumns_to_keep = [e for e in predict_df.columns if '~' in e or e == 'ds'] \npredict_df = predict_df[columns_to_keep]\npredict_df = predict_df.melt(id_vars =['ds'], value_vars =[c for c in predict_df.columns if c != 'ds'])\npredict_df[['store_nbr', 'family']] = predict_df.key.str.split('~', expand=True)\npredict_df = predict_df.rename(columns={'value': 'y_hat'})\npredict_df['store_nbr'] = predict_df.store_nbr.astype('int')\npredict_df.drop('key', axis=1, inplace=True)\n\npredict_df = pd.merge(data_di['train'].drop('id', axis=1), predict_df, on=['ds', 'store_nbr', 'family'], how='left')\npredict_df['y_hat'] = np.clip(predict_df.y_hat, 0, np.inf)\n\npredict_df.tail()\nplot_ds_range = ['2017-07-01', predict_df.ds.iloc[-1]]\nfig, axes = plt.subplots(nrows=10, ncols=1, figsize=(20, 50))\nunique_keys = set(zip(data_di['train'].store_nbr, data_di['train'].family))\nkey = random.choice(list(unique_keys))\nfamilies = list(predict_df.family.unique())[-10:]\npredict_df['error'] = (np.log(1 + predict_df[~predict_df.y_hat.isnull()].y) - np.log(1 + predict_df[~predict_df.y_hat.isnull()].y_hat))**2\nprint(\"RMSLE: %s\" %rmsle(predict_df[~predict_df.y_hat.isnull()].y, predict_df[~predict_df.y_hat.isnull()].y_hat))\n\nfor i, f in enumerate(families):\n    key = [7, f]\n\n    ts = predict_df[(predict_df.store_nbr == key[0]) & (predict_df.family == key[1])]\n    ts = ts[(ts.ds >= plot_ds_range[0]) & (ts.ds <= plot_ds_range[1])]\n \n    plt.legend()\n    if i == 0:\n        plt.title(\"Store: \" + str(key[0]) + \", Family: \" + key[1])\n    axes[i].plot(ts.ds, ts.y_hat,label='y_hat', linestyle='--')\n    axes[i].plot(ts.ds, ts.y, label='y')\n    axes[i].set_xticks(np.array(ts.ds)[::5])\n    axes[i].tick_params(axis='x')\n    axes[i].legend()\n    axes[i].axvline(x=datetime(2017, 7, 31), linestyle='--', color='r')\n    axes[i].text(x=datetime(2017, 7, 31), y=ts.y_hat.max(), s='Prediction Start')","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:30:58.309768Z","iopub.status.idle":"2022-07-31T06:30:58.310679Z","shell.execute_reply.started":"2022-07-31T06:30:58.310435Z","shell.execute_reply":"2022-07-31T06:30:58.310457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate predictions for the tesddt period taking the last values of the validation period\ny_hat = gru.predict(val_df.values[-label_width:, :].reshape(1, input_width, num_features))\npredict_df = (pd.DataFrame(y_hat.reshape(label_width, num_features), columns=df.columns)*train_std + train_mean).assign(ds=date_time[-label_width:].values)\ncolumns_to_keep = [e for e in predict_df.columns if '~' in e or e == 'ds'] \npredict_df = predict_df[columns_to_keep]\npredict_df = predict_df.melt(id_vars =['ds'], value_vars =[c for c in predict_df.columns if c != 'ds'])\npredict_df[['store_nbr', 'family']] = predict_df.key.str.split('~', expand=True)\npredict_df = predict_df.rename(columns={'value': 'y_hat'})\npredict_df['store_nbr'] = predict_df.store_nbr.astype('int')\npredict_df.drop('key', axis=1, inplace=True)\n\npredict_df = pd.merge(data_di['train'].drop('id', axis=1), predict_df, on=['ds', 'store_nbr', 'family'], how='left')\npredict_df['y_hat'] = np.clip(predict_df.y_hat, 0, np.inf)\n\npredict_df.tail()\nplot_ds_range = ['2017-07-01', predict_df.ds.iloc[-1]]\nfig, axes = plt.subplots(nrows=10, ncols=1, figsize=(20, 50))\nunique_keys = set(zip(data_di['train'].store_nbr, data_di['train'].family))\nkey = random.choice(list(unique_keys))\nfamilies = list(predict_df.family.unique())[-10:]\npredict_df['error'] = (np.log(1 + predict_df[~predict_df.y_hat.isnull()].y) - np.log(1 + predict_df[~predict_df.y_hat.isnull()].y_hat))**2\nprint(\"RMSLE: %s\" %rmsle(predict_df[~predict_df.y_hat.isnull()].y, predict_df[~predict_df.y_hat.isnull()].y_hat))\n\nfor i, f in enumerate(families):\n    key = [7, f]\n\n    ts = predict_df[(predict_df.store_nbr == key[0]) & (predict_df.family == key[1])]\n    ts = ts[(ts.ds >= plot_ds_range[0]) & (ts.ds <= plot_ds_range[1])]\n \n    plt.legend()\n    if i == 0:\n        plt.title(\"Store: \" + str(key[0]) + \", Family: \" + key[1])\n    axes[i].plot(ts.ds, ts.y_hat,label='y_hat', linestyle='--')\n    axes[i].plot(ts.ds, ts.y, label='y')\n    axes[i].set_xticks(np.array(ts.ds)[::5])\n    axes[i].tick_params(axis='x')\n    axes[i].legend()\n    axes[i].axvline(x=datetime(2017, 7, 31), linestyle='--', color='r')\n    axes[i].text(x=datetime(2017, 7, 31), y=ts.y_hat.max(), s='Prediction Start')","metadata":{"execution":{"iopub.status.busy":"2022-07-31T06:30:58.312052Z","iopub.status.idle":"2022-07-31T06:30:58.312821Z","shell.execute_reply.started":"2022-07-31T06:30:58.312594Z","shell.execute_reply":"2022-07-31T06:30:58.312622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"p = lstm.predict(test_df.values.reshape(1, input_width, num_features))\np_df = (pd.DataFrame(p.reshape(label_width, num_features), columns=df.columns) * train_std + train_mean).assign(ds=data_di['test'].ds.unique())\ncolumns_to_keep = [e for e in p_df.columns if '~' in e or e == 'ds'] \np_df = p_df[columns_to_keep]\np_df = p_df.melt(id_vars = ['ds'], value_vars = [c for c in p_df.columns if c != 'ds'])\np_df[['store_nbr', 'family']] = p_df.key.str.split('~', expand=True)\np_df = p_df.astype({\"store_nbr\": int}, errors='raise') \n\np_df.store_nbr.astype(int)\np_df = p_df.rename(columns={'value': 'sales'})\np_df.drop('key', inplace=True, axis=1)\np_df = pd.merge(data_di['test'].drop('id', axis=1), p_df, on = ['ds', 'store_nbr', 'family'], how='left')\np_df['sales'] = np.clip(p_df.sales, 0, np.inf)\n# p_df = p_df.drop(['ds', 'store_nbr', 'family', 'onpromotion'], axis=1)\np_df.index = p_df.index + 3000888\np_df.to_csv('./submission.csv')","metadata":{},"execution_count":null,"outputs":[]}]}