如何在 Polars 中按时间戳和其他列进行分组

问题描述 投票:0回答:1

我有一个包含许多列的数据框,只对时间戳、国家/地区、省份和人口感兴趣。

我想确定各省一段时间内的平均人口。我可以使用 Polars 中的以下内容来计算:

df.groupby(['timestamp','country', 'prov']).agg(pl.col('population').mean())

但是我想加入滚动时间窗口。我发现了以下内容,但我不确定是否可以将两者合并到一个表达式中。

df.groupby_rolling('timestamp', period = '1y')

我正在寻找年份的平均值,也许滚动窗口不是正确的术语

有什么建议吗?

aggregate python-polars
1个回答
0
投票

要将数据分组为基于区间的大小,请查看

group_by_dynamic
every
参数将定义对数据进行分组的间隔,而
by
将为间隔添加额外的分组级别。

group_by_dynamic
要求您的数据在索引列上排序(例如
timestamp
)。

index_column:用于根据时间窗口进行分组的列。通常是日期/日期时间类型。该列必须按升序排序(或者,如果指定了 by,则必须在每个组内按升序排序)。`

from datetime import datetime
import polars as pl

df = pl.DataFrame(
    {
        "timestamp": [datetime(2022, n + 1, 1) for n in range(12)] * 6
        + [datetime(2023, n + 1, 1) for n in range(12)] * 6,
        "country": ["USA", "CAN", "MEX"] * 48,
        "prov": ["Florida", "Ontario", "Oaxaca", "California", "Quebec", "Jalisco"]
        * 24,
        "population": range(500, 644, 1),
    }
)

print(
    df.sort("timestamp")
    .group_by_dynamic("timestamp", every="1y", by=["country", "prov"])
    .agg(pl.col("population").mean())
)

结果:

shape: (12, 4)
┌─────────┬─────────┬─────────────────────┬────────────┐
│ country ┆ prov    ┆ timestamp           ┆ population │
│ ---     ┆ ---     ┆ ---                 ┆ ---        │
│ str     ┆ str     ┆ datetime[μs]        ┆ f64        │
╞═════════╪═════════╪═════════════════════╪════════════╡
│ USA     ┆ Florida ┆ 2022-01-01 00:00:00 ┆ 533.0      │
│ USA     ┆ Florida ┆ 2023-01-01 00:00:00 ┆ 605.0      │
│ CAN     ┆ Ontario ┆ 2022-01-01 00:00:00 ┆ 534.0      │
│ CAN     ┆ Ontario ┆ 2023-01-01 00:00:00 ┆ 606.0      │
│ …       ┆ …       ┆ …                   ┆ …          │
│ CAN     ┆ Quebec  ┆ 2022-01-01 00:00:00 ┆ 537.0      │
│ CAN     ┆ Quebec  ┆ 2023-01-01 00:00:00 ┆ 609.0      │
│ MEX     ┆ Jalisco ┆ 2022-01-01 00:00:00 ┆ 538.0      │
│ MEX     ┆ Jalisco ┆ 2023-01-01 00:00:00 ┆ 610.0      │
└─────────┴─────────┴─────────────────────┴────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.