是否可以创建与 Altair/Vega-Lite 中的选择过滤器一起使用的自定义聚合?

Is it possible to create custom aggregations that work with selection filters in Altair/Vega-Lite?

几天以来,我一直在探索 Altair,以创建交互式图表。 我正在尝试创建一个包含两层的图表,这两个层都显示随时间推移的累积库存 returns。 刷过一个图表应该在另一个图表中提供放大视图,累积 return 从 0 开始实时更新。

在 pandas 中,您可以在可见时间段内按如下方式计算:

(1 + ret).cumprod() - 1

我不知道如何以及是否可以用 altair 做到这一点。

我看到有两种可能的转换:

  1. 编码通道内
  2. 使用顶级转换(例如,transform_aggregate 和 transform_calculate)

我过去曾成功使用 1(例如创建两个图表,其中一个用作另一个的缩放选择),但我无法使 2 正常工作。

举一个具体的简单例子,我将下面的两个图表垂直拼接起来。底部的选择应显示 运行 与第一个选择的总和。

这是我目前尝试执行此操作时产生的我不完全理解的行为(从左到右刷似乎是我想要的,从右到左刷会导致向下倾斜的总和 运行 , 取消选择会产生奇怪的结果)...

import altair as alt
from vega_datasets import data

source = data.stocks().query('symbol=="GOOG"')

sel = alt.selection_interval(encodings=['x'])

c1 = alt.Chart(source).mark_line().encode(
    x='date',
    y='price_cum:Q'
).transform_filter(sel).transform_window(price_cum='sum(price)')

c2 = alt.Chart(source).mark_line().encode(
    x='date',
    y='price'
).properties(height=100).add_selection(sel)

c1&c2

这里是编辑器中的corresponding vega-lite spec

https://vega.github.io/vega-lite/docs/window.html#cumulative-frequency-distribution 对于执行累积操作很有用。

Vega 还没有 "product" 运算符,但我认为您可以使用 calculate 来导出对数值,进行累加和并应用指数——这应该等同于累积产品。

如果您认为应该包含 "product",请随时在 Vega 存储库中提出问题。