Возможно ли добиться такой агрегации с помощью vega / vega-lite?

#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"}
        }
      }
    }
  ]
}