You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:09:57