更新: 在这种情况下,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
,而不是各有一个
因为这些值无法计算,因为前两天“count”列中没有数据。滚动聚合过程根据特定时间段内的数据进行统计。对于前两天,这段时间(3天)没有足够的数据,因此无法计算相关性(“corr”)。
到前两天结束时,已经收集了更多数据,因此可以进行相关性计算。因此,从第三天开始可以计算并显示相关值(“corr”)。
因此,前两天显示“null”和“NaN”值是预期行为,因为无法计算这些天的相关性。