滚动 group_by,但在午夜截断每个值

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

假设我有以下数据框:

import polars as pl
import numpy as np
from datetime import datetime

df = pl.DataFrame({'ts': pl.datetime_range(datetime(2020, 1, 1), datetime(2020, 1, 10), '1h', eager=True)})
df = df.with_columns(value=pl.Series(np.arange(len(df))))
In [62]: df
Out[62]:
shape: (217, 2)
┌─────────────────────┬───────┐
│ ts                  ┆ value │
│ ---                 ┆ ---   │
│ datetime[μs]        ┆ i64   │
╞═════════════════════╪═══════╡
│ 2020-01-01 00:00:00 ┆ 0     │
│ 2020-01-01 01:00:00 ┆ 1     │
│ 2020-01-01 02:00:00 ┆ 2     │
│ 2020-01-01 03:00:00 ┆ 3     │
│ …                   ┆ …     │
│ 2020-01-09 21:00:00 ┆ 213   │
│ 2020-01-09 22:00:00 ┆ 214   │
│ 2020-01-09 23:00:00 ┆ 215   │
│ 2020-01-10 00:00:00 ┆ 216   │
└─────────────────────┴───────┘

对于每一行,我想要得到的是:

  • 考虑 3 天前到当天午夜之间的所有行
  • 计算平均值

因此,例如,对于第

2020-01-09 23:00:00
行,我想考虑
ts
大于或等于
2020-01-06 00:00:00
且小于
2020-01-09 00:00:00
的行,并取
'value'
列的平均值。

预期输出:

shape: (217, 2)
┌─────────────────────┬───────┐
│ ts                  ┆ value │
│ ---                 ┆ ---   │
│ datetime[μs]        ┆ i64   │
╞═════════════════════╪═══════╡
│ 2020-01-01 00:00:00 ┆ null  │
│ 2020-01-01 01:00:00 ┆ null  │
│ 2020-01-01 02:00:00 ┆ null  │
│ 2020-01-01 03:00:00 ┆ null  │
│ …                   ┆ …     │
│ 2020-01-09 21:00:00 ┆ 155.5 │
│ 2020-01-09 22:00:00 ┆ 155.5 │
│ 2020-01-09 23:00:00 ┆ 155.5 │
│ 2020-01-10 00:00:00 ┆ 179.5 │
└─────────────────────┴───────┘

我如何计算预期输出:

df.filter(
    (pl.col("ts") >= datetime(2020, 1, 6)) & (pl.col("ts") < datetime(2020, 1, 9))
).mean()
df.filter(
    (pl.col("ts") >= datetime(2020, 1, 7)) & (pl.col("ts") < datetime(2020, 1, 10))
).mean()
python python-polars
1个回答
1
投票

哦,这似乎有效:

right = df.groupby_rolling('ts', period='3d', closed='left').agg(pl.col('value').mean()).filter(pl.col('ts').dt.hour()==0)
df.join(right, left_on=pl.col('ts').dt.truncate('1d'), right_on='ts')
In [84]: df.join(right, left_on=pl.col('ts').dt.truncate('1d'), right_on='ts')
Out[84]:
shape: (217, 3)
┌─────────────────────┬───────┬─────────────┐
│ ts                  ┆ value ┆ value_right │
│ ---                 ┆ ---   ┆ ---         │
│ datetime[μs]        ┆ i64   ┆ f64         │
╞═════════════════════╪═══════╪═════════════╡
│ 2020-01-01 00:00:00 ┆ 0     ┆ null        │
│ 2020-01-01 00:00:00 ┆ 1     ┆ null        │
│ 2020-01-01 00:00:00 ┆ 2     ┆ null        │
│ 2020-01-01 00:00:00 ┆ 3     ┆ null        │
│ …                   ┆ …     ┆ …           │
│ 2020-01-09 00:00:00 ┆ 213   ┆ 155.5       │
│ 2020-01-09 00:00:00 ┆ 214   ┆ 155.5       │
│ 2020-01-09 00:00:00 ┆ 215   ┆ 155.5       │
│ 2020-01-10 00:00:00 ┆ 216   ┆ 179.5       │
└─────────────────────┴───────┴─────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.