我有一个包含许多列的数据框,只对时间戳、国家/地区、省份和人口感兴趣。
我想确定各省一段时间内的平均人口。我可以使用 Polars 中的以下内容来计算:
df.groupby(['timestamp','country', 'prov']).agg(pl.col('population').mean())
但是我想加入滚动时间窗口。我发现了以下内容,但我不确定是否可以将两者合并到一个表达式中。
df.groupby_rolling('timestamp', period = '1y')
我正在寻找年份的平均值,也许滚动窗口不是正确的术语
有什么建议吗?
要将数据分组为基于区间的大小,请查看
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 │
└─────────┴─────────┴─────────────────────┴────────────┘