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

时间:2018-12-29 19:14:17

标签: vega-lite altair

几天以来,我一直在探索Altair,以创建交互式图表。 我正在尝试创建一个包含两层的图表,这两层都显示一段时间内的累积股票收益。 刷完一张图表应在另一张图表中提供放大视图,并从0开始实时实时更新累积收益。

在熊猫中,您可以在可见时间段内进行如下计算:

(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

1 个答案:

答案 0 :(得分:0)

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

Vega尚无“乘积”运算,但是我认为您可以使用calculate来导出对数值,求和并应用指数-这应该等同于乘积。

如果您认为应该包括“产品”,请随时在Vega存储库中提交问题。