NSE and R2 return 1.0 when model values are NaN
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 72/100
Línea de trabajo
Empieza en src/modelskill/metrics.py, en nash_sutcliffe_efficiency, donde np.sum se aplica a las entradas; r2 se basa en la misma ruta. Reproduce el problema con el ejemplo de pandas Series del issue y compáralo con la llamada con arrays de NumPy, que ya devuelve NaN. Está terminado cuando ambos tipos de entrada devuelven NaN para valores de modelo NaN y las pruebas existentes de métricas siguen pasando.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
nse and r2 return a perfect 1.0 when model values are missing. rmse, bias, mae, kge and cc return NaN for the same input.
import numpy as np, pandas as pd, modelskill as ms
t = pd.date_range("2026-01-01", periods=4, freq="h")
df = pd.DataFrame({"obs": [1.0, 2, 3, 4], "mod": [1.0, 2, np.nan, np.nan]}, index=t)
cmp = ms.from_matched(df, obs_item="obs")
print(cmp.skill(metrics=["nse", "rmse"]).to_dataframe())
# n nse rmse
# observation
# obs 4 1.0 NaN
df["mod"] = np.nan
print(ms.from_matched(df, obs_item="obs").score(metric="nse"))
# {'mod': 1.0}
The same happens calling the metric directly on pandas Series. With NumPy arrays it returns NaN:
obs = pd.Series([1.0, 2, 3, 4])
mod = pd.Series([1.0, 2, np.nan, np.nan])
ms.metrics.nse(obs, mod) # 1.0
ms.metrics.nse(obs.values, mod.values) # nan
Cause
nash_sutcliffe_efficiency uses np.sum on its inputs, which for a pandas Series skips NaN. The numerator then sums only the points where the model has a value, while the denominator sums every observation. The result is not the NSE of the non-missing points either; it overstates the fit, and an all-NaN model scores 1.0. r2 inherits it.
Expected
NaN, as the other metrics return. A model run that failed part-way, and so returns NaN after the failure, should not score as a perfect fit.
Converting the inputs with np.asarray before summing would make it consistent with the other metrics.
modelskill 1.4.0, numpy 2.4.6, pandas 2.3.3. The code is unchanged on main.
- Lenguaje dominante
- Python
- Estrellas
- 58
- Forks
- 9
- Merge medio
- 28 min
- PR fusionados (30 d)
- 1
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de DHI/modelskill
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
DHI/modelskill#628 ·
-
Follow-ups after network module integrationPosiblemente ocupada @jpalm3r la tomó hace 15 días. Abiertoenhancement
DHI/modelskill#718 · 1 asignado ·
-
Vertical: z sign convention is guessed in plots and ignored in matchingPosiblemente ocupada @otzi5300 la tomó hace 23 días. Abiertobug
DHI/modelskill#715 · 1 asignado ·
-
bug
Dificultad 3/5 1-2 días Aptitud para principiantes 76/100
DHI/modelskill#714 · 1 reacción ·
-
An already-validated Dataset silently discards x, y, item and the other constructor argumentsAbiertobug
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
DHI/modelskill#713 ·
Todos los issues de DHI/modelskill
Issues similares
-
`lvm_compact` has no self-hosted twin, and `docs/158` §5 says every language-face component mustAbiertobug sev-3 vm
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
sierra-research/tau2-bench#635 ·
Los mantenedores suelen responder en 1 día
-
The add-ssm-model skill requires a Cython simulator; the contributing guide allows Python onesPosiblemente ocupada @fmuia la tomó hoy. Abiertodocumentation skill
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
lnccbrown/ssm-simulators#406 ·
Los mantenedores suelen responder en 4 días
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 95/100
btclib-org/btclib-ecc#309 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
autowarefoundation/autoware_carla_scenario#281 ·
Los mantenedores suelen responder en 1 día