Hide keyboard shortcuts

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 

6 

7 

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. 

15 

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