2017-02-15 5 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) 

私はそれが好きではありませんが、スピードの点では最適ではありません。よりPythonの方法と速度を高めるためにコードを書き換えるには?

答えて

3

ここmaskingと1つのベクトル化のアプローチだ -

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 

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

division演算後maskingとおそらく速く1

関連する問題