polars.Series.ewm_mean_by#

Series.ewm_mean_by(by: IntoExpr, *, half_life: str | timedelta) Series[source]#

计算基于时间的指数加权移动平均。

给定在时间 \(t_0, t_1, \ldots, t_{n-1}\) 的观测值 \(x_0, x_1, \ldots, x_{n-1}\),EWMA 的计算方式为

\[ \begin{align}\begin{aligned}y_0 &= x_0\\\alpha_i &= 1 - \exp \left\{ \frac{ -\ln(2)(t_i-t_{i-1}) } { \tau } \right\}\\y_i &= \alpha_i x_i + (1 - \alpha_i) y_{i-1}; \quad i > 0\end{aligned}\end{align} \]

其中 \(\tau\)half_life

Parameters:
by

用于计算平均值的时间。应为 DateTime, Date, UInt64, UInt32, Int64, 或 Int32 数据类型。

half_life

观察值衰减到其一半值的时间单位。

可以从一个时间差创建,或者 通过使用以下字符串语言来创建:

  • 1纳秒 (1 纳秒)

  • 1微秒 (1 微秒)

  • 1毫秒 (1 毫秒)

  • 1秒 (1 秒)

  • 1分钟 (1 minute)

  • 1小时 (1小时)

  • 1天 (1 天)

  • 1周 (1 周)

  • 1i (1 索引计数)

或者将它们组合起来: “3d12h4m25s” # 3天,12小时,4分钟,25秒

请注意,half_life被视为一个固定的持续时间 - 不支持日历持续时间,如月份(或在时区感知的情况下甚至天数),请以大约等效的小时数表示您的持续时间(例如,使用'370h'而不是'1mo')。

Returns:
Expr

如果输入是Float32,则为Float32,否则为Float64。

示例

>>> from datetime import date, timedelta
>>> df = pl.DataFrame(
...     {
...         "values": [0, 1, 2, None, 4],
...         "times": [
...             date(2020, 1, 1),
...             date(2020, 1, 3),
...             date(2020, 1, 10),
...             date(2020, 1, 15),
...             date(2020, 1, 17),
...         ],
...     }
... ).sort("times")
>>> df["values"].ewm_mean_by(df["times"], half_life="4d")
shape: (5,)
Series: 'values' [f64]
[
        0.0
        0.292893
        1.492474
        null
        3.254508
]