climpred.metrics._rps

climpred.metrics._rps(forecast: xarray.Dataset, verif: xarray.Dataset, dim: Optional[Union[str, List[str]]] = None, **metric_kwargs: Any) xarray.Dataset[source]

Ranked Probability Score.

RPS(p, k) = \sum_{m=1}^{M} [(\sum_{k=1}^{m} p_k) - (\sum_{k=1}^{m} \
    o_k)]^{2}

Parameters
  • forecast – Forecasts.

  • verif – Verification.

  • dim – Dimensions to aggregate.

  • **metric_kwargs, see :py:func:`.xskillscore.rps`

Note

If category_edges is xr.Dataset or tuple of xr.Datasets, climpred will broadcast the grouped dimensions season, month, weekofyear, dayfofyear onto the dimensions init for forecast and time for observations. see climpred.utils.broadcast_time_grouped_to_time.

Notes

minimum

0.0

maximum

perfect

0.0

orientation

negative

Example

>>> category_edges = np.array([-0.5, 0.0, 0.5, 1.0])
>>> HindcastEnsemble.verify(
...     metric="rps",
...     comparison="m2o",
...     dim=["member", "init"],
...     alignment="same_verifs",
...     category_edges=category_edges,
... )
<xarray.Dataset>
Dimensions:                     (lead: 10)
Coordinates:
  * lead                        (lead) int32 1 2 3 4 5 6 7 8 9 10
    observations_category_edge  <U67 '[-np.inf, -0.5), [-0.5, 0.0), [0.0, 0.5...
    forecasts_category_edge     <U67 '[-np.inf, -0.5), [-0.5, 0.0), [0.0, 0.5...
    skill                       <U11 'initialized'
Data variables:
    SST                         (lead) float64 0.115 0.1123 ... 0.1687 0.1875
Attributes:
    prediction_skill_software:     climpred https://climpred.readthedocs.io/
    skill_calculated_by_function:  HindcastEnsemble.verify()
    number_of_initializations:     64
    number_of_members:             10
    alignment:                     same_verifs
    metric:                        rps
    comparison:                    m2o
    dim:                           ['member', 'init']
    reference:                     []
    category_edges:                [-0.5  0.   0.5  1. ]

Provide category_edges as xarray.Dataset for category edges varying along dimensions.

>>> category_edges = (
...     xr.DataArray([9.5, 10.0, 10.5, 11.0], dims="category_edge")
...     .assign_coords(category_edge=[9.5, 10.0, 10.5, 11.0])
...     .to_dataset(name="tos")
... )
>>> # category_edges = np.array([9.5, 10., 10.5, 11.]) # identical
>>> PerfectModelEnsemble.verify(
...     metric="rps",
...     comparison="m2c",
...     dim=["member", "init"],
...     category_edges=category_edges,
... )
<xarray.Dataset>
Dimensions:                     (lead: 20)
Coordinates:
  * lead                        (lead) int64 1 2 3 4 5 6 7 ... 15 16 17 18 19 20
    observations_category_edge  <U71 '[-np.inf, 9.5), [9.5, 10.0), [10.0, 10....
    forecasts_category_edge     <U71 '[-np.inf, 9.5), [9.5, 10.0), [10.0, 10....
Data variables:
    tos                         (lead) float64 0.08951 0.1615 ... 0.1399 0.2274
Attributes:
    prediction_skill_software:     climpred https://climpred.readthedocs.io/
    skill_calculated_by_function:  PerfectModelEnsemble.verify()
    number_of_initializations:     12
    number_of_members:             10
    metric:                        rps
    comparison:                    m2c
    dim:                           ['member', 'init']
    reference:                     []
    category_edges:                <xarray.Dataset>\nDimensions:        (cate...

Provide category_edges as tuple for different category edges to categorize forecasts and observations.

>>> q = [1 / 3, 2 / 3]  # terciles by month
>>> forecast_edges = (
...     HindcastEnsemble.get_initialized()
...     .groupby("init.month")
...     .quantile(q=q, dim=["init", "member"])
...     .rename({"quantile": "category_edge"})
... )
>>> obs_edges = (
...     HindcastEnsemble.get_observations()
...     .groupby("time.month")
...     .quantile(q=q, dim="time")
...     .rename({"quantile": "category_edge"})
... )
>>> category_edges = (obs_edges, forecast_edges)
>>> HindcastEnsemble.verify(
...     metric="rps",
...     comparison="m2o",
...     dim=["member", "init"],
...     alignment="same_verifs",
...     category_edges=category_edges,
... )
<xarray.Dataset>
Dimensions:                     (lead: 10)
Coordinates:
  * lead                        (lead) int32 1 2 3 4 5 6 7 8 9 10
    observations_category_edge  <U101 '[-np.inf, 0.3333333333333333), [0.3333...
    forecasts_category_edge     <U101 '[-np.inf, 0.3333333333333333), [0.3333...
    skill                       <U11 'initialized'
Data variables:
    SST                         (lead) float64 0.1248 0.1756 ... 0.3081 0.3413
Attributes:
    prediction_skill_software:     climpred https://climpred.readthedocs.io/
    skill_calculated_by_function:  HindcastEnsemble.verify()
    number_of_initializations:     64
    number_of_members:             10
    alignment:                     same_verifs
    metric:                        rps
    comparison:                    m2o
    dim:                           ['member', 'init']
    reference:                     []
    category_edges:                (<xarray.Dataset>\nDimensions:        (mon...