def __init__(self, ssdo, weightField=None, caseField=None, stdDeviations=1.0): #### Set Initial Attributes #### UTILS.assignClassAttr(self, locals()) #### Set Data #### self.xyCoords = self.ssdo.xyCoords #### Verify Weights #### if weightField: self.weights = self.ssdo.fields[weightField].returnDouble() #### Report Negative Weights #### lessThanZero = NUM.where(self.weights < 0.0) if len(lessThanZero[0]): self.weights[lessThanZero] = 0.0 ARCPY.AddIDMessage("Warning", 941) #### Verify Weight Sum #### self.weightSum = self.weights.sum() if not self.weightSum > 0.0: ARCPY.AddIDMessage("ERROR", 898) raise SystemExit() else: self.weights = NUM.ones((self.ssdo.numObs, )) #### Set Case Field #### if caseField: caseType = ssdo.allFields[caseField].type.upper() self.caseIsString = caseType == "STRING" self.caseVals = self.ssdo.fields[caseField].data cases = NUM.unique(self.caseVals) if self.caseIsString: self.uniqueCases = cases[NUM.where(cases != "")] else: self.uniqueCases = cases else: self.caseIsString = False self.caseVals = NUM.ones((self.ssdo.numObs, ), int) self.uniqueCases = [1] #### Set Result Dict #### meanCenter = COLL.defaultdict(NUM.array) sd = COLL.defaultdict(float) #### Keep Track of Bad Cases #### badCases = [] #### Calculate Mean Center and Standard Distance #### for case in self.uniqueCases: indices = NUM.where(self.caseVals == case) numFeatures = len(indices[0]) xy = self.xyCoords[indices] w = self.weights[indices] w.shape = numFeatures, 1 weightSum = w.sum() if (weightSum != 0.0) and (numFeatures > 2): xyWeighted = w * xy #### Mean Center #### centers = xyWeighted.sum(0) / weightSum meanCenter[case] = centers #### Standard Distance #### devXY = xy - centers sigXY = (w * devXY**2.0).sum(0) / weightSum sdVal = (MATH.sqrt(sigXY.sum())) * stdDeviations sd[case] = sdVal else: badCases.append(case) #### Report Bad Cases #### nCases = len(self.uniqueCases) nBadCases = len(badCases) badCases.sort() if nBadCases: cBool = self.caseIsString if not self.caseIsString: badCases = [UTILS.caseValue2Print(i, cBool) for i in badCases] ERROR.reportBadCases(nCases, nBadCases, badCases, label=caseField) #### Sorted Case List #### caseKeys = sd.keys() caseKeys.sort() self.caseKeys = caseKeys #### Set Attributes #### self.meanCenter = meanCenter self.sd = sd self.badCases = badCases self.caseField = caseField self.stdDeviations = stdDeviations self.weightField = weightField
def __init__ (self, ssdo, weightField = None, caseField = None, attFields = None): #### Set Initial Attributes #### UTILS.assignClassAttr(self, locals()) #### Set Data #### self.xyCoords = self.ssdo.xyCoords #### Verify Weights #### if weightField: self.weights = self.ssdo.fields[weightField].returnDouble() #### Report Negative Weights #### lessThanZero = NUM.where(self.weights < 0.0) if len(lessThanZero[0]): self.weights[lessThanZero] = 0.0 ARCPY.AddIDMessage("Warning", 941) #### Verify Weight Sum #### self.weightSum = self.weights.sum() if not self.weightSum > 0.0: ARCPY.AddIDMessage("ERROR", 898) raise SystemExit() else: self.weights = NUM.ones((self.ssdo.numObs,)) #### Set Case Field #### if caseField: caseType = ssdo.allFields[caseField].type.upper() self.caseIsString = caseType == "STRING" self.caseVals = self.ssdo.fields[caseField].data cases = NUM.unique(self.caseVals) if self.caseIsString: self.uniqueCases = cases[NUM.where(cases != "")] else: self.uniqueCases = cases else: self.caseIsString = False self.caseVals = NUM.ones((self.ssdo.numObs, ), int) self.uniqueCases = [1] #### Set Result Dict #### medianCenter = COLL.defaultdict(NUM.array) if attFields: attCenter = COLL.defaultdict(NUM.array) #### Keep Track of Bad Cases #### badCases = [] #### Calculate Results #### for case in self.uniqueCases: indices = NUM.where(self.caseVals == case) numFeatures = len(indices[0]) xy = self.xyCoords[indices] w = self.weights[indices] weightSum = w.sum() if (weightSum != 0.0) and (numFeatures > 0): #### Calculate Median Center #### medX, medY, iters = calcMedianCenter(xy, w) medianCenter[case] = (medX, medY) if attFields: attMeds = [] for attField in attFields: attCaseVals = ssdo.fields[attField].returnDouble() attCaseVals = attCaseVals[indices] attMed = STATS.median(attCaseVals, weights = w) attMeds.append(attMed) attMeds = NUM.array(attMeds) attCenter[case] = attMeds else: badCases.append(case) #### Report Bad Cases #### nCases = len(self.uniqueCases) nBadCases = len(badCases) badCases.sort() if nBadCases: cBool = self.caseIsString if not self.caseIsString: badCases = [UTILS.caseValue2Print(i, cBool) for i in badCases] ERROR.reportBadCases(nCases, nBadCases, badCases, label = caseField) #### Sorted Case List #### caseKeys = medianCenter.keys() caseKeys.sort() self.caseKeys = caseKeys #### Set Attributes #### self.medianCenter = medianCenter self.badCases = badCases self.caseField = caseField self.attFields = attFields self.weightField = weightField if attFields: self.attCenter = attCenter
def __init__(self, ssdo, weightField = None, caseField = None, stdDeviations = 1.0): #### Set Initial Attributes #### UTILS.assignClassAttr(self, locals()) #### Set Data #### self.xyCoords = self.ssdo.xyCoords #### Verify Weights #### if weightField: self.weights = self.ssdo.fields[weightField].returnDouble() #### Report Negative Weights #### lessThanZero = NUM.where(self.weights < 0.0) if len(lessThanZero[0]): self.weights[lessThanZero] = 0.0 ARCPY.AddIDMessage("Warning", 941) #### Verify Weight Sum #### self.weightSum = self.weights.sum() if not self.weightSum > 0.0: ARCPY.AddIDMessage("ERROR", 898) raise SystemExit() else: self.weights = NUM.ones((self.ssdo.numObs,)) #### Set Case Field #### if caseField: caseType = ssdo.allFields[caseField].type.upper() self.caseIsString = caseType == "STRING" self.caseVals = self.ssdo.fields[caseField].data cases = NUM.unique(self.caseVals) if self.caseIsString: self.uniqueCases = cases[NUM.where(cases != "")] else: self.uniqueCases = cases else: self.caseIsString = False self.caseVals = NUM.ones((self.ssdo.numObs, ), int) self.uniqueCases = [1] #### Set Result Dict #### meanCenter = COLL.defaultdict(NUM.array) sd = COLL.defaultdict(float) #### Keep Track of Bad Cases #### badCases = [] #### Calculate Mean Center and Standard Distance #### for case in self.uniqueCases: indices = NUM.where(self.caseVals == case) numFeatures = len(indices[0]) xy = self.xyCoords[indices] w = self.weights[indices] w.shape = numFeatures, 1 weightSum = w.sum() if (weightSum != 0.0) and (numFeatures > 2): xyWeighted = w * xy #### Mean Center #### centers = xyWeighted.sum(0) / weightSum meanCenter[case] = centers #### Standard Distance #### devXY = xy - centers sigXY = (w * devXY**2.0).sum(0)/weightSum sdVal = (MATH.sqrt(sigXY.sum())) * stdDeviations sd[case] = sdVal else: badCases.append(case) #### Report Bad Cases #### nCases = len(self.uniqueCases) nBadCases = len(badCases) badCases.sort() if nBadCases: cBool = self.caseIsString if not self.caseIsString: badCases = [UTILS.caseValue2Print(i, cBool) for i in badCases] ERROR.reportBadCases(nCases, nBadCases, badCases, label = caseField) #### Sorted Case List #### caseKeys = sd.keys() caseKeys.sort() self.caseKeys = caseKeys #### Set Attributes #### self.meanCenter = meanCenter self.sd = sd self.badCases = badCases self.caseField = caseField self.stdDeviations = stdDeviations self.weightField = weightField
def __init__(self, ssdo, weightField=None, caseField=None, dimField=None): #### Set Initial Attributes #### UTILS.assignClassAttr(self, locals()) #### Set Data #### self.xyCoords = self.ssdo.xyCoords self.zCoords = self.ssdo.zCoords #### Verify Weights #### if weightField: self.weights = self.ssdo.fields[weightField].returnDouble() #### Report Negative Weights #### lessThanZero = NUM.where(self.weights < 0.0) if len(lessThanZero[0]): self.weights[lessThanZero] = 0.0 ARCPY.AddIDMessage("Warning", 941) #### Verify Weight Sum #### self.weightSum = self.weights.sum() if not self.weightSum > 0.0: ARCPY.AddIDMessage("ERROR", 898) raise SystemExit() else: self.weights = NUM.ones((self.ssdo.numObs, 1)) #### Set Case Field #### if caseField: caseType = ssdo.allFields[caseField].type.upper() self.caseIsString = caseType == "STRING" self.caseVals = self.ssdo.fields[caseField].data cases = NUM.unique(self.caseVals) if self.caseIsString: self.uniqueCases = cases[NUM.where(cases != "")] else: self.uniqueCases = cases else: self.caseIsString = False self.caseVals = NUM.ones((self.ssdo.numObs, ), int) self.uniqueCases = [1] #### Set Result Dict #### meanCenter = COLL.defaultdict(NUM.array) if dimField: dimCenter = COLL.defaultdict(float) self.dimVals = self.ssdo.fields[dimField].returnDouble() else: dimCenter = None #### Keep Track of Bad Cases #### badCases = [] #### Calculate Results #### for case in self.uniqueCases: indices = NUM.where(self.caseVals == case) numFeatures = len(indices[0]) xy = self.xyCoords[indices] w = self.weights[indices] w.shape = numFeatures, 1 weightSum = w.sum() if (weightSum != 0.0) and (numFeatures > 0): xyWeighted = w * xy #### Mean Center #### centers = xyWeighted.sum(0) / weightSum meanX, meanY = centers meanZ = None if ssdo.hasZ: z = self.ssdo.zCoords[indices] try: zWeighted = w * z meanZ = zWeighted.sum() / weightSum except: meanZ = 0.0 else: meanZ = self.ssdo.defaultZ meanCenter[case] = NUM.array([meanX, meanY, meanZ]) #### Attribute Field #### if dimField: dimWeighted = w.flatten() * self.dimVals[indices] meanDim = dimWeighted.sum() / weightSum dimCenter[case] = meanDim else: badCases.append(case) #### Report Bad Cases #### nCases = len(self.uniqueCases) nBadCases = len(badCases) badCases.sort() if nBadCases: cBool = self.caseIsString if not self.caseIsString: badCases = [UTILS.caseValue2Print(i, cBool) for i in badCases] ERROR.reportBadCases(nCases, nBadCases, badCases, label=caseField) #### Sorted Case List #### caseKeys = meanCenter.keys() caseKeys.sort() self.caseKeys = caseKeys #### Set Attributes #### self.meanCenter = meanCenter self.dimCenter = dimCenter self.badCases = badCases self.caseField = caseField self.dimField = dimField self.weightField = weightField
def __init__(self, ssdo, weightField=None, caseField=None, stdDeviations=1.0): #### Set Initial Attributes #### UTILS.assignClassAttr(self, locals()) #### Set Data #### self.xyCoords = self.ssdo.xyCoords #### Verify Weights #### if weightField: self.weights = self.ssdo.fields[weightField].returnDouble() #### Report Negative Weights #### lessThanZero = NUM.where(self.weights < 0.0) if len(lessThanZero[0]): self.weights[lessThanZero] = 0.0 ARCPY.AddIDMessage("Warning", 941) #### Verify Weight Sum #### self.weightSum = self.weights.sum() if not self.weightSum > 0.0: ARCPY.AddIDMessage("ERROR", 898) raise SystemExit() else: self.weights = NUM.ones((self.ssdo.numObs, )) #### Set Case Field #### if caseField: caseType = ssdo.allFields[caseField].type.upper() self.caseIsString = caseType == "STRING" self.caseVals = self.ssdo.fields[caseField].data cases = NUM.unique(self.caseVals) if self.caseIsString: self.uniqueCases = cases[NUM.where(cases != "")] else: self.uniqueCases = cases else: self.caseIsString = False self.caseVals = NUM.ones((self.ssdo.numObs, ), int) self.uniqueCases = [1] #### Set Result Dict #### meanCenter = COLL.defaultdict(NUM.array) se = COLL.defaultdict(float) #### Keep Track of Bad Cases #### badCases = [] #### Calculate Mean Center and Standard Distance #### for case in self.uniqueCases: indices = NUM.where(self.caseVals == case) numFeatures = len(indices[0]) xy = self.xyCoords[indices] w = self.weights[indices] w.shape = numFeatures, 1 weightSum = w.sum() if (weightSum != 0.0) and (numFeatures > 2): xyWeighted = w * xy #### Mean Center #### centers = xyWeighted.sum(0) / weightSum meanX, meanY = centers meanCenter[case] = centers #### Standard Ellipse #### devXY = xy - centers flatW = w.flatten() sigX = (flatW * devXY[:, 0]**2.0).sum() sigY = (flatW * devXY[:, 1]**2.0).sum() sigXY = (flatW * devXY[:, 0] * devXY[:, 1]).sum() denom = 2.0 * sigXY diffXY = sigX - sigY sum1 = diffXY**2.0 + 4.0 * sigXY**2.0 if not abs(denom) > 0: arctanVal = 0.0 else: tempVal = (diffXY + NUM.sqrt(sum1)) / denom arctanVal = NUM.arctan(tempVal) if arctanVal < 0.0: arctanVal += (NUM.pi / 2.0) sinVal = NUM.sin(arctanVal) cosVal = NUM.cos(arctanVal) sqrt2 = NUM.sqrt(2.0) sigXYSinCos = 2.0 * sigXY * sinVal * cosVal seX = (sqrt2 * NUM.sqrt( ((sigX * cosVal**2.0) - sigXYSinCos + (sigY * sinVal**2.0)) / weightSum) * stdDeviations) seY = (sqrt2 * NUM.sqrt( ((sigX * sinVal**2.0) + sigXYSinCos + (sigY * cosVal**2.0)) / weightSum) * stdDeviations) #### Counter Clockwise from Noon #### degreeRotation = 360.0 - (arctanVal * 57.2957795) #### Convert to Radians #### radianRotation1 = UTILS.convert2Radians(degreeRotation) #### Add Rotation #### radianRotation2 = 360.0 - degreeRotation if seX > seY: radianRotation2 += 90.0 if radianRotation2 > 360.0: radianRotation2 = radianRotation2 - 180.0 se[case] = (seX, seY, degreeRotation, radianRotation1, radianRotation2) else: badCases.append(case) #### Report Bad Cases #### nCases = len(self.uniqueCases) nBadCases = len(badCases) badCases.sort() if nBadCases: cBool = self.caseIsString if not self.caseIsString: badCases = [UTILS.caseValue2Print(i, cBool) for i in badCases] ERROR.reportBadCases(nCases, nBadCases, badCases, label=caseField) #### Sorted Case List #### caseKeys = se.keys() caseKeys.sort() self.caseKeys = caseKeys #### Set Attributes #### self.meanCenter = meanCenter self.se = se self.badCases = badCases self.caseField = caseField self.stdDeviations = stdDeviations self.weightField = weightField
def __init__(self, ssdo, weightField = None, caseField = None, stdDeviations = 1.0): #### Set Initial Attributes #### UTILS.assignClassAttr(self, locals()) #### Set Data #### self.xyCoords = self.ssdo.xyCoords #### Verify Weights #### if weightField: self.weights = self.ssdo.fields[weightField].returnDouble() #### Report Negative Weights #### lessThanZero = NUM.where(self.weights < 0.0) if len(lessThanZero[0]): self.weights[lessThanZero] = 0.0 ARCPY.AddIDMessage("Warning", 941) #### Verify Weight Sum #### self.weightSum = self.weights.sum() if not self.weightSum > 0.0: ARCPY.AddIDMessage("ERROR", 898) raise SystemExit() else: self.weights = NUM.ones((self.ssdo.numObs,)) #### Set Case Field #### if caseField: caseType = ssdo.allFields[caseField].type.upper() self.caseIsString = caseType == "STRING" self.caseVals = self.ssdo.fields[caseField].data cases = NUM.unique(self.caseVals) if self.caseIsString: self.uniqueCases = cases[NUM.where(cases != "")] else: self.uniqueCases = cases else: self.caseIsString = False self.caseVals = NUM.ones((self.ssdo.numObs, ), int) self.uniqueCases = [1] #### Set Result Dict #### meanCenter = COLL.defaultdict(NUM.array) se = COLL.defaultdict(float) #### Keep Track of Bad Cases #### badCases = [] #### Calculate Mean Center and Standard Distance #### for case in self.uniqueCases: indices = NUM.where(self.caseVals == case) numFeatures = len(indices[0]) xy = self.xyCoords[indices] w = self.weights[indices] w.shape = numFeatures, 1 weightSum = w.sum() if (weightSum != 0.0) and (numFeatures > 2): xyWeighted = w * xy #### Mean Center #### centers = xyWeighted.sum(0) / weightSum meanX, meanY = centers meanCenter[case] = centers #### Standard Ellipse #### devXY = xy - centers flatW = w.flatten() sigX = (flatW * devXY[:,0]**2.0).sum() sigY = (flatW * devXY[:,1]**2.0).sum() sigXY = (flatW * devXY[:,0] * devXY[:,1]).sum() denom = 2.0 * sigXY diffXY = sigX - sigY sum1 = diffXY**2.0 + 4.0 * sigXY**2.0 if not abs(denom) > 0: arctanVal = 0.0 else: tempVal = (diffXY + NUM.sqrt(sum1)) / denom arctanVal = NUM.arctan(tempVal) if arctanVal < 0.0: arctanVal += (NUM.pi / 2.0) sinVal = NUM.sin(arctanVal) cosVal = NUM.cos(arctanVal) sqrt2 = NUM.sqrt(2.0) sigXYSinCos = 2.0 * sigXY * sinVal * cosVal seX = (sqrt2 * NUM.sqrt(((sigX * cosVal**2.0) - sigXYSinCos + (sigY * sinVal**2.0)) / weightSum) * stdDeviations) seY = (sqrt2 * NUM.sqrt(((sigX * sinVal**2.0) + sigXYSinCos + (sigY * cosVal**2.0)) / weightSum) * stdDeviations) #### Counter Clockwise from Noon #### degreeRotation = 360.0 - (arctanVal * 57.2957795) #### Convert to Radians #### radianRotation1 = UTILS.convert2Radians(degreeRotation) #### Add Rotation #### radianRotation2 = 360.0 - degreeRotation if seX > seY: radianRotation2 += 90.0 if radianRotation2 > 360.0: radianRotation2 = radianRotation2 - 180.0 se[case] = (seX, seY, degreeRotation, radianRotation1, radianRotation2) else: badCases.append(case) #### Report Bad Cases #### nCases = len(self.uniqueCases) nBadCases = len(badCases) badCases.sort() if nBadCases: cBool = self.caseIsString if not self.caseIsString: badCases = [UTILS.caseValue2Print(i, cBool) for i in badCases] ERROR.reportBadCases(nCases, nBadCases, badCases, label = caseField) #### Sorted Case List #### caseKeys = se.keys() caseKeys.sort() self.caseKeys = caseKeys #### Set Attributes #### self.meanCenter = meanCenter self.se = se self.badCases = badCases self.caseField = caseField self.stdDeviations = stdDeviations self.weightField = weightField