Source code for pyFTS.models.seasonal.cmsfts

import numpy as np
from pyFTS.common import FuzzySet, FLR
from pyFTS.models.seasonal import sfts
from pyFTS.models import chen


[docs]class ContextualSeasonalFLRG(sfts.SeasonalFLRG): """ Contextual Seasonal Fuzzy Logical Relationship Group """ def __init__(self, seasonality): super(ContextualSeasonalFLRG, self).__init__(seasonality) self.RHS = {}
[docs] def append_rhs(self, flr, **kwargs): if flr.LHS in self.RHS: self.RHS[flr.LHS].append_rhs(flr.RHS) else: self.RHS[flr.LHS] = chen.ConventionalFLRG(flr.LHS) self.RHS[flr.LHS].append_rhs(flr.RHS)
def __str__(self): tmp = str(self.LHS) + ": \n " tmp2 = "\t" for r in sorted(self.RHS): tmp2 += str(self.RHS[r]) + "\n\t" return tmp + tmp2 + "\n"
[docs]class ContextualMultiSeasonalFTS(sfts.SeasonalFTS): """ Contextual Multi-Seasonal Fuzzy Time Series """ def __init__(self, **kwargs): super(ContextualMultiSeasonalFTS, self).__init__(**kwargs) self.name = "Contextual Multi Seasonal FTS" self.shortname = "CMSFTS " self.detail = "" self.seasonality = 1 self.has_seasonality = True self.has_point_forecasting = True self.is_high_order = True self.is_multivariate = True self.order = 1 self.flrgs = {}
[docs] def generate_flrg(self, flrs): for flr in flrs: if str(flr.index) not in self.flrgs: self.flrgs[str(flr.index)] = ContextualSeasonalFLRG(flr.index) self.flrgs[str(flr.index)].append_rhs(flr)
[docs] def train(self, data, **kwargs): if kwargs.get('sets', None) is not None: self.sets = kwargs.get('sets', None) if kwargs.get('parameters', None) is not None: self.seasonality = kwargs.get('parameters', None) flrs = FLR.generate_indexed_flrs(self.sets, self.indexer, data, transformation=self.partitioner.transformation, alpha_cut=self.alpha_cut) self.generate_flrg(flrs)
[docs] def get_midpoints(self, flrg, data): ret = [] for d in data: if d in flrg.RHS: ret.extend([self.sets[s].centroid for s in flrg.RHS[d].RHS]) else: ret.extend([self.sets[d].centroid]) return np.array(ret)
[docs] def forecast(self, data, **kwargs): ordered_sets = FuzzySet.set_ordered(self.sets) ret = [] index = self.indexer.get_season_of_data(data) ndata = self.indexer.get_data(data) for k in np.arange(0, len(data)): if str(index[k]) in self.flrgs: flrg = self.flrgs[str(index[k])] d = FuzzySet.get_fuzzysets(ndata[k], self.sets, ordered_sets, alpha_cut=self.alpha_cut) mp = self.get_midpoints(flrg, d) ret.append(sum(mp) / len(mp)) else: ret.append(np.nan) return ret
[docs] def forecast_ahead(self, data, steps, **kwargs): ret = [] for i in steps: flrg = self.flrgs[str(i)] mp = self.get_midpoints(flrg) ret.append(sum(mp) / len(mp)) return ret