Как вычислить агрегаты агрегатов для ярлыков / всплывающих подсказок? - PullRequest
0 голосов
/ 25 января 2019

Если у меня есть данные временных рядов, которые агрегируются.Можно ли выполнить дополнительное агрегирование и отобразить его во всплывающей подсказке?

Вот более явный пример моего вопроса.Для приведенного ниже примера кода мы показываем сумму весов, агрегированных по месяцам для трех разных видов фруктов.Можно ли также показывать общий вес каждого месяца (и / или, возможно, нормализованный процент веса по фруктам каждый месяц) в виде метки или в подсказке?

Я поигрался с transform_aggregate, но, похоже, не смог заставить его работать (в итоге он искажает group by для фруктов).:(

dates = np.array([
     np.datetime64('200%s-%.02d-%.02d' % (i,j,k)) 
                   for i in range(5) 
                   for j in range(1,13) 
                   for k in range(1, 29)])
data = pd.DataFrame({
    'timestamp': dates,
    'weight': np.random.randint(0, 20, 1680),
    'fruit': np.random.randint(0,3, 1680)
})
date_month = alt.X('yearmonth(timestamp):O', title='Month')
total = alt.Y('weight:Q', aggregate='sum', title='Metric')

(alt.Chart(data).mark_bar().encode(
    x=date_month,
    y=total,
    color='fruit',
    tooltip=[date_month, total, 'fruit']
))

1 Ответ

0 голосов
/ 25 января 2019

Способ сделать это с помощью агрегатных преобразований, хотя это немного сложнее, потому что вам нужно убедиться, что данные правильно сгруппированы, прежде чем вычислять агрегат.Вот как вы можете воспроизвести диаграмму, используя агрегированные преобразования, а не агрегаты в кодировке:

alt.Chart(data).transform_timeunit(
    Month='yearmonth(timestamp)'
).transform_aggregate(
    Metric='sum(weight)',
    groupby=['fruit', 'Month']
).mark_bar().encode(
    x='yearmonth(Month):O',  # use yearmonth to control axis format
    y='Metric:Q',
    color='fruit:Q',
    tooltip=['yearmonth(Month):O', 'Metric:Q', 'fruit:Q']
)

enter image description here

После того, как вы это сделаете, выможно использовать аналогичную стратегию (следя за groupby), чтобы отобразить сумму над каждым баром:

base = alt.Chart(data).transform_timeunit(
    Month='yearmonth(timestamp)'
).encode(
    x='yearmonth(Month):O'
)

labels = base.transform_aggregate(
    Total='sum(weight)',
    groupby=['Month']
).mark_text().encode(
    y='Total:Q',
    text='Total:Q'
)

bars = base.transform_aggregate(
    Metric='sum(weight)',
    groupby=['fruit', 'Month']
).mark_bar().encode(
    y='Metric:Q',
    color='fruit:Q',
    tooltip=['Month:O', 'Metric:Q', 'fruit:Q']
)

alt.layer(bars, labels, width=1400)

enter image description here

...