Polars滚动相关系数为何同时返回null与NaN而非单一值?
Polars滚动窗口中corr列出现null与NaN差异的原因
更新说明
当前Polars在此场景下已不再返回null,示例现在会返回2个NaN值。
问题复现代码
import polars as pl ts_count_df = pl.DataFrame([pl.Series("ts", [ 1687743109438, 1687831935720, 1687958569223, 1687978376064, 1688095371395, 1688213575425, 1688262561054, 1688281964195, 1688362014828, 1688442925287 ]), pl.Series("count", [ 0, 0, 19301, 67, 0, 3009, 1871, 0, 95, 12, ])]).with_columns( pl.from_epoch("ts", time_unit="ms") ).sort("ts") with_corr = ts_count_df.rolling(index_column="ts", period="3d").agg( pl.corr("count", "count").alias("corr"), pl.mean("count").alias("avg")) print(with_corr.head())
旧版本输出
┌─────────────────────────┬────────────────────┬────────────────────┐ │ ts ┆ corr ┆ avg │ │ --- ┆ --- ┆ --- │ │ datetime[ms] ┆ f64 ┆ f64 │ ╞═════════════════════════╪════════════════════╪════════════════════╡ │ 2023-06-26 01:31:49.438 ┆ null ┆ 0 │ │ 2023-06-27 02:12:15.720 ┆ NaN ┆ 0 │ │ 2023-06-28 13:22:49.223 ┆ 1.0000000000000002 ┆ 6433.666666666667 │ │ 2023-06-28 18:52:56.064 ┆ 1.0000000000000002 ┆ 4842 │ │ 2023-06-30 03:22:51.395 ┆ 1 ┆ 6456 │ │ 2023-07-01 12:12:55.425 ┆ 1.0000000000000002 ┆ 5594.25 │ │ 2023-07-02 01:49:21.054 ┆ 1 ┆ 1626.6666666666667 │ │ 2023-07-02 07:12:44.195 ┆ 1 ┆ 1220 │ │ 2023-07-03 05:26:54.828 ┆ 1 ┆ 1243.75 │ │ 2023-07-04 03:55:25.287 ┆ 1 ┆ 997.4 │ └─────────────────────────┴────────────────────┴────────────────────┘
问题
为何corr列的前两个值分别为null和NaN?预期前两行应统一返回NaN或null,而非两种不同值。
原因分析
这是Polars旧版本中的一致性bug:
- 第一行的滚动窗口仅包含1个数据点,相关系数计算至少需要2个样本点才能进行,此时Polars返回
null表示计算无法完成。 - 第二行的滚动窗口包含2个数据点,但两个值都是0,计算相关系数时会出现分母为0的数学无效情况(方差为0),此时Polars返回
NaN表示数学上的无意义值。
后续Polars官方修复了这个一致性问题,统一将这类无法计算相关系数的场景返回NaN,所以现在运行相同代码会得到两个NaN值,符合预期的统一表现。
内容的提问来源于stack exchange,提问作者Capacytron
相关产品推荐
相关产品推荐

