def _plotTrackwaySamples(self, trackway, samples): """_plotTrackwaySamples doc...""" bundle = self.owner.getSeriesBundle(trackway) plot = MultiScatterPlot( title='%s Direction Sampling %s' % (trackway.name, bundle.echoStatus(asPercent=True)), xLabel='Trackway Curve Position (m)', yLabel='Direction (degrees)') for sample in samples: color = self.COLORS[samples.index(sample)] data = [] for value in sample['values']: data.append(value.curvePoint) plot.addPlotSeries(data=data, color=color, line=True) self._paths.append(plot.save(self.getTempFilePath(extension='pdf')))
def _addQuartileEntry(self, label, trackway, data): if not data or len(data) < 4: return if label not in self._quartileStats: csv = CsvWriter() csv.path = self.getPath( '%s-Quartiles.csv' % label.replace(' ', '-'), isFile=True) csv.autoIndexFieldName = 'Index' csv.addFields( ('name', 'Name'), ('normality', 'Normality'), ('unweightedNormality', 'Unweighted Normality'), ('unweightedLowerBound', 'Unweighted Lower Bound'), ('unweightedLowerQuart', 'Unweighted Lower Quartile'), ('unweightedMedian', 'Unweighted Median'), ('unweightedUpperQuart', 'Unweighted Upper Quartile'), ('unweightedUpperBound', 'Unweighted Upper Bound'), ('lowerBound', 'Lower Bound'), ('lowerQuart', 'Lower Quartile'), ('median', 'Median'), ('upperQuart', 'Upper Quartile'), ('upperBound', 'Upper Bound'), ('diffLowerBound', 'Diff Lower Bound'), ('diffLowerQuart', 'Diff Lower Quartile'), ('diffMedian', 'Diff Median'), ('diffUpperQuart', 'Diff Upper Quartile'), ('diffUpperBound', 'Diff Upper Bound') ) self._quartileStats[label] = csv csv = self._quartileStats[label] dd = mstats.density.Distribution(data) unweighted = mstats.density.boundaries.unweighted_two(dd) weighted = mstats.density.boundaries.weighted_two(dd) #----------------------------------------------------------------------- # PLOT DENSITY # Create a density plot for each value p = MultiScatterPlot( title='%s %s Density Distribution' % (trackway.name, label), xLabel=label, yLabel='Probability (AU)') x_values = mstats.density.ops.adaptive_range(dd, 10.0) y_values = dd.probabilities_at(x_values=x_values) p.addPlotSeries( line=True, markers=False, label='Weighted', color='blue', data=zip(x_values, y_values) ) temp = mstats.density.create_distribution( dd.naked_measurement_values(raw=True) ) x_values = mstats.density.ops.adaptive_range(dd, 10.0) y_values = dd.probabilities_at(x_values=x_values) p.addPlotSeries( line=True, markers=False, label='Unweighted', color='red', data=zip(x_values, y_values) ) if label not in self._densityPlots: self._densityPlots[label] = [] self._densityPlots[label].append( p.save(self.getTempFilePath(extension='pdf'))) #----------------------------------------------------------------------- # NORMALITY # Calculate the normality of the weighted and unweighted # distributions as a test against how well they conform to # the Normal distribution calculated from the unweighted data. # # The unweighted Normality test uses a basic bandwidth detection # algorithm to create a uniform Gaussian kernel to populate the # DensityDistribution. It is effectively a density kernel # estimation, but is aggressive in selecting the bandwidth to # prevent over-smoothing multi-modal distributions. if len(data) < 8: normality = -1.0 unweightedNormality = -1.0 else: result = NumericUtils.getMeanAndDeviation(data) mean = result.raw std = result.rawUncertainty normality = mstats.density.ops.overlap( dd, mstats.density.create_distribution([mean], [std]) ) rawValues = [] for value in data: rawValues.append(value.value) ddRaw = mstats.density.create_distribution(rawValues) unweightedNormality = mstats.density.ops.overlap( ddRaw, mstats.density.create_distribution([mean], [std]) ) # Prevent divide by zero unweighted = [ 0.00001 if NumericUtils.equivalent(x, 0) else x for x in unweighted ] csv.addRow({ 'index':trackway.index, 'name':trackway.name, 'normality':normality, 'unweightedNormality':unweightedNormality, 'unweightedLowerBound':unweighted[0], 'unweightedLowerQuart':unweighted[1], 'unweightedMedian' :unweighted[2], 'unweightedUpperQuart':unweighted[3], 'unweightedUpperBound':unweighted[4], 'lowerBound':weighted[0], 'lowerQuart':weighted[1], 'median' :weighted[2], 'upperQuart':weighted[3], 'upperBound':weighted[4], 'diffLowerBound':abs(unweighted[0] - weighted[0])/unweighted[0], 'diffLowerQuart':abs(unweighted[1] - weighted[1])/unweighted[1], 'diffMedian' :abs(unweighted[2] - weighted[2])/unweighted[2], 'diffUpperQuart':abs(unweighted[3] - weighted[3])/unweighted[3], 'diffUpperBound':abs(unweighted[4] - weighted[4])/unweighted[4] })