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 ]