diff --git a/pyFTS/models/incremental/IncrementalEnsemble.py b/pyFTS/models/incremental/IncrementalEnsemble.py index f1a6773..d65e6a0 100644 --- a/pyFTS/models/incremental/IncrementalEnsemble.py +++ b/pyFTS/models/incremental/IncrementalEnsemble.py @@ -63,6 +63,15 @@ class IncrementalEnsembleFTS(ensemble.EnsembleFTS): def forecast(self, data, **kwargs): l = len(data) + no_update = kwargs.get('no_update', False) + if no_update: + ret = [] + for k in np.arange(self.order, l+1): + sample = data[k-self.order: k] + tmp = self.get_models_forecasts(sample) + point = self.get_point(tmp) + ret.append(point) + return ret data_window = [] @@ -88,6 +97,27 @@ class IncrementalEnsembleFTS(ensemble.EnsembleFTS): return ret + def forecast_ahead(self, data, steps, **kwargs): + if len(data) < self.order: + return data + + if isinstance(data, np.ndarray): + data = data.tolist() + + start = kwargs.get('start_at',0) + + ret = data[:start+self.order] + for k in np.arange(start+self.order, steps+start+self.order): + tmp = self.forecast(ret[k-self.order:k], no_update=True, **kwargs) + + if isinstance(tmp,(list, np.ndarray)): + tmp = tmp[-1] + + ret.append(tmp) + data.append(tmp) + + return ret[-steps:] + diff --git a/pyFTS/models/incremental/TimeVariant.py b/pyFTS/models/incremental/TimeVariant.py index 49b2098..6a0789a 100644 --- a/pyFTS/models/incremental/TimeVariant.py +++ b/pyFTS/models/incremental/TimeVariant.py @@ -55,6 +55,11 @@ class Retrainer(fts.FTS): def forecast(self, data, **kwargs): l = len(data) + no_update = kwargs.get('no_update',False) + + if no_update: + return self.model.predict(data, **kwargs) + horizon = self.window_length + self.order ret = [] @@ -73,13 +78,34 @@ class Retrainer(fts.FTS): return ret + def forecast_ahead(self, data, steps, **kwargs): + if len(data) < self.order: + return data + + if isinstance(data, np.ndarray): + data = data.tolist() + + start = kwargs.get('start_at',0) + + ret = data[:start+self.order] + for k in np.arange(start+self.order, steps+start+self.order): + tmp = self.forecast(ret[k-self.order:k], no_update=True, **kwargs) + + if isinstance(tmp,(list, np.ndarray)): + tmp = tmp[-1] + + ret.append(tmp) + data.append(tmp) + + return ret[-steps:] + def offset(self): return self.max_lag def __str__(self): """String representation of the model""" - return str(this.model) + return str(self.model) def __len__(self): """ diff --git a/pyFTS/tests/nonstationary.py b/pyFTS/tests/nonstationary.py index 76ca04c..f90c15b 100644 --- a/pyFTS/tests/nonstationary.py +++ b/pyFTS/tests/nonstationary.py @@ -23,10 +23,44 @@ from pyFTS.common import Transformations from pyFTS.partitioners import Grid, Util as pUtil from pyFTS.benchmarks import benchmarks as bchmk from pyFTS.models import chen, hofts, pwfts, hwang +from pyFTS.models.incremental import TimeVariant, IncrementalEnsemble train = dataset[:1000] test = dataset[1000:] +window = 100 + +batch = 10 + +num_models = 3 + +model1 = TimeVariant.Retrainer(partitioner_method=Grid.GridPartitioner, partitioner_params={'npart': 35}, + fts_method=pwfts.ProbabilisticWeightedFTS, fts_params={}, order=1, + batch_size=batch, window_length=window * num_models) + +model2 = IncrementalEnsemble.IncrementalEnsembleFTS(partitioner_method=Grid.GridPartitioner, + partitioner_params={'npart': 35}, + fts_method=pwfts.ProbabilisticWeightedFTS, fts_params={}, order=1, + batch_size=int(batch / 3), window_length=window, + num_models=num_models) + +model1.fit(train) +model2.fit(train) + +print(len(test)) +''' +forecasts1 = model1.predict(test[:-10]) +print(len(forecasts1)) +forecasts1 = model1.predict(test[-10:], steps_ahead=10) +print(len(forecasts1)) +''' +forecasts2 = model2.predict(test[:-10]) +print(len(forecasts2)) +forecasts2 = model2.predict(test[-10:], steps_ahead=10) +print(len(forecasts2)) + + +''' from pyFTS.models.nonstationary import partitioners as nspart, nsfts, honsfts fs = nspart.simplenonstationary_gridpartitioner_builder(data=train,npart=35,transformation=None) print(fs) @@ -35,4 +69,5 @@ model = nsfts.WeightedNonStationaryFTS(partitioner=fs) model.fit(train) print(model) forecasts = model.predict(test) -#print(forecasts) \ No newline at end of file +#print(forecasts) +''' \ No newline at end of file