Мы все знаем, что скользящие средние требуют определенной длины окна, чтобы оглянуться назад от текущей точки данных для вычисления среднего значения. Ну, мне нужно не фиксированное окно, а динамическое окно c, длина которого определяется позицией строки, в которой совокупная сумма другого столбца достигает произвольно определенного порога.
Проблема заключается в том, что результирующая l oop слишком медленная для моих данных.
Кроме того, результирующая скользящая средняя на самом деле является взвешенной скользящей средней, но это не должно сделать основную проблему намного больше.
Мне было интересно, есть ли способ использовать лямбда-функцию с apply или что-то еще, чтобы добиться этого быстрее.
Фрагмент кода ниже:
Спасибо.
import numpy as np
#Random data:
values = np.random.uniform(0,10,3000)
values2 = np.random.uniform(0,10,3000)
output = []
#Function which finds a window by finding the row position where a cum sum of a given threshold is reached, and then computes a weighted average with that calculated window.
def function(threshold, row):
try:
slice_sum = 0
for i in range(1, len(values)+1):
slice_sum += values[row-i]
if slice_sum >= threshold:
break
return np.average(values2[row-i:row], weights=values[row-i:row])
except:
np.nan
#Output is weighted rolling moving average, where the window was dynamically calculated:
output = [function(40, i) for i in range(0, len(values))]