diff --git a/python/plugins/processing/algs/qgis/BasicStatisticsNumbers.py b/python/plugins/processing/algs/qgis/BasicStatisticsNumbers.py index 803cd374814..488453a906f 100644 --- a/python/plugins/processing/algs/qgis/BasicStatisticsNumbers.py +++ b/python/plugins/processing/algs/qgis/BasicStatisticsNumbers.py @@ -31,7 +31,9 @@ import codecs from qgis.PyQt.QtGui import QIcon -from qgis.core import QgsStatisticalSummary +from qgis.core import (QgsStatisticalSummary, + QgsFeatureRequest, + NULL) from processing.core.GeoAlgorithm import GeoAlgorithm from processing.core.parameters import ParameterVector @@ -107,36 +109,16 @@ class BasicStatisticsNumbers(GeoAlgorithm): outputFile = self.getOutputValue(self.OUTPUT_HTML_FILE) - cvValue = 0 - minValue = 0 - maxValue = 0 - sumValue = 0 - meanValue = 0 - medianValue = 0 - stdDevValue = 0 - minority = 0 - majority = 0 - firstQuartile = 0 - thirdQuartile = 0 - nullValues = 0 - iqr = 0 - - values = [] - - features = vector.features(layer) + request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry).setSubsetOfAttributes([fieldName], layer.fields()) + stat = QgsStatisticalSummary() + features = vector.features(layer, request) count = len(features) total = 100.0 / float(count) for current, ft in enumerate(features): - value = ft[fieldName] - if value or value == 0: - values.append(float(value)) - else: - nullValues += 1 - + stat.addVariant(ft[fieldName]) progress.setPercentage(int(current * total)) - stat = QgsStatisticalSummary() - stat.calculate(values) + stat.finalize() count = stat.count() uniqueValue = stat.variety() @@ -147,13 +129,13 @@ class BasicStatisticsNumbers(GeoAlgorithm): meanValue = stat.mean() medianValue = stat.median() stdDevValue = stat.stDev() - if meanValue != 0.00: - cvValue = stdDevValue / meanValue + cvValue = stdDevValue / meanValue if meanValue != 0 else 0 minority = stat.minority() majority = stat.majority() firstQuartile = stat.firstQuartile() thirdQuartile = stat.thirdQuartile() iqr = stat.interQuartileRange() + nullValues = stat.countMissing() data = [] data.append(self.tr('Analyzed layer: {}').format(layer.name()))