Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""
2@file
3@brief Timeseries metrics.
4"""
5import numpy
8def ts_mape(expected_y, predicted_y, sample_weight=None):
9 """
10 Computes :math:`\\frac{\\sum_i | \\hat{Y_t} - Y_t |}
11 {\\sum_i | Y_t - Y_{t-1} |}`.
12 It compares the prediction to what a dummy
13 predictor would do by using the previous day
14 as a prediction.
16 @param expected_y expected values
17 @param predicted_y predictions
18 @return metrics
19 """
20 if len(expected_y) != len(predicted_y):
21 raise ValueError( # pragma: no cover
22 'Size mismatch {} != {}.'.format(
23 len(expected_y), len(predicted_y)))
24 expected_y = numpy.squeeze(expected_y)
25 predicted_y = numpy.squeeze(predicted_y)
26 mask = numpy.isnan(predicted_y)
27 mask2 = mask.copy()
28 mask2[1:] |= numpy.isnan(predicted_y[:-1])
29 expected_y = numpy.ma.masked_array(expected_y, mask=mask)
30 predicted_y = numpy.ma.masked_array(predicted_y, mask=mask2)
31 if sample_weight is None:
32 dy1 = numpy.sum(numpy.abs(expected_y[:-1] - expected_y[1:]))
33 dy2 = numpy.sum(numpy.abs(predicted_y[1:] - expected_y[1:]))
34 else:
35 dy1 = numpy.sum(
36 (numpy.abs(expected_y[:-1] - expected_y[1:]) * sample_weight[1:]))
37 dy2 = numpy.sum(
38 (numpy.abs(predicted_y[1:] - expected_y[1:]) * sample_weight[1:]))
39 dy1 = dy1.sum()
40 dy2 = dy2.sum()
41 if dy1 == 0:
42 return 0 if dy2 == 0 else numpy.infty
43 return dy2 / dy1