Агрегирование производной
Родительское агрегирование на основе конвейера, которое вычисляет производную указанного метрики в родительском агрегировании гистограммы (или date_histogram). Указанная метрика должна быть числовой, а окружающая гистограмма должна иметь min_doc_count, установленное на 0 (значение по умолчанию для агрегаций histogram).
Синтаксис
Агрегирование derivative выглядит так:
"derivative": {
"buckets_path": "the_sum"
} Таблица 61. Параметры агрегирования derivative
| Имя параметра | Описание | Обязательно | Значение по умолчанию |
|---|---|---|---|
| Путь к корзинам, для которых мы хотим найти производную (см. | Обязательно | |
| Политика, применяемая при обнаружении пробелов в данных (см. Обработка пробелов в данных для получения дополнительных сведений) | Необязательно |
|
| Шаблон DecimalFormat для выходного значения. При указании отформатированное значение возвращается в свойстве | Необязательно |
|
Производная первого порядка
Следующий фрагмент кода вычисляет производную общей ежемесячной sales:
resp = client.search(
index="sales",
size=0,
aggs={
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
},
"sales_deriv": {
"derivative": {
"buckets_path": "sales"
}
}
}
}
},
)
print(resp) response = client.search(
index: 'sales',
body: {
size: 0,
aggregations: {
sales_per_month: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
},
aggregations: {
sales: {
sum: {
field: 'price'
}
},
sales_deriv: {
derivative: {
buckets_path: 'sales'
}
}
}
}
}
}
)
puts response const response = await client.search({
index: "sales",
size: 0,
aggs: {
sales_per_month: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
aggs: {
sales: {
sum: {
field: "price",
},
},
sales_deriv: {
derivative: {
buckets_path: "sales",
},
},
},
},
},
});
console.log(response); POST /sales/_search
{
"size": 0,
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
},
"sales_deriv": {
"derivative": {
"buckets_path": "sales"
}
}
}
}
}
} |
|
И вот возможный ответ:
{
"took": 11,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"sales_per_month": {
"buckets": [
{
"key_as_string": "2015/01/01 00:00:00",
"key": 1420070400000,
"doc_count": 3,
"sales": {
"value": 550.0
}
},
{
"key_as_string": "2015/02/01 00:00:00",
"key": 1422748800000,
"doc_count": 2,
"sales": {
"value": 60.0
},
"sales_deriv": {
"value": -490.0
}
},
{
"key_as_string": "2015/03/01 00:00:00",
"key": 1425168000000,
"doc_count": 2,
"sales": {
"value": 375.0
},
"sales_deriv": {
"value": 315.0
}
}
]
}
}
} | Для первой корзины производная отсутствует, так как для расчета производной требуется как минимум 2 точки данных | |
| Единицы измерения значения производной неявно определяются агрегированием | |
| Количество документов в корзине представлено значением |
Производная второго порядка
Производную второго порядка можно вычислить, объединив агрегирование производной на основе конвейера с результатом другого агрегирования производной на основе конвейера, как показано в следующем примере, который вычислит производные первого и второго порядка от общей ежемесячной продажи:
resp = client.search(
index="sales",
size=0,
aggs={
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
},
"sales_deriv": {
"derivative": {
"buckets_path": "sales"
}
},
"sales_2nd_deriv": {
"derivative": {
"buckets_path": "sales_deriv"
}
}
}
}
},
)
print(resp) response = client.search(
index: 'sales',
body: {
size: 0,
aggregations: {
sales_per_month: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
},
aggregations: {
sales: {
sum: {
field: 'price'
}
},
sales_deriv: {
derivative: {
buckets_path: 'sales'
}
},
"sales_2nd_deriv": {
derivative: {
buckets_path: 'sales_deriv'
}
}
}
}
}
}
)
puts response const response = await client.search({
index: "sales",
size: 0,
aggs: {
sales_per_month: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
aggs: {
sales: {
sum: {
field: "price",
},
},
sales_deriv: {
derivative: {
buckets_path: "sales",
},
},
sales_2nd_deriv: {
derivative: {
buckets_path: "sales_deriv",
},
},
},
},
},
});
console.log(response); POST /sales/_search
{
"size": 0,
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
},
"sales_deriv": {
"derivative": {
"buckets_path": "sales"
}
},
"sales_2nd_deriv": {
"derivative": {
"buckets_path": "sales_deriv"
}
}
}
}
}
} |
|
И вот возможный ответ:
{
"took": 50,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"sales_per_month": {
"buckets": [
{
"key_as_string": "2015/01/01 00:00:00",
"key": 1420070400000,
"doc_count": 3,
"sales": {
"value": 550.0
}
},
{
"key_as_string": "2015/02/01 00:00:00",
"key": 1422748800000,
"doc_count": 2,
"sales": {
"value": 60.0
},
"sales_deriv": {
"value": -490.0
}
},
{
"key_as_string": "2015/03/01 00:00:00",
"key": 1425168000000,
"doc_count": 2,
"sales": {
"value": 375.0
},
"sales_deriv": {
"value": 315.0
},
"sales_2nd_deriv": {
"value": 805.0
}
}
]
}
}
} | Вторая производная отсутствует для первых двух корзин, так как для расчета второй производной требуется как минимум 2 точки данных из первой производной |
Единицы измерения
Агрегирование производной позволяет задавать единицы измерения значений производной. Это возвращает дополнительное поле в ответе normalized_value, которое сообщает значение производной в требуемых единицах оси x. В приведенном ниже примере мы вычисляем производную общей продажи за месяц, но запрашиваем производную продажи в единицах измерения продаж за день:
resp = client.search(
index="sales",
size=0,
aggs={
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
},
"sales_deriv": {
"derivative": {
"buckets_path": "sales",
"unit": "day"
}
}
}
}
},
)
print(resp) response = client.search(
index: 'sales',
body: {
size: 0,
aggregations: {
sales_per_month: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
},
aggregations: {
sales: {
sum: {
field: 'price'
}
},
sales_deriv: {
derivative: {
buckets_path: 'sales',
unit: 'day'
}
}
}
}
}
}
)
puts response const response = await client.search({
index: "sales",
size: 0,
aggs: {
sales_per_month: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
aggs: {
sales: {
sum: {
field: "price",
},
},
sales_deriv: {
derivative: {
buckets_path: "sales",
unit: "day",
},
},
},
},
},
});
console.log(response); POST /sales/_search
{
"size": 0,
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
},
"sales_deriv": {
"derivative": {
"buckets_path": "sales",
"unit": "day"
}
}
}
}
}
} |
|
И вот возможный ответ:
{
"took": 50,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"sales_per_month": {
"buckets": [
{
"key_as_string": "2015/01/01 00:00:00",
"key": 1420070400000,
"doc_count": 3,
"sales": {
"value": 550.0
}
},
{
"key_as_string": "2015/02/01 00:00:00",
"key": 1422748800000,
"doc_count": 2,
"sales": {
"value": 60.0
},
"sales_deriv": {
"value": -490.0,
"normalized_value": -15.806451612903226
}
},
{
"key_as_string": "2015/03/01 00:00:00",
"key": 1425168000000,
"doc_count": 2,
"sales": {
"value": 375.0
},
"sales_deriv": {
"value": 315.0,
"normalized_value": 11.25
}
}
]
}
}
} |
| |
|
|
© 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/8.17/search-aggregations-pipeline-derivative-aggregation.html