I get the error when fitting an LSTM using keras/pandas. I'm not sure what I can do to fix it.

import random
import tensorflow as tf
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.preprocessing.sequence import TimeseriesGenerator
from sklearn.model_selection import train_test_split

# Get data
qb = QuantBook()
eq = qb.AddEquity("SPY")
data = qb.History(eq.Symbol, timedelta(days=30), Resolution.Daily).droplevel("symbol")

# Reset randomization seeds
np.random.seed(0)
tf.random.set_random_seed(0)
random.seed(0)


timesteps = 1
batch_size = 32

# Just using these features as an example
X = data[['low', 'high']][:-1]
Y = data['close'].shift(-1)[:-1]
X_train, _X, y_train, _y = train_test_split(X, Y, test_size=0.5, shuffle=False, random_state=1)
X_validation, X_test, y_validation, y_test = train_test_split(_X, _y, test_size=0.5, shuffle=False, random_state=1)

train = TimeseriesGenerator(X_train, y_train, timesteps, batch_size=batch_size)
validation = TimeseriesGenerator(X_validation, y_validation, timesteps, batch_size=batch_size)
test = TimeseriesGenerator(X_test, y_test, timesteps, batch_size=batch_size)

model = Sequential(name='Example Model')
model.add(LSTM(50, name='LSTM', stateful=True, batch_input_shape=(batch_size, timesteps, X_train.shape[1])))
model.add(Dense(1, name='Output'))
model.compile(loss='logcosh', metrics=['mean_absolute_percentage_error'], optimizer='Adam', sample_weight_mode='temporal')
print(model.summary())
model.fit_generator(train, epochs=10, validation_data=validation, verbose=1)
loss, accuracy = model.evaluate_generator(test, verbose=0)
print(f'Model Accuracy: {accuracy}')

Full backtrace:

Using TensorFlow backend.
WARNING:tensorflow:From /opt/miniconda3/lib/python3.6/site-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.
Model: "Example Model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
LSTM (LSTM) (32, 50) 10600
_________________________________________________________________
Output (Dense) (32, 1) 51
=================================================================
Total params: 10,651
Trainable params: 10,651
Non-trainable params: 0
_________________________________________________________________
None
WARNING:tensorflow:From /opt/miniconda3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py:422: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.

Epoch 1/10
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
/opt/miniconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2896 try:
-> 2897 return self._engine.get_loc(key)
2898 except KeyError:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 0

During handling of the above exception, another exception occurred:

KeyError Traceback (most recent call last)
~/PandasMapper.py in wrapped_function(*args, **kwargs)
72 try:
---> 73 return f(*args, **kwargs)
74 except KeyError as e:

/opt/miniconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2898 except KeyError:
-> 2899 return self._engine.get_loc(self._maybe_cast_indexer(key))
2900 indexer = self.get_indexer([key], method=method, tolerance=tolerance)

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 0

During handling of the above exception, another exception occurred:

KeyError Traceback (most recent call last)
~/PandasMapper.py in wrapped_function(*args, **kwargs)
72 try:
---> 73 return f(*args, **kwargs)
74 except KeyError as e:

/opt/miniconda3/lib/python3.6/site-packages/pandas/core/frame.py in __getitem__(self, key)
2994 return self._getitem_multilevel(key)
-> 2995 indexer = self.columns.get_loc(key)
2996 if is_integer(indexer):

~/PandasMapper.py in wrapped_function(*args, **kwargs)
75 oKey = [arg for arg in args if isinstance(arg, str)]
---> 76 raise KeyError(f"No key found for either mapped or original key. Mapped Key: {mKey}; Original Key: {oKey}")
77

KeyError: 'No key found for either mapped or original key. Mapped Key: []; Original Key: []'

During handling of the above exception, another exception occurred:

KeyError Traceback (most recent call last)
<ipython-input-2-290f7cfdc25a> in <module>
30 model.compile(loss='logcosh', metrics=['mean_absolute_percentage_error'], optimizer='Adam', sample_weight_mode='temporal')
31 print(model.summary())
---> 32 model.fit_generator(train, epochs=10, validation_data=validation, verbose=1)
33 loss, accuracy = model.evaluate_generator(test, verbose=0)
34 print(f'Model Accuracy: {accuracy}')

/opt/miniconda3/lib/python3.6/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs)
89 warnings.warn('Update your `' + object_name + '` call to the ' +
90 'Keras 2 API: ' + signature, stacklevel=2)
---> 91 return func(*args, **kwargs)
92 wrapper._original_function = func
93 return wrapper

/opt/miniconda3/lib/python3.6/site-packages/keras/engine/training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, validation_freq, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
1730 use_multiprocessing=use_multiprocessing,
1731 shuffle=shuffle,
-> 1732 initial_epoch=initial_epoch)
1733
1734 @interfaces.legacy_generator_methods_support

/opt/miniconda3/lib/python3.6/site-packages/keras/engine/training_generator.py in fit_generator(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, validation_freq, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
183 batch_index = 0
184 while steps_done < steps_per_epoch:
--> 185 generator_output = next(output_generator)
186
187 if not hasattr(generator_output, '__len__'):

/opt/miniconda3/lib/python3.6/site-packages/keras/utils/data_utils.py in get(self)
623 except Exception:
624 self.stop()
--> 625 six.reraise(*sys.exc_info())
626
627

/opt/miniconda3/lib/python3.6/site-packages/six.py in reraise(tp, value, tb)
717 if value.__traceback__ is not tb:
718 raise value.with_traceback(tb)
--> 719 raise value
720 finally:
721 value = None

/opt/miniconda3/lib/python3.6/site-packages/keras/utils/data_utils.py in get(self)
608 try:
609 future = self.queue.get(block=True)
--> 610 inputs = future.get(timeout=30)
611 except mp.TimeoutError:
612 idx = future.idx

/opt/miniconda3/lib/python3.6/multiprocessing/pool.py in get(self, timeout)
642 return self._value
643 else:
--> 644 raise self._value
645
646 def _set(self, i, obj):

/opt/miniconda3/lib/python3.6/multiprocessing/pool.py in worker(inqueue, outqueue, initializer, initargs, maxtasks, wrap_exception)
117 job, i, func, args, kwds = task
118 try:
--> 119 result = (True, func(*args, **kwds))
120 except Exception as e:
121 if wrap_exception and func is not _helper_reraises_exception:

/opt/miniconda3/lib/python3.6/site-packages/keras/utils/data_utils.py in get_index(uid, i)
404 The value at index `i`.
405 """
--> 406 return _SHARED_SEQUENCES[uid][i]
407
408

/opt/miniconda3/lib/python3.6/site-packages/keras_preprocessing/sequence.py in __getitem__(self, index)
371
372 samples = np.array([self.data[row - self.length:row:self.sampling_rate]
--> 373 for row in rows])
374 targets = np.array([self.targets[row] for row in rows])
375

~/PandasMapper.py in wrapped_function(*args, **kwargs)
74 except KeyError as e:
75 oKey = [arg for arg in args if isinstance(arg, str)]
---> 76 raise KeyError(f"No key found for either mapped or original key. Mapped Key: {mKey}; Original Key: {oKey}")
77
78 wrapped_function.__name__ = f.__name__

KeyError: 'No key found for either mapped or original key. Mapped Key: []; Original Key: []'