Метод var аксессора ewm
Метод var аксессора ewm применяется к Series
или DataFrame и вычисляет экспоненциально взвешенную
дисперсию. В отличие от обычной дисперсии, этот метод
придаёт больший вес более поздним наблюдениям. Основные
параметры: bias (логический флаг, определяющий
использование смещённой или несмещённой оценки),
numeric_only (работа только с числовыми колонками),
а также параметры самого экспоненциального взвешивания -
com, span, halflife, alpha,
которые задаются при создании аксессора ewm.
Синтаксис
series.ewm(span=None, com=None, halflife=None, alpha=None, adjust=True, ignore_na=False).var(bias=False, numeric_only=False)
Пример
Рассмотрим базовое использование метода на простой серии данных:
import pandas as pd
ser = pd.Series([10, 12, 15, 14, 18, 20])
res = ser.ewm(span=3).var()
print(res)
Результат выполнения кода:
0 NaN
1 2.000000
2 6.333333
3 1.500000
4 5.333333
5 7.000000
dtype: float64
Пример
Параметр bias управляет способом вычисления дисперсии.
При bias=True используется смещённая оценка (деление на n),
при bias=False - несмещённая (деление на n-1):
import pandas as pd
ser = pd.Series([5, 8, 6, 9, 7, 10])
res_biased = ser.ewm(alpha=0.5).var(bias=True)
res_unbiased = ser.ewm(alpha=0.5).var(bias=False)
print("Biased:\n", res_biased)
print("Unbiased:\n", res_unbiased)
Результат выполнения кода:
Biased:
0 NaN
1 2.250000
2 1.187500
3 2.472656
4 1.164795
5 2.169067
dtype: float64
Unbiased:
0 NaN
1 4.500000
2 2.375000
3 4.945312
4 2.329590
5 4.338134
dtype: float64
Пример
Метод можно применять к DataFrame, вычисляя дисперсию
для каждого столбца независимо:
import pandas as pd
df = pd.DataFrame({
'a': [1, 3, 2, 5, 4],
'b': [10, 12, 11, 15, 14]
})
res = df.ewm(span=4).var()
print(res)
Результат выполнения кода:
a b
0 NaN NaN
1 2.000000 2.000000
2 0.285714 0.285714
3 2.538462 2.538462
4 1.461538 1.461538
Пример
Параметр numeric_only позволяет исключить нечисловые
столбцы из вычислений:
import pandas as pd
df = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': ['x', 'y', 'z', 'w', 'v'],
'c': [10, 20, 30, 40, 50]
})
res = df.ewm(span=3).var(numeric_only=True)
print(res)
Результат выполнения кода:
a c
0 NaN NaN
1 0.250000 25.000000
2 0.642857 64.285714
3 0.642857 64.285714
4 0.642857 64.285714
Пример
Различные способы задания параметров сглаживания влияют на результат вычисления дисперсии:
import pandas as pd
ser = pd.Series([2, 4, 6, 8, 10])
res_span = ser.ewm(span=5).var()
res_alpha = ser.ewm(alpha=0.3).var()
res_halflife = ser.ewm(halflife=2).var()
print("Span 5:\n", res_span)
print("Alpha 0.3:\n", res_alpha)
print("Halflife 2:\n", res_halflife)
Результат выполнения кода:
Span 5:
0 NaN
1 2.000000
2 4.000000
3 4.666667
4 4.800000
dtype: float64
Alpha 0.3:
0 NaN
1 2.000000
2 3.807018
3 5.460508
4 6.461395
dtype: float64
Halflife 2:
0 NaN
1 2.000000
2 3.488372
3 4.373802
4 4.901830
dtype: float64