python-3.x 有没有一种方法可以利用极化Map来使这个代码更有效?

blpfk2vs  于 2023-03-31  发布在  Python
关注(0)|答案(1)|浏览(128)

我有一些polars代码,功能上可以做我想要的,但我觉得这是一个低效的实现在最好的。我觉得必须有一些方法来实现相同的结果与.map(),但我不知道如何。任何想法或建议?
具体来说,我的数据组织如下:每一列都是一个位置,每一行都是一个日期时间。我试图做的是计算连续非零值的最大计数(我将其转换为布尔值,因为我不需要值的大小,我只需要知道值是否为零)。下面是示例数据和示例预期输出:

虚拟数据示例

日期位置1地点2
01-01-23 00:0001
01-01-23 01:0011
01-01-23 02:0011
01-01-23 03:0001
01-01-23 04:0011
01-01-23 05:0010
01-01-23 06:0010

预期产出

地点最大累积计数
位置1
地点2

下面是我的代码,它是 * 功能 *,但感觉它可以改进我的人更聪明,更精通极化比我。

for col in pivoted_df.drop("Date").columns:
    xy_cont_df_a = (
        pivoted_df.select(pl.col(col))
        .with_columns(
            pl.when(
                pl.col(col).cast(pl.Boolean)
                & pl.col(col)
                .cast(pl.Boolean)
                .shift_and_fill(-1, False)
                .is_not()
            ).then(
                pl.count().over(
                    (
                        pl.col(col).cast(pl.Boolean)
                        != pl.col(col).cast(pl.Boolean).shift()
                    ).cumsum()
                )
            )
        )
        .max()
    )
hlswsv35

hlswsv351#

您可以一次处理所有列:

columns = pl.exclude("Date")

df.select(
   (columns != 0).cumsum() 
    - (pl.when(columns == 0)
         .then(columns.cumsum())
         .forward_fill()
         .fill_null(0))
).max()
shape: (1, 2)
┌────────────┬────────────┐
│ Location 1 ┆ Location 2 │
│ ---        ┆ ---        │
│ i64        ┆ i64        │
╞════════════╪════════════╡
│ 3          ┆ 5          │
└────────────┴────────────┘

您的示例提到了pivoted_df,这表明您可能使用了.pivot来达到这一点。
如果是这种情况,可能有一种更简单的方法可以从当前流程的早期步骤中获取这些计数。

编辑:

如果你有一个“平面”框架:

>>> df
shape: (14, 3)
┌─────────────────────┬────────────┬───────┐
│ Date                ┆ Location   ┆ Value │
│ ---                 ┆ ---        ┆ ---   │
│ datetime[ns]        ┆ str        ┆ i64   │
╞═════════════════════╪════════════╪═══════╡
│ 2023-01-01 00:00:00 ┆ Location 1 ┆ 0     │
│ 2023-01-01 01:00:00 ┆ Location 1 ┆ 1     │
│ 2023-01-01 02:00:00 ┆ Location 1 ┆ 1     │
│ 2023-01-01 03:00:00 ┆ Location 1 ┆ 0     │
│ …                   ┆ …          ┆ …     │
│ 2023-01-01 03:00:00 ┆ Location 2 ┆ 1     │
│ 2023-01-01 04:00:00 ┆ Location 2 ┆ 1     │
│ 2023-01-01 05:00:00 ┆ Location 2 ┆ 0     │
│ 2023-01-01 06:00:00 ┆ Location 2 ┆ 0     │
└─────────────────────┴────────────┴───────┘

一种可能的方法是:
一个三个三个一个

相关问题