#json #kibana #aggregation #vega-lite #vega
#json #kibana #агрегация #vega-lite #vega
Вопрос:
У меня есть список данных такого формата
[
{"id": 100, "y": 28, "c":0},
{"id": 1, "y": 20, "c":1},
{"id": 2, "y": 43, "c":0},
{"id": 3, "y": 35, "c":1},
{"id": 4, "y": 81, "c":0},
{"id": 5, "y": 10, "c":1},
{"id": 6, "y": 19, "c":0},
{"id": 7, "y": 15, "c":1},
{"id": 8, "y": 52, "c":0},
{"id": 9, "y": 48, "c":1}
]
Моя цель — добиться суммирования полей x и y для всех документов, исключая id = 100, затем вычесть этот результат агрегирования из значений x и y документа с id = 100 и отобразить этот результат в виде метки типа текста.
Я пробовал следующее :
{
$schema: https://vega.github.io/schema/vega/v3.0.json
title: Sum amount Per id
data: [
{
"name": "table",
"values": [
{"id": 100, "y": 28, "c":0},
{"id": 1, "y": 20, "c":1},
{"id": 2, "y": 43, "c":0},
{"id": 3, "y": 35, "c":1},
{"id": 4, "y": 81, "c":0},
{"id": 5, "y": 10, "c":1},
{"id": 6, "y": 19, "c":0},
{"id": 7, "y": 15, "c":1},
{"id": 8, "y": 52, "c":0},
{"id": 9, "y": 48, "c":1}
]
transform: [
{
type: aggregate
ops: ["sum","sum"]
fields: ["c", "y"]
as: ["sumc","sumy"]
}
]
}
]
marks: [
{
type: text
from: {data: "table"}
encode: {
update: {
text: {signal: "datum.sumc"}
align: {value: "center"}
baseline: {value: "middle"}
xc: {signal: "width/4"}
yc: {signal: "height/2"}
fontSize: {signal: "min(width/10, height)/1.3"}
}
}
}
{
type: text
from: {data: "table"}
encode: {
update: {
text: {signal: "datum.sumy"}
align: {value: "center"}
baseline: {value: "middle"}
xc: {signal: "width*3/4"}
yc: {signal: "height/2"}
fontSize: {signal: "min(width/10, height)/1.3"}
}
}
}
]
}
Пожалуйста, помогите мне, как добиться вычитания из id = 100
Ответ №1:
Я смог решить эту проблему с помощью преобразования JoinAggregate в Vega, добавив значения агрегации в виде дополнительных столбцов в набор данных, а затем отфильтровав, чтобы получить одну строку с желаемыми значениями!
{
"$schema": "https://vega.github.io/schema/vega/v3.0.json",
"title": "Sum amount Per id",
"data": [
{
"name": "table",
"values": [
{"id": 100, "y": 2800, "c": 1000},
{"id": 1, "y": 20, "c": 1},
{"id": 2, "y": 43, "c": 0},
{"id": 3, "y": 35, "c": 1},
{"id": 4, "y": 81, "c": 0},
{"id": 5, "y": 10, "c": 1},
{"id": 6, "y": 19, "c": 0},
{"id": 7, "y": 15, "c": 1},
{"id": 8, "y": 52, "c": 0},
{"id": 9, "y": 48, "c": 1}
],
"transform": [
{
"type": "joinaggregate",
"ops": ["sum", "sum"],
"fields": ["c", "y"],
"as": ["sumc", "sumy"]
},{
"type":"filter"
"expr":"datum.id==100"
}
]
}
],
"marks": [
{
"type": "text",
"from": {"data": "table"},
"encode": {
"update": {
"text": {"signal": "-datum.sumc datum.c*2"},
"align": {"value": "center"},
"baseline": {"value": "middle"},
"xc": {"signal": "width/4"},
"yc": {"signal": "height/2"},
"fontSize": {"signal": "min(width/10, height)/1.3"}
}
}
},
{
"type": "text",
"from": {"data": "table"},
"encode": {
"update": {
"text": {"signal": "datum.y-datum.sumy datum.y"},
"align": {"value": "center"},
"baseline": {"value": "middle"},
"xc": {"signal": "width*3/4"},
"yc": {"signal": "height/2"},
"fontSize": {"signal": "min(width/10, height)/1.3"}
}
}
}
]
}