Source code for gatspy.periodic.trended_lomb_scargle

from __future__ import division, print_function, absolute_import

__all__ = ['TrendedLombScargle']

import warnings

import numpy as np

from .modeler import PeriodicModeler
from .lomb_scargle import LombScargle


[docs]class TrendedLombScargle(LombScargle): """Trended Lomb-Scargle Periodogram Implementation This is a generalized periodogram implementation using the matrix formalism outlined in VanderPlas & Ivezic 2015. It fits both a floating mean and a trend parameter (as opposed to the `LombScargle` class, which fits only the mean). Parameters ---------- optimizer : PeriodicOptimizer instance Optimizer to use to find the best period. If not specified, the LinearScanOptimizer will be used. center_data : boolean (default = True) If True, then compute the weighted mean of the input data and subtract before fitting the model. fit_offset : boolean (default = True) If True, then fit a floating-mean sinusoid model. Nterms : int (default = 1) Number of Fourier frequencies to fit in the model regularization : float, vector or None (default = None) If specified, then add this regularization penalty to the least squares fit. regularize_by_trace : boolean (default = True) If True, multiply regularization by the trace of the matrix fit_period : bool (optional) If True, then fit for the best period when fit() method is called. optimizer_kwds : dict (optional) Dictionary of keyword arguments for constructing the optimizer. For example, silence optimizer output with `optimizer_kwds={"quiet": True}`. Examples -------- >>> rng = np.random.RandomState(0) >>> t = 100 * rng.rand(100) >>> dy = 0.1 >>> omega = 10 >>> slope = 2. >>> y = np.sin(omega * t) + slope * t + dy * rng.randn(100) >>> ls = TrendedLombScargle().fit(t, y, dy) >>> ls.optimizer.period_range = (0.2, 1.2) >>> ls.best_period Finding optimal frequency: - Estimated peak width = 0.0639 - Using 5 steps per peak; omega_step = 0.0128 - User-specified period range: 0.2 to 1.2 - Computing periods at 2051 steps Zooming-in on 5 candidate peaks: - Computing periods at 1000 steps 0.62827068275990694 >>> ls.predict([0, 0.5]) array([-0.01144474, 0.07567192]) See Also -------- LombScargle LombScargleAstroML LombScargleMultiband LombScargleMultibandFast """ def _construct_X(self, omega, weighted=True, **kwargs): """Construct the design matrix for the problem""" t = kwargs.get('t', self.t) dy = kwargs.get('dy', self.dy) fit_offset = kwargs.get('fit_offset', self.fit_offset) offsets = [] if fit_offset: offsets.append(np.ones(len(t))) offsets.append(t) # coefficients for trend parameter cols = sum(([np.sin((i + 1) * omega * t), np.cos((i + 1) * omega * t)] for i in range(self.Nterms)), offsets) if weighted: return np.transpose(np.vstack(cols) / dy) else: return np.transpose(np.vstack(cols))