diff --git a/pyFTS/benchmarks/Measures.py b/pyFTS/benchmarks/Measures.py index 381ecdd..8bd1a41 100644 --- a/pyFTS/benchmarks/Measures.py +++ b/pyFTS/benchmarks/Measures.py @@ -5,14 +5,12 @@ pyFTS module for common benchmark metrics """ import time -import numba import numpy as np import pandas as pd from pyFTS.common import FuzzySet,SortedCollection from pyFTS.probabilistic import ProbabilityDistribution - def acf(data, k): """ Autocorrelation function estimative @@ -30,7 +28,6 @@ def acf(data, k): return 1/((n-k)*sigma)*s - def rmse(targets, forecasts): """ Root Mean Squared Error @@ -45,7 +42,6 @@ def rmse(targets, forecasts): return np.sqrt(np.nanmean((targets - forecasts) ** 2)) - def rmse_interval(targets, forecasts): """ Root Mean Squared Error diff --git a/pyFTS/benchmarks/benchmarks.py b/pyFTS/benchmarks/benchmarks.py index d0cbe91..af2c2eb 100644 --- a/pyFTS/benchmarks/benchmarks.py +++ b/pyFTS/benchmarks/benchmarks.py @@ -580,100 +580,9 @@ def print_interval_statistics(original, models): -def plot_interval(axis, intervals, order, label, color='red', typeonlegend=False, ls='-', linewidth=1): - lower = [kk[0] for kk in intervals] - upper = [kk[1] for kk in intervals] - mi = min(lower) * 0.95 - ma = max(upper) * 1.05 - for k in np.arange(0, order): - lower.insert(0, None) - upper.insert(0, None) - if typeonlegend: label += " (Interval)" - axis.plot(lower, color=color, label=label, ls=ls,linewidth=linewidth) - axis.plot(upper, color=color, ls=ls,linewidth=linewidth) - return [mi, ma] -def plot_compared_series(original, models, colors, typeonlegend=False, save=False, file=None, tam=[20, 5], - points=True, intervals=True, linewidth=1.5): - """ - Plot the forecasts of several one step ahead models, by point or by interval - :param original: Original time series data (list) - :param models: List of models to compare - :param colors: List of models colors - :param typeonlegend: Add the type of forecast (point / interval) on legend - :param save: Save the picture on file - :param file: Filename to save the picture - :param tam: Size of the picture - :param points: True to plot the point forecasts, False otherwise - :param intervals: True to plot the interval forecasts, False otherwise - :param linewidth: - :return: - """ - - fig = plt.figure(figsize=tam) - ax = fig.add_subplot(111) - - mi = [] - ma = [] - - legends = [] - - ax.plot(original, color='black', label="Original", linewidth=linewidth*1.5) - - for count, fts in enumerate(models, start=0): - try: - if fts.has_point_forecasting and points: - forecasts = fts.forecast(original) - if isinstance(forecasts, np.ndarray): - forecasts = forecasts.tolist() - mi.append(min(forecasts) * 0.95) - ma.append(max(forecasts) * 1.05) - for k in np.arange(0, fts.order): - forecasts.insert(0, None) - lbl = fts.shortname + str(fts.order if fts.is_high_order and not fts.benchmark_only else "") - if typeonlegend: lbl += " (Point)" - ax.plot(forecasts, color=colors[count], label=lbl, ls="-",linewidth=linewidth) - - if fts.has_interval_forecasting and intervals: - forecasts = fts.forecast_interval(original) - lbl = fts.shortname + " " + str(fts.order if fts.is_high_order and not fts.benchmark_only else "") - if not points and intervals: - ls = "-" - else: - ls = "--" - tmpmi, tmpma = plot_interval(ax, forecasts, fts.order, label=lbl, typeonlegend=typeonlegend, - color=colors[count], ls=ls, linewidth=linewidth) - mi.append(tmpmi) - ma.append(tmpma) - except ValueError as ex: - print(fts.shortname) - - handles0, labels0 = ax.get_legend_handles_labels() - lgd = ax.legend(handles0, labels0, loc=2, bbox_to_anchor=(1, 1)) - legends.append(lgd) - - # ax.set_title(fts.name) - ax.set_ylim([min(mi), max(ma)]) - ax.set_ylabel('F(T)') - ax.set_xlabel('T') - ax.set_xlim([0, len(original)]) - - #Util.show_and_save_image(fig, file, save, lgd=legends) - - -def plot_probability_distributions(pmfs, lcolors, tam=[15, 7]): - fig = plt.figure(figsize=tam) - ax = fig.add_subplot(111) - - for k,m in enumerate(pmfs,start=0): - m.plot(ax, color=lcolors[k]) - - handles0, labels0 = ax.get_legend_handles_labels() - ax.legend(handles0, labels0) - - def ahead_sliding_window(data, windowsize, train, steps, models=None, resolution = None, partitioners=[Grid.GridPartitioner], partitions=[10], max_order=3, transformation=None, indexer=None, dump=False, @@ -928,14 +837,18 @@ from pyFTS.common import Transformations -def plot_probabilitydistribution_density(ax, cmap, probabilitydist, fig, time_from): +def plot_distribution(ax, cmap, probabilitydist, fig, time_from, reference_data=None): from matplotlib.patches import Rectangle from matplotlib.collections import PatchCollection patches = [] colors = [] for ct, dt in enumerate(probabilitydist): + disp = 0.0 + if reference_data is not None: + disp = reference_data[time_from+ct] + for y in dt.bins: - s = Rectangle((time_from+ct, y), 1, dt.resolution, fill=True, lw = 0) + s = Rectangle((time_from+ct, y+disp), 1, dt.resolution, fill=True, lw = 0) patches.append(s) colors.append(dt.density(y)) scale = Transformations.Scale() @@ -949,6 +862,101 @@ def plot_probabilitydistribution_density(ax, cmap, probabilitydist, fig, time_fr cb.set_label('Density') +def plot_interval(axis, intervals, order, label, color='red', typeonlegend=False, ls='-', linewidth=1): + lower = [kk[0] for kk in intervals] + upper = [kk[1] for kk in intervals] + mi = min(lower) * 0.95 + ma = max(upper) * 1.05 + for k in np.arange(0, order): + lower.insert(0, None) + upper.insert(0, None) + if typeonlegend: label += " (Interval)" + axis.plot(lower, color=color, label=label, ls=ls,linewidth=linewidth) + axis.plot(upper, color=color, ls=ls,linewidth=linewidth) + return [mi, ma] + + + +def plot_compared_series(original, models, colors, typeonlegend=False, save=False, file=None, tam=[20, 5], + points=True, intervals=True, linewidth=1.5): + """ + Plot the forecasts of several one step ahead models, by point or by interval + :param original: Original time series data (list) + :param models: List of models to compare + :param colors: List of models colors + :param typeonlegend: Add the type of forecast (point / interval) on legend + :param save: Save the picture on file + :param file: Filename to save the picture + :param tam: Size of the picture + :param points: True to plot the point forecasts, False otherwise + :param intervals: True to plot the interval forecasts, False otherwise + :param linewidth: + :return: + """ + + fig = plt.figure(figsize=tam) + ax = fig.add_subplot(111) + + mi = [] + ma = [] + + legends = [] + + ax.plot(original, color='black', label="Original", linewidth=linewidth*1.5) + + for count, fts in enumerate(models, start=0): + try: + if fts.has_point_forecasting and points: + forecasts = fts.forecast(original) + if isinstance(forecasts, np.ndarray): + forecasts = forecasts.tolist() + mi.append(min(forecasts) * 0.95) + ma.append(max(forecasts) * 1.05) + for k in np.arange(0, fts.order): + forecasts.insert(0, None) + lbl = fts.shortname + str(fts.order if fts.is_high_order and not fts.benchmark_only else "") + if typeonlegend: lbl += " (Point)" + ax.plot(forecasts, color=colors[count], label=lbl, ls="-",linewidth=linewidth) + + if fts.has_interval_forecasting and intervals: + forecasts = fts.forecast_interval(original) + lbl = fts.shortname + " " + str(fts.order if fts.is_high_order and not fts.benchmark_only else "") + if not points and intervals: + ls = "-" + else: + ls = "--" + tmpmi, tmpma = plot_interval(ax, forecasts, fts.order, label=lbl, typeonlegend=typeonlegend, + color=colors[count], ls=ls, linewidth=linewidth) + mi.append(tmpmi) + ma.append(tmpma) + except ValueError as ex: + print(fts.shortname) + + handles0, labels0 = ax.get_legend_handles_labels() + lgd = ax.legend(handles0, labels0, loc=2, bbox_to_anchor=(1, 1)) + legends.append(lgd) + + # ax.set_title(fts.name) + ax.set_ylim([min(mi), max(ma)]) + ax.set_ylabel('F(T)') + ax.set_xlabel('T') + ax.set_xlim([0, len(original)]) + + #Util.show_and_save_image(fig, file, save, lgd=legends) + + +def plot_probability_distributions(pmfs, lcolors, tam=[15, 7]): + fig = plt.figure(figsize=tam) + ax = fig.add_subplot(111) + + for k,m in enumerate(pmfs,start=0): + m.plot(ax, color=lcolors[k]) + + handles0, labels0 = ax.get_legend_handles_labels() + ax.legend(handles0, labels0) + + + def plotCompared(original, forecasts, labels, title): fig = plt.figure(figsize=[13, 6]) ax = fig.add_subplot(111) diff --git a/pyFTS/models/pwfts.py b/pyFTS/models/pwfts.py index 57a37e0..99b0333 100644 --- a/pyFTS/models/pwfts.py +++ b/pyFTS/models/pwfts.py @@ -444,6 +444,7 @@ class ProbabilisticWeightedFTS(ifts.IntervalFTS): if 'bins' in kwargs: _bins = kwargs.pop('bins') + nbins = len(_bins) else: nbins = kwargs.get("num_bins", 100) _bins = np.linspace(uod[0], uod[1], nbins)