diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 6cbb234..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,9 +0,0 @@ -image: alpine:latest - -pages: - stage: deploy - script: - - echo 'Nothing to do...' - artifacts: - paths: - - public diff --git a/drcstools/_modidx.py b/drcstools/_modidx.py index bfd0629..3ccafd2 100644 --- a/drcstools/_modidx.py +++ b/drcstools/_modidx.py @@ -95,6 +95,9 @@ d = { 'settings': { 'branch': 'master', 'drcstools.stats.normalize_0_to_1': ('stats.html#normalize_0_to_1', 'drcstools/stats.py'), 'drcstools.stats.normalize_from_minus_plus_one': ( 'stats.html#normalize_from_minus_plus_one', 'drcstools/stats.py'), - 'drcstools.stats.regression': ('stats.html#regression', 'drcstools/stats.py')}, + 'drcstools.stats.regression': ('stats.html#regression', 'drcstools/stats.py'), + 'drcstools.stats.segments_fit': ('stats.html#segments_fit', 'drcstools/stats.py')}, 'drcstools.storm': {}, - 'drcstools.tef': {}}} \ No newline at end of file + 'drcstools.tef': {}, + 'drcstools.wavelet': { 'drcstools.wavelet.wavelet_object': ('wavelet.html#wavelet_object', 'drcstools/wavelet.py'), + 'drcstools.wavelet.wavelet_object.__init__': ('wavelet.html#__init__', 'drcstools/wavelet.py')}}} \ No newline at end of file diff --git a/drcstools/stats.py b/drcstools/stats.py index 311a91e..29b4600 100644 --- a/drcstools/stats.py +++ b/drcstools/stats.py @@ -2,12 +2,13 @@ # %% auto 0 __all__ = ['normalize_from_minus_plus_one', 'normalize_0_to_1', 'regression', 'mean2', 'corr2', 'linear_regression_lag', - 'linear_trend', 'detrend_dim', 'detrend'] + 'segments_fit', 'linear_trend', 'detrend_dim', 'detrend'] # %% ../nbs/02_stats.ipynb 3 import xarray as xr import numpy as np from scipy import stats +from scipy import optimize import matplotlib.pyplot as plt # %% ../nbs/02_stats.ipynb 4 @@ -108,7 +109,31 @@ def linear_regression_lag(x, y, shiftx=0, shifty=0, dim = "time"): } ) -# %% ../nbs/02_stats.ipynb 21 +# %% ../nbs/02_stats.ipynb 18 +def segments_fit(X, Y, count): + xmin = X.min() + xmax = X.max() + + seg = np.full(count - 1, (xmax - xmin) / count) + + px_init = np.r_[np.r_[xmin, seg].cumsum(), xmax] + py_init = np.array([Y[np.abs(X - x) < (xmax - xmin) * 0.01].mean() for x in px_init]) + + def func(p): + seg = p[:count - 1] + py = p[count - 1:] + px = np.r_[np.r_[xmin, seg].cumsum(), xmax] + return px, py + + def err(p): + px, py = func(p) + Y2 = np.interp(X, px, py) + return np.mean((Y - Y2)**2) + + r = optimize.minimize(err, x0=np.r_[seg, py_init], method='Nelder-Mead') + return func(r.x) + +# %% ../nbs/02_stats.ipynb 22 def linear_trend(obj, dim): """Convenience wrapper for 'lag_linregress_3D'. Calculates the trend per given timestep. E.g. if the data is passed as yearly values, the @@ -120,14 +145,21 @@ def linear_trend(obj, dim): trend = linear_regression_lag(x, obj, dim=dim) return trend -# %% ../nbs/02_stats.ipynb 25 +# %% ../nbs/02_stats.ipynb 26 +def detrend_dim(da, dim, deg=1): + # detrend along a single dimension + p = da.polyfit(dim=dim, deg=deg) + fit = xr.polyval(da[dim], p.polyfit_coefficients) + return da - fit + +# %% ../nbs/02_stats.ipynb 30 def detrend_dim(da, dim, deg=1): # detrend along a single dimension p = da.polyfit(dim=dim, deg=deg) fit = xr.polyval(da[dim], p.polyfit_coefficients) return da - fit -# %% ../nbs/02_stats.ipynb 26 +# %% ../nbs/02_stats.ipynb 31 def detrend(da, dims, deg=1): """Linear along possible multiple dimensions diff --git a/drcstools/wavelet.py b/drcstools/wavelet.py new file mode 100644 index 0000000..ba4662f --- /dev/null +++ b/drcstools/wavelet.py @@ -0,0 +1,25 @@ +# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/11_wavelet.ipynb. + +# %% auto 0 +__all__ = ['wavelet_object'] + +# %% ../nbs/11_wavelet.ipynb 4 +class wavelet_object: + + def __init__(self, data, varname, timename="time", remove_trend = False): + self.N = data[varname].size + self.dt = 1 + self.t = np.arange(0, self.N) * self.dt + self.data = data[varname].values + self.time = data[timename] + if remove_trend == True: + p = np.polyfit(self.t, self.data, 1) + self.data = self.data - np.polyval(p, self.t) + self.std = self.data.std() + self.var = self.std ** 2 + self.data = (self.data - self.data.mean()) / self.std + self.mother = wavelet.Morlet(6) + self.s0 = 2 * self.dt + self.dj = 1 / 24 + self.J = 7 / self.dj + self.alpha, _, _ = wavelet.ar1(self.data) diff --git a/lfca_rco_trunc120_cutoff120.png b/lfca_rco_trunc120_cutoff120.png deleted file mode 100644 index db33ecf..0000000 Binary files a/lfca_rco_trunc120_cutoff120.png and /dev/null differ diff --git a/nbs/11_wavelet.ipynb b/nbs/11_wavelet.ipynb index 9d33752..db88b71 100644 --- a/nbs/11_wavelet.ipynb +++ b/nbs/11_wavelet.ipynb @@ -70,20 +70,6 @@ " self.J = 7 / self.dj\n", " self.alpha, _, _ = wavelet.ar1(self.data)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#| export\n", - "def cwt(wavelet_object):\n", - "\n", - " self.wave, self.scales, self.freqs, self.coi, self.fft, self.fftfreqs = wavelet.cwt(wavelet_object.data, self.dt, self.dj,\n", - " self.s0, self.J, self.mother)\n", - " self.iwave = wavelet.icwt(self.wave, self.scales, self.dt, self.dj, self.mother)" - ] } ], "metadata": { @@ -102,7 +88,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.6 | packaged by conda-forge | (main, Aug 22 2022, 20:41:22) [Clang 13.0.1 ]" }, "vscode": { "interpreter": { diff --git a/quarto-macos.pkg b/quarto-macos.pkg deleted file mode 100644 index 6804ec9..0000000 Binary files a/quarto-macos.pkg and /dev/null differ