Source code for mlinsights.timeseries.metrics
"""
Timeseries metrics.
:githublink:`%|py|5`
"""
import numpy
[docs]def ts_mape(expected_y, predicted_y, sample_weight=None):
"""
Computes :math:`\\frac{\\sum_i | \\hat{Y_t} - Y_t |}
{\\sum_i | Y_t - Y_{t-1} |}`.
It compares the prediction to what a dummy
predictor would do by using the previous day
as a prediction.
:param expected_y: expected values
:param predicted_y: predictions
:return: metrics
:githublink:`%|py|19`
"""
if len(expected_y) != len(predicted_y):
raise ValueError( # pragma: no cover
'Size mismatch {} != {}.'.format(
len(expected_y), len(predicted_y)))
expected_y = numpy.squeeze(expected_y)
predicted_y = numpy.squeeze(predicted_y)
mask = numpy.isnan(predicted_y)
mask2 = mask.copy()
mask2[1:] |= numpy.isnan(predicted_y[:-1])
expected_y = numpy.ma.masked_array(expected_y, mask=mask)
predicted_y = numpy.ma.masked_array(predicted_y, mask=mask2)
if sample_weight is None:
dy1 = numpy.sum(numpy.abs(expected_y[:-1] - expected_y[1:]))
dy2 = numpy.sum(numpy.abs(predicted_y[1:] - expected_y[1:]))
else:
dy1 = numpy.sum(
(numpy.abs(expected_y[:-1] - expected_y[1:]) * sample_weight[1:]))
dy2 = numpy.sum(
(numpy.abs(predicted_y[1:] - expected_y[1:]) * sample_weight[1:]))
dy1 = dy1.sum()
dy2 = dy2.sum()
if dy1 == 0:
return 0 if dy2 == 0 else numpy.infty
return dy2 / dy1