pyFTS/pyFTS/notebooks/Sadaei et Al - ExponentialyWeightedFTS.ipynb
2018-02-27 18:30:20 -03:00

313 KiB
Raw Blame History

First Order Exponentialy Weighted Fuzzy Time Series by Sadaei et al. (2013)

H. J. Sadaei, R. Enayatifar, A. H. Abdullah, and A. Gani, “Short-term load forecasting using a hybrid model with a refined exponentially weighted fuzzy time series and an improved harmony search,” Int. J. Electr. Power Energy Syst., vol. 62, no. from 2005, pp. 118129, 2014.

Common Imports

In [1]:
import matplotlib.pylab as plt
from pyFTS.benchmarks import benchmarks as bchmk
from pyFTS.models import sadaei

%pylab inline
/usr/local/lib/python3.6/dist-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.
  from pandas.core import datetools
Populating the interactive namespace from numpy and matplotlib
/usr/lib/python3/dist-packages/IPython/core/magics/pylab.py:161: UserWarning: pylab import has clobbered these variables: ['plt']
`%matplotlib` prevents importing * from pylab and numpy
  "\n`%matplotlib` prevents importing * from pylab and numpy"

Data Loading

In [2]:
from pyFTS.data import Enrollments

enrollments = Enrollments.get_data()

Exploring the partitioning effects on original data

In [17]:
# Parameter c = 1.1
tmp = bchmk.simpleSearch_RMSE(enrollments, enrollments, sadaei.ExponentialyWeightedFTS, 
                              range(4,20), [1], tam=[10, 5], parameters=1.1)
In [16]:
# Parameter c = 2
tmp = bchmk.simpleSearch_RMSE(enrollments, enrollments, sadaei.ExponentialyWeightedFTS, 
                              range(4,20), [1], tam=[10, 5], parameters=2.0)

Exploring the partitioning effects on transformed data

In [19]:
from pyFTS.common import Transformations
diff = Transformations.Differential(1)

tmp = bchmk.simpleSearch_RMSE(enrollments, enrollments, sadaei.ExponentialyWeightedFTS, 
                              range(2,10), [1], transformation=diff, tam=[10, 5], parameters=1.1)
In [20]:
tmp = bchmk.simpleSearch_RMSE(enrollments, enrollments, sadaei.ExponentialyWeightedFTS, 
                              range(2,10), [1], transformation=diff, tam=[10, 5], parameters=2)

Comparing the partitioning schemas

In [7]:
from pyFTS.partitioners import Grid, Util as pUtil

fuzzy_sets = Grid.GridPartitioner(enrollments, 8)
fuzzy_sets2 = Grid.GridPartitioner(enrollments, 4, transformation=diff)

pUtil.plot_partitioners(enrollments, [fuzzy_sets,fuzzy_sets2])

Fitting a model on original data

In [8]:
model1 = sadaei.ExponentialyWeightedFTS("FTS", partitioner=fuzzy_sets, c=1.1)
model1.fit(enrollments)

print(model1)
Exponentialy Weighted FTS:
A1 -> A2(1.0)
A2 -> A2(0.30211480362537757),A2(0.33232628398791536),A3(0.36555891238670696)
A3 -> A3(0.08744401757481343),A3(0.09618841933229477),A3(0.10580726126552426),A3(0.1163879873920767),A3(0.12802678613128438),A3(0.14082946474441282),A4(0.15491241121885413),A4(0.17040365234073956)
A4 -> A3(0.16379748079474535),A4(0.18017722887421989),A4(0.1981949517616419),A4(0.2180144469378061),A5(0.23981589163158673)
A5 -> A6(1.0)
A6 -> A6(0.30211480362537757),A6(0.33232628398791536),A6(0.36555891238670696)

Fitting a model on transformed data

In [9]:
model2 = sadaei.ExponentialyWeightedFTS("FTS Diff", partitioner=fuzzy_sets2, c=1.1)
model2.append_transformation(diff)
model2.fit(enrollments)

print(model2)
Exponentialy Weighted FTS:
A0 -> A1(1.0)
A1 -> A0(0.10540549970059566),A1(0.11594604967065524),A1(0.12754065463772077),A2(0.14029472010149285),A2(0.15432419211164214),A2(0.16975661132280637),A3(0.18673227245508703)
A2 -> A1(0.07364053907434345),A1(0.08100459298177781),A1(0.08910505227995559),A1(0.09801555750795117),A2(0.10781711325874628),A2(0.11859882458462091),A3(0.13045870704308302),A3(0.14350457774739134),A3(0.1578550355221305)
A3 -> A2(0.21547080370609778),A2(0.23701788407670757),A2(0.26071967248437833),A3(0.28679163973281624)

Using the models

In [10]:
model1.predict(enrollments)
Out[10]:
[14129.8,
 14564.869939577038,
 14564.869939577038,
 14564.869939577038,
 15661.27507002801,
 15661.27507002801,
 15661.27507002801,
 15661.27507002801,
 16559.635161586215,
 16559.635161586215,
 16559.635161586215,
 15661.27507002801,
 15661.27507002801,
 15661.27507002801,
 15661.27507002801,
 16559.635161586215,
 16559.635161586215,
 18890.399999999998,
 18890.399999999994,
 18890.399999999994,
 18890.399999999994,
 18890.399999999994]
In [11]:
model2.predict(enrollments)
Out[11]:
[12870.91127138479,
 13080.342728533089,
 13682.91127138479,
 14213.342728533089,
 14977.342728533089,
 15272.594096099978,
 15418.91127138479,
 15676.91127138479,
 16324.342728533089,
 16734.91127138479,
 16349.594096099978,
 15394.594096099978,
 15312.91127138479,
 15106.594096099978,
 14978.91127138479,
 15501.342728533089,
 16376.342728533089,
 17347.55,
 18487.34272853309,
 19143.91127138479,
 19152.91127138479,
 18837.59409609998]

Comparing the models

In [12]:
bchmk.plot_compared_series(enrollments, [model1, model2], bchmk.colors, intervals=False)
In [13]:
bchmk.print_point_statistics(enrollments, [model1, model2])
Model		& Order     & RMSE		& SMAPE      & Theil's U		\\ 
EWFTS		& 1		& 624.71		& 1.5		& 1.02	\\ 
EWFTS		& 1		& 877.76		& 2.27		& 1.43	\\ 

Residual Analysis

In [14]:
from pyFTS.benchmarks import ResidualAnalysis as ra

ra.plot_residuals(enrollments, [model1, model2])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/usr/lib/python3/dist-packages/IPython/core/formatters.py in __call__(self, obj)
    305                 pass
    306             else:
--> 307                 return printer(obj)
    308             # Finally look for special method names
    309             method = get_real_method(obj, self.print_method)

/usr/lib/python3/dist-packages/IPython/core/pylabtools.py in <lambda>(fig)
    225 
    226     if 'png' in formats:
--> 227         png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png', **kwargs))
    228     if 'retina' in formats or 'png2x' in formats:
    229         png_formatter.for_type(Figure, lambda fig: retina_figure(fig, **kwargs))

/usr/lib/python3/dist-packages/IPython/core/pylabtools.py in print_figure(fig, fmt, bbox_inches, **kwargs)
    117 
    118     bytes_io = BytesIO()
--> 119     fig.canvas.print_figure(bytes_io, **kw)
    120     data = bytes_io.getvalue()
    121     if fmt == 'svg':

/usr/local/lib/python3.6/dist-packages/matplotlib/backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)
   2214                     orientation=orientation,
   2215                     dryrun=True,
-> 2216                     **kwargs)
   2217                 renderer = self.figure._cachedRenderer
   2218                 bbox_inches = self.figure.get_tightbbox(renderer)

/usr/local/lib/python3.6/dist-packages/matplotlib/backends/backend_agg.py in print_png(self, filename_or_obj, *args, **kwargs)
    505 
    506     def print_png(self, filename_or_obj, *args, **kwargs):
--> 507         FigureCanvasAgg.draw(self)
    508         renderer = self.get_renderer()
    509         original_dpi = renderer.dpi

/usr/local/lib/python3.6/dist-packages/matplotlib/backends/backend_agg.py in draw(self)
    428             # if toolbar:
    429             #     toolbar.set_cursor(cursors.WAIT)
--> 430             self.figure.draw(self.renderer)
    431         finally:
    432             # if toolbar:

/usr/local/lib/python3.6/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     53                 renderer.start_filter()
     54 
---> 55             return draw(artist, renderer, *args, **kwargs)
     56         finally:
     57             if artist.get_agg_filter() is not None:

/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py in draw(self, renderer)
   1297 
   1298             mimage._draw_list_compositing_images(
-> 1299                 renderer, self, artists, self.suppressComposite)
   1300 
   1301             renderer.close_group('figure')

/usr/local/lib/python3.6/dist-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    136     if not_composite or not has_images:
    137         for a in artists:
--> 138             a.draw(renderer)
    139     else:
    140         # Composite any adjacent images together

/usr/local/lib/python3.6/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     53                 renderer.start_filter()
     54 
---> 55             return draw(artist, renderer, *args, **kwargs)
     56         finally:
     57             if artist.get_agg_filter() is not None:

/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py in draw(self, renderer, inframe)
   2435             renderer.stop_rasterizing()
   2436 
-> 2437         mimage._draw_list_compositing_images(renderer, self, artists)
   2438 
   2439         renderer.close_group('axes')

/usr/local/lib/python3.6/dist-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    136     if not_composite or not has_images:
    137         for a in artists:
--> 138             a.draw(renderer)
    139     else:
    140         # Composite any adjacent images together

/usr/local/lib/python3.6/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     53                 renderer.start_filter()
     54 
---> 55             return draw(artist, renderer, *args, **kwargs)
     56         finally:
     57             if artist.get_agg_filter() is not None:

/usr/local/lib/python3.6/dist-packages/matplotlib/axis.py in draw(self, renderer, *args, **kwargs)
   1131         renderer.open_group(__name__)
   1132 
-> 1133         ticks_to_draw = self._update_ticks(renderer)
   1134         ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw,
   1135                                                                 renderer)

/usr/local/lib/python3.6/dist-packages/matplotlib/axis.py in _update_ticks(self, renderer)
    972 
    973         interval = self.get_view_interval()
--> 974         tick_tups = list(self.iter_ticks())
    975         if self._smart_bounds and tick_tups:
    976             # handle inverted limits

/usr/local/lib/python3.6/dist-packages/matplotlib/axis.py in iter_ticks(self)
    915         Iterate through all of the major and minor ticks.
    916         """
--> 917         majorLocs = self.major.locator()
    918         majorTicks = self.get_major_ticks(len(majorLocs))
    919         self.major.formatter.set_locs(majorLocs)

/usr/local/lib/python3.6/dist-packages/matplotlib/ticker.py in __call__(self)
   1951     def __call__(self):
   1952         vmin, vmax = self.axis.get_view_interval()
-> 1953         return self.tick_values(vmin, vmax)
   1954 
   1955     def tick_values(self, vmin, vmax):

/usr/local/lib/python3.6/dist-packages/matplotlib/ticker.py in tick_values(self, vmin, vmax)
   1959         vmin, vmax = mtransforms.nonsingular(
   1960             vmin, vmax, expander=1e-13, tiny=1e-14)
-> 1961         locs = self._raw_ticks(vmin, vmax)
   1962 
   1963         prune = self._prune

/usr/local/lib/python3.6/dist-packages/matplotlib/ticker.py in _raw_ticks(self, vmin, vmax)
   1901         if self._nbins == 'auto':
   1902             if self.axis is not None:
-> 1903                 nbins = np.clip(self.axis.get_tick_space(),
   1904                                 max(1, self._min_n_ticks - 1), 9)
   1905             else:

/usr/local/lib/python3.6/dist-packages/matplotlib/axis.py in get_tick_space(self)
   2060         size = tick.label1.get_size() * 3
   2061         if size > 0:
-> 2062             return int(np.floor(length / size))
   2063         else:
   2064             return 2**31 - 1

ValueError: cannot convert float NaN to integer
<matplotlib.figure.Figure at 0x7f65562d7ba8>
In [ ]:

In [ ]: