¿Cómo optimizar el código MAPE en Python?

Necesito tener una función MAPE, sin embargo, no pude encontrarla en paquetes estándar … A continuación, mi implementación de esta función.

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) 

No me gusta, es super no óptimo en términos de velocidad. ¿Cómo reescribir el código para que sea de forma más Pythonic y boost la velocidad?

Aquí hay un enfoque vectorizado con masking :

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

Probablemente uno más rápido con masking después del cálculo de division

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

Prueba de tiempo de ejecución –

 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