Hinweise zur Beschleunigung des Python-Codes mit Numba Es ist eine Fortsetzung oder eine Ergänzung.
pandas ist praktisch für die Verarbeitung von Zeitreihendaten, aber wenn Sie die for-Anweisung so verwenden, wie sie ist, ist sie extrem langsam.
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
Die Anzahl der Daten beträgt 370.000, bei einem gleitenden Durchschnitt von 10 Stichproben ist es jedoch schwierig, 3 Minuten zu dauern. Für längere Zeiträume kann es 10 Minuten oder länger dauern. (Core i7-6700 3,4 GHz)
In Vorheriger Artikel habe ich es durch ein Array ersetzt und versucht, es mit Numba zu beschleunigen, aber tatsächlich wird es nur durch die Verwendung eines Arrays schneller.
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
Auch ohne Numba ist es etwa 100-mal schneller als Pandas.
In diesem Zustand wird die Verwendung von Numba natürlich noch schneller.
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
Selbst wenn Sie die for-Anweisung in Pandas verwenden, ist es ratsam, dies in Fällen zu tun, in denen sie durch ein Array ersetzt werden kann (Index ist irrelevant). Es scheint, dass ein kleiner Trick nötig ist, um mit Pandas gut auszukommen.
Recommended Posts