pyFTS/benchmarks/ResidualAnalysis.py

131 lines
3.4 KiB
Python
Raw Normal View History

2017-01-20 05:24:44 +04:00
#!/usr/bin/python
# -*- coding: utf8 -*-
"""Residual Analysis methods"""
2017-01-20 05:24:44 +04:00
import numpy as np
import pandas as pd
import matplotlib as plt
import matplotlib.pyplot as plt
2017-01-20 19:49:44 +04:00
from pyFTS.common import Transformations,Util
from pyFTS.benchmarks import Measures
from scipy import stats
2017-01-20 05:24:44 +04:00
def residuals(targets, forecasts, order=1):
"""First order residuals"""
return np.array(targets[order:]) - np.array(forecasts[:-1])
def ChiSquared(q,h):
"""
Chi-Squared value
:param q:
:param h:
:return:
"""
p = stats.chi2.sf(q, h)
return p
def compareResiduals(data, models):
"""
Compare residual's statistics of several models
:param data:
:param models:
:return:
"""
ret = "Model & Order & Mean & STD & Box-Pierce & Box-Ljung & P-value \\\\ \n"
for mfts in models:
forecasts = mfts.forecast(data)
res = residuals(data, forecasts, mfts.order)
mu = np.mean(res)
sig = np.std(res)
ret += mfts.shortname + " & "
ret += str(mfts.order) + " & "
ret += str(round(mu,2)) + " & "
ret += str(round(sig,2)) + " & "
q1 = Measures.BoxPierceStatistic(res, 10)
ret += str(round(q1,2)) + " & "
q2 = Measures.BoxLjungStatistic(res, 10)
ret += str(round(q2,2)) + " & "
ret += str(ChiSquared(q2, 10))
ret += " \\\\ \n"
return ret
def plotResiduals(targets, models, tam=[8, 8], save=False, file=None):
"""
Plot residuals and statistics
:param targets:
:param models:
:param tam:
:param save:
:param file:
:return:
"""
fig, axes = plt.subplots(nrows=len(models), ncols=3, figsize=tam)
for c, mfts in enumerate(models):
if len(models) > 1:
ax = axes[c]
else:
ax = axes
forecasts = mfts.forecast(targets)
res = residuals(targets,forecasts,mfts.order)
mu = np.mean(res)
sig = np.std(res)
ax[0].set_title("Residuals Mean=" + str(mu) + " STD = " + str(sig))
ax[0].set_ylabel('E')
ax[0].set_xlabel('T')
ax[0].plot(res)
ax[1].set_title("Residuals Autocorrelation")
ax[1].set_ylabel('ACS')
ax[1].set_xlabel('Lag')
ax[1].acorr(res)
ax[2].set_title("Residuals Histogram")
ax[2].set_ylabel('Freq')
ax[2].set_xlabel('Bins')
ax[2].hist(res)
c += 1
plt.tight_layout()
2017-01-20 05:24:44 +04:00
2017-01-20 19:49:44 +04:00
Util.showAndSaveImage(fig, file, save)
def plot_residuals(targets, models, tam=[8, 8], save=False, file=None):
fig, axes = plt.subplots(nrows=len(models), ncols=3, figsize=tam)
for c, mfts in enumerate(models, start=0):
if len(models) > 1:
ax = axes[c]
else:
ax = axes
forecasts = mfts.forecast(targets)
res = residuals(targets, forecasts, mfts.order)
mu = np.mean(res)
sig = np.std(res)
if c == 0: ax[0].set_title("Residuals", size='large')
ax[0].set_ylabel(mfts.shortname, size='large')
ax[0].set_xlabel(' ')
ax[0].plot(res)
if c == 0: ax[1].set_title("Residuals Autocorrelation", size='large')
ax[1].set_ylabel('ACS')
ax[1].set_xlabel('Lag')
ax[1].acorr(res)
if c == 0: ax[2].set_title("Residuals Histogram", size='large')
ax[2].set_ylabel('Freq')
ax[2].set_xlabel('Bins')
ax[2].hist(res)
plt.tight_layout()
Util.showAndSaveImage(fig, file, save)