-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Median Absolute Deviation Aggregation (#3627)
Relates: #3615
- Loading branch information
Showing
8 changed files
with
222 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
76 changes: 76 additions & 0 deletions
76
.../median-absolute-deviation/median-absolute-deviation-aggregation-usage.asciidoc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
:ref_current: https://www.elastic.co/guide/en/elasticsearch/reference/6.7 | ||
|
||
:github: https://github.com/elastic/elasticsearch-net | ||
|
||
:nuget: https://www.nuget.org/packages | ||
|
||
//// | ||
IMPORTANT NOTE | ||
============== | ||
This file has been generated from https://github.com/elastic/elasticsearch-net/tree/6.x/src/Tests/Tests/Aggregations/Metric/MedianAbsoluteDeviation/MedianAbsoluteDeviationAggregationUsageTests.cs. | ||
If you wish to submit a PR for any spelling mistakes, typos or grammatical errors for this file, | ||
please modify the original csharp file found at the link and submit the PR with that change. Thanks! | ||
//// | ||
|
||
[[median-absolute-deviation-aggregation-usage]] | ||
=== Median Absolute Deviation Aggregation Usage | ||
|
||
A single-value aggregation that approximates the median absolute deviation of its search results. | ||
|
||
Median absolute deviation is a measure of variability. It is a robust statistic, meaning that it is | ||
useful for describing data that may have outliers, or may not be normally distributed. | ||
For such data it can be more descriptive than standard deviation. | ||
|
||
It is calculated as the median of each data point's deviation from the median of the | ||
entire sample. That is, for a random variable `X`, the median absolute deviation is `median(|median(X) - Xi|)`. | ||
|
||
Be sure to read the Elasticsearch documentation on {ref_current}/search-aggregations-metrics-median-absolute-deviation-aggregation.html[Median Absolute Deviation Aggregation] | ||
|
||
==== Fluent DSL example | ||
|
||
[source,csharp] | ||
---- | ||
a => a | ||
.Average("average_commits", avg => avg | ||
.Field(p => p.NumberOfCommits) | ||
) | ||
.MedianAbsoluteDeviation("commit_variability", m => m | ||
.Field(f => f.NumberOfCommits) | ||
) | ||
---- | ||
|
||
==== Object Initializer syntax example | ||
|
||
[source,csharp] | ||
---- | ||
new AverageAggregation("average_commits", Infer.Field<Project>(p => p.NumberOfCommits)) && | ||
new MedianAbsoluteDeviationAggregation("commit_variability", Infer.Field<Project>(p => p.NumberOfCommits)) | ||
---- | ||
|
||
[source,javascript] | ||
.Example json output | ||
---- | ||
{ | ||
"average_commits": { | ||
"avg": { | ||
"field": "numberOfCommits" | ||
} | ||
}, | ||
"commit_variability": { | ||
"median_absolute_deviation": { | ||
"field": "numberOfCommits" | ||
} | ||
} | ||
} | ||
---- | ||
|
||
==== Handling Responses | ||
|
||
[source,csharp] | ||
---- | ||
response.ShouldBeValid(); | ||
var medianAbsoluteDeviation = response.Aggregations.MedianAbsoluteDeviation("commit_variability"); | ||
medianAbsoluteDeviation.Should().NotBeNull(); | ||
medianAbsoluteDeviation.Value.Should().BeGreaterThan(0); | ||
---- | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
56 changes: 56 additions & 0 deletions
56
src/Nest/Aggregations/Metric/MedianAbsoluteDeviation/MedianAbsoluteDeviationAggregation.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
using System.Runtime.Serialization; | ||
using Elasticsearch.Net; | ||
|
||
namespace Nest | ||
{ | ||
/// <summary> | ||
/// This single-value aggregation approximates the median absolute deviation of its search results. | ||
/// | ||
/// Median absolute deviation is a measure of variability. It is a robust statistic, meaning that | ||
/// it is useful for describing data that may have outliers, or may not be normally distributed. | ||
/// For such data it can be more descriptive than standard deviation. | ||
/// | ||
/// It is calculated as the median of each data point’s deviation from the median of the | ||
/// entire sample. That is, for a random variable <code>X</code>, the median absolute deviation | ||
/// is <code>median(|median(X) - Xi|).</code> | ||
/// </summary> | ||
[InterfaceDataContract] | ||
[ReadAs(typeof(MedianAbsoluteDeviationAggregation))] | ||
public interface IMedianAbsoluteDeviationAggregation : IMetricAggregation | ||
{ | ||
/// <summary> | ||
/// TDigest algorithm component that controls memory usage and approximation error. | ||
/// By increasing the compression value, you can increase the accuracy | ||
/// at the cost of more memory. Larger compression values also make | ||
/// the algorithm slower since the underlying tree data structure grows in | ||
/// size, resulting in more expensive operations. The default compression value is <c>100</c>. | ||
/// </summary> | ||
[DataMember(Name = "compression")] | ||
double? Compression { get; set; } | ||
} | ||
|
||
/// <inheritdoc cref="IMedianAbsoluteDeviationAggregation"/> | ||
public class MedianAbsoluteDeviationAggregation : MetricAggregationBase, IMedianAbsoluteDeviationAggregation | ||
{ | ||
internal MedianAbsoluteDeviationAggregation() { } | ||
|
||
public MedianAbsoluteDeviationAggregation(string name, Field field) : base(name, field) { } | ||
|
||
/// <inheritdoc /> | ||
public double? Compression { get; set; } | ||
|
||
internal override void WrapInContainer(AggregationContainer c) => c.MedianAbsoluteDeviation = this; | ||
} | ||
|
||
/// <inheritdoc cref="IMedianAbsoluteDeviationAggregation"/> | ||
public class MedianAbsoluteDeviationAggregationDescriptor<T> | ||
: MetricAggregationDescriptorBase<MedianAbsoluteDeviationAggregationDescriptor<T>, IMedianAbsoluteDeviationAggregation, T> | ||
, IMedianAbsoluteDeviationAggregation | ||
where T : class | ||
{ | ||
double? IMedianAbsoluteDeviationAggregation.Compression { get; set; } | ||
|
||
/// <inheritdoc cref="IMedianAbsoluteDeviationAggregation.Compression"/> | ||
public MedianAbsoluteDeviationAggregationDescriptor<T> Compression(double? compression) => Assign(compression, (a, v) => a.Compression = v); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
67 changes: 67 additions & 0 deletions
67
...gregations/Metric/MedianAbsoluteDeviation/MedianAbsoluteDeviationAggregationUsageTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
using System; | ||
using Elastic.Xunit.XunitPlumbing; | ||
using FluentAssertions; | ||
using Nest; | ||
using Tests.Core.Extensions; | ||
using Tests.Core.ManagedElasticsearch.Clusters; | ||
using Tests.Domain; | ||
using Tests.Framework.Integration; | ||
|
||
namespace Tests.Aggregations.Metric.MedianAbsoluteDeviation | ||
{ | ||
/** | ||
* A single-value aggregation that approximates the median absolute deviation of its search results. | ||
* | ||
* Median absolute deviation is a measure of variability. It is a robust statistic, meaning that it is | ||
* useful for describing data that may have outliers, or may not be normally distributed. | ||
* For such data it can be more descriptive than standard deviation. | ||
* | ||
* It is calculated as the median of each data point's deviation from the median of the | ||
* entire sample. That is, for a random variable `X`, the median absolute deviation is `median(|median(X) - Xi|)`. | ||
* | ||
* Be sure to read the Elasticsearch documentation on {ref_current}/search-aggregations-metrics-median-absolute-deviation-aggregation.html[Median Absolute Deviation Aggregation] | ||
*/ | ||
[SkipVersion("<6.6.0", "Introduced in Elasticsearch 6.6.0")] | ||
public class MedianAbsoluteDeviationAggregationUsageTests : AggregationUsageTestBase | ||
{ | ||
public MedianAbsoluteDeviationAggregationUsageTests(ReadOnlyCluster i, EndpointUsage usage) : base(i, usage) { } | ||
|
||
protected override object AggregationJson => new | ||
{ | ||
average_commits = new | ||
{ | ||
avg = new | ||
{ | ||
field = "numberOfCommits", | ||
} | ||
}, | ||
commit_variability = new | ||
{ | ||
median_absolute_deviation = new | ||
{ | ||
field = "numberOfCommits" | ||
} | ||
} | ||
}; | ||
|
||
protected override Func<AggregationContainerDescriptor<Project>, IAggregationContainer> FluentAggs => a => a | ||
.Average("average_commits", avg => avg | ||
.Field(p => p.NumberOfCommits) | ||
) | ||
.MedianAbsoluteDeviation("commit_variability", m => m | ||
.Field(f => f.NumberOfCommits) | ||
); | ||
|
||
protected override AggregationDictionary InitializerAggs => | ||
new AverageAggregation("average_commits", Infer.Field<Project>(p => p.NumberOfCommits)) && | ||
new MedianAbsoluteDeviationAggregation("commit_variability", Infer.Field<Project>(p => p.NumberOfCommits)); | ||
|
||
protected override void ExpectResponse(SearchResponse<Project> response) | ||
{ | ||
response.ShouldBeValid(); | ||
var medianAbsoluteDeviation = response.Aggregations.MedianAbsoluteDeviation("commit_variability"); | ||
medianAbsoluteDeviation.Should().NotBeNull(); | ||
medianAbsoluteDeviation.Value.Should().BeGreaterThan(0); | ||
} | ||
} | ||
} |