Source code for pyamr.core.regression.theilsens

##############################################################################
# Author: Bernard Hernandez
# Filename: 03-main-create-sari-idxs.py
# Description : This file contains differnent statistics used in time-series.
#               What it mainly does is to format the output of tests provided
#               by external libraries and return them in a dataframe.
#
# TODO: Move it to a module.
#
###############################################################################
# Forces decimals on divisions.
from __future__ import division

# Libraries
import sys
import numpy as np
import pandas as pd
import statsmodels.api as sm

# Import pyamr
from pyamr.core.regression.wregression import BaseRegressionWrapper


[docs]class TheilSensWrapper(BaseRegressionWrapper): # Attributes. _name = 'THEILSENS' # Label to add to the attributes when saving. # -------------------------------------------------------------------------- # HELPER METHODS # -------------------------------------------------------------------------- def _init_result(self, alpha=0.05): """This method set all the variables into this class. """ # Create series d = {} # Set results. d['slope'] = self._raw[0] d['intercept'] = self._raw[1] d['ci_lower'] = self._raw[2] d['ci_upper'] = self._raw[3] # Return return d
[docs] def as_summary(self, alpha=0.05): """This method displays the summary. """ # Create summary base summary = ' TheilSens Slope \n' summary += "==================================\n" summary += "slope: %23s\n" % str(round(self.slope, 4)) summary += "intercept: %23s\n" % str(round(self.intercept, 4)) summary += "ci_lower: %23s\n" % str(round(self.ci_lower, 4)) summary += "ci_upper: %23s\n" % str(round(self.ci_upper, 4)) summary += "==================================" # Return return summary
# -------------------------------------------------------------------------- # FIT # --------------------------------------------------------------------------
[docs] def fit(self, **kwargs): """This method.... Parameters ---------- x : y : alpha : Returns ------- object : A KendallWrapper objects. """ # Library. from scipy.stats.mstats import theilslopes # Save parameters. self._config.update(kwargs) self._conkwargs = self.fargs(self._config, theilslopes) # Compute theilsens slopes self._raw = theilslopes(**self._conkwargs) # Set series. self._result = self._init_result() # Compute residuals. x, y = kwargs['x'], kwargs['y'] self._resid = y - (x * self.slope + self.intercept) # return return self
[docs] def get_prediction(self, exog=None, start=None, end=None, **kwargs): """This method... Parameters ---------- exog : start : end : kwargs : Returns ------- """ # Create exogenous variable. if start is not None or end is not None: exog = self._exog(start, end) # Compute prediction forecast = exog * self.slope + self.intercept # Get plotting values. mean = forecast.reshape(1, -1) cilo = self.conf_int_insample(mean, alpha=0.05)[:, 0].reshape(1, -1) ciup = self.conf_int_insample(mean, alpha=0.05)[:, 1].reshape(1, -1) # Add time. time = exog.reshape(1, -1) # Get plotting values. return np.concatenate((time, mean, cilo, ciup), axis=0)
if __name__ == '__main__': # pragma: no cover # Libraries. import matplotlib.pyplot as plt # Set pandas configuration. pd.set_option('display.max_colwidth', 14) pd.set_option('display.width', 150) pd.set_option('display.precision', 4) # Constants length = 100 offset = 100 slope = 10 # Create timeseries. x = np.arange(length) y = np.random.rand(length) * slope + offset + x # Create object theilsens = TheilSensWrapper().fit(x=x, y=y) # Print series. print("\n") print(theilsens.as_series()) # Print summary. print("\n") print(theilsens.as_summary()) import sys sys.exit() # ----------------- # Save & Load # ----------------- # File location fname = '../../examples/saved/theilsens-sample.pickle' # Save theilsens.save(fname=fname) # Load theilsens = TheilSensWrapper().load(fname=fname) # ----------------- # Predictions # ----------------- # Variables. start, end, = 10, 70 # Compute predictions. preds = theilsens.get_prediction(start=start, end=end) # Plot truth values. plt.plot(x, y, color='#A6CEE3', alpha=0.5, marker='o', markeredgecolor='k', markeredgewidth=0.5, markersize=5, linewidth=0.75, label='Observed') # Plot forecasted values. plt.plot(preds[0, :], preds[1, :], color='#FF0000', alpha=1.00, linewidth=2.0, label=theilsens._identifier()) # Plot the confidence intervals. plt.fill_between(preds[0, :], preds[2, :], preds[3, :], color='r', alpha=0.1) # Legend plt.legend() # Grid search # ----------- # Grid parameters. grid_params = {'x': [x], 'y': [y], 'alpha': [0.05, 0.1]} # Get summary. summary = TheilSensWrapper().grid_search_dataframe(grid_params=grid_params) # Plot result (drop x which is an array to improve visualization). print(summary) # Show # plt.show()