Spec-Zone.ru › Elasticsearch 7
›Руководство по Elasticsearch [7.17] ›Агрегации ›Агрегации поэтапно

Агрегация с функцией скользящего окна

При заданной упорядоченной серии данных агрегация Moving Function будет скользить окном по данным, и позволит пользователю указать пользовательский скрипт, который будет выполняться на каждом окне данных. Для удобства предусмотрено несколько общих функций, таких как min/max, скользящие средние и т.д.

По концепции это очень похоже на агрегацию поэтапно скользящего среднего, за исключением того, что она предоставляет больше функциональности.

Синтаксис

Агрегация moving_fn выглядит следующим образом:

{
  "moving_fn": {
    "buckets_path": "the_sum",
    "window": 10,
    "script": "MovingFunctions.min(values)"
  }
}

Таблица 60. moving_fn Параметры

Имя параметра Описание Обязательный Значение по умолчанию

buckets_path

Путь к метрике, представляющей интерес (см. buckets_path Синтаксис для получения более подробной информации)

Обязательный

window

Размер окна для "скольжения" по гистограмме.

Обязательный

script

Скрипт, который должен выполняться на каждом окне данных

Обязательный

gap_policy

Политика, применяемая при обнаружении пробелов в данных. См. Обработка пробелов в данных.

Необязательный

skip

shift

Смещение позиции окна.

Необязательный

0

Агрегации moving_fn должны быть встроены в histogram или date_histogram агрегацию. Они могут быть встроены как любая другая метрическая агрегация:

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {                  
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }   
        },
        "the_movfn": {
          "moving_fn": {
            "buckets_path": "the_sum",  
            "window": 10,
            "script": "MovingFunctions.unweightedAvg(values)"
          }
        }
      }
    }
  }
}

Создается date_histogram с именем "my_date_histo" по полю "timestamp" с интервалами в один день

Используется sum метрика для расчета суммы поля. Это может быть любая числовая метрика (сумма, мин, макс и т.д)

Наконец, задается moving_fn агрегация, которая использует метрику "the_sum" в качестве входных данных.

Скользящие средние строятся, сначала задавая histogram или date_histogram по полю. Затем можно необязательно добавить числовые метрики, такие как sum, внутри этой гистограммы. Наконец, moving_fn встраивается внутри гистограммы. Параметр buckets_path используется для указания на одну из метрик-собратьев внутри гистограммы (см. buckets_path Синтаксис для описания синтаксиса buckets_path).

Пример ответа от вышеуказанной агрегации:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "my_date_histo": {
         "buckets": [
             {
                 "key_as_string": "2015/01/01 00:00:00",
                 "key": 1420070400000,
                 "doc_count": 3,
                 "the_sum": {
                    "value": 550.0
                 },
                 "the_movfn": {
                    "value": null
                 }
             },
             {
                 "key_as_string": "2015/02/01 00:00:00",
                 "key": 1422748800000,
                 "doc_count": 2,
                 "the_sum": {
                    "value": 60.0
                 },
                 "the_movfn": {
                    "value": 550.0
                 }
             },
             {
                 "key_as_string": "2015/03/01 00:00:00",
                 "key": 1425168000000,
                 "doc_count": 2,
                 "the_sum": {
                    "value": 375.0
                 },
                 "the_movfn": {
                    "value": 305.0
                 }
             }
         ]
      }
   }
}

Пользовательское программирование на скриптах

Агрегация Moving Function позволяет пользователю указать любой произвольный скрипт для определения пользовательской логики. Скрипт вызывается каждый раз, когда собирается новое окно данных. Эти значения предоставляются скрипту в переменной values. Затем скрипт должен выполнить какой-либо расчет и выдать единственное значение double в качестве результата. Вывод null не допускается, хотя NaN и +/- Inf разрешены.

Например, этот скрипт просто возвращает первое значение из окна или NaN, если значения недоступны:

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "return values.length > 0 ? values[0] : Double.NaN"
          }
        }
      }
    }
  }
}

Параметр смещения

По умолчанию (с shift = 0), окно, предлагаемое для расчета, содержит последние n значения, исключая текущий бакет. Увеличение shift на 1 смещает начальную позицию окна на 1 вправо.

  • Для включения текущего бакет в окно, используйте shift = 1.
  • Для выравнивания по центру (n / 2 значений до и после текущего бакет), используйте shift = window / 2.
  • Для выравнивания по правому краю (n значений после текущего бакет), используйте shift = window.

Если какое-либо из краев окна выходит за пределы серии данных, окно сужается, включая только доступные значения.

Предопределенные функции

Для удобства, ряд функций предопределен и доступен в контексте скрипта moving_fn:

  • max()
  • min()
  • sum()
  • stdDev()
  • unweightedAvg()
  • linearWeightedAvg()
  • ewma()
  • holt()
  • holtWinters()

Функции доступны из пространства имен MovingFunctions. Например: MovingFunctions.max()

Функция max

Эта функция принимает набор значений типа double и возвращает максимальное значение в этом окне. Значения null и NaN игнорируются; максимальное значение вычисляется только для действительных значений. Если окно пустое или все значения являются null/NaN, то результатом будет NaN.

Таблица 61. Параметры функции max(double[] values)

Имя параметра Описание

values

Окно значений для поиска максимального значения

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_moving_max": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.max(values)"
          }
        }
      }
    }
  }
}

Функция min

Эта функция принимает набор значений типа double и возвращает минимальное значение в этом окне. Значения null и NaN игнорируются; минимальное значение вычисляется только для действительных значений. Если окно пустое или все значения являются null/NaN, то результатом будет NaN.

Таблица 62. Параметры функции min(double[] values)

Имя параметра Описание

values

Окно значений для поиска минимального значения

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_moving_min": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.min(values)"
          }
        }
      }
    }
  }
}

Функция sum

Эта функция принимает набор значений типа double и возвращает сумму значений в этом окне. Значения null и NaN игнорируются; сумма вычисляется только для действительных значений. Если окно пустое или все значения являются null/NaN, то результатом будет 0.0.

Таблица 63. Параметры функции sum(double[] values)

Имя параметра Описание

values

Окно значений для вычисления суммы

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_moving_sum": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.sum(values)"
          }
        }
      }
    }
  }
}

Функция stdDev

Эта функция принимает набор значений типа double, вычисляет среднее арифметическое, и затем возвращает стандартное отклонение значений в этом окне. null и NaN значения игнорируются; сумма вычисляется только для действительных значений. Если окно пустое или все значения являются null/NaN, то результатом будет 0.0.

Таблица 64. Параметры функции stdDev(double[] values)

Имя параметра Описание

values

Окно значений для вычисления стандартного отклонения

avg

Среднее арифметическое окна

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_moving_sum": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.stdDev(values, MovingFunctions.unweightedAvg(values))"
          }
        }
      }
    }
  }
}

Параметр avg должен быть предоставлен функции стандартного отклонения, так как различные стили вычисления среднего могут быть применены к окну (простое, линейно взвешенное и т.д.). Различные скользящие средние, которые описаны ниже, могут быть использованы для вычисления среднего значения для функции стандартного отклонения.

Функция unweightedAvg

Функция unweightedAvg вычисляет сумму всех значений в окне, а затем делит на размер окна. Это фактически простое среднее арифметическое окна. Простое скользящее среднее не выполняет временную взвешивание, что означает, что значения от simple скользящего среднего имеют тенденцию "отставать" от реальных данных.

null и NaN значения игнорируются; среднее вычисляется только для действительных значений. Если окно пустое или все значения являются null/NaN, то результатом будет NaN. Это означает, что количество используемых в вычислении среднего значений - это количество не-null, не-NaN значений.

Таблица 65. Параметры функции unweightedAvg(double[] values)

Имя параметра Описание

values

Окно значений для вычисления суммы

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.unweightedAvg(values)"
          }
        }
      }
    }
  }
}

Функция linearWeightedAvg

Функция linearWeightedAvg назначает линейную взвешенность точкам в ряду, так что "более старые" точки данных (например, те, что в начале окна) вносят линейно меньший вклад в общее среднее. Линейная взвешенность помогает уменьшить "отставание" от среднего значения данных, так как более старые точки имеют меньшее влияние.

Если окно пустое или все значения являются null/NaN, то результатом будет NaN.

Таблица 66. Параметры функции linearWeightedAvg(double[] values)

Имя параметра Описание

values

Окно значений для вычисления суммы

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.linearWeightedAvg(values)"
          }
        }
      }
    }
  }
}

Функция ewma

Функция ewma (также известная как "экспоненциальная") похожа на функцию linearMovAvg, за исключением того, что более старые точки данных становятся экспоненциально менее важными, а не линейно менее важными. Скорость, с которой важность убывает, может быть контролируема с помощью параметра alpha. Малые значения делают вес убывает медленно, что обеспечивает большую сглаженность и учитывает большую часть окна. Большие значения делают вес убывает быстро, что уменьшает влияние более старых значений на скользящее среднее. Это, как правило, заставляет скользящее среднее более точно следовать за данными, но с меньшей сглаживанием.

null и NaN значения игнорируются; среднее вычисляется только для действительных значений. Если окно пустое или все значения являются null/NaN, то результатом будет NaN. Это означает, что количество используемых в вычислении среднего значений - это количество не-null, не-NaN значений.

Таблица 67. Параметры функции ewma(double[] values, double alpha)

Имя параметра Описание

values

Окно значений для вычисления суммы

alpha

Экспоненциальное убывание

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.ewma(values, 0.3)"
          }
        }
      }
    }
  }
}

Функция holt

Функция holt (также известная как «двойная экспоненциальная») включает второй экспоненциальный член, который отслеживает тренд данных. Простая экспоненциальная функция плохо работает, когда данные имеют скрытый линейный тренд. Двойная экспоненциальная модель рассчитывает два значения внутри: «уровень» и «тенденцию».

Вычисление уровня аналогично вычислению ewma и представляет собой экспоненциально взвешенное представление данных. Разница в том, что вместо исходного значения используется ранее сглаженное значение, что позволяет ему оставаться близким к исходному ряду. Вычисление тренда рассматривает разницу между текущим и последним значениями (например, наклон или тренд сглаженных данных). Значение тренда также экспоненциально взвешено.

Значения получаются путем умножения компонентов уровня и тренда.

Значения null и NaN игнорируются; среднее значение вычисляется только для действительных значений. Если окно пустое или все значения являются null/NaN, возвращается значение NaN. Это означает, что количество, используемое в вычислении среднего значения, равно количеству ненулевых, не-null, не-NaN значений.

Таблица 68. Параметры функции holt(double[] values, double alpha)

Имя параметра Описание

values

Интервал значений для нахождения суммы

alpha

Значение затухания уровня

beta

Значение затухания тренда

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.holt(values, 0.3, 0.1)"
          }
        }
      }
    }
  }
}

На практике значение alpha ведет себя очень похоже в holtMovAvg, как и ewmaMovAvg: маленькие значения обеспечивают большее сглаживание и задержку, а большие значения обеспечивают более точное отслеживание и меньшую задержку. Значение beta часто трудно определить. Маленькие значения подчеркивают долгосрочные тенденции (например, постоянный линейный тренд во всем ряду), а большие значения подчеркивают краткосрочные тенденции.

Функция holtWinters

Функция holtWinters (также известная как «тройная экспоненциальная») включает третий экспоненциальный член, который отслеживает сезонный аспект ваших данных. Таким образом, этот агрегированный подход обеспечивает сглаживание на основе трех компонентов: «уровень», «тенденция» и «сезонность».

Вычисление уровня и тренда идентично holt. Вычисление сезонности рассматривает разницу между текущей точкой и точкой, расположенной на один период ранее.

Для Holt-Winters требуется немного больше ручного управления, чем для других скользящих средних. Вам необходимо указать «периодичность» ваших данных: например, если ваши данные имеют циклические тренды каждые 7 дней, вы должны установить period = 7. Аналогично, если наблюдается месячный тренд, вы должны установить его на 30. В настоящее время нет обнаружения периодичности, хотя это запланировано на будущее.

Значения null и NaN игнорируются; среднее значение вычисляется только для действительных значений. Если окно пустое или все значения являются null/NaN, возвращается значение NaN. Это означает, что количество, используемое в вычислении среднего значения, равно количеству ненулевых, не-null, не-NaN значений.

Таблица 69. Параметры функции holtWinters(double[] values, double alpha)

Имя параметра Описание

values

Интервал значений для нахождения суммы

alpha

Значение затухания уровня

beta

Значение затухания тренда

gamma

Значение затухания сезонности

period

Периодичность данных

multiplicative

Истинно, если вы хотите использовать мультипликативную Holt-Winters, ложно для использования аддитивной

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "if (values.length > 5*2) {MovingFunctions.holtWinters(values, 0.3, 0.1, 0.1, 5, false)}"
          }
        }
      }
    }
  }
}

Мультипликативная Holt-Winters работает путем деления каждого значения данных на сезонное значение. Это проблематично, если некоторые из ваших данных равны нулю или если в данных есть пробелы (поскольку это приводит к делению на ноль). Чтобы противостоять этому, mult Holt-Winters добавляет ко всем значениям очень маленькое значение (1*10-10), чтобы все значения были ненулевыми. Это влияет на результат, но только незначительно. Если ваши данные не равны нулю или вы предпочитаете видеть NaN при встрече нулей, вы можете отключить это поведение с помощью pad: false

«Холодный запуск»

К сожалению, из-за природы Holt-Winters, ему необходимо два периода данных для «запуска» алгоритма. Это означает, что ваш window всегда должен быть по крайней мере вдвое больше вашего периода. Если это не так, будет выброшено исключение. Это также означает, что Holt-Winters не будет выдавать значение для первых 2 * period блоков; текущий алгоритм не выполняет обратное вычисление.

В приведенном выше примере вы заметите оператор if (), проверяющий размер значений. Это проверяет, есть ли у нас два периода данных (5 * 2, где 5 - период, указанный в функции holtWintersMovAvg), прежде чем вызывать функцию Holt-Winters.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/search-aggregations-pipeline-movfn-aggregation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API