Source code for pyFTS.models.multivariate.cmvfts


import numpy as np
import pandas as pd
from pyFTS.common import FuzzySet, FLR, fts, flrg
from pyFTS.models import hofts
from pyFTS.models.multivariate import mvfts, grid, common


[docs]class ClusteredMVFTS(mvfts.MVFTS): """ Meta model for multivariate, high order, clustered multivariate FTS """ def __init__(self, **kwargs): super(ClusteredMVFTS, self).__init__(**kwargs) self.cluster_method = kwargs.get('cluster_method', grid.GridCluster) """The cluster method to be called when a new model is build""" self.cluster_params = kwargs.get('cluster_params', {}) """The cluster method parameters""" self.cluster = kwargs.get('cluster', None) """The trained clusterer""" self.fts_method = kwargs.get('fts_method', hofts.WeightedHighOrderFTS) """The FTS method to be called when a new model is build""" self.fts_params = kwargs.get('fts_params', {}) """The FTS method specific parameters""" self.model = None """The most recent trained model""" self.knn = kwargs.get('knn', 2) self.is_high_order = True self.order = kwargs.get("order", 2) self.lags = kwargs.get("lags", None) self.alpha_cut = kwargs.get('alpha_cut', 0.25) self.shortname = "ClusteredMVFTS" self.name = "Clustered Multivariate FTS" self.pre_fuzzyfy = kwargs.get('pre_fuzzyfy', True)
[docs] def fuzzyfy(self,data): ndata = [] for index, row in data.iterrows(): data_point = self.format_data(row) ndata.append(common.fuzzyfy_instance_clustered(data_point, self.cluster, alpha_cut=self.alpha_cut)) return ndata
[docs] def train(self, data, **kwargs): if self.cluster is None: self.cluster = self.cluster_method(data=data, mvfts=self, neighbors=self.knn, **self.cluster_params) self.model = self.fts_method(partitioner=self.cluster, **self.fts_params) if self.model.is_high_order: self.model.order = self.order ndata = self.check_data(data) self.model.train(ndata, fuzzyfied=self.pre_fuzzyfy) self.cluster.prune()
[docs] def check_data(self, data): if self.pre_fuzzyfy: ndata = self.fuzzyfy(data) else: ndata = [self.format_data(k) for k in data.to_dict('records')] return ndata
[docs] def forecast(self, ndata, **kwargs): ndata = self.check_data(ndata) return self.model.forecast(ndata, fuzzyfied=self.pre_fuzzyfy, **kwargs)
[docs] def forecast_multivariate(self, data, **kwargs): ndata = self.check_data(data) ret = {} for var in self.explanatory_variables: if self.target_variable.name != var.name: self.target_variable = var self.cluster.change_target_variable(var) self.model.partitioner = self.cluster self.model.reset_calculated_values() ret[var.name] = self.model.forecast(ndata, fuzzyfied=self.pre_fuzzyfy, **kwargs) return pd.DataFrame(ret, columns=ret.keys())
def __str__(self): """String representation of the model""" return str(self.model) def __len__(self): """ The length (number of rules) of the model :return: number of rules """ return len(self.model)