Source code for dpyverification.scores.continuous
"""
Continuous verification scores.
For verification of non-probabilistic (deterministic) forecasts, and historical simulations of
continuous variables.
For reference, see: https://scores.readthedocs.io/en/stable/included.html#continuous.
"""
from collections.abc import Callable
from typing import TYPE_CHECKING, ClassVar
import xarray as xr
from scores.continuous import ( # type:ignore[import-untyped]
additive_bias,
kge,
mae,
mean_error,
mse,
rmse,
)
from dpyverification.configuration.default.scores import ContinuousScoresConfig
from dpyverification.constants import DataType, SupportedContinuousScore
from dpyverification.scores.base import BaseScore
if TYPE_CHECKING:
from dpyverification.scores.utils import ScoreFunc
score_funcs: dict[SupportedContinuousScore, Callable] = {
SupportedContinuousScore.additive_bias: additive_bias, # type:ignore[misc]
SupportedContinuousScore.kge: kge, # type:ignore[misc]
SupportedContinuousScore.mae: mae, # type:ignore[misc]
SupportedContinuousScore.mse: mse, # type:ignore[misc]
SupportedContinuousScore.rmse: rmse, # type:ignore[misc]
SupportedContinuousScore.mean_error: mean_error, # type:ignore[misc]
}
__all__ = [
"ContinuousScores",
"ContinuousScoresConfig",
]
[docs]
class ContinuousScores(BaseScore):
"""Implementation for CRPS for probabilistic forecasts, expressed as cdf."""
kind = "continuous_scores"
config_class = ContinuousScoresConfig
supported_data_types: ClassVar[set[DataType]] = {
DataType.simulated_forecast_single,
}
def __init__(self, config: ContinuousScoresConfig) -> None:
self.config: ContinuousScoresConfig = config
[docs]
def compute(
self,
obs: xr.DataArray,
sim: xr.DataArray,
) -> xr.Dataset:
"""Compute any number of continous scores."""
results: list[xr.DataArray | xr.Dataset] = []
for score in self.config.scores:
func: ScoreFunc = score_funcs[score] # type:ignore[misc]
result = func(fcst=sim, obs=obs, reduce_dims=self.config.reduce_dims)
result.name = func.__qualname__ # type:ignore[attr-defined]
results.append(result)
return xr.merge(results)