Я просмотрел стекопоток и не могу найти именно то, что мне подходит.
Я рассчитываю взвешенное скользящее среднее для скользящего окна.
Уравнение:
#weighted average temp with smoothing factor, a
#T_w = sum[k=1,24](a^(k-1)*T(t-k)) / sum[k=1,24]a^(k-1)
Кажется, достаточно просто, но мне нужно применить это среднее к скользящему окну. Я могу сделать скользящее среднее (простое скользящее среднее):
T_ = pd.DataFrame()
T_ = temps['T'].rolling(window=24).mean()
Но теперь я хочу применить веса ТОЛЬКО к окну, по которому я усредняю.
Python .ewm () не сокращает горчицу, потому что я хочу, чтобы веса были только для окна, по которому я «переворачиваюсь».
Я нашел несколько фрагментов кода, которые могут работать, но компоненты не работают:
from functools import partial
window = 13
alpha = 1-ln(2)/3 # This is ewma's decay factor.
weights = list(reversed([(1-alpha)**n for n in range(window)]))
ewma = partial(average, weights=weight)
rolling_average = series.rolling(window).apply(ewma)
Здесь проблема, с которой я столкнулся, заключается в том, что функцияручная () вызывает среднее () - это было представлено здесь - Создание скользящего пользовательского EWMA на кадре данных pandas - но я не могу комментировать пока (новичок), и я не знаю, где это взять.
Еще одно решение, которое я реализовал, но оно не выполняет именно то, что мне нужно:
alpha = 0.1 # This is my smoothing parameter
weights = list(reversed([(1-alpha)**n for n in range(window)]))
def f(w):
def g(x):
return (w*x).mean()
return g
T_ = pd.DataFrame()
T_ = temps['T'].rolling(window=24).apply(f(weights))
На основе предложенного решения здесь: Расчет взвешенного скользящего среднего с использованием метода Ролдинга панд
Проблема этого подхода в том, что он вычисляет среднее значение, тогда как мне нужно что-то вроде этого:
return (w*x).sum() / w.sum()
Но это не работает, потому что
AttributeError: 'list' object has no attribute 'sum'
Как рассчитать скользящее взвешенное скользящее среднее с указанным окном (здесь, последние 24 часа) и заданным параметром сглаживания a (который применяется только к последним 24 часам)?