/// <summary> /// Gets the items with the highest values from <paramref name="statisticsResult"/>. /// /// This will return at least <paramref name="atLeast"/> items whose value exceeds <paramref name="minSampleValue"/> (if available). /// It will try to return all 'equal best' items (ie items in the same bucket) but only up to <paramref name="noMoreThan"/>. /// </summary> public static IEnumerable <T> GetTopItems <T>(this DiscreteStatisticsResult <T> statisticsResult, int atLeast, int noMoreThan, int minSampleValue = int.MinValue) { atLeast = Min(atLeast, statisticsResult.ItemsCount); noMoreThan = Min(noMoreThan, statisticsResult.ItemsCount); var itemsReturned = 0; for (int i = statisticsResult.BucketValues.Count - 1; i >= 0; i--) { if (itemsReturned >= atLeast) { break; } var bucketValue = statisticsResult.BucketValues[i]; if (bucketValue < minSampleValue) { break; } var bucket = statisticsResult.ItemsByBucket[bucketValue]; foreach (var item in bucket) { if (itemsReturned >= noMoreThan) { break; } yield return(item); itemsReturned++; } } }
public void When_Simple() { var rawValues = new[] { 12, 1, 5, 7, 5, 8, -4, 5, 1, 22, 5, 1, 8 }; var values = rawValues.Select(i => new SimpleWrapper(i)).ToArray(); var mean = (double)rawValues.Sum() / rawValues.Count(); var min = -4; var max = 22; var mode = 5; var sortedDistinct = rawValues.Distinct().OrderBy(i => i).ToArray(); var statisticsResult = DiscreteStatisticsResult.Create(values, v => v.Value); Assert.AreEqual(min, statisticsResult.Min); Assert.AreEqual(max, statisticsResult.Max); Assert.AreEqual(mode, statisticsResult.Mode); Assert.AreEqual(mean, statisticsResult.Mean); var index = -1; foreach (var bucket in statisticsResult.BucketValues) { index++; Assert.AreEqual(sortedDistinct[index], bucket); } Assert.AreEqual(4, statisticsResult.Histogram[5]); Assert.AreEqual(0, statisticsResult.Histogram[6]); Assert.IsFalse(statisticsResult.Histogram.ContainsKey(23)); Assert.IsTrue(statisticsResult.Histogram.ContainsKey(20)); }
public void When_Simple_BucketSD() { var rawValues = new[] { 11, 11, 11, 12, 14, 14 }; var values = rawValues.Select(i => new SimpleWrapper(i)).ToArray(); const double expectedSD = 1.1180339887499; // https://www.calculator.net/standard-deviation-calculator.html?numberinputs=3%2C+1%2C+0%2C+2&ctype=p&x=48&y=24 var statisticsResult = DiscreteStatisticsResult.Create(values, v => v.Value); Assert.AreEqual(expectedSD, statisticsResult.SDBucketCount, delta: 1e-6); }
public void When_Bucket_Counts() { var rawValues = new[] { 11, 11, 11, 12, 14, 14 }; var values = rawValues.Select(i => new SimpleWrapper(i)).ToArray(); var statisticsResult = DiscreteStatisticsResult.Create(values, v => v.Value); Assert.AreEqual(4, statisticsResult.Histogram.Count); Assert.AreEqual(3, statisticsResult.MaxBucketCount); Assert.AreEqual(0, statisticsResult.MinBucketCount); Assert.AreEqual(1.5, statisticsResult.MeanBucketCount); }