如何在Polars中实现忽略空值的滚动均值(用于RSI计算)
在Polars中计算忽略空值的滚动均值(用于RSI指标)
要实现忽略空值的滚动均值,你可以通过滚动求和除以滚动非空值计数的方式来实现,Polars原生支持这两个操作的滚动计算:
完整代码示例
import polars as pl window_size = 5 # 构造示例数据 df = pl.DataFrame({"price_change": [1, 2, 3, -2, 4]}) # 生成增益列:仅保留正的价格变动,其余设为空值 df_gain = df.select( pl.when(pl.col('price_change') > 0.0) .then(pl.col('price_change')) .otherwise(None) .alias('gain') ) # 计算忽略空值的滚动均值:滚动有效值总和 / 滚动有效值数量 rol_mean_gain = df_gain.select( ( pl.col('gain').rolling_sum(window_size=window_size, ignore_null=True) / pl.col('gain').is_not_null().rolling_sum(window_size=window_size, ignore_null=True) ).alias('rolling_mean_gain') ) print(rol_mean_gain)
代码说明
- 生成增益列:和你原逻辑一致,仅保留正的价格变动,非正值转为Polars空值
None。 - 滚动有效值求和:
rolling_sum的ignore_null=True参数会自动跳过空值,计算窗口内有效增益的总和。 - 滚动有效值计数:先用
is_not_null()将空值转为False(对应数值0)、有效值转为True(对应数值1),再通过rolling_sum求和,得到窗口内有效值的数量。 - 计算均值:用滚动总和除以滚动计数,得到基于有效值的滚动均值。
结果验证
针对你的示例数据,窗口内有效增益为[1,2,3,4],总和为10,有效值数量为4,计算出的均值为10/4=2.5,完全符合你期望的计算逻辑。
内容的提问来源于stack exchange,提问作者Joris Medeišis
相关产品推荐
相关产品推荐

