Contextual Multi Season FTS
This commit is contained in:
parent
55d3deadfc
commit
26656153f4
@ -72,15 +72,23 @@ def allPointForecasters(data_train, data_test, partitions, max_order=3, statisti
|
|||||||
intervals=False)
|
intervals=False)
|
||||||
|
|
||||||
|
|
||||||
def getPointStatistics(data, models, externalmodels = None, externalforecasts = None):
|
def getPointStatistics(data, models, externalmodels = None, externalforecasts = None, indexers=None):
|
||||||
ret = "Model & Order & RMSE & MAPE & Theil's U \\\\ \n"
|
ret = "Model & Order & RMSE & SMAPE & Theil's U \\\\ \n"
|
||||||
for fts in models:
|
for count,model in enumerate(models,start=0):
|
||||||
forecasts = fts.forecast(data)
|
if indexers is not None:
|
||||||
ret += fts.shortname + " & "
|
ndata = np.array(indexers[count].get_data(data[model.order:]))
|
||||||
ret += str(fts.order) + " & "
|
else:
|
||||||
ret += str(round(Measures.rmse(np.array(data[fts.order:]), np.array(forecasts[:-1])), 2)) + " & "
|
ndata = np.array(data[model.order:])
|
||||||
ret += str(round(Measures.smape(np.array(data[fts.order:]), np.array(forecasts[:-1])), 2))+ " & "
|
forecasts = model.forecast(data)
|
||||||
ret += str(round(Measures.UStatistic(np.array(data[fts.order:]), np.array(forecasts[:-1])), 2))
|
if model.hasSeasonality:
|
||||||
|
nforecasts = np.array(forecasts)
|
||||||
|
else:
|
||||||
|
nforecasts = np.array(forecasts[:-1])
|
||||||
|
ret += model.shortname + " & "
|
||||||
|
ret += str(model.order) + " & "
|
||||||
|
ret += str(round(Measures.rmse(ndata, nforecasts), 2)) + " & "
|
||||||
|
ret += str(round(Measures.smape(ndata, nforecasts), 2))+ " & "
|
||||||
|
ret += str(round(Measures.UStatistic(ndata, nforecasts), 2))
|
||||||
#ret += str(round(Measures.TheilsInequality(np.array(data[fts.order:]), np.array(forecasts[:-1])), 4))
|
#ret += str(round(Measures.TheilsInequality(np.array(data[fts.order:]), np.array(forecasts[:-1])), 4))
|
||||||
ret += " \\\\ \n"
|
ret += " \\\\ \n"
|
||||||
if externalmodels is not None:
|
if externalmodels is not None:
|
||||||
@ -88,9 +96,9 @@ def getPointStatistics(data, models, externalmodels = None, externalforecasts =
|
|||||||
for k in np.arange(0,l):
|
for k in np.arange(0,l):
|
||||||
ret += externalmodels[k] + " & "
|
ret += externalmodels[k] + " & "
|
||||||
ret += " 1 & "
|
ret += " 1 & "
|
||||||
ret += str(round(Measures.rmse(data[fts.order:], externalforecasts[k][:-1]), 2)) + " & "
|
ret += str(round(Measures.rmse(data, externalforecasts[k][:-1]), 2)) + " & "
|
||||||
ret += str(round(Measures.smape(data[fts.order:], externalforecasts[k][:-1]), 2))+ " & "
|
ret += str(round(Measures.smape(data, externalforecasts[k][:-1]), 2))+ " & "
|
||||||
ret += str(round(Measures.UStatistic(np.array(data[fts.order:]), np.array(forecasts[:-1])), 2))
|
ret += str(round(Measures.UStatistic(np.array(data), np.array(forecasts[:-1])), 2))
|
||||||
ret += " \\\\ \n"
|
ret += " \\\\ \n"
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
2
chen.py
2
chen.py
@ -34,7 +34,7 @@ class ConventionalFTS(fts.FTS):
|
|||||||
if flr.LHS.name in flrgs:
|
if flr.LHS.name in flrgs:
|
||||||
flrgs[flr.LHS.name].append(flr.RHS)
|
flrgs[flr.LHS.name].append(flr.RHS)
|
||||||
else:
|
else:
|
||||||
flrgs[flr.LHS.name] = ConventionalFLRG(flr.LHS);
|
flrgs[flr.LHS.name] = ConventionalFLRG(flr.LHS)
|
||||||
flrgs[flr.LHS.name].append(flr.RHS)
|
flrgs[flr.LHS.name].append(flr.RHS)
|
||||||
return (flrgs)
|
return (flrgs)
|
||||||
|
|
||||||
|
95
models/cmsfts.py
Normal file
95
models/cmsfts.py
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
import numpy as np
|
||||||
|
from pyFTS.common import FuzzySet,FLR
|
||||||
|
from pyFTS import fts, sfts, chen
|
||||||
|
|
||||||
|
|
||||||
|
class ContextualSeasonalFLRG(object):
|
||||||
|
def __init__(self, seasonality):
|
||||||
|
super(ContextualSeasonalFLRG, self).__init__(None,None)
|
||||||
|
self.season = seasonality
|
||||||
|
self.flrgs = {}
|
||||||
|
|
||||||
|
def append(self, flr):
|
||||||
|
if flr.LHS.name in self.flrgs:
|
||||||
|
self.flrgs[flr.LHS.name].append(flr.RHS)
|
||||||
|
else:
|
||||||
|
self.flrgs[flr.LHS.name] = chen.ConventionalFLRG(flr.LHS)
|
||||||
|
self.flrgs[flr.LHS.name].append(flr.RHS)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
tmp = str(self.season) + ": \n "
|
||||||
|
tmp2 = "\t"
|
||||||
|
for r in sorted(self.flrgs):
|
||||||
|
tmp2 += str(self.flrgs[r]) + "\n\t"
|
||||||
|
return tmp + tmp2 + "\n"
|
||||||
|
|
||||||
|
|
||||||
|
class ContextualMultiSeasonalFTS(sfts.SeasonalFTS):
|
||||||
|
def __init__(self, name, indexer):
|
||||||
|
super(ContextualMultiSeasonalFTS, self).__init__("CMSFTS")
|
||||||
|
self.name = "Contextual Multi Seasonal FTS"
|
||||||
|
self.shortname = "CMSFTS " + name
|
||||||
|
self.detail = ""
|
||||||
|
self.seasonality = 1
|
||||||
|
self.hasSeasonality = True
|
||||||
|
self.hasPointForecasting = True
|
||||||
|
self.isHighOrder = True
|
||||||
|
self.isMultivariate = True
|
||||||
|
self.indexer = indexer
|
||||||
|
self.flrgs = {}
|
||||||
|
|
||||||
|
def generateFLRG(self, flrs):
|
||||||
|
flrgs = {}
|
||||||
|
|
||||||
|
for flr in flrs:
|
||||||
|
|
||||||
|
if str(flr.index) not in self.flrgs:
|
||||||
|
flrgs[str(flr.index)] = ContextualSeasonalFLRG(flr.index)
|
||||||
|
|
||||||
|
flrgs[str(flr.index)].append(flr)
|
||||||
|
|
||||||
|
return (flrgs)
|
||||||
|
|
||||||
|
def train(self, data, sets, order=1, parameters=None):
|
||||||
|
self.sets = sets
|
||||||
|
self.seasonality = parameters
|
||||||
|
flrs = FLR.generateIndexedFLRs(self.sets, self.indexer, data)
|
||||||
|
self.flrgs = self.generateFLRG(flrs)
|
||||||
|
|
||||||
|
def getMidpoints(self, flrg, data):
|
||||||
|
ret = np.array([s.centroid for s in flrg.flrgs[data].RHS])
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def forecast(self, data):
|
||||||
|
|
||||||
|
ret = []
|
||||||
|
|
||||||
|
index = self.indexer.get_season_of_data(data)
|
||||||
|
ndata = self.indexer.get_data(data)
|
||||||
|
|
||||||
|
for k in np.arange(1, len(data)):
|
||||||
|
|
||||||
|
flrg = self.flrgs[str(index[k])]
|
||||||
|
|
||||||
|
d = FuzzySet.getMaxMembershipFuzzySet(ndata[k], self.sets)
|
||||||
|
|
||||||
|
mp = self.getMidpoints(flrg, d)
|
||||||
|
|
||||||
|
ret.append(sum(mp) / len(mp))
|
||||||
|
|
||||||
|
ret = self.doInverseTransformations(ret, params=[ndata[self.order - 1:]])
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def forecastAhead(self, data, steps):
|
||||||
|
ret = []
|
||||||
|
for i in steps:
|
||||||
|
flrg = self.flrgs[str(i)]
|
||||||
|
|
||||||
|
mp = self.getMidpoints(flrg)
|
||||||
|
|
||||||
|
ret.append(sum(mp) / len(mp))
|
||||||
|
|
||||||
|
ret = self.doInverseTransformations(ret, params=data)
|
||||||
|
|
||||||
|
return ret
|
@ -7,6 +7,7 @@ class MultiSeasonalFTS(sfts.SeasonalFTS):
|
|||||||
def __init__(self, name, indexer):
|
def __init__(self, name, indexer):
|
||||||
super(MultiSeasonalFTS, self).__init__("MSFTS")
|
super(MultiSeasonalFTS, self).__init__("MSFTS")
|
||||||
self.name = "Multi Seasonal FTS"
|
self.name = "Multi Seasonal FTS"
|
||||||
|
self.shortname = "MSFTS " + name
|
||||||
self.detail = ""
|
self.detail = ""
|
||||||
self.seasonality = 1
|
self.seasonality = 1
|
||||||
self.hasSeasonality = True
|
self.hasSeasonality = True
|
||||||
|
4
sfts.py
4
sfts.py
@ -2,8 +2,10 @@ import numpy as np
|
|||||||
from pyFTS.common import FuzzySet,FLR
|
from pyFTS.common import FuzzySet,FLR
|
||||||
from pyFTS import fts
|
from pyFTS import fts
|
||||||
|
|
||||||
class SeasonalFLRG(fts.FTS):
|
|
||||||
|
class SeasonalFLRG(FLR.FLR):
|
||||||
def __init__(self, seasonality):
|
def __init__(self, seasonality):
|
||||||
|
super(SeasonalFLRG, self).__init__(None,None)
|
||||||
self.LHS = seasonality
|
self.LHS = seasonality
|
||||||
self.RHS = []
|
self.RHS = []
|
||||||
|
|
||||||
|
@ -28,27 +28,6 @@ sonda = sonda[:][527041:]
|
|||||||
|
|
||||||
sonda.index = np.arange(0,len(sonda.index))
|
sonda.index = np.arange(0,len(sonda.index))
|
||||||
|
|
||||||
#data = []
|
|
||||||
|
|
||||||
#for i in sonda.index:
|
|
||||||
|
|
||||||
#inst = []
|
|
||||||
|
|
||||||
#year = int( sonda["year"][i] )
|
|
||||||
#day_of_year = int( sonda["day"][i] )
|
|
||||||
#minute = int (sonda["min"][i] )
|
|
||||||
|
|
||||||
#glo_avg = sonda["glo_avg"][i]
|
|
||||||
|
|
||||||
#inst.append( datetime.datetime(year, 1, 1) + datetime.timedelta(day_of_year - 1, minutes=minute) )
|
|
||||||
|
|
||||||
#inst.append( glo_avg )
|
|
||||||
|
|
||||||
#data.append(inst)
|
|
||||||
|
|
||||||
#nov = pd.DataFrame(data,columns=["data","glo_avg"])
|
|
||||||
|
|
||||||
#nov.to_csv("DataSets/SONDA_BSB_MOD.csv", sep=";")
|
|
||||||
|
|
||||||
sonda_treino = sonda[:1051200]
|
sonda_treino = sonda[:1051200]
|
||||||
sonda_teste = sonda[1051201:]
|
sonda_teste = sonda[1051201:]
|
||||||
@ -63,42 +42,23 @@ from pyFTS.models.seasonal import SeasonalIndexer
|
|||||||
from pyFTS.models import msfts
|
from pyFTS.models import msfts
|
||||||
from pyFTS.common import FLR
|
from pyFTS.common import FLR
|
||||||
|
|
||||||
ix = SeasonalIndexer.DateTimeSeasonalIndexer('data',[SeasonalIndexer.DateTime.month,
|
partitions = ['grid','entropy']
|
||||||
SeasonalIndexer.DateTime.hour, SeasonalIndexer.DateTime.minute],
|
|
||||||
[None, None,15],'glo_avg')
|
indexers = ['m15','Mh','Mhm15']
|
||||||
|
|
||||||
|
models = []
|
||||||
|
ixs = []
|
||||||
|
|
||||||
|
sample = sonda_teste[0:4300]
|
||||||
|
|
||||||
tmp = ix.get_data(sonda_treino)
|
|
||||||
for max_part in [10, 20, 30, 40, 50]:
|
for max_part in [10, 20, 30, 40, 50]:
|
||||||
|
for part in partitions:
|
||||||
|
for ind in indexers:
|
||||||
|
ix = Util.load_obj("models/sonda_ix_" + ind + ".pkl")
|
||||||
|
model = Util.load_obj("models/sonda_msfts_" + part + "_" + str(max_part) + "_" + ind + ".pkl")
|
||||||
|
model.shortname = part + "_" + str(max_part) + "_" + ind
|
||||||
|
|
||||||
fs1 = Grid.GridPartitionerTrimf(tmp,max_part)
|
models.append(model)
|
||||||
|
ixs.append(ix)
|
||||||
|
|
||||||
Util.persist_obj(fs1,"models/sonda_fs_grid_" + str(max_part) + ".pkl")
|
print(bchmk.getPointStatistics(sample, models, indexers=ixs))
|
||||||
|
|
||||||
fs2 = FCM.FCMPartitionerTrimf(tmp, max_part)
|
|
||||||
|
|
||||||
Util.persist_obj(fs2, "models/sonda_fs_fcm_" + str(max_part) + ".pkl")
|
|
||||||
|
|
||||||
fs3 = Entropy.EntropyPartitionerTrimf(tmp, max_part)
|
|
||||||
|
|
||||||
Util.persist_obj(fs3, "models/sonda_fs_entropy_" + str(max_part) + ".pkl")
|
|
||||||
|
|
||||||
|
|
||||||
#fs = Util.load_obj("models/sonda_fs_grid_50.pkl")
|
|
||||||
|
|
||||||
#for f in fs:
|
|
||||||
# print(f)
|
|
||||||
|
|
||||||
#mfts = msfts.MultiSeasonalFTS("",ix)
|
|
||||||
|
|
||||||
#mfts.train(sonda_treino,fs)
|
|
||||||
|
|
||||||
#print(str(mfts))
|
|
||||||
|
|
||||||
#plt.plot(mfts.forecast(sonda_teste))
|
|
||||||
|
|
||||||
#[10, 508]
|
|
||||||
|
|
||||||
#flrs = FLR.generateIndexedFLRs(fs, ix, sonda_treino[110000:111450])
|
|
||||||
|
|
||||||
#for i in mfts.forecast(sonda_teste):
|
|
||||||
# print(i)
|
|
Loading…
Reference in New Issue
Block a user