# Weighted average scripted metric usage

The current 1.4 docs mention that the scripted_metric aggregation is
experimental, and to share our usages. I've found a really great use on our
project so I thought I'd share!

While the 'stats' metric provides great data like 'sum' and 'average', we
needed to calculate a weighted average. In this case, the weighting field
is 'principal_amount', and the field we'd like the metric on is 'rate'. A
CURL for this agg is here:

curl -XGET "http://localhost:9200/my_index/_search" -d'
{
"size": 0,
"aggs": {
"test_script": {
"scripted_metric": {
"init_script": "_agg["numerator"] = []; _agg["denominator"] =
[];",
"map_script": "_agg.numerator << (doc["principal_amount"].value *
doc["rate"].value); _agg.denominator << doc["principal_amount"].value",
"combine_script" : "num_sum = 0; den_sum = 0; for (t in
_agg.numerator) { num_sum += t }; for (t in _agg.denominator) { den_sum +=
t };return [num_sum: num_sum, den_sum: den_sum]",
"reduce_script" : "num_sum = 0; den_sum=0; for (a in _aggs) {
num_sum += a.num_sum; den_sum += a.den_sum; }; return num_sum/den_sum"
}
}
}
}'

For reference, a weighted average is defined here (it's pretty simple):

Without this great new aggregation type, I guess I'd have to index the
product of 'rate' and 'principal_amount' so that I could run a stats agg on
that. It would work, but not as clean.

One thing I notice here is that there is quite a bit of redundancy between
the 'combine' and 'reduce' scripts. I haven't fully explored what the most
concise representation might look like, but it could be something to think

Thanks for including it!

--
You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com.

I have data that has a weighting field and I'd like to visualize the
weighted average in Kibana4. Is it possible to visualize this query in
Kibana4?

On Friday, 9 January 2015 23:42:42 UTC+1, Kallin Nagelberg wrote:

The current 1.4 docs mention that the scripted_metric aggregation is
experimental, and to share our usages. I've found a really great use on our
project so I thought I'd share!

While the 'stats' metric provides great data like 'sum' and 'average', we
needed to calculate a weighted average. In this case, the weighting field
is 'principal_amount', and the field we'd like the metric on is 'rate'. A
CURL for this agg is here:

curl -XGET "http://localhost:9200/my_index/_search" -d'
{
"size": 0,
"aggs": {
"test_script": {
"scripted_metric": {
"init_script": "_agg["numerator"] = []; _agg["denominator"] =
[];",
"map_script": "_agg.numerator << (doc["principal_amount"].value

• doc["rate"].value); _agg.denominator <<
doc["principal_amount"].value",
"combine_script" : "num_sum = 0; den_sum = 0; for (t in
_agg.numerator) { num_sum += t }; for (t in _agg.denominator) { den_sum +=
t };return [num_sum: num_sum, den_sum: den_sum]",
"reduce_script" : "num_sum = 0; den_sum=0; for (a in _aggs) {
num_sum += a.num_sum; den_sum += a.den_sum; }; return num_sum/den_sum"
}
}
}
}'

For reference, a weighted average is defined here (it's pretty simple):
http://www.investopedia.com/terms/w/weightedaverage.asp

Without this great new aggregation type, I guess I'd have to index the
product of 'rate' and 'principal_amount' so that I could run a stats agg on
that. It would work, but not as clean.

One thing I notice here is that there is quite a bit of redundancy between
the 'combine' and 'reduce' scripts. I haven't fully explored what the most
concise representation might look like, but it could be something to think