From 2e0e86b747258c5ca6edbe8a399d7f653eaa504f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=C3=B4nio=20C=C3=A2ndido?= Date: Fri, 22 Mar 2019 19:46:42 -0300 Subject: [PATCH] Interval forecasting on MVFTS and WMVFTS --- pyFTS/models/multivariate/flrg.py | 15 ++++++++++-- pyFTS/models/multivariate/mvfts.py | 4 +-- pyFTS/tests/multivariate.py | 39 ++++++++++++++++++++++++++++-- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/pyFTS/models/multivariate/flrg.py b/pyFTS/models/multivariate/flrg.py index a67efc2..f97ba81 100644 --- a/pyFTS/models/multivariate/flrg.py +++ b/pyFTS/models/multivariate/flrg.py @@ -22,7 +22,6 @@ class FLRG(flg.FLRG): self.LHS[var] = [] self.LHS[var].append(fset) - def append_rhs(self, fset, **kwargs): self.RHS.add(fset) @@ -34,10 +33,22 @@ class FLRG(flg.FLRG): return np.nanmin(mvs) + def get_lower(self, sets): + if self.lower is None: + self.lower = min([sets[rhs].lower for rhs in self.RHS]) + + return self.lower + + def get_upper(self, sets): + if self.upper is None: + self.upper = max([sets[rhs].upper for rhs in self.RHS]) + + return self.upper + def __str__(self): _str = "" for k in self.RHS: _str += "," if len(_str) > 0 else "" _str += k - return self.get_key() + " -> " + _str \ No newline at end of file + return self.get_key() + " -> " + _str diff --git a/pyFTS/models/multivariate/mvfts.py b/pyFTS/models/multivariate/mvfts.py index 5121f63..2fc85fb 100644 --- a/pyFTS/models/multivariate/mvfts.py +++ b/pyFTS/models/multivariate/mvfts.py @@ -236,8 +236,8 @@ class MVFTS(fts.FTS): los.append(_flrg.get_lower(self.target_variable.partitioner.sets)) mv = np.array(mvs) - up = np.dot(mv, np.array(ups).T) / np.sum(mv) - lo = np.dot(mv, np.array(los).T) / np.sum(mv) + up = np.dot(mv, np.array(ups).T) / np.nansum(mv) + lo = np.dot(mv, np.array(los).T) / np.nansum(mv) ret.append([lo, up]) diff --git a/pyFTS/tests/multivariate.py b/pyFTS/tests/multivariate.py index d89dec9..ca243df 100644 --- a/pyFTS/tests/multivariate.py +++ b/pyFTS/tests/multivariate.py @@ -85,6 +85,7 @@ print(_s2-_s1) #model.fit(data, distributed='dispy', nodes=['192.168.0.110']) #''' +''' from pyFTS.models.multivariate import common, variable, mvfts, wmvfts, cmvfts, grid from pyFTS.models.seasonal import partitioner as seasonal from pyFTS.models.seasonal.common import DateTime @@ -99,7 +100,7 @@ from pyFTS.models.multivariate import common, variable, mvfts from pyFTS.models.seasonal import partitioner as seasonal from pyFTS.models.seasonal.common import DateTime -#''' + sp = {'seasonality': DateTime.minute_of_day, 'names': [str(k) for k in range(0,24)]} vhour = variable.Variable("Hour", data_label="date", partitioner=seasonal.TimeGridPartitioner, npart=24, @@ -152,4 +153,38 @@ time_generator = lambda x : pd.to_datetime(x) + pd.to_timedelta(1, unit='h') forecasts = mload.predict(test_mv.iloc[:1], steps_ahead=48, generators={'date': time_generator, - 'temperature': mtemp}) \ No newline at end of file + 'temperature': mtemp}) + +''' + + +data = pd.read_csv('https://query.data.world/s/6xfb5useuotbbgpsnm5b2l3wzhvw2i', sep=';') + +train = data.iloc[:9000] +test = data.iloc[9000:9200] + +from pyFTS.models.multivariate import common, variable, mvfts +from pyFTS.models.seasonal import partitioner as seasonal +from pyFTS.models.seasonal.common import DateTime +from pyFTS.partitioners import Grid + +sp = {'seasonality': DateTime.day_of_year , 'names': ['Jan','Fev','Mar','Abr','Mai','Jun','Jul', 'Ago','Set','Out','Nov','Dez']} + +vmonth = variable.Variable("Month", data_label="data", partitioner=seasonal.TimeGridPartitioner, npart=12, + data=train, partitioner_specific=sp) + +sp = {'seasonality': DateTime.minute_of_day, 'names': [str(k) for k in range(0,24)]} + +vhour = variable.Variable("Hour", data_label="data", partitioner=seasonal.TimeGridPartitioner, npart=24, + data=train, partitioner_specific=sp) + +vavg = variable.Variable("Radiation", data_label="glo_avg", alias='rad', + partitioner=Grid.GridPartitioner, npart=30, alpha_cut=.3, + data=train) + +from pyFTS.models.multivariate import mvfts, wmvfts, cmvfts + +model = wmvfts.WeightedMVFTS(explanatory_variables=[vmonth, vhour, vavg], target_variable=vavg) +model.fit(train) + +forecasts = model.predict(test, type='interval') \ No newline at end of file