Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
result (xarray object):
Verification metric over ``lead`` reduced by dimension(s) ``dim``.
"""
metric, comparison, dim = _get_metric_comparison_dim(
metric, comparison, dim, kind='hindcast'
)
hind = convert_time_index(hind, 'init', 'hind[init]')
verif = convert_time_index(verif, 'time', 'verif[time]')
has_valid_lead_units(hind)
forecast, verif = comparison.function(hind, verif, metric=metric)
# think in real time dimension: real time = init + lag
forecast = forecast.rename({'init': 'time'})
inits, verif_dates = return_inits_and_verif_dates(
forecast, verif, alignment=alignment
)
log_compute_hindcast_header(metric, comparison, dim, alignment)
metric_over_leads = [
_apply_metric_at_given_lead(
verif,
verif_dates,
lead,
hind=forecast,
inits=inits,
metric=metric,
comparison=comparison,
dim=dim,
**metric_kwargs,
'cannot compute persistence forecast.',
)
# If lead 0, need to make modifications to get proper persistence, since persistence
# at lead 0 is == 1.
if [0] in hind.lead.values:
hind = hind.copy()
with xr.set_options(keep_attrs=True): # keeps lead.attrs['units']
hind['lead'] = hind['lead'] + 1
n, freq = get_lead_cftime_shift_args(hind.lead.attrs['units'], 1)
# Shift backwards shift for lead zero.
hind['init'] = shift_cftime_index(hind, 'init', -1 * n, freq)
# temporarily change `init` to `time` for comparison to verification data time.
hind = hind.rename({'init': 'time'})
inits, verif_dates = return_inits_and_verif_dates(hind, verif, alignment=alignment)
plag = []
for i in hind.lead.values:
a = verif.sel(time=inits[i])
b = verif.sel(time=verif_dates[i])
a['time'] = b['time']
plag.append(
metric.function(a, b, dim='time', comparison=__e2c, **metric_kwargs)
)
pers = xr.concat(plag, 'lead')
pers['lead'] = hind.lead.values
# keep coords from hind
drop_dims = [d for d in hind.coords if d in CLIMPRED_DIMS]
if 'iteration' in hind.dims:
drop_dims += ['iteration']
pers = copy_coords_from_to(hind.drop_vars(drop_dims), pers)
hind = convert_time_index(hind, 'init', 'hind[init]')
uninit = convert_time_index(uninit, 'time', 'uninit[time]')
verif = convert_time_index(verif, 'time', 'verif[time]')
has_valid_lead_units(hind)
# get metric/comparison function name, not the alias
metric = METRIC_ALIASES.get(metric, metric)
comparison = COMPARISON_ALIASES.get(comparison, comparison)
comparison = get_comparison_class(comparison, HINDCAST_COMPARISONS)
metric = get_metric_class(metric, DETERMINISTIC_HINDCAST_METRICS)
forecast, verif = comparison.function(uninit, verif, metric=metric)
hind = hind.rename({'init': 'time'})
_, verif_dates = return_inits_and_verif_dates(hind, verif, alignment=alignment)
plag = []
# TODO: Refactor this, getting rid of `compute_uninitialized` completely.
# `same_verifs` does not need to go through the loop, since it's a fixed
# skill over all leads.
for i in hind['lead'].values:
# Ensure that the uninitialized reference has all of the
# dates for alignment.
dates = list(set(forecast['time'].values) & set(verif_dates[i]))
a = forecast.sel(time=dates)
b = verif.sel(time=dates)
a['time'] = b['time']
plag.append(
metric.function(a, b, dim='time', comparison=comparison, **metric_kwargs)
)
uninit_skill = xr.concat(plag, 'lead')
verif,
hist,
reference,
metric,
comparison,
alignment,
dim,
**metric_kwargs,
):
"""Interior verify func to be passed to apply func."""
metric, comparison, dim = _get_metric_comparison_dim(
metric, comparison, dim, kind=self.kind
)
forecast, verif = comparison.function(hind, verif, metric=metric)
forecast = forecast.rename({'init': 'time'})
inits, verif_dates = return_inits_and_verif_dates(
forecast, verif, alignment, reference=reference, hist=hist,
)
metric_over_leads = [
_apply_metric_at_given_lead(
verif,
verif_dates,
lead,
hind=forecast,
hist=hist,
inits=inits,
# Ensure apply metric function returns skill and not reference
# results.
reference=None,
metric=metric,
comparison=comparison,
dim=dim,