Source code for utils
import numpy as np
from collections import deque
[docs]def shift(darray, k, axis=0):
"""
Utility function to shift a numpy array
Inputs
------
darray: a numpy array
the array to be shifted.
k: integer
number of shift
axis: non-negative integer
axis to perform shift operation
Outputs
-------
shifted numpy array, fill the unknown values with nan
"""
if k == 0:
return darray
elif k < 0:
shift_array = np.roll(darray, k, axis=axis).astype(float)
shift_array[k:] = np.nan
return shift_array
else:
shift_array = np.roll(darray, k, axis=axis).astype(float)
shift_array[:k] = np.nan
return shift_array
[docs]class OutputLagFeatureProcessor:
def __init__(self, data, order):
self._feature_queue = deque([shift(data, l) for l in range(order)])
[docs] def update(self, data_new):
# TODO: this is not memory efficient, need to do this in a
# better way in the future
self._feature_queue.appendleft(data_new)
self._feature_queue.pop()
return np.array(self._feature_queue).T
[docs]class InputLagFeatureProcessor:
def __init__(self, data, order, delay):
self._data = data
self._lags = np.array(range(delay, delay + order))
[docs] def generate_lag_features(self):
features = [shift(self._data, l) for l in self._lags]
return np.array(features).T
[docs]class MetaLagFeatureProcessor(object):
def __init__(self, X, y, auto_order, exog_order, exog_delay):
self._lag_feature_processors = [
OutputLagFeatureProcessor(y, auto_order)
]
self._lag_feature_processors.extend([
InputLagFeatureProcessor(data, order, delay)
for data, order, delay in zip(X.T, exog_order, exog_delay)
])
[docs] def generate_lag_features(self):
lag_feature_list = [
p.generate_lag_features() for p in self._lag_feature_processors
]
lag_features = np.concatenate(lag_feature_list, axis=1)
return lag_features
[docs] def update(self, data_new):
lag_feature_list = [
p.update(data_new) if i == 0 else p.update()
for i, p in enumerate(self._lag_feature_processors)
]
lag_features = np.concatenate(lag_feature_list, axis=1)
return lag_features