假设我有以下数据框:
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 │
└─────────────────────┴───────┘
对于每一行,我想要得到的是:
因此,例如,对于第
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()
哦,这似乎有效:
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 │
└─────────────────────┴───────┴─────────────┘