|
|
@@ -8,6 +8,7 @@ import net.ranides.assira.collection.query.CQuery;
|
|
|
import net.ranides.assira.generic.CompareUtils;
|
|
|
|
|
|
import java.util.DoubleSummaryStatistics;
|
|
|
+import java.util.IntSummaryStatistics;
|
|
|
import java.util.List;
|
|
|
|
|
|
/**
|
|
|
@@ -31,8 +32,17 @@ public class MathStats {
|
|
|
* @param data input
|
|
|
* @return standard deviation stats
|
|
|
*/
|
|
|
- public static StandardDeviation deviation(CQuery<? extends Number> data) {
|
|
|
- return new StandardDeviation(data);
|
|
|
+ public static DoubleDeviationSummary deviation(CQuery<? extends Number> data) {
|
|
|
+ return new DoubleDeviationSummary(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Traverses whole input and calculates average, variance and deviation
|
|
|
+ * @param data input
|
|
|
+ * @return standard deviation stats
|
|
|
+ */
|
|
|
+ public static IntDeviationSummary deviation(int... data) {
|
|
|
+ return new IntDeviationSummary(CQuery.from().array(data).map(Integer.class));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -111,12 +121,7 @@ public class MathStats {
|
|
|
* Basic statistics about classical average
|
|
|
*/
|
|
|
@Data
|
|
|
- public static class StandardDeviation {
|
|
|
-
|
|
|
- /**
|
|
|
- * classic arithmetical average
|
|
|
- */
|
|
|
- private final double average;
|
|
|
+ public static class DoubleDeviationSummary extends DoubleSummaryStatistics {
|
|
|
|
|
|
/**
|
|
|
* classic variance
|
|
|
@@ -128,19 +133,45 @@ public class MathStats {
|
|
|
*/
|
|
|
private final double deviation;
|
|
|
|
|
|
- private StandardDeviation(CQuery<? extends Number> data) {
|
|
|
- DoubleSummaryStatistics statAvg = data.stream()
|
|
|
- .mapToDouble(Number::doubleValue)
|
|
|
- .summaryStatistics();
|
|
|
-
|
|
|
- double avg = statAvg.getAverage();
|
|
|
+ private DoubleDeviationSummary(CQuery<? extends Number> data) {
|
|
|
+ combine(data.stream().mapToDouble(Number::doubleValue).summaryStatistics());
|
|
|
|
|
|
+ double avg = getAverage();
|
|
|
DoubleSummaryStatistics statVar = data.stream()
|
|
|
.mapToDouble(Number::doubleValue)
|
|
|
.map(x -> MathUtils.square(avg - x))
|
|
|
.summaryStatistics();
|
|
|
|
|
|
- this.average = statAvg.getAverage();
|
|
|
+ this.variance = statVar.getAverage();
|
|
|
+ this.deviation = Math.sqrt(statVar.getAverage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Basic statistics about classical average
|
|
|
+ */
|
|
|
+ @Data
|
|
|
+ public static class IntDeviationSummary extends IntSummaryStatistics {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * classic variance
|
|
|
+ */
|
|
|
+ private final double variance;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * classic standard deviation
|
|
|
+ */
|
|
|
+ private final double deviation;
|
|
|
+
|
|
|
+ private IntDeviationSummary(CQuery<? extends Number> data) {
|
|
|
+ combine(data.stream().mapToInt(Number::intValue).summaryStatistics());
|
|
|
+
|
|
|
+ double avg = getAverage();
|
|
|
+ DoubleSummaryStatistics statVar = data.stream()
|
|
|
+ .mapToInt(Number::intValue)
|
|
|
+ .mapToDouble(x -> MathUtils.square(avg - x))
|
|
|
+ .summaryStatistics();
|
|
|
+
|
|
|
this.variance = statVar.getAverage();
|
|
|
this.deviation = Math.sqrt(statVar.getAverage());
|
|
|
}
|