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