]> source.dussan.org Git - poi.git/commitdiff
support DVARP and DSTDEVP
authorPJ Fanning <fanningpj@apache.org>
Thu, 26 May 2022 11:07:41 +0000 (11:07 +0000)
committerPJ Fanning <fanningpj@apache.org>
Thu, 26 May 2022 11:07:41 +0000 (11:07 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1901280 13f79535-47bb-0310-9956-ffa450edef68

poi/src/main/java/org/apache/poi/ss/formula/eval/FunctionEval.java
poi/src/main/java/org/apache/poi/ss/formula/functions/DStarRunner.java
poi/src/main/java/org/apache/poi/ss/formula/functions/DStdevp.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/ss/formula/functions/DVarp.java [new file with mode: 0644]
poi/src/test/java/org/apache/poi/ss/formula/functions/TestDStdev.java
poi/src/test/java/org/apache/poi/ss/formula/functions/TestDVar.java

index 992ad35c625e11ae4a0e61b9fd83f4c0d235dee3..32750a6b0ea7939457e39a3242375408608e3a93 100644 (file)
@@ -206,8 +206,8 @@ public final class FunctionEval {
 
         retval[193] = AggregateFunction.STDEVP;
         retval[194] = AggregateFunction.VARP;
-        // 195: DSTDEVP
-        // 196: DVARP
+        retval[195] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DSTDEVP);
+        retval[196] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DVARP);
         retval[197] = NumericFunction.TRUNC;
         retval[198] = LogicalFunction.ISLOGICAL;
         // 199: DCOUNTA
index e829216873934c0dd8dc7b3dc0b86049454761e3..5a3fbfbdea7343f55c51ce56c18d38a4caa29e46 100644 (file)
@@ -63,8 +63,12 @@ public final class DStarRunner implements Function3Arg {
         DAVERAGE(DAverage::new),
         /** @see DStdev */
         DSTDEV(DStdev::new),
+        /** @see DStdevp */
+        DSTDEVP(DStdevp::new),
         /** @see DVar */
         DVAR(DVar::new),
+        /** @see DVarp */
+        DVARP(DVarp::new),
         /** @see DProduct */
         DPRODUCT(DProduct::new),
         ;
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/DStdevp.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/DStdevp.java
new file mode 100644 (file)
index 0000000..08688e0
--- /dev/null
@@ -0,0 +1,53 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss.formula.functions;
+
+import org.apache.poi.ss.formula.eval.NumberEval;
+import org.apache.poi.ss.formula.eval.NumericValueEval;
+import org.apache.poi.ss.formula.eval.ValueEval;
+import org.apache.poi.ss.util.NumberToTextConverter;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+
+/**
+ * Implementation of the DStdevp function:
+ * Gets the standard deviation value of a column in an area with given conditions.
+ */
+public final class DStdevp implements IDStarAlgorithm {
+    private final ArrayList<NumericValueEval> values = new ArrayList<>();
+
+    @Override
+    public boolean processMatch(ValueEval eval) {
+        if (eval instanceof NumericValueEval) {
+            values.add((NumericValueEval) eval);
+        }
+        return true;
+    }
+
+    @Override
+    public ValueEval getResult() {
+        final double[] array = new double[values.size()];
+        int pos = 0;
+        for (NumericValueEval d : values) {
+            array[pos++] = d.getNumberValue();
+        }
+        final double stdev = StatsLib.stdevp(array);
+        return new NumberEval(new BigDecimal(NumberToTextConverter.toText(stdev)).doubleValue());
+    }
+}
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/DVarp.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/DVarp.java
new file mode 100644 (file)
index 0000000..ae3ad77
--- /dev/null
@@ -0,0 +1,53 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss.formula.functions;
+
+import org.apache.poi.ss.formula.eval.NumberEval;
+import org.apache.poi.ss.formula.eval.NumericValueEval;
+import org.apache.poi.ss.formula.eval.ValueEval;
+import org.apache.poi.ss.util.NumberToTextConverter;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+
+/**
+ * Implementation of the DVarp function:
+ * Gets the variance value of a column in an area with given conditions.
+ */
+public final class DVarp implements IDStarAlgorithm {
+    private final ArrayList<NumericValueEval> values = new ArrayList<>();
+
+    @Override
+    public boolean processMatch(ValueEval eval) {
+        if (eval instanceof NumericValueEval) {
+            values.add((NumericValueEval) eval);
+        }
+        return true;
+    }
+
+    @Override
+    public ValueEval getResult() {
+        final double[] array = new double[values.size()];
+        int pos = 0;
+        for (NumericValueEval d : values) {
+            array[pos++] = d.getNumberValue();
+        }
+        final double var = StatsLib.varp(array);
+        return new NumberEval(new BigDecimal(NumberToTextConverter.toText(var)).doubleValue());
+    }
+}
index 48393dc9804be706a0219424c82aa98abcf6cb2b..df4eb99d5cfc13c457ffa6204091fa55672dde36 100644 (file)
@@ -29,7 +29,7 @@ import static org.apache.poi.ss.util.Utils.addRow;
 import static org.apache.poi.ss.util.Utils.assertDouble;
 
 /**
- * Testcase for function DSTDEV()
+ * Testcase for function DSTDEV() and DSTDEVP()
  */
 public class TestDStdev {
 
@@ -43,6 +43,16 @@ public class TestDStdev {
         }
     }
 
+    //https://support.microsoft.com/en-us/office/dstdevp-function-04b78995-da03-4813-bbd9-d74fd0f5d94b
+    @Test
+    void testDSTDEVPMicrosoftExample1() throws IOException {
+        try (HSSFWorkbook wb = initWorkbook1()) {
+            HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
+            HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(12);
+            assertDouble(fe, cell, "DSTDEVP(A5:E11, \"Yield\", A1:A3)", 2.65329983228432, 0.0000000001);
+        }
+    }
+
     private HSSFWorkbook initWorkbook1() {
         HSSFWorkbook wb = new HSSFWorkbook();
         HSSFSheet sheet = wb.createSheet();
index 4915173a4388fdecaca5baef347208aab59312a3..6c8a86bf285496ba6e3407dd40c60de31bde2f14 100644 (file)
@@ -29,7 +29,7 @@ import static org.apache.poi.ss.util.Utils.addRow;
 import static org.apache.poi.ss.util.Utils.assertDouble;
 
 /**
- * Testcase for function DVAR()
+ * Testcase for function DVAR() and DVARP()
  */
 public class TestDVar {
 
@@ -43,6 +43,16 @@ public class TestDVar {
         }
     }
 
+    //https://support.microsoft.com/en-us/office/dvarp-function-eb0ba387-9cb7-45c8-81e9-0394912502fc
+    @Test
+    void testDVARPMicrosoftExample1() throws IOException {
+        try (HSSFWorkbook wb = initWorkbook1()) {
+            HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
+            HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(12);
+            assertDouble(fe, cell, "DVARP(A4:E10, \"Yield\", A1:A3)", 7.04, 0.0000000001);
+        }
+    }
+
     private HSSFWorkbook initWorkbook1() {
         HSSFWorkbook wb = new HSSFWorkbook();
         HSSFSheet sheet = wb.createSheet();