关于EMA计算的优化,效率提升100倍
import scipy.signal def rolling_ewm(arr, window, span): if len(arr) < window: window = len(arr) alpha = 2 / (span + 1) ret = np.empty_like(arr) ret[:window] = arr[:window] zi = (1-alpha)*ret[window-1:window] ret[window:], _ = scipy.signal.lfilter([alpha], [1, alpha-1], arr[window:], zi=zi) return ret mtm = df['mtm'].values df['mtm'] = rolling_ewm(mtm, 999, n)