NSE and R2 return 1.0 when model values are NaN
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 72/100
調査の方向性
src/modelskill/metrics.py の nash_sutcliffe_efficiency から始めてください。入力に対して np.sum が適用されている箇所です。r2 も同じ経路を利用しています。Issue にある pandas Series の例で再現し、既に NaN を返す NumPy 配列での呼び出しと比較してください。モデル値が NaN のとき、両方の入力型で NaN が返り、既存のメトリクステストが引き続き通れば完了です。
索引モデルが issue の本文から書いたものです。
説明
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.
- 主要言語
- Python
- スター
- 58
- フォーク
- 9
- 平均マージ
- 28分
- マージ済み PR(30日)
- 1
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
DHI/modelskill のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
DHI/modelskill#628 ·
-
Follow-ups after network module integration対応中かも @jpalm3r が 12 日前に担当しました。 オープンenhancement
DHI/modelskill#718 · 担当者 1 名 ·
-
Vertical: z sign convention is guessed in plots and ignored in matching対応中かも @otzi5300 が 20 日前に担当しました。 オープンbug
DHI/modelskill#715 · 担当者 1 名 ·
-
bug
難易度 3/5 1〜2日 初心者へのやさしさ 76/100
DHI/modelskill#714 · リアクション 1 件 ·
-
bug
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
DHI/modelskill#713 ·
似ている issue
-
[Bug]: LangGraph Store sync put bypasses namespace validation対応中かも @ktz03 が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
volcengine/OpenViking#6050 ·
メンテナーはふだん 1 日以内に返信
-
[Bug]: Streamed /v1/chat/completions sends unredacted agent error text (keys) in the final chunk対応中かも @rodricksz4h5 が今日担当しました。 オープンarea/streaming comp/gateway P2 type/security
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
NousResearch/hermes-agent#138245 ·
メンテナーはふだん 1 日以内に返信
-
[oblt-aw][autodoc] Update user onboarding guide for mandatory trigger CODEOWNERS step対応中かも @github-actions が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
メンテナーはふだん 1 日以内に返信
-
correction metadata
難易度 2/5 1時間未満 初心者へのやさしさ 68/100
acl-org/acl-anthology#10378 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
cloudtrail_multi_region_enabled_logging_management_events fails when the advanced event selector has a custom name対応中かも @12YYCCYY16 が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
prowler-cloud/prowler#13033 ·
メンテナーはふだん 1 日以内に返信