Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

NSE and R2 return 1.0 when model values are NaN

Abierto Apto para principiantes
#720 0 comentarios 0 reacciones 0 asignados Ver en GitHub

@syahra712 ya está trabajando en esto.

Desde el 17/10/2026.

  • #721 de @syahra712 — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
72/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
numpy, pandas, python
Área
analytics

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

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de DHI/modelskill

Todos los issues de DHI/modelskill

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.