Агрегация extended stats
Агрегация метрик multi-value, которая вычисляет статистические данные по числовым значениям, извлечённым из агрегированных документов.
Агрегация extended_stats — это расширенная версия агрегации stats, где добавляются дополнительные метрики, такие как sum_of_squares, variance, std_deviation и std_deviation_bounds.
Предположим, что данные состоят из документов, представляющих оценки (от 0 до 100) по экзаменам студентов.
resp = client.search(
index="exams",
size=0,
aggs={
"grades_stats": {
"extended_stats": {
"field": "grade"
}
}
},
)
print(resp) response = client.search(
index: 'exams',
body: {
size: 0,
aggregations: {
grades_stats: {
extended_stats: {
field: 'grade'
}
}
}
}
)
puts response const response = await client.search({
index: "exams",
size: 0,
aggs: {
grades_stats: {
extended_stats: {
field: "grade",
},
},
},
});
console.log(response); GET /exams/_search
{
"size": 0,
"aggs": {
"grades_stats": { "extended_stats": { "field": "grade" } }
}
} Вышеуказанная агрегация вычисляет статистику оценок по всем документам. Тип агрегации — extended_stats, а параметр field определяет числовое поле документов, по которому будут вычисляться статистические данные. Вышеуказанное вернёт следующее:
std_deviation и variance рассчитываются как метрики по генеральной совокупности, поэтому они всегда будут такими же, как std_deviation_population и variance_population соответственно.
{
...
"aggregations": {
"grades_stats": {
"count": 2,
"min": 50.0,
"max": 100.0,
"avg": 75.0,
"sum": 150.0,
"sum_of_squares": 12500.0,
"variance": 625.0,
"variance_population": 625.0,
"variance_sampling": 1250.0,
"std_deviation": 25.0,
"std_deviation_population": 25.0,
"std_deviation_sampling": 35.35533905932738,
"std_deviation_bounds": {
"upper": 125.0,
"lower": 25.0,
"upper_population": 125.0,
"lower_population": 25.0,
"upper_sampling": 145.71067811865476,
"lower_sampling": 4.289321881345245
}
}
}
} Имя агрегации (grades_stats выше) также используется в качестве ключа для получения результата агрегации из возвращённого ответа.
Границы стандартного отклонения
По умолчанию метрика extended_stats вернёт объект под названием std_deviation_bounds, который предоставляет интервал, плюс-минус два стандартных отклонения от среднего значения. Это может быть полезным способом визуализации дисперсии данных. Если вам требуется другая граница, например, три стандартных отклонения, вы можете установить sigma в запросе:
resp = client.search(
index="exams",
size=0,
aggs={
"grades_stats": {
"extended_stats": {
"field": "grade",
"sigma": 3
}
}
},
)
print(resp) response = client.search(
index: 'exams',
body: {
size: 0,
aggregations: {
grades_stats: {
extended_stats: {
field: 'grade',
sigma: 3
}
}
}
}
)
puts response const response = await client.search({
index: "exams",
size: 0,
aggs: {
grades_stats: {
extended_stats: {
field: "grade",
sigma: 3,
},
},
},
});
console.log(response); GET /exams/_search
{
"size": 0,
"aggs": {
"grades_stats": {
"extended_stats": {
"field": "grade",
"sigma": 3
}
}
}
} |
|
sigma может быть любым неотрицательным числом с плавающей запятой, что означает, что вы можете запросить нецелые значения, такие как 1.5. Значение 0 является допустимым, но просто вернёт среднее значение для границ upper и lower.
Границы upper и lower рассчитываются как метрики по генеральной совокупности, поэтому они всегда будут такими же, как upper_population и lower_population соответственно.
Стандартное отклонение и границы требуют нормальности
Стандартное отклонение и его границы отображаются по умолчанию, но они не всегда применимы ко всем наборам данных. Ваши данные должны быть нормально распределены для того, чтобы метрики имели смысл. Статистика, стоящая за стандартными отклонениями, предполагает нормально распределённые данные, поэтому если ваши данные сильно скошены влево или вправо, возвращаемое значение будет вводящим в заблуждение.
Скрипт
Если вам нужно агрегировать по значению, которое не индексируется, используйте runtime-поле. Допустим, мы обнаружили, что оценки, над которыми мы работали, относятся к экзамену, который был выше уровня студентов, и мы хотим его «исправить»:
resp = client.search(
index="exams",
size=0,
runtime_mappings={
"grade.corrected": {
"type": "double",
"script": {
"source": "emit(Math.min(100, doc['grade'].value * params.correction))",
"params": {
"correction": 1.2
}
}
}
},
aggs={
"grades_stats": {
"extended_stats": {
"field": "grade.corrected"
}
}
},
)
print(resp) response = client.search(
index: 'exams',
body: {
size: 0,
runtime_mappings: {
'grade.corrected' => {
type: 'double',
script: {
source: "emit(Math.min(100, doc['grade'].value * params.correction))",
params: {
correction: 1.2
}
}
}
},
aggregations: {
grades_stats: {
extended_stats: {
field: 'grade.corrected'
}
}
}
}
)
puts response const response = await client.search({
index: "exams",
size: 0,
runtime_mappings: {
"grade.corrected": {
type: "double",
script: {
source: "emit(Math.min(100, doc['grade'].value * params.correction))",
params: {
correction: 1.2,
},
},
},
},
aggs: {
grades_stats: {
extended_stats: {
field: "grade.corrected",
},
},
},
});
console.log(response); GET /exams/_search
{
"size": 0,
"runtime_mappings": {
"grade.corrected": {
"type": "double",
"script": {
"source": "emit(Math.min(100, doc['grade'].value * params.correction))",
"params": {
"correction": 1.2
}
}
}
},
"aggs": {
"grades_stats": {
"extended_stats": { "field": "grade.corrected" }
}
}
} Пропущенное значение
Параметр missing определяет, как должны обрабатываться документы, у которых отсутствует значение. По умолчанию они игнорируются, но также можно обработать их так, как будто у них есть значение.
resp = client.search(
index="exams",
size=0,
aggs={
"grades_stats": {
"extended_stats": {
"field": "grade",
"missing": 0
}
}
},
)
print(resp) response = client.search(
index: 'exams',
body: {
size: 0,
aggregations: {
grades_stats: {
extended_stats: {
field: 'grade',
missing: 0
}
}
}
}
)
puts response const response = await client.search({
index: "exams",
size: 0,
aggs: {
grades_stats: {
extended_stats: {
field: "grade",
missing: 0,
},
},
},
});
console.log(response); GET /exams/_search
{
"size": 0,
"aggs": {
"grades_stats": {
"extended_stats": {
"field": "grade",
"missing": 0
}
}
}
} | Документы без значения в поле |
© 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-metrics-extendedstats-aggregation.html