TL; DR: Мой вопрос о том, как я могу улучшить свою функцию, чтобы превзойти собственную функцию движущегося максимума панд?
Справочная информация:
Поэтому я работаю со многими скользящими средними, скользящим максимумом и скользящим минимумом и т. д., и единственные движущиеся окна, подобные функциям, которые я нашел до сих пор, находятся в метод pandas.rolling. Дело в том, что данные, которые у меня есть, представляют собой массивы numpy, и конечный результат, который я хочу, также должен быть в массивах numpy; насколько я хочу просто преобразовать его в серию панд и обратно в массив numpy, чтобы выполнить эту работу следующим образом:
result2_max = pd.Series(data_array).rolling(window).max().to_numpy()
, это слишком непитоново, поскольку преобразование типов данных кажется ненужным, и могут быть способы сделать то же самое исключительно в реализации numpy.
Однако, как бы не питонично это ни казалось, это быстрее, чем любые подходы, которые я придумал или видел в Интернете. Ниже я приведу небольшие тесты:
import numpy as np
import pandas as pd
def numpy_rolling_max(data, window):
data = data[::-1]
data_strides = data.strides[0]
movin_window = np.lib.stride_tricks.as_strided(data,
shape=(data.shape[0] - window +1, window),
strides = (data_strides ,data_strides)
)[::-1]
max_window =np.amax(movin_window, axis = 1)#this line seems to be the bottleneck
nan_array = np.full(window - 1, np.nan)
return np.hstack((nan_array, max_window))
def pandas_rolling_max(data, window):
return pd.Series(data).rolling(window).max().to_numpy()
length = 120000
window = 190
data = np.arange(length) + 0.5
result1_max = numpy_rolling_max(data, window)#21.9ms per loop
result2_max = pandas_rolling_max(data, window)#5.43ms per loop
result_comparision = np.allclose(result1_max, result2_max, equal_nan = True)
С размером массива = 120 КБ, окном = 190, максимальная прокрутка pandas примерно в 3 раза быстрее, чем версия с numpy. Я понятия не имею, что делать дальше, так как я уже максимально векторизовал свою собственную функцию, но она все еще намного медленнее, чем версия для панд, и я действительно не знаю, почему.
заранее спасибо
РЕДАКТИРОВАТЬ: я нашел узкое место, и это строка:
max_window =np.amax(movin_window, axis = 1)
Но видя, что это уже вызов векторизованной функции, я до сих пор не знаю, как действовать дальше.
convolve
в numpy - person BENY   schedule 20.05.2019