From ff23d874bcd1dfeba04b73e1f22219351a40e278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=C3=B4nio=20C=C3=A2ndido?= Date: Thu, 12 Apr 2018 17:47:54 -0300 Subject: [PATCH] Logo and icon --- img/icon.png | Bin 0 -> 1808 bytes img/logo.png | Bin 0 -> 13274 bytes pyFTS/benchmarks/Util.py | 78 ++++++++++++++++++++------------- pyFTS/benchmarks/benchmarks.py | 22 ++++++++-- pyFTS/common/fts.py | 12 ++--- 5 files changed, 72 insertions(+), 40 deletions(-) create mode 100644 img/icon.png create mode 100644 img/logo.png diff --git a/img/icon.png b/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..81fbcf5fc19cd36f10127a045e3bdbb423048514 GIT binary patch literal 1808 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 GpZ^aiZNJ0- literal 0 HcmV?d00001 diff --git a/pyFTS/benchmarks/Util.py b/pyFTS/benchmarks/Util.py index 812e80b..1dc76f5 100644 --- a/pyFTS/benchmarks/Util.py +++ b/pyFTS/benchmarks/Util.py @@ -47,8 +47,8 @@ def find_best(dataframe, criteria, ascending): def point_dataframe_synthetic_columns(): - return ["Model", "Order", "Scheme", "Partitions", "Size", "RMSEAVG", "RMSESTD", "SMAPEAVG", "SMAPESTD", "UAVG", - "USTD", "TIMEAVG", "TIMESTD"] + return ["Model", "Order", "Scheme", "Partitions", "Size", "Steps", "Method", "RMSEAVG", "RMSESTD", + "SMAPEAVG", "SMAPESTD", "UAVG","USTD", "TIMEAVG", "TIMESTD"] def point_dataframe_analytic_columns(experiments): @@ -58,11 +58,13 @@ def point_dataframe_analytic_columns(experiments): columns.insert(2, "Scheme") columns.insert(3, "Partitions") columns.insert(4, "Size") - columns.insert(5, "Measure") + columns.insert(5, "Steps") + columns.insert(6, "Method") + columns.insert(7, "Measure") return columns -def save_dataframe_point(experiments, file, objs, rmse, save, synthetic, smape, times, u): +def save_dataframe_point(experiments, file, objs, rmse, save, synthetic, smape, times, u, steps, method): """ Create a dataframe to store the benchmark results :param experiments: dictionary with the execution results @@ -90,6 +92,8 @@ def save_dataframe_point(experiments, file, objs, rmse, save, synthetic, smape, mod.append(mfts.partitioner.name) mod.append(mfts.partitioner.partitions) mod.append(len(mfts)) + mod.append(steps) + mod.append(method) else: mod.append('-') mod.append('-') @@ -122,17 +126,17 @@ def save_dataframe_point(experiments, file, objs, rmse, save, synthetic, smape, s = '-' p = '-' l = '-' - print([n, o, s, p, l]) - tmp = [n, o, s, p, l, 'RMSE'] + print([n, o, s, p, l, steps, method]) + tmp = [n, o, s, p, l, steps, method, 'RMSE'] tmp.extend(rmse[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'SMAPE'] + tmp = [n, o, s, p, l, steps, method, 'SMAPE'] tmp.extend(smape[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'U'] + tmp = [n, o, s, p, l, steps, method, 'U'] tmp.extend(u[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'TIME'] + tmp = [n, o, s, p, l, steps, method, 'TIME'] tmp.extend(times[k]) ret.append(deepcopy(tmp)) except Exception as ex: @@ -401,7 +405,8 @@ def check_ignore_list(b, ignore): return flag -def save_dataframe_interval(coverage, experiments, file, objs, resolution, save, sharpness, synthetic, times, q05, q25, q75, q95): +def save_dataframe_interval(coverage, experiments, file, objs, resolution, save, sharpness, synthetic, times, + q05, q25, q75, q95, steps, method): ret = [] if synthetic: for k in sorted(objs.keys()): @@ -409,14 +414,19 @@ def save_dataframe_interval(coverage, experiments, file, objs, resolution, save, mfts = objs[k] mod.append(mfts.shortname) mod.append(mfts.order) + l = len(mfts) if not mfts.benchmark_only: mod.append(mfts.partitioner.name) mod.append(mfts.partitioner.partitions) - l = len(mfts) + mod.append(l) + mod.append(steps) + mod.append(method) else: mod.append('-') mod.append('-') - l = '-' + mod.append('-') + mod.append(steps) + mod.append(method) mod.append(round(np.nanmean(sharpness[k]), 2)) mod.append(round(np.nanstd(sharpness[k]), 2)) mod.append(round(np.nanmean(resolution[k]), 2)) @@ -452,28 +462,28 @@ def save_dataframe_interval(coverage, experiments, file, objs, resolution, save, p = '-' l = '-' - tmp = [n, o, s, p, l, 'Sharpness'] + tmp = [n, o, s, p, l, steps, method, 'Sharpness'] tmp.extend(sharpness[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'Resolution'] + tmp = [n, o, s, p, l, steps, method, 'Resolution'] tmp.extend(resolution[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'Coverage'] + tmp = [n, o, s, p, l, steps, method, 'Coverage'] tmp.extend(coverage[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'TIME'] + tmp = [n, o, s, p, l, steps, method, 'TIME'] tmp.extend(times[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'Q05'] + tmp = [n, o, s, p, l, steps, method, 'Q05'] tmp.extend(q05[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'Q25'] + tmp = [n, o, s, p, l, steps, method, 'Q25'] tmp.extend(q25[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'Q75'] + tmp = [n, o, s, p, l, steps, method, 'Q75'] tmp.extend(q75[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'Q95'] + tmp = [n, o, s, p, l, steps, method, 'Q95'] tmp.extend(q95[k]) ret.append(deepcopy(tmp)) except Exception as ex: @@ -492,18 +502,19 @@ def interval_dataframe_analytic_columns(experiments): columns.insert(2, "Scheme") columns.insert(3, "Partitions") columns.insert(4, "Size") - columns.insert(5, "Measure") + columns.insert(5, "Steps") + columns.insert(6, "Method") + columns.insert(7, "Measure") return columns def interval_dataframe_synthetic_columns(): - columns = ["Model", "Order", "Scheme", "Partitions", "SHARPAVG", "SHARPSTD", "RESAVG", "RESSTD", "COVAVG", + columns = ["Model", "Order", "Scheme", "Partitions","SIZE", "Steps","Method" "SHARPAVG", "SHARPSTD", "RESAVG", "RESSTD", "COVAVG", "COVSTD", "TIMEAVG", "TIMESTD", "Q05AVG", "Q05STD", "Q25AVG", "Q25STD", "Q75AVG", "Q75STD", "Q95AVG", "Q95STD"] return columns - def cast_dataframe_to_synthetic_interval(infile, outfile, experiments): columns = interval_dataframe_analytic_columns(experiments) dat = pd.read_csv(infile, sep=";", usecols=columns) @@ -863,7 +874,7 @@ def plot_dataframe_interval_pinball(file_synthetic, file_analytic, experiments, Util.show_and_save_image(fig, file, save) -def save_dataframe_probabilistic(experiments, file, objs, crps, times, save, synthetic): +def save_dataframe_probabilistic(experiments, file, objs, crps, times, save, synthetic, steps, method): """ Save benchmark results for m-step ahead probabilistic forecasters :param experiments: @@ -893,11 +904,15 @@ def save_dataframe_probabilistic(experiments, file, objs, crps, times, save, syn if not mfts.benchmark_only: mod.append(mfts.partitioner.name) mod.append(mfts.partitioner.partitions) - l = len(mfts) + mod.append(len(mfts)) + mod.append(steps) + mod.append(method) else: mod.append('-') mod.append('-') - l = '-' + mod.append('-') + mod.append(steps) + mod.append(method) mod.append(np.round(np.nanmean(crps[k]), 2)) mod.append(np.round(np.nanstd(crps[k]), 2)) mod.append(l) @@ -925,10 +940,10 @@ def save_dataframe_probabilistic(experiments, file, objs, crps, times, save, syn s = '-' p = '-' l = '-' - tmp = [n, o, s, p, l, 'CRPS'] + tmp = [n, o, s, p, l, steps, method, 'CRPS'] tmp.extend(crps[k]) ret.append(deepcopy(tmp)) - tmp = [n, o, s, p, l, 'TIME'] + tmp = [n, o, s, p, l, steps, method, 'TIME'] tmp.extend(times[k]) ret.append(deepcopy(tmp)) except Exception as ex: @@ -940,7 +955,6 @@ def save_dataframe_probabilistic(experiments, file, objs, crps, times, save, syn return dat - def probabilistic_dataframe_analytic_columns(experiments): columns = [str(k) for k in np.arange(0, experiments)] columns.insert(0, "Model") @@ -948,12 +962,14 @@ def probabilistic_dataframe_analytic_columns(experiments): columns.insert(2, "Scheme") columns.insert(3, "Partitions") columns.insert(4, "Size") - columns.insert(5, "Measure") + columns.insert(5, "Steps") + columns.insert(6, "Method") + columns.insert(7, "Measure") return columns def probabilistic_dataframe_synthetic_columns(): - columns = ["Model", "Order", "Scheme", "Partitions", "CRPSAVG", "CRPSSTD", + columns = ["Model", "Order", "Scheme", "Partitions","Size", "Steps", "Method", "CRPSAVG", "CRPSSTD", "TIMEAVG", "TIMESTD"] return columns diff --git a/pyFTS/benchmarks/benchmarks.py b/pyFTS/benchmarks/benchmarks.py index 4ec24bc..409503f 100644 --- a/pyFTS/benchmarks/benchmarks.py +++ b/pyFTS/benchmarks/benchmarks.py @@ -293,6 +293,9 @@ def run_point(mfts, partitioner, train_data, test_data, window_key=None, **kwarg transformation = kwargs.get('transformation', None) indexer = kwargs.get('indexer', None) + steps_ahead = kwargs.get('steps_ahead', 1) + method = kwargs.get('method', None) + if mfts.benchmark_only: _key = mfts.shortname + str(mfts.order if mfts.order is not None else "") else: @@ -313,7 +316,8 @@ def run_point(mfts, partitioner, train_data, test_data, window_key=None, **kwarg _end = time.time() times += _end - _start - ret = {'key': _key, 'obj': mfts, 'rmse': _rmse, 'smape': _smape, 'u': _u, 'time': times, 'window': window_key} + ret = {'key': _key, 'obj': mfts, 'rmse': _rmse, 'smape': _smape, 'u': _u, 'time': times, 'window': window_key, + 'steps': steps_ahead, 'method': method} return ret @@ -346,6 +350,9 @@ def run_interval(mfts, partitioner, train_data, test_data, window_key=None, **kw transformation = kwargs.get('transformation', None) indexer = kwargs.get('indexer', None) + steps_ahead = kwargs.get('steps_ahead', 1) + method = kwargs.get('method', None) + if mfts.benchmark_only: _key = mfts.shortname + str(mfts.order if mfts.order is not None else "") + str(mfts.alpha) else: @@ -367,7 +374,8 @@ def run_interval(mfts, partitioner, train_data, test_data, window_key=None, **kw times += _end - _start ret = {'key': _key, 'obj': mfts, 'sharpness': _sharp, 'resolution': _res, 'coverage': _cov, 'time': times, - 'Q05': _q05, 'Q25': _q25, 'Q75': _q75, 'Q95': _q95, 'window': window_key} + 'Q05': _q05, 'Q25': _q25, 'Q75': _q75, 'Q95': _q95, 'window': window_key, + 'steps': steps_ahead, 'method': method} return ret @@ -403,6 +411,9 @@ def run_probabilistic(mfts, partitioner, train_data, test_data, window_key=None, transformation = kwargs.get('transformation', None) indexer = kwargs.get('indexer', None) + steps_ahead = kwargs.get('steps_ahead', 1) + method = kwargs.get('method', None) + if mfts.benchmark_only: _key = mfts.shortname + str(mfts.order if mfts.order is not None else "") + str(mfts.alpha) else: @@ -429,7 +440,8 @@ def run_probabilistic(mfts, partitioner, train_data, test_data, window_key=None, _crps1 = np.nan _t1 = np.nan - ret = {'key': _key, 'obj': mfts, 'CRPS': _crps1, 'time': _t1, 'window': window_key} + ret = {'key': _key, 'obj': mfts, 'CRPS': _crps1, 'time': _t1, 'window': window_key, + 'steps': steps_ahead, 'method': method} return ret @@ -466,6 +478,8 @@ def process_point_jobs(jobs, experiments, save=False, file=None, sintetic=False) smape = {} u = {} times = {} + steps = None + method = None for job in jobs: _key = job['key'] @@ -475,6 +489,8 @@ def process_point_jobs(jobs, experiments, save=False, file=None, sintetic=False) smape[_key] = [] u[_key] = [] times[_key] = [] + steps[_key] = job['steps'] + method[_key] = job['method'] rmse[_key].append(job['rmse']) smape[_key].append(job['smape']) u[_key].append(job['u']) diff --git a/pyFTS/common/fts.py b/pyFTS/common/fts.py index 43f607c..13aec21 100644 --- a/pyFTS/common/fts.py +++ b/pyFTS/common/fts.py @@ -89,17 +89,17 @@ class FTS(object): steps_ahead = kwargs.get("steps_ahead", None) - if type == 'point' and steps_ahead == None: + if type == 'point' and (steps_ahead == None or steps_ahead == 1): ret = self.forecast(ndata, **kwargs) - elif type == 'point' and steps_ahead != None: + elif type == 'point' and steps_ahead > 1: ret = self.forecast_ahead(ndata, steps_ahead, **kwargs) - elif type == 'interval' and steps_ahead == None: + elif type == 'interval' and (steps_ahead == None or steps_ahead == 1): ret = self.forecast_interval(ndata, **kwargs) - elif type == 'interval' and steps_ahead != None: + elif type == 'interval' and steps_ahead > 1: ret = self.forecast_ahead_interval(ndata, steps_ahead, **kwargs) - elif type == 'distribution' and steps_ahead == None: + elif type == 'distribution' and (steps_ahead == None or steps_ahead == 1): ret = self.forecast_distribution(ndata, **kwargs) - elif type == 'distribution' and steps_ahead != None: + elif type == 'distribution' and steps_ahead > 1: ret = self.forecast_ahead_distribution(ndata, steps_ahead, **kwargs) else: raise ValueError('The argument \'type\' has an unknown value.')