Skip to content

Commit

Permalink
[sextante] changed statisticByCategories, so now it does not depend o…
Browse files Browse the repository at this point in the history
…n external libs
  • Loading branch information
volaya committed Feb 24, 2013
1 parent cd0253a commit ffa56d0
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 21 deletions.
1 change: 0 additions & 1 deletion python/plugins/sextante/algs/FieldsCalculator.py
Expand Up @@ -31,7 +31,6 @@
from PyQt4.QtGui import *
from sextante.parameters.ParameterString import ParameterString
from sextante.core.QGisLayers import QGisLayers
from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException


class FieldsCalculator(GeoAlgorithm):
Expand Down
11 changes: 5 additions & 6 deletions python/plugins/sextante/algs/QGISAlgorithmProvider.py
Expand Up @@ -16,9 +16,9 @@
* *
***************************************************************************
"""
from sextante.algs.MeanAndStdDevPlot import MeanAndStdDevPlot
from sextante.algs.BarPlot import BarPlot
from sextante.algs.PolarPlot import PolarPlot
#from sextante.algs.MeanAndStdDevPlot import MeanAndStdDevPlot
#from sextante.algs.BarPlot import BarPlot
#from sextante.algs.PolarPlot import PolarPlot
from sextante.algs.RasterLayerStatistics import RasterLayerStatistics

__author__ = 'Victor Olaya'
Expand All @@ -30,7 +30,7 @@
import os
from PyQt4 import QtGui
#from sextante.algs.RasterLayerHistogram import RasterLayerHistogram
#from sextante.algs.StatisticsByCategories import StatisticsByCategories
from sextante.algs.StatisticsByCategories import StatisticsByCategories
from sextante.algs.ftools.PointsInPolygon import PointsInPolygon
from sextante.algs.ftools.PointsInPolygonUnique import PointsInPolygonUnique
from sextante.algs.ftools.PointsInPolygonWeighted import PointsInPolygonWeighted
Expand Down Expand Up @@ -97,8 +97,7 @@ def __init__(self):
SumLines(), PointsInPolygon(), PointsInPolygonWeighted(), PointsInPolygonUnique(),
BasicStatisticsStrings(), BasicStatisticsNumbers(), NearestNeighbourAnalysis(),
MeanCoords(), LinesIntersection(), UniqueValues(), PointDistance(), PointsLayerFromTable(),
#StatisticsByCategories(),
ReprojectLayer(),
StatisticsByCategories(),ReprojectLayer(),
ExportGeometryInfo(), Centroids(), Delaunay(), VoronoiPolygons(),
SimplifyGeometries(), DensifyGeometries(), DensifyGeometriesInterval(),
MultipartToSingleparts(), SinglePartsToMultiparts(), PolygonsToLines(),
Expand Down
61 changes: 47 additions & 14 deletions python/plugins/sextante/algs/StatisticsByCategories.py
Expand Up @@ -16,17 +16,16 @@
* *
***************************************************************************
"""
import math

__author__ = 'Victor Olaya'
__date__ = 'September 2012'
__copyright__ = '(C) 2012, Victor Olaya'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'

import math
from PyQt4.QtCore import *
from qgis.core import *
from scipy import stats
from sextante.outputs.OutputTable import OutputTable
from sextante.core.GeoAlgorithm import GeoAlgorithm
from sextante.core.QGisLayers import QGisLayers
Expand All @@ -50,7 +49,7 @@ def defineCharacteristics(self):
self.addParameter(ParameterTableField(self.CATEGORIES_FIELD_NAME, "Field with categories",
self.INPUT_LAYER, ParameterTableField.DATA_TYPE_ANY))

self.addOutput(OutputTable(self.OUTPUT, "Statistics for numeric field"))
self.addOutput(OutputTable(self.OUTPUT, "Statistics"))

def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER))
Expand All @@ -62,21 +61,55 @@ def processAlgorithm(self, progress):
categoriesField = layer.fieldNameIndex(categoriesFieldName)

features = QGisLayers.features(layer)
nFeat = len(features)
nFeats = len(features)
values = {}
nFeat = 0
for feat in features:
nFeat += 1
progress.setPercentage(int((100 * nFeats) / nFeat))
attrs = feat.attributes()
value = float(attrs[valuesField].toDouble()[0])
cat = unicode(attrs[categoriesField].toString())
if cat not in values:
values[cat] = []
values[cat].append(value)
try:
value = float(attrs[valuesField].toDouble()[0])
cat = unicode(attrs[categoriesField].toString())
if cat not in values:
values[cat] = []
values[cat].append(value)
except:
pass

fields = [QgsField("category", QVariant.String), QgsField("mean", QVariant.Double), QgsField("variance", QVariant.Double)]
fields = [QgsField("category", QVariant.String), QgsField("min", QVariant.Double),
QgsField("max", QVariant.Double), QgsField("mean", QVariant.Double),
QgsField("stddev", QVariant.Double)]
writer = output.getTableWriter(fields)
for cat, value in values.items():
n, min_max, mean, var, skew, kurt = stats.describe(value)
record = [cat, mean, math.sqrt(var)]
for cat, v in values.items():
min, max, mean, stddev = calculateStats(v)
record = [cat, min, max, mean, stddev]
writer.addRecord(record)


def calculateStats(values):
n = 0
sum = 0
mean = 0
M2 = 0
minvalue = None
maxvalue = None

for v in values:
sum += v
n = n + 1
delta = v - mean
mean = mean + delta/n
M2 = M2 + delta*(v - mean)
if minvalue is None:
minvalue = v
maxvalue = v
else:
minvalue = min(v, minvalue)
maxvalue = max(v, maxvalue)

if n > 1:
variance = M2/(n - 1)
else:
variance = 0;
stddev = math.sqrt(variance)
return minvalue,maxvalue, mean, stddev

0 comments on commit ffa56d0

Please sign in to comment.