pandas.DataFrame.ewm#

DataFrame.ewm(com=None, span=None, halflife=None, alpha=None, min_periods=0, adjust=True, ignore_na=False, times=None, method='single')[源代码]#

提供指数加权 (EW) 计算。

times 未提供时,必须提供 comspanhalflifealpha 中的一个。如果提供了 timesadjust=True,则可以提供 halflifecomspanalpha 中的一个。如果提供了 timesadjust=False,则 halflife 必须是唯一提供的衰减指定参数。

参数:
comfloat, optional

以质心指定衰减

\(\alpha = 1 / (1 + com)\),对于 \(com \geq 0\)

spanfloat, optional

以跨度指定衰减

\(\alpha = 2 / (span + 1)\),对于 \(span \geq 1\)

halflifefloat, str, timedelta, optional

以半衰期指定衰减

\(\alpha = 1 - \exp\left(-\ln(2) / halflife\right)\),对于 \(halflife > 0\)

如果指定了 times,则为一个可转换为 timedelta 的单位,在此单位内观测值衰减到其值的一半。仅适用于 mean(),半衰期值不适用于其他函数。

alphafloat, optional

直接指定平滑因子 \(\alpha\)

\(0 < \alpha \leq 1\).

min_periodsint, default 0

窗口中需要有值所需的最小观测值数量;否则,结果为 np.nan

adjustbool, default True

在初始周期内除以衰减的调整因子,以考虑权重不平衡(将 EWMA 视为移动平均)。

  • adjust=True(默认值)时, EW 函数使用权重 \(w_i = (1 - \alpha)^i\) 计算。例如,序列 [\(x_0, x_1, ..., x_t\)] 的 EW 移动平均值为

\[y_t = \frac{x_t + (1 - \alpha)x_{t-1} + (1 - \alpha)^2 x_{t-2} + ... + (1 - \alpha)^t x_0}{1 + (1 - \alpha) + (1 - \alpha)^2 + ... + (1 - \alpha)^t}\]
  • adjust=False 时,指数加权函数通过递归计算

\[\begin{split}\begin{split} y_0 &= x_0\\ y_t &= (1 - \alpha) y_{t-1} + \alpha x_t, \end{split}\end{split}\]
ignore_nabool, default False

计算权重时忽略缺失值。

  • ignore_na=False(默认值)时,权重基于绝对位置。例如,在计算 [\(x_0\), None, \(x_2\)] 的最终加权平均值时,\(x_0\)\(x_2\) 的权重如果 adjust=True,则为 \((1-\alpha)^2\)\(1\);如果 adjust=False,则为 \((1-\alpha)^2\)\(\alpha\)

  • ignore_na=True 时,权重基于相对位置。例如,在计算 [\(x_0\), None, \(x_2\)] 的最终加权平均值时,\(x_0\)\(x_2\) 的权重如果 adjust=True,则为 \(1-\alpha\)\(1\);如果 adjust=False,则为 \(1-\alpha\)\(\alpha\)

timesnp.ndarray, Series, default None

仅适用于 mean()

与观测值对应的时序。必须是单调递增且 dtype 为 datetime64[ns]

如果是一维数组,则其形状与观测值相同。

methodstr {‘single’, ‘table’}, default ‘single’

按单列或行 ('single') 或在整个对象 ('table') 上执行滚动操作。

此参数仅在方法调用中指定 engine='numba' 时实现。

仅适用于 mean()

返回:
pandas.api.typing.ExponentialMovingWindow

ExponentialMovingWindow 的一个实例,用于进一步的指数加权 (EW) 计算,例如使用 mean 方法。

另请参阅

rolling

提供滚动窗口计算。

expanding

提供扩展变换。

注意

有关更多用法细节和示例,请参阅 窗口操作

示例

>>> df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
>>> df
     B
0  0.0
1  1.0
2  2.0
3  NaN
4  4.0
>>> df.ewm(com=0.5).mean()
          B
0  0.000000
1  0.750000
2  1.615385
3  1.615385
4  3.670213
>>> df.ewm(alpha=2 / 3).mean()
          B
0  0.000000
1  0.750000
2  1.615385
3  1.615385
4  3.670213

adjust

>>> df.ewm(com=0.5, adjust=True).mean()
          B
0  0.000000
1  0.750000
2  1.615385
3  1.615385
4  3.670213
>>> df.ewm(com=0.5, adjust=False).mean()
          B
0  0.000000
1  0.666667
2  1.555556
3  1.555556
4  3.650794

ignore_na

>>> df.ewm(com=0.5, ignore_na=True).mean()
          B
0  0.000000
1  0.750000
2  1.615385
3  1.615385
4  3.225000
>>> df.ewm(com=0.5, ignore_na=False).mean()
          B
0  0.000000
1  0.750000
2  1.615385
3  1.615385
4  3.670213

times

以相对于 timestimedelta halflife 计算权重的指数加权平均值。

>>> times = ['2020-01-01', '2020-01-03', '2020-01-10', '2020-01-15', '2020-01-17']
>>> df.ewm(halflife='4 days', times=pd.DatetimeIndex(times)).mean()
          B
0  0.000000
1  0.585786
2  1.523889
3  1.523889
4  3.233686