Notes sur l'accélération du code Python avec Numba C'est une continuation ou un supplément.
pandas est pratique pour traiter les données de séries chronologiques, mais si vous utilisez l'instruction for telle quelle, elle sera extrêmement lente.
import numpy as np
import pandas as pd
dataM1 = pd.read_csv('DAT_ASCII_EURUSD_M1_2015.csv', sep=';',
names=('Time','Open','High','Low','Close', ''),
index_col='Time', parse_dates=True)
def LWMA(s, ma_period):
y = pd.Series(0.0, index=s.index)
for i in range(len(y)):
for j in range(ma_period):
y[i] += s[i-j]*(ma_period-j)
y[i] /= ma_period*(ma_period+1)/2
return y
%time MA = LWMA(dataM1['Close'], 10)
Wall time: 3min 10s
Le nombre de données est aussi grand que 370 000, mais il est difficile de prendre 3 minutes sur une moyenne mobile de 10 échantillons. Pour des périodes plus longues, cela peut prendre 10 minutes ou plus. (Core i7-6700 3,4 GHz)
Dans Article précédent, je l'ai remplacé par array et j'ai essayé de l'accélérer en utilisant Numba, mais en fait, ce sera plus rapide simplement en utilisant array.
def LWMA1(s, ma_period):
a = s.values
y = np.zeros(len(a))
for i in range(len(y)):
for j in range(ma_period):
y[i] += a[i-j]*(ma_period-j)
y[i] /= ma_period*(ma_period+1)/2
return pd.Series(y, index=s.index)
%timeit MA = LWMA1(dataM1['Close'], 10)
1 loop, best of 3: 1.92 s per loop
Même sans utiliser Numba, il est environ 100 fois plus rapide que les pandas.
Bien sûr, dans cet état, l'utilisation de Numba le rendra encore plus rapide.
from numba import jit
@jit
def LWMA2(s, ma_period):
a = s.values
y = np.zeros(len(a))
for i in range(len(y)):
for j in range(ma_period):
y[i] += a[i-j]*(ma_period-j)
y[i] /= ma_period*(ma_period+1)/2
return pd.Series(y, index=s.index)
%timeit MA = LWMA2(dataM1['Close'], 10)
100 loops, best of 3: 5.31 ms per loop
Même si vous utilisez l'instruction for dans les pandas, il est sage de le faire si elle peut être remplacée par array (l'index n'est pas pertinent). Il semble qu'une petite astuce soit nécessaire pour bien s'entendre avec les pandas.
Recommended Posts