Есть ли способ выделить или выделить последние или первые n точек данных в Altair? - PullRequest
1 голос
/ 20 июня 2020

В последнее время я обнаружил, что желает иметь возможность выделять или выбирать только последние n точки данных в Altair. Например, для данных временного ряда, обновляемых ежедневно, выбор / выделение окна данных за последние 7 дней.

Проблема с condition заключается в том, что вам нужно явно указать дату или значение, от которого происходит выбор / выделение. Одним из недостатков этого является то, что в случае данных временных рядов, которые обновляются довольно часто, это становится ручной задачей.

Одно из возможных решений - просто использовать собственный Python, а ось x - datetime data, а затем напишите код таким образом, чтобы он программно позаботился обо всем, возможно, используя f-строки.

Мне было интересно, несмотря на эти два решения выше, есть ли способ, изначально встроенный в Altair / Vega-Lite для выбора последних / первых n точек данных?

Надуманный пример с использованием f-строк -

index = 7 #a perhaps bad way to highlight last 2 data points
data = pd.DataFrame({'time':[0,1,2,3,4,5,6,7,8,9], 'value':[1,2,4,8,16,15,14,13,12,11]})

bar = alt.Chart(data).mark_bar(opacity=1, width=15).encode(
    x='time:T',
    y='value:Q',
    color = alt.condition(alt.datum.time>f'{index}', alt.value('red'), alt.value('steelblue'))
)

text = bar.mark_text(align='center', dy=-10).encode(
    text='value:Q'
)

bar+text

введите описание изображения здесь

1 Ответ

1 голос
/ 21 июня 2020

Вы можете сделать это, используя оконное преобразование, аналогично примеру Top-K Items :

import altair as alt
import pandas as pd

data = pd.DataFrame({'time':[0,1,2,3,4,5,6,7,8,9], 'value':[1,2,4,8,16,15,14,13,12,11]})
num_items = 2

base = alt.Chart(data).transform_window(
    rank='rank()',
    sort=[alt.SortField('time', order='descending')]
)

bar = base.mark_bar(opacity=1, width=15).encode(
    x='time:T',
    y='value:Q',
    color = alt.condition(alt.datum.rank<=num_items, alt.value('red'), alt.value('steelblue'))
)

text = bar.mark_text(align='center', dy=-10).encode(
    text='value:Q'
)

bar+text

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...