From 7c57a17963dd99d115b0911479d646b31b5da388 Mon Sep 17 00:00:00 2001 From: Omesh37 Date: Sat, 11 Jul 2026 22:46:04 +0530 Subject: [PATCH 1/4] Fix divide-by-zero RuntimeWarning in quartic_restricted_r2 when y is constant --- pvanalytics/util/_fit.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pvanalytics/util/_fit.py b/pvanalytics/util/_fit.py index 65a61559..479be44a 100644 --- a/pvanalytics/util/_fit.py +++ b/pvanalytics/util/_fit.py @@ -127,4 +127,7 @@ def _quartic(x, a, b, c, e): ) model = _quartic(x, params[0], params[1], params[2], params[3]) residuals = y - model - return 1 - (np.sum(residuals**2) / np.sum((y - np.mean(y))**2)) + ss_tot = np.sum((y - np.mean(y))**2) + if ss_tot == 0: + return 0.0 + return 1 - (np.sum(residuals**2) / ss_tot) From e311ef2013977019ed3f83cc6cf1e3066d4e1b2d Mon Sep 17 00:00:00 2001 From: Omesh37 Date: Fri, 31 Jul 2026 09:15:16 +0530 Subject: [PATCH 2/4] BUG: suppress RuntimeWarning in snow.categorize and outliers.zscore GH#237 --- pvanalytics/features/snow.py | 2 +- pvanalytics/quality/outliers.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pvanalytics/features/snow.py b/pvanalytics/features/snow.py index c3b542db..a99f8cd2 100644 --- a/pvanalytics/features/snow.py +++ b/pvanalytics/features/snow.py @@ -224,7 +224,7 @@ def categorize(transmission, measured_voltage, modeled_voltage_with_snow_copy = np.where( transmission == 0, 0, modeled_voltage_with_snow) - with np.errstate(divide='ignore'): + with np.errstate(divide='ignore',invalid='ignore'): vmp_ratio =\ measured_voltage /\ modeled_voltage_with_snow_copy diff --git a/pvanalytics/quality/outliers.py b/pvanalytics/quality/outliers.py index 4efc140d..ead57f96 100644 --- a/pvanalytics/quality/outliers.py +++ b/pvanalytics/quality/outliers.py @@ -1,5 +1,6 @@ """Functions for identifying and labeling outliers.""" import pandas as pd +import numpy as np from scipy import stats from statsmodels import robust @@ -75,7 +76,8 @@ def zscore(data, zmax=1.5, nan_policy='raise'): "nan_policy. Expected 'raise' or 'omit'.") is_outlier = pd.Series(False, index=data.index) - is_outlier.loc[~nan_mask] = abs(stats.zscore(data[~nan_mask])) > zmax + with np.errstate(invalid='ignore'): + is_outlier.loc[~nan_mask] = abs(stats.zscore(data[~nan_mask])) > zmax return is_outlier From 732783538ba2e39f8423f75de8e1520a56d4bac1 Mon Sep 17 00:00:00 2001 From: Omesh37 Date: Fri, 31 Jul 2026 09:27:14 +0530 Subject: [PATCH 3/4] DOC: add whatsnew entry for RuntimeWarning fixes GH#XXX --- docs/whatsnew/v0.2.3.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/whatsnew/v0.2.3.rst b/docs/whatsnew/v0.2.3.rst index 216f9f59..d309d726 100644 --- a/docs/whatsnew/v0.2.3.rst +++ b/docs/whatsnew/v0.2.3.rst @@ -15,6 +15,10 @@ Bug Fixes * Remove freq parameter from :py:func:`pvanalytics.quality.gaps.completeness` and :py:func:`pvanalytics.quality.gaps.completeness_score`. Frequency is now always calculated from the input data's DatetimeIndex. (:pull:`236`) +* Suppress divide-by-zero warnings in + :mod:`pvanalytics.features.snow` and precision-loss warnings in + :mod:`pvanalytics.quality.outliers` by extending ``np.errstate`` to +include ``invalid='ignore'``. (:issue:`#237`, :pull:`YYY`) Requirements ~~~~~~~~~~~~ @@ -39,3 +43,4 @@ Testing Contributors ~~~~~~~~~~~~ * Cliff Hansen (:ghuser:`cwhanse`) +* Omesh Chandure (:ghuser: `Omesh37`) \ No newline at end of file From 3eaa7e5c01fa0b372862f18e2ed326dd5dae8791 Mon Sep 17 00:00:00 2001 From: Omesh37 Date: Fri, 31 Jul 2026 09:34:12 +0530 Subject: [PATCH 4/4] FLAKE8 --- pvanalytics/features/snow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvanalytics/features/snow.py b/pvanalytics/features/snow.py index a99f8cd2..84c98c37 100644 --- a/pvanalytics/features/snow.py +++ b/pvanalytics/features/snow.py @@ -224,7 +224,7 @@ def categorize(transmission, measured_voltage, modeled_voltage_with_snow_copy = np.where( transmission == 0, 0, modeled_voltage_with_snow) - with np.errstate(divide='ignore',invalid='ignore'): + with np.errstate(divide='ignore', invalid='ignore'): vmp_ratio =\ measured_voltage /\ modeled_voltage_with_snow_copy