ewm_mean 忽略南

ewm_mean ignore nan

给定一系列可能的 NaN 值,如何告诉 polars 忽略 NaN 值?也就是说,将 NaN 值视为不在 DataFrame 中,并使用与 NaN 值之前的单元格中相同的均值。

为了 100% 具体,这是 panda 的 class 函数 ewm and rolling 的默认行为。

我想你想要的是fill_nan方法。目前有一种 request to expand the fill_nan method to have the same handy options as the fill_null 方法(即 'forward'、'backward'、'mean' 等)。

但我们可以通过一些小的变通方法获得相同的结果。假设我们的数据如下所示:

df = pl.DataFrame(
    {
        "group": (["a"] * 3) + (["b"] * 4),
        "obs": [1, 2, 3, 1, 2, 3, 4],
        "val": [1.0, np.NaN, 3, 4, np.NaN, np.NaN, 7],
    }
)
df
shape: (7, 3)
┌───────┬─────┬─────┐
│ group ┆ obs ┆ val │
│ ---   ┆ --- ┆ --- │
│ str   ┆ i64 ┆ f64 │
╞═══════╪═════╪═════╡
│ a     ┆ 1   ┆ 1.0 │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ a     ┆ 2   ┆ NaN │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ a     ┆ 3   ┆ 3.0 │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ b     ┆ 1   ┆ 4.0 │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ b     ┆ 2   ┆ NaN │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ b     ┆ 3   ┆ NaN │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ b     ┆ 4   ┆ 7.0 │
└───────┴─────┴─────┘

只要您的列没有 null 值,我们就可以将 NaN 值转换为 null,然后使用 fill_null 表达式。

(
    df
    .with_column(pl.col("val").fill_nan(None).keep_name())
    .with_columns(
        [
            pl.col("val").fill_null("forward").over("group").alias("fill_forward"),
            pl.col("val").fill_null("backward").over("group").alias("fill_back"),
            pl.col("val").fill_null("mean").over("group").alias("fill_mean"),
            pl.col("val").fill_null("zero").over("group").alias("fill_zero"),
            pl.col("val").fill_null("one").over("group").alias("fill_one"),
        ]
    )
)
shape: (7, 8)
┌───────┬─────┬──────┬──────────────┬───────────┬───────────┬───────────┬──────────┐
│ group ┆ obs ┆ val  ┆ fill_forward ┆ fill_back ┆ fill_mean ┆ fill_zero ┆ fill_one │
│ ---   ┆ --- ┆ ---  ┆ ---          ┆ ---       ┆ ---       ┆ ---       ┆ ---      │
│ str   ┆ i64 ┆ f64  ┆ f64          ┆ f64       ┆ f64       ┆ f64       ┆ f64      │
╞═══════╪═════╪══════╪══════════════╪═══════════╪═══════════╪═══════════╪══════════╡
│ a     ┆ 1   ┆ 1.0  ┆ 1.0          ┆ 1.0       ┆ 1.0       ┆ 1.0       ┆ 1.0      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ a     ┆ 2   ┆ null ┆ 1.0          ┆ 3.0       ┆ 2.0       ┆ 0.0       ┆ 1.0      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ a     ┆ 3   ┆ 3.0  ┆ 3.0          ┆ 3.0       ┆ 3.0       ┆ 3.0       ┆ 3.0      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ b     ┆ 1   ┆ 4.0  ┆ 4.0          ┆ 4.0       ┆ 4.0       ┆ 4.0       ┆ 4.0      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ b     ┆ 2   ┆ null ┆ 4.0          ┆ 7.0       ┆ 5.5       ┆ 0.0       ┆ 1.0      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ b     ┆ 3   ┆ null ┆ 4.0          ┆ 7.0       ┆ 5.5       ┆ 0.0       ┆ 1.0      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ b     ┆ 4   ┆ 7.0  ┆ 7.0          ┆ 7.0       ┆ 7.0       ┆ 7.0       ┆ 7.0      │

您也可以使用具有 null 值的其他方法,例如 interpolate.

(df
 .with_column(pl.col("val").fill_nan(None).keep_name())
 .with_column(pl.col("val").interpolate().over("group").alias("inter"))
)
shape: (7, 4)
┌───────┬─────┬──────┬───────┐
│ group ┆ obs ┆ val  ┆ inter │
│ ---   ┆ --- ┆ ---  ┆ ---   │
│ str   ┆ i64 ┆ f64  ┆ f64   │
╞═══════╪═════╪══════╪═══════╡
│ a     ┆ 1   ┆ 1.0  ┆ 1.0   │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ a     ┆ 2   ┆ null ┆ 2.0   │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ a     ┆ 3   ┆ 3.0  ┆ 3.0   │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ b     ┆ 1   ┆ 4.0  ┆ 4.0   │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ b     ┆ 2   ┆ null ┆ 5.0   │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ b     ┆ 3   ┆ null ┆ 6.0   │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ b     ┆ 4   ┆ 7.0  ┆ 7.0   │
└───────┴─────┴──────┴───────┘