Я изучаю Altair уже пару дней, чтобы создавать интерактивные диаграммы.Я пытаюсь создать диаграмму с двумя слоями, на которых показан совокупный доход с течением времени.Перемещение по одному графику должно обеспечить увеличенное представление на другом графике с кумулятивным обновлением возврата в реальном времени, начиная с 0.
В пандах вы можете рассчитать это следующим образом за видимый период времени:
(1 + ret).cumprod() - 1
Я не могу понять, как и возможно ли это сделать с помощью altair.
Я видел, что возможны два вида преобразований:
- В канале кодирования
- Использование преобразований верхнего уровня (например, transform_aggregate и transform_calculate)
В прошлом я успешно использовал 1 (например, для создания двух диаграмм содин действует как выбор масштаба для другого), у меня проблемы с выполнением двух работ.
Чтобы привести конкретный простой пример, я объединяю вертикально две диаграммы ниже.Выбор в нижней части должен показывать промежуточную сумму по этой выборке в первой.
Вот моя текущая попытка сделать это, которое приводит к поведению, которое я не до конца понимаю (кажется, чистка слева направоделай то, что я хочу, чистя результаты справа налево в бегущей сумме с понижением, отмена выбора приводит к причудливым результатам в целом) ...
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
Вот соответствующая спецификация vega-lite вредактор: