def fit(self): # Get the input ............... y = self.inputs.y_eff mask = self.inputs._mask if mask is nomask: unmask = slice(None, None) else: unmask = logical_not(mask) # Get the parameters .......... model = self.model (np, ns, nt, nl) = (model.np, model.ns, model.nt, model.nl) (isdeg, itdeg, ildeg) = (model.isdeg, model.itdeg, model.ildeg) control = self.control (nsjump, ntjump, nljump) = (control.nsjump, control.ntjump, control.nljump) (ni, no) = (control.ni, control.no) # Compute the fit ............. (rw, szn, trn, work) = _stl.stl(y, np, ns, nt, nl, isdeg, itdeg, ildeg, nsjump, ntjump, nljump, ni, no) # Process the outputs ..... # ... set the values self.outputs.trend[unmask] = trn.flat self.outputs.seasonal[unmask] = szn.flat self.outputs.weights[unmask] = rw.flat self.outputs.residuals[unmask] = y - trn - szn # ... set the masks self.outputs.trend._set_mask(mask) self.outputs.seasonal._set_mask(mask) self.outputs.weights._set_mask(mask) self.outputs.residuals._set_mask(mask) # Clean up the mess ....... self.model.activated = self.control.activated = True del (trn, rw, szn) return self.outputs
def fit(self): # Get the input ............... y = self.inputs.y_eff mask = self.inputs._mask if mask is nomask: unmask = slice(None,None) else: unmask = logical_not(mask) # Get the parameters .......... model = self.model (np, ns, nt, nl) = (model.np, model.ns, model.nt, model.nl) (isdeg, itdeg, ildeg) = (model.isdeg, model.itdeg, model.ildeg) control = self.control (nsjump, ntjump, nljump) = (control.nsjump, control.ntjump, control.nljump) (ni, no) = (control.ni, control.no) # Compute the fit ............. (rw,szn,trn,work) = _stl.stl(y,np,ns,nt,nl,isdeg,itdeg,ildeg, nsjump,ntjump,nljump,ni,no,) # Process the outputs ..... #... set the values self.outputs.trend[unmask] = trn.flat self.outputs.seasonal[unmask] = szn.flat self.outputs.weights[unmask] = rw.flat self.outputs.residuals[unmask] = (y-trn-szn) #... set the masks self.outputs.trend._set_mask(mask) self.outputs.seasonal._set_mask(mask) self.outputs.weights._set_mask(mask) self.outputs.residuals._set_mask(mask) # Clean up the mess ....... self.model.activated = self.control.activated = True del(trn, rw, szn) return self.outputs
def fstl( y, np=12, ns=7, nt=None, nl=13, isdeg=1, itdeg=1, ildeg=1, nsjump=None, ntjump=None, nljump=None, robust=True, ni=None, no=None, ): """Decomposes a time series into seasonal and trend components. :Parameters: y : Numerical array Time Series to be decomposed. np : Integer *[12]* Period of the seasonal component. For example, if the time series is monthly with a yearly cycle, then np=12. ns : Integer *[7]* Length of the seasonal smoother. The value of ns should be an odd integer greater than or equal to 3. A value ns>6 is recommended. As ns increases the values of the seasonal component at a given point in the seasonal cycle (e.g., January values of a monthly series with a yearly cycle) become smoother. nt : Integer *[None]* Length of the trend smoother. The value of nt should be an odd integer greater than or equal to 3. A value of nt between 1.5*np and 2*np is recommended. As nt increases, the values of the trend component become smoother. If nt is None, it is estimated as the smallest odd integer greater or equal to (1.5*np)/[1-(1.5/ns)] nl : Integer *[None]* Length of the low-pass filter. The value of nl should be an odd integer greater than or equal to 3. The smallest odd integer greater than or equal to np is used by default. isdeg : Integer *[1]* Degree of locally-fitted polynomial in seasonal smoothing. The value is 0 or 1. itdeg : Integer *[1]* Degree of locally-fitted polynomial in trend smoothing. The value is 0 or 1. ildeg : Integer *[1]* Degree of locally-fitted polynomial in low-pass smoothing. The value is 0 or 1. nsjump : Integer *[None]* Skipping value for seasonal smoothing. The seasonal smoother skips ahead nsjump points and then linearly interpolates in between. The value of nsjump should be a positive integer; if nsjump=1, a seasonal smooth is calculated at all n points. To make the procedure run faster, a reasonable choice for nsjump is 10%-20% of ns. By default, nsjump= 0.1*ns. ntjump : Integer *[1]* Skipping value for trend smoothing. If None, ntjump= 0.1*nt nljump : Integer *[1]* Skipping value for low-pass smoothing. If None, nljump= 0.1*nl robust : Boolean *[True]* Flag indicating whether robust fitting should be performed. ni : Integer *[None]* Number of loops for updating the seasonal and trend components. The value of ni should be a positive integer. See the next argument for advice on the choice of ni. If ni is None, ni is set to 1 for robust fitting, to 5 otherwise. no : Integer *[0]* Number of iterations of robust fitting. The value of no should be a nonnegative integer. If the data are well behaved without outliers, then robustness iterations are not needed. In this case set no=0, and set ni=2 to 5 depending on how much security you want that the seasonal-trend looping converges. If outliers are present then no=3 is a very secure value unless the outliers are radical, in which case no=5 or even 10 might be better. If no>0 then set ni to 1 or 2. If None, then no is set to 15 for robust fitting, to 0 otherwise. Returns: A recarray of estimated trend values ('trend'), estimated seasonal components ('seasonal'), local robust weights ('weights') and fit residuals ('residuals'). The final local robust weights are all 1 if no=0. Reference --------- R. B. Cleveland, W. S. Cleveland, J. E. McRae and I. Terpenning. 1990. STL: A Seasonal-Trend Decomposition Procedure Based on LOESS (with Discussion). Journal of Official Statistics, 6:3-73. """ ns = max(ns, 3) if ns % 2 == 0: ns += 1 np = max(2, np) if nt is None: nt = max(int((1.5 * np / (1.0 - 1.5 / ns)) + 0.5), 3) if not nt % 2: nt += 1 if nl is None: nl = max(3, np) if not nl % 2: nl += 1 if nsjump is None: nsjump = int(0.1 * ns + 0.9) if ntjump is None: ntjump = int(0.1 * nt + 0.9) if nljump is None: nljump = int(0.1 * nl + 0.9) if robust: if ni is None: ni = 1 if no is None: no = 15 else: if ni is None: ni = 5 if no is None: no = 0 if hasattr(y, "_mask") and numpy.any(y._mask): raise ValueError, "Missing values should first be filled !" y = array(y, subok=True, copy=False).ravel() (rw, szn, trn, work) = _stl.stl(y, np, ns, nt, nl, isdeg, itdeg, ildeg, nsjump, ntjump, nljump, ni, no) dtyp = [("trend", float_), ("seasonal", float_), ("residuals", float_), ("weights", float_)] result = fromiter(zip(trn, szn, y - trn - szn, rw), dtype=dtyp) return result.view(recarray)
def stl(y, np=12, ns=7, nt=None, nl=13, isdeg=1, itdeg=1, ildeg=1, nsjump=None,ntjump=None,nljump=None, robust=True, ni=None,no=None): """Decomposes a time series into seasonal and trend components. :Parameters: y : Numerical array Time Series to be decomposed. np : Integer *[12]* Period of the seasonal component. For example, if the time series is monthly with a yearly cycle, then np=12. ns : Integer *[7]* Length of the seasonal smoother. The value of ns should be an odd integer greater than or equal to 3. A value ns>6 is recommended. As ns increases the values of the seasonal component at a given point in the seasonal cycle (e.g., January values of a monthly series with a yearly cycle) become smoother. nt : Integer *[None]* Length of the trend smoother. The value of nt should be an odd integer greater than or equal to 3. A value of nt between 1.5*np and 2*np is recommended. As nt increases, the values of the trend component become smoother. If nt is None, it is estimated as the smallest odd integer greater or equal to (1.5*np)/[1-(1.5/ns)] nl : Integer *[None]* Length of the low-pass filter. The value of nl should be an odd integer greater than or equal to 3. The smallest odd integer greater than or equal to np is used by default. isdeg : Integer *[1]* Degree of locally-fitted polynomial in seasonal smoothing. The value is 0 or 1. itdeg : Integer *[1]* Degree of locally-fitted polynomial in trend smoothing. The value is 0 or 1. ildeg : Integer *[1]* Degree of locally-fitted polynomial in low-pass smoothing. The value is 0 or 1. nsjump : Integer *[None]* Skipping value for seasonal smoothing. The seasonal smoother skips ahead nsjump points and then linearly interpolates in between. The value of nsjump should be a positive integer; if nsjump=1, a seasonal smooth is calculated at all n points. To make the procedure run faster, a reasonable choice for nsjump is 10%-20% of ns. By default, nsjump= 0.1*ns. ntjump : Integer *[1]* Skipping value for trend smoothing. If None, ntjump= 0.1*nt nljump : Integer *[1]* Skipping value for low-pass smoothing. If None, nljump= 0.1*nl robust : Boolean *[True]* Flag indicating whether robust fitting should be performed. ni : Integer *[None]* Number of loops for updating the seasonal and trend components. The value of ni should be a positive integer. See the next argument for advice on the choice of ni. If ni is None, ni is set to 1 for robust fitting, to 5 otherwise. no : Integer *[0]* Number of iterations of robust fitting. The value of no should be a nonnegative integer. If the data are well behaved without outliers, then robustness iterations are not needed. In this case set no=0, and set ni=2 to 5 depending on how much security you want that the seasonal-trend looping converges. If outliers are present then no=3 is a very secure value unless the outliers are radical, in which case no=5 or even 10 might be better. If no>0 then set ni to 1 or 2. If None, then no is set to 15 for robust fitting, to 0 otherwise. Returns: A recarray of estimated trend values ('trend'), estimated seasonal components ('seasonal'), local robust weights ('weights') and fit residuals ('residuals'). The final local robust weights are all 1 if no=0. Reference --------- R. B. Cleveland, W. S. Cleveland, J. E. McRae and I. Terpenning. 1990. STL: A Seasonal-Trend Decomposition Procedure Based on LOESS (with Discussion). Journal of Official Statistics, 6:3-73. """ ns = max(ns, 3) if ns%2 == 0: ns += 1 np = max(2, np) if nt is None: nt = max(int((1.5*np/(1.-1.5/ns))+0.5), 3) if not nt%2: nt += 1 if nl is None: nl = max(3,np) if not nl%2: nl += 1 if nsjump is None: nsjump = int(0.1*ns + 0.9) if ntjump is None: ntjump = int(0.1*nt + 0.9) if nljump is None: nljump = int(0.1*nl + 0.9) if robust: if ni is None: ni = 1 if no is None: no = 15 else: if ni is None: ni = 5 if no is None: no = 0 if hasattr(y,'_mask') and numpy.any(y._mask): raise ValueError,"Missing values should first be filled !" y = array(y, subok=True, copy=False).ravel() (rw,szn,trn,work) = _stl.stl(y,np,ns,nt,nl,isdeg,itdeg,ildeg, nsjump,ntjump,nljump,ni,no,) dtyp = [('trend', float_), ('seasonal', float_), ('residuals', float_), ('weights', float_)] result = fromiter(zip(trn,szn,y-trn-szn,rw), dtype=dtyp) return result.view(recarray)