Skip to content

Commit c4f936b

Browse files
author
cfarmer
committedNov 8, 2009
Adds new statistics/outputs to basic statistics plugin, thanks to Alexander Bruy for the patch
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@12039 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

2 files changed

+52
-15
lines changed

2 files changed

+52
-15
lines changed
 

‎python/plugins/fTools/tools/doVisual.py

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ def update( self ):
4747
# add all fields in combobox because now we can work with text fields too
4848
for i in changedField:
4949
if self.myFunction == 3:
50-
if changedField[i].type() == QVariant.Int or changedField[i].type() == QVariant.Double:
50+
# if changedField[i].type() == QVariant.Int or changedField[i].type() == QVariant.Double:
5151
self.cmbField.addItem( unicode( changedField[i].name() ) )
5252
else:
5353
self.cmbField.addItem( unicode( changedField[i].name() ) )
54-
self.cmbField.addItem( unicode( changedField[i].name() ) )
54+
# self.cmbField.addItem( unicode( changedField[i].name() ) )
5555

5656
def accept( self ):
5757
if self.inShape.currentText() == "":
@@ -246,19 +246,22 @@ def basic_statistics( self, vlayer, myField ):
246246
if nVal > 0.00:
247247
meanVal = sumVal / nVal
248248
lstStats = []
249-
lstStats.append( QCoreApplication.translate( "statResult", "Max. len. : " ) + unicode( maxVal ) )
250-
lstStats.append( QCoreApplication.translate( "statResult", "Min. len. : " ) + unicode( minVal ) )
251-
lstStats.append( QCoreApplication.translate( "statResult", "Mean. len : " ) + unicode( meanVal ) )
252-
lstStats.append( QCoreApplication.translate( "statResult", "Filled : " ) + unicode( fillVal ) )
253-
lstStats.append( QCoreApplication.translate( "statResult", "Empty : " ) + unicode( emptyVal ) )
254-
lstStats.append( QCoreApplication.translate( "statResult", "N : " ) + unicode( nVal ) )
249+
lstStats.append( self.tr( "Max. len: " ) + " " + unicode( maxVal ) )
250+
lstStats.append( self.tr( "Min. len: " ) + " " + unicode( minVal ) )
251+
lstStats.append( self.tr( "Mean. len: " ) + " " + unicode( meanVal ) )
252+
lstStats.append( self.tr( "Filled: " ) + " " + unicode( fillVal ) )
253+
lstStats.append( self.tr( "Empty: " ) + " " + unicode( emptyVal ) )
254+
lstStats.append( self.tr( "N: " ) + " " + unicode( nVal ) )
255255
return ( lstStats, [] )
256256
else: # numeric field
257257
stdVal = 0
258258
cvVal = 0
259+
rangeVal = 0
260+
medianVal = 0
259261
if self.mySelection: # only selected features
260262
selection = vlayer.selectedFeatures()
261263
nFeat = vlayer.selectedFeatureCount()
264+
uniqueVal = utils.getUniqueValuesCount( vlayer, index, True )
262265
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
263266
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
264267
for f in selection:
@@ -277,6 +280,7 @@ def basic_statistics( self, vlayer, myField ):
277280
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
278281
else: # there is no selection, process the whole layer
279282
nFeat = vprovider.featureCount()
283+
uniqueVal = ftools_utils.getUniqueValuesCount( vlayer, index, False )
280284
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
281285
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
282286
while vprovider.nextFeature( feat ):
@@ -294,21 +298,32 @@ def basic_statistics( self, vlayer, myField ):
294298
nElement += 1
295299
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
296300
nVal= float( len( values ) )
301+
rangeVal = maxVal - minVal
297302
if nVal > 0.00:
298303
meanVal = sumVal / nVal
299304
if meanVal != 0.00:
300305
for val in values:
301306
stdVal += ( ( val - meanVal ) * ( val - meanVal ) )
302307
stdVal = math.sqrt( stdVal / nVal )
303308
cvVal = stdVal / meanVal
309+
if nVal > 1:
310+
lstVal = values
311+
lstVal.sort()
312+
if ( nVal % 2 ) == 0:
313+
medianVal = 0.5 * ( lstVal[ int( ( nVal - 1 ) / 2 ) ] + lstVal[ int( ( nVal ) / 2 ) ] )
314+
else:
315+
medianVal = lstVal[ ( nVal + 1 ) / 2 ]
304316
lstStats = []
305-
lstStats.append( "Mean : " + unicode( meanVal ) )
306-
lstStats.append( "StdDev : " + unicode( stdVal ) )
307-
lstStats.append( "Sum : " + unicode( sumVal) )
308-
lstStats.append( "Min : " + unicode( minVal ) )
309-
lstStats.append( "Max : " + unicode( maxVal ) )
310-
lstStats.append( "N : " + unicode( nVal ) )
311-
lstStats.append( "CV : " + unicode( cvVal ) )
317+
lstStats.append( self.tr( "Mean: " ) + " " + unicode( meanVal ) )
318+
lstStats.append( self.tr( "StdDev: " ) + " " + unicode( stdVal ) )
319+
lstStats.append( self.tr( "Sum: " ) + " " + unicode( sumVal) )
320+
lstStats.append( self.tr( "Min: " ) + " " + unicode( minVal ) )
321+
lstStats.append( self.tr( "Max: " ) + " " + unicode( maxVal ) )
322+
lstStats.append( self.tr( "N: " ) + " " + unicode( nVal ) )
323+
lstStats.append( self.tr( "CV: " ) + " " + unicode( cvVal ) )
324+
lstStats.append( self.tr( "Number of unique values: " ) + " " + unicode( uniqueVal ) )
325+
lstStats.append( self.tr( "Range: " ) + " " + unicode( rangeVal ) )
326+
lstStats.append( self.tr( "Median: " ) + " " + unicode( medianVal ) )
312327
return ( lstStats, [] )
313328

314329
def nearest_neighbour_analysis( self, vlayer ):

‎python/plugins/fTools/tools/ftools_utils.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
# getUniqueValues( QgsVectorDataProvider, int *field id )
2121
# saveDialog( QWidget *parent )
2222
# getFieldType( QgsVectorLayer, QgsField.name() )
23+
# getUniqueValuesCount( QgsVectorLayer, int fieldIndex, bool useSelection ):
2324
#
2425
# -------------------------------------------------
2526

@@ -267,3 +268,24 @@ def getFieldType(vlayer, fieldName):
267268
for name, field in fields.iteritems():
268269
if field.name() == fieldName:
269270
return field.typeName()
271+
272+
# return the number of unique values in field
273+
def getUniqueValuesCount( vlayer, fieldIndex, useSelection ):
274+
vprovider = vlayer.dataProvider()
275+
allAttrs = vprovider.attributeIndexes()
276+
vprovider.select( allAttrs )
277+
count = 0
278+
values = []
279+
if useSelection:
280+
selection = vlayer.selectedFeatures()
281+
for f in selection:
282+
if f.attributeMap()[ fieldIndex ].toString() not in values:
283+
values.append( f.attributeMap()[ fieldIndex ].toString() )
284+
count += 1
285+
else:
286+
feat = QgsFeature()
287+
while vprovider.nextFeature( feat ):
288+
if feat.attributeMap()[ fieldIndex ].toString() not in values:
289+
values.append( feat.attributeMap()[ fieldIndex ].toString() )
290+
count += 1
291+
return count

0 commit comments

Comments
 (0)
Please sign in to comment.