Вы можете использовать метод Pandas ewm()
, который ведет себя точно так же, как вы описали, когда adjust=False
:
Когда настройка установлена в False, вычисляются средневзвешенные значения рекурсивно как:
weighted_average[0] = arg[0];
weighted_average[i] = (1-alpha)*weighted_average[i-1] + alpha*arg[i]
Если вы хотите сделать простое среднее для первого периода элементов, вы можете сделать это первым и применить ewm()
к результату.
Вы можете вычислить ряды со средним значением первых периодов элементов, а затем другие элементы, дословно повторяемые по формуле:
pd.Series(
data=[df['A'].iloc[:period].mean()],
index=[df['A'].index[period-1]],
).append(
df['A'].iloc[period:]
)
Таким образом, чтобы вычислите скользящее среднее значение Уайлдера и сохраните его в новом столбце 'C'
, вы можете использовать:
df['C'] = pd.Series(
data=[df['A'].iloc[:period].mean()],
index=[df['A'].index[period-1]],
).append(
df['A'].iloc[period:]
).ewm(
alpha=1.0 / period,
adjust=False,
).mean()
В этот момент вы можете вычислить df['B'] - df['C']
, и вы увидите, что разница почти равна нулю (есть некоторая ошибка округления с числами с плавающей запятой.) Так что это эквивалентно вашему вычислению с использованием al oop.
Возможно, вы захотите пропустить прямое среднее между первыми элементами period и просто начните применять ewm()
от т начало, при котором первая строка будет предыдущим средним в первом расчете. Результаты будут немного отличаться, но как только вы пройдете через пару периодов , эти начальные значения вряд ли повлияют на результаты.
Это будет намного более простой расчет:
df['D'] = df['A'].ewm(
alpha=1.0 / period,
adjust=False,
).mean()