31
31
32
32
from qgis .PyQt .QtGui import QIcon
33
33
34
+ from qgis .core import (QgsStringStatisticalSummary ,
35
+ QgsFeatureRequest )
36
+
34
37
from processing .core .GeoAlgorithm import GeoAlgorithm
35
38
from processing .core .parameters import ParameterVector
36
39
from processing .core .parameters import ParameterTableField
@@ -54,6 +57,8 @@ class BasicStatisticsStrings(GeoAlgorithm):
54
57
EMPTY = 'EMPTY'
55
58
FILLED = 'FILLED'
56
59
UNIQUE = 'UNIQUE'
60
+ MIN_VALUE = 'MIN_VALUE'
61
+ MAX_VALUE = 'MAX_VALUE'
57
62
58
63
def getIcon (self ):
59
64
return QIcon (os .path .join (pluginPath , 'images' , 'ftools' , 'basic_statistics.png' ))
@@ -78,6 +83,8 @@ def defineCharacteristics(self):
78
83
self .addOutput (OutputNumber (self .EMPTY , self .tr ('Number of empty values' )))
79
84
self .addOutput (OutputNumber (self .FILLED , self .tr ('Number of non-empty values' )))
80
85
self .addOutput (OutputNumber (self .UNIQUE , self .tr ('Number of unique values' )))
86
+ self .addOutput (OutputNumber (self .MIN_VALUE , self .tr ('Minimum string value' )))
87
+ self .addOutput (OutputNumber (self .MAX_VALUE , self .tr ('Maximum string value' )))
81
88
82
89
def processAlgorithm (self , progress ):
83
90
layer = dataobjects .getObjectFromUri (
@@ -86,77 +93,47 @@ def processAlgorithm(self, progress):
86
93
87
94
outputFile = self .getOutputValue (self .OUTPUT_HTML_FILE )
88
95
89
- index = layer .fields ().lookupField (fieldName )
90
-
91
- sumValue = 0
92
- minValue = 0
93
- maxValue = 0
94
- meanValue = 0
95
- nullValues = 0
96
- filledValues = 0
97
-
98
- isFirst = True
99
- values = []
100
-
101
- features = vector .features (layer )
96
+ request = QgsFeatureRequest ().setFlags (QgsFeatureRequest .NoGeometry ).setSubsetOfAttributes ([fieldName ],
97
+ layer .fields ())
98
+ stat = QgsStringStatisticalSummary ()
99
+ features = vector .features (layer , request )
102
100
count = len (features )
103
- total = 100.0 / count
101
+ total = 100.0 / float ( count )
104
102
for current , ft in enumerate (features ):
105
- value = ft [fieldName ]
106
- if value :
107
- length = float (len (value ))
108
- filledValues += 1
109
- else :
110
- nullValues += 1
111
- progress .setPercentage (int (current * total ))
112
- continue
113
-
114
- if isFirst :
115
- minValue = length
116
- maxValue = length
117
- isFirst = False
118
- else :
119
- if length < minValue :
120
- minValue = length
121
- if length > maxValue :
122
- maxValue = length
123
-
124
- values .append (length )
125
- sumValue += length
126
-
103
+ stat .addValue (ft [fieldName ])
127
104
progress .setPercentage (int (current * total ))
128
105
129
- n = float (len (values ))
130
- if n > 0 :
131
- meanValue = sumValue / n
132
-
133
- uniqueValues = vector .getUniqueValuesCount (layer , index )
106
+ stat .finalize ()
134
107
135
108
data = []
136
109
data .append (self .tr ('Analyzed layer: {}' ).format (layer .name ()))
137
110
data .append (self .tr ('Analyzed field: {}' ).format (fieldName ))
138
- data .append (self .tr ('Minimum length: {}' ).format (minValue ))
139
- data .append (self .tr ('Maximum length: {}' ).format (maxValue ))
140
- data .append (self .tr ('Mean length: {}' ).format (meanValue ))
141
- data .append (self .tr ('Filled values: {}' ).format (filledValues ))
142
- data .append (self .tr ('NULL (missing) values: {}' ).format (nullValues ))
143
- data .append (self .tr ('Count: {}' ).format (count ))
144
- data .append (self .tr ('Unique: {}' ).format (uniqueValues ))
111
+ data .append (self .tr ('Minimum length: {}' ).format (stat .minLength ()))
112
+ data .append (self .tr ('Maximum length: {}' ).format (stat .maxLength ()))
113
+ data .append (self .tr ('Mean length: {}' ).format (stat .meanLength ()))
114
+ data .append (self .tr ('Filled values: {}' ).format (stat .count () - stat .countMissing ()))
115
+ data .append (self .tr ('NULL (missing) values: {}' ).format (stat .countMissing ()))
116
+ data .append (self .tr ('Count: {}' ).format (stat .count ()))
117
+ data .append (self .tr ('Unique: {}' ).format (stat .countDistinct ()))
118
+ data .append (self .tr ('Minimum string value: {}' ).format (stat .min ()))
119
+ data .append (self .tr ('Maximum string value: {}' ).format (stat .max ()))
145
120
146
121
self .createHTML (outputFile , data )
147
122
148
- self .setOutputValue (self .MIN_LEN , minValue )
149
- self .setOutputValue (self .MAX_LEN , maxValue )
150
- self .setOutputValue (self .MEAN_LEN , meanValue )
151
- self .setOutputValue (self .FILLED , filledValues )
152
- self .setOutputValue (self .EMPTY , nullValues )
153
- self .setOutputValue (self .COUNT , count )
154
- self .setOutputValue (self .UNIQUE , uniqueValues )
123
+ self .setOutputValue (self .MIN_LEN , stat .minLength ())
124
+ self .setOutputValue (self .MAX_LEN , stat .maxLength ())
125
+ self .setOutputValue (self .MEAN_LEN , stat .meanLength ())
126
+ self .setOutputValue (self .FILLED , stat .count () - stat .countMissing ())
127
+ self .setOutputValue (self .EMPTY , stat .countMissing ())
128
+ self .setOutputValue (self .COUNT , stat .count ())
129
+ self .setOutputValue (self .UNIQUE , stat .countDistinct ())
130
+ self .setOutputValue (self .MIN_VALUE , stat .min ())
131
+ self .setOutputValue (self .MAX_VALUE , stat .max ())
155
132
156
133
def createHTML (self , outputFile , algData ):
157
134
with codecs .open (outputFile , 'w' , encoding = 'utf-8' ) as f :
158
135
f .write ('<html><head>\n ' )
159
136
f .write ('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body>\n ' )
160
137
for s in algData :
161
138
f .write ('<p>' + str (s ) + '</p>\n ' )
162
- f .write ('</body></html>' )
139
+ f .write ('</body></html>\n ' )
0 commit comments