Excel 移动时的等效平均值 window

Excel equivalent average if on moving window

我正在学习极坐标(作为 pandas 的替代品),我会回复一些 excel 函数。

特别平均如果超过滚动 windows。

假设我们有一个具有正值和负值的列,只有当该列中的所有值都是正值时,我如何才能创建一个具有滚动平均值的新列?

import polars as pl

df = pl.DataFrame(
    {
        "Date": ["12/04/98", "19/04/98", "26/04/98", "03/05/98", "10/05/98", "17/05/98", "24/05/98", "31/05/98", "07/06/98"],
        "Close": [15.46 ,15.09 ,16.13 ,15.13 ,14.47 ,14.78 ,15.20 ,15.07 ,12.59]
    }
)

df = df.with_columns([(
    pl.col("Close").pct_change().alias("Close Returns")
)])

这将创建一个包含列“Close Returns”的数据框,并且新列将是它在固定 windows 上的平均值,前提是它们都是正数。

如果我想创建一个新列作为正平均值对负平均值的商数?

作为两个元素的 window 的示例,在下图中,第一个元素为 null,什么都不做。第一个寡妇包含一个正数和一个负数所以 returns 零(我需要 2 个正值)而最后一个 window 包含两个负数并且可以计算平均值。

这是我的解决方案,但我不满意:

import polars as pl

dataset = pl.DataFrame(
    {
        "Date": ["12/04/98", "19/04/98", "26/04/98", "03/05/98", "10/05/98", "17/05/98", "24/05/98", "31/05/98", "07/06/98"],
        "Close": [15.46 ,15.09 ,16.13 ,15.13 ,14.47 ,14.78 ,15.20 ,15.07 ,12.59]
    }
)

q = dataset.lazy().with_column(pl.col("Date").str.strptime(pl.Date, fmt="%d/%m/%y"))

df = q.collect()
df = df.with_columns([(
    pl.col("Close").pct_change().alias("Close Returns")
)])

lag_vector = [2, 6, 7, 10, 12, 13]

for lag in lag_vector:
    out = df.groupby_rolling(
        index_column="Date", period=f"{lag}w"
    ).agg([
        pl.col("Close Returns").filter(pl.col("Close Returns") >= 0).mean().alias("positive mean"),
        pl.col("Close Returns").filter(pl.col("Close Returns") < 0).mean().alias("negative mean"),
    ])
    out["negative mean"] = out["negative mean"].fill_null("zero")
    out["positive mean"] = out["positive mean"].fill_null("zero")
    out = out.with_columns([
        (pl.col("positive mean") / (pl.col("positive mean") - pl.col("negative mean"))).alias(f"{lag} lag mean"),
    ])
    df = df.join(out.select(["Date", f"{lag} lag mean"]), left_on="Date", right_on="Date")

您可以使用 groupby_rolling,然后在聚合中过滤掉负值。

在下面的示例中,我们解析日期,然后按 window 10 天 ("10d") 进行分组,最后我们根据条件进行聚合。

df = pl.DataFrame(
    {
        "Date": ["12/04/98", "19/04/98", "26/04/98", "03/05/98", "10/05/98", "17/05/98", "24/05/98",],
        "Close": [15.46 ,15.09 ,16.13 ,15.13 ,14.47 ,14.78 ,15.20]
    }
)

(df.with_column(pl.col("Date").str.strptime(pl.Date, fmt="%d/%m/%y"))
   .groupby_rolling(index_column="Date", period="10d")
   .agg([
       pl.col("Close").filter(pl.col("Close") > 0).mean().alias("mean")
   ])
)
shape: (7, 2)
┌────────────┬────────┐
│ Date       ┆ mean   │
│ ---        ┆ ---    │
│ date       ┆ f64    │
╞════════════╪════════╡
│ 1998-04-12 ┆ 15.46  │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 1998-04-19 ┆ 15.275 │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 1998-04-26 ┆ 15.61  │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 1998-05-03 ┆ 15.63  │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 1998-05-10 ┆ 14.8   │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 1998-05-17 ┆ 14.625 │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 1998-05-24 ┆ 14.99  │
└────────────┴────────┘

编辑:我调整了我的答案以使用 any 表达式,以便在 any[=27= 时计算 non-negative windowed 平均值](而不是 all)的 window 中的值是 non-negative。同样,对于负 windowed 均值。

lag_vector = [1, 2, 3]
for lag in lag_vector:
    out = (
        df
        .groupby_rolling(index_column="Date", period=f"{lag}w").agg(
            [
                pl.col('Close Returns').alias('Close Returns list'),
                pl.when((pl.col("Close Returns") >= 0).any())
                .then(pl.col('Close Returns').filter(pl.col("Close Returns") >= 0).mean())
                .otherwise(0)
                .alias("positive mean"),
                pl.when((pl.col("Close Returns") < 0).any())
                .then(pl.col('Close Returns').filter(pl.col("Close Returns") < 0).mean())
                .otherwise(0)
                .alias("negative mean"),
            ]
        )
    )

    print(out)

Window 尺码 1 周:

shape: (9, 4)
┌────────────┬────────────────────┬───────────────┬───────────────┐
│ Date       ┆ Close Returns list ┆ positive mean ┆ negative mean │
│ ---        ┆ ---                ┆ ---           ┆ ---           │
│ date       ┆ list [f64]         ┆ f64           ┆ f64           │
╞════════════╪════════════════════╪═══════════════╪═══════════════╡
│ 1998-04-12 ┆ [null]             ┆ 0.0           ┆ 0.0           │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-04-19 ┆ [-0.023933]        ┆ 0.0           ┆ -0.023933     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-04-26 ┆ [0.0689]           ┆ 0.0689        ┆ 0.0           │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-03 ┆ [-0.061996]        ┆ 0.0           ┆ -0.061996     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-10 ┆ [-0.043622]        ┆ 0.0           ┆ -0.043622     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-17 ┆ [0.021424]         ┆ 0.021424      ┆ 0.0           │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-24 ┆ [0.028417]         ┆ 0.028417      ┆ 0.0           │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-31 ┆ [-0.008553]        ┆ 0.0           ┆ -0.008553     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-06-07 ┆ [-0.164565]        ┆ 0.0           ┆ -0.164565     │
└────────────┴────────────────────┴───────────────┴───────────────┘

Window 尺寸 2 周:

shape: (9, 4)
┌────────────┬────────────────────────┬───────────────┬───────────────┐
│ Date       ┆ Close Returns list     ┆ positive mean ┆ negative mean │
│ ---        ┆ ---                    ┆ ---           ┆ ---           │
│ date       ┆ list [f64]             ┆ f64           ┆ f64           │
╞════════════╪════════════════════════╪═══════════════╪═══════════════╡
│ 1998-04-12 ┆ [null]                 ┆ 0.0           ┆ 0.0           │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-04-19 ┆ [null, -0.023933]      ┆ 0.0           ┆ -0.023933     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-04-26 ┆ [-0.023933, 0.0689]    ┆ 0.0689        ┆ -0.023933     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-03 ┆ [0.0689, -0.061996]    ┆ 0.0689        ┆ -0.061996     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-10 ┆ [-0.061996, -0.043622] ┆ 0.0           ┆ -0.052809     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-17 ┆ [-0.043622, 0.021424]  ┆ 0.021424      ┆ -0.043622     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-24 ┆ [0.021424, 0.028417]   ┆ 0.0249        ┆ 0.0           │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-31 ┆ [0.028417, -0.008553]  ┆ 0.028417      ┆ -0.008553     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-06-07 ┆ [-0.008553, -0.164565] ┆ 0.0           ┆ -0.086559     │
└────────────┴────────────────────────┴───────────────┴───────────────┘

Window 尺寸 3 周:

shape: (9, 4)
┌────────────┬──────────────────────────────────┬───────────────┬───────────────┐
│ Date       ┆ Close Returns list               ┆ positive mean ┆ negative mean │
│ ---        ┆ ---                              ┆ ---           ┆ ---           │
│ date       ┆ list [f64]                       ┆ f64           ┆ f64           │
╞════════════╪══════════════════════════════════╪═══════════════╪═══════════════╡
│ 1998-04-12 ┆ [null]                           ┆ 0.0           ┆ 0.0           │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-04-19 ┆ [null, -0.023933]                ┆ 0.0           ┆ -0.023933     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-04-26 ┆ [null, -0.023933, 0.0689]        ┆ 0.0689        ┆ -0.023933     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-03 ┆ [-0.023933, 0.0689, -0.061996]   ┆ 0.0689        ┆ -0.042965     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-10 ┆ [0.0689, -0.061996, -0.043622]   ┆ 0.0689        ┆ -0.052809     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-17 ┆ [-0.061996, -0.043622, 0.021424] ┆ 0.021424      ┆ -0.052809     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-24 ┆ [-0.043622, 0.021424, 0.028417]  ┆ 0.0249        ┆ -0.043622     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-05-31 ┆ [0.021424, 0.028417, -0.008553]  ┆ 0.0249        ┆ -0.008553     │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 1998-06-07 ┆ [0.028417, -0.008553, -0.164565] ┆ 0.028417      ┆ -0.086559     │
└────────────┴──────────────────────────────────┴───────────────┴───────────────┘

这是否更接近您要查找的内容?