我有一个LazyFrame timesymbolsmid_price:

示例:

time                symbols             mid_price
datetime[ns]        str                 f64
2024-03-01 00:01:00 "PERP_SOL_USDT@…    126.1575
2024-03-01 00:01:00 "PERP_WAVES_USD…    2.71235
2024-03-01 00:01:00 "SOL_USDT@BINAN…    126.005
2024-03-01 00:01:00 "WAVES_USDT@BIN…    2.7085
2024-03-01 00:02:00 "PERP_SOL_USDT@…    126.3825

我想在时间维度上执行一些聚合(例如:GROUP BY symbol):

aggs = (
    df
        .group_by('symbols')
        .agg([
            pl.col('mid_price').diff(1).alias("change"),
        ])
)

每个唯一的symbols值返回list个值:

>>> aggs.head().collect()

symbols             change
str                 list[f64]
"SOL_USDT@BINAN…    [null, 0.25, … -0.55]
"PERP_SOL_USDT@…    [null, 0.225, … -0.605]
"WAVES_USDT@BIN…    [null, -0.002, … -0.001]
"PERP_WAVES_USD…    [null, -0.00255, … 0.0001]

现在,我想把这个加入到我原来的birrame中:

df = df.join(
    aggs,
    on='symbols',
    how='left',
)

现在,这导致每行得到的是change的完整列表,而不是相应的值.

>>> df.head().collect()

time                symbols             mid_price   change
datetime[ns]        str                 f64         list[f64]
2024-03-01 00:01:00 "PERP_SOL_USDT@…    126.1575    [null, 0.225, … -0.605]
2024-03-01 00:01:00 "PERP_WAVES_USD…    2.71235     [null, -0.00255, … 0.0001]
2024-03-01 00:01:00 "SOL_USDT@BINAN…    126.005     [null, 0.25, … -0.55]
2024-03-01 00:01:00 "WAVES_USDT@BIN…    2.7085      [null, -0.002, … -0.001]
2024-03-01 00:02:00 "PERP_SOL_USDT@…    126.3825    [null, 0.225, … -0.605]

我有两个问题,请:

  1. 当我将group_by返回的列表加入到原始的数据库时,我如何将它们unstack/explode返回?
  2. 这是从group_by开始向我的原始数据框添加新列(即:group_by后跟join)的推荐方式吗?

推荐答案

听起来你并不想实际聚合任何东西(并获得每个符号single的值),而是想计算"change",但对每个符号独立.

在polars中,这种行为类似于PostgreSQL中的window functions,可以用pl.Expr.over实现.

df.with_columns(
    pl.col("mid_price").diff(1).over("symbol").alias("change")
)

在某些示例数据中,解析器如下所示.

import polars as pl
import numpy as np
import datetime

df = pl.DataFrame({
    "symbol": ["A"] * 3 + ["B"] * 3 + ["C"] * 3,
    "time": [datetime.datetime(2024, 3, 1, hour) for hour in range(3)] * 3,
    "mid_price": np.random.randn(9),
})

df.with_columns(
    pl.col("mid_price").diff(1).over("symbol").alias("change")
)
shape: (9, 4)
┌────────┬─────────────────────┬───────────┬───────────┐
│ symbol ┆ time                ┆ mid_price ┆ change    │
│ ---    ┆ ---                 ┆ ---       ┆ ---       │
│ str    ┆ datetime[μs]        ┆ f64       ┆ f64       │
╞════════╪═════════════════════╪═══════════╪═══════════╡
│ A      ┆ 2024-03-01 00:00:00 ┆ -0.349863 ┆ null      │
│ A      ┆ 2024-03-01 01:00:00 ┆ 0.093732  ┆ 0.443595  │
│ A      ┆ 2024-03-01 02:00:00 ┆ -1.262064 ┆ -1.355796 │
│ B      ┆ 2024-03-01 00:00:00 ┆ 1.953929  ┆ null      │
│ B      ┆ 2024-03-01 01:00:00 ┆ 0.637582  ┆ -1.316348 │
│ B      ┆ 2024-03-01 02:00:00 ┆ 1.009401  ┆ 0.37182   │
│ C      ┆ 2024-03-01 00:00:00 ┆ 0.75864   ┆ null      │
│ C      ┆ 2024-03-01 01:00:00 ┆ -0.866227 ┆ -1.624867 │
│ C      ┆ 2024-03-01 02:00:00 ┆ -0.674938 ┆ 0.191289  │
└────────┴─────────────────────┴───────────┴───────────┘

Python相关问答推荐

运行Python脚本时,用作命令行参数的SON文本

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

输出中带有南的亚麻神经网络

将两只Pandas rame乘以指数

加速Python循环

Python键入协议默认值

为什么抓取的HTML与浏览器判断的元素不同?

在含噪声的3D点网格中识别4连通点模式

如何合并两个列表,并获得每个索引值最高的列表名称?

如何使用Numpy. stracards重新编写滚动和?

具有相同图例 colored颜色 和标签的堆叠子图

OpenGL仅渲染第二个三角形,第一个三角形不可见

用SymPy在Python中求解指数函数

无法在Spyder上的Pandas中将本地CSV转换为数据帧

获取PANDA GROUP BY转换中的组的名称

Python—在嵌套列表中添加相同索引的元素,然后计算平均值

如何根据一定条件生成段id

Scipy.linprog的可行性有问题吗?(A_ub@x0<;=b_ub).all()为True-但是-linprog(np.zeros_like(X0),A_ub=A_ub,b_ub=b_ub)不可行

如何在基于时间的数据帧中添加计算值

如何在Django查询集中生成带有值列表的带注释的字段?