From e629fe812c0534773aa84d4064ac7a9152321e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20L=C3=BCnenschlo=C3=9F?= <peter.luenenschloss@ufz.de> Date: Fri, 24 Feb 2023 13:05:19 +0100 Subject: [PATCH] fixed center index bug for polynomial fits to irregularly sampled data --- CHANGELOG.md | 1 + saqc/funcs/curvefit.py | 25 ++++--------------------- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 839310af7..ddd4980e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - python 3.7 support ### Fixed - Error for interpolations with limits set to be greater than 2 (`interpolateNANs`) +- Error when fitting polynomials to irregularly sampled data (`fitPolynomial`) ## [2.2.1](https://git.ufz.de/rdm-software/saqc/-/tags/v2.2.1) - 2022-10-29 [List of commits](https://git.ufz.de/rdm-software/saqc/-/compare/v2.2.0...v2.2.1) diff --git a/saqc/funcs/curvefit.py b/saqc/funcs/curvefit.py index 865550c8b..9261e2fcb 100644 --- a/saqc/funcs/curvefit.py +++ b/saqc/funcs/curvefit.py @@ -180,31 +180,14 @@ def _fitPolynomial( "sample series." ) # get interval centers - centers = ( - to_fit.rolling( - pd.Timedelta(window) / 2, closed="both", min_periods=min_periods - ).count() - ).floor() + centers = to_fit.rolling( + pd.Timedelta(window) / 2, closed="both", min_periods=min_periods + ).count() centers = centers.drop(centers[centers.isna()].index) centers = centers.astype(int) fitted = to_fit.rolling( - pd.Timedelta(window), closed="both", min_periods=min_periods + pd.Timedelta(window), closed="both", min_periods=min_periods, center=True ).apply(polyRollerIrregular, args=(centers, order)) - - def center_func(x, y=centers): - pos = x.index[int(len(x) - y[x.index[-1]])] - return y.index.get_loc(pos) - - centers_iloc = ( - centers.rolling(window, closed="both") - .apply(center_func, raw=False) - .astype(int) - ) - temp = fitted.copy() - for k in centers_iloc.iteritems(): - fitted.iloc[k[1]] = temp[k[0]] - fitted[fitted.index[0] : fitted.index[centers_iloc[0]]] = np.nan - fitted[fitted.index[centers_iloc[-1]] : fitted.index[-1]] = np.nan else: if isinstance(window, str): window = pd.Timedelta(window) // regular -- GitLab