2017-02-15 94 views
3

我需要一個MAPE函數,但是我無法在標準包中找到它...下面是我的這個函數的實現。如何優化Python中的MAPE代碼?

def mape(actual, predict): 
    tmp, n = 0.0, 0 
    for i in range(0, len(actual)): 
     if actual[i] <> 0: 
      tmp += math.fabs(actual[i]-predict[i])/actual[i] 
      n += 1 
    return (tmp/n) 

我不喜歡它,它在速度方面超級不是最佳。如何將代碼重寫爲Pythonic方式並提高速度?

回答

3

下面是與masking一個量化的方法 - 後division計算

def mape_vectorized(a, b): 
    mask = a <> 0 
    return (np.fabs(a[mask] - b[mask])/a[mask]).mean() 

可能是更快的一個與masking -

def mape_vectorized_v2(a, b): 
    mask = a <> 0 
    return (np.fabs(a - b)/a)[mask].mean() 

運行測試 -

In [217]: a = np.random.randint(-10,10,(10000)) 
    ...: b = np.random.randint(-10,10,(10000)) 
    ...: 

In [218]: %timeit mape(a,b) 
100 loops, best of 3: 11.7 ms per loop 

In [219]: %timeit mape_vectorized(a,b) 
1000 loops, best of 3: 273 µs per loop 

In [220]: %timeit mape_vectorized_v2(a,b) 
1000 loops, best of 3: 220 µs per loop