Example #1
0
        public static ClusteringSpec GetDefaultClusteringSpec(CancellationToken cancellationToken, ReportResults reportResults,
                                                              PivotedProperties pivotedProperties)
        {
            var values = new List <ValueSpec>();

            foreach (var seriesGroup in pivotedProperties.SeriesGroups)
            {
                foreach (var series in seriesGroup.SeriesList)
                {
                    var columnRef = ColumnRef.FromPivotedPropertySeries(series);
                    if (columnRef == null)
                    {
                        continue;
                    }
                    if (reportResults.RowCount >= MIN_ROWS_TO_ASSUME_HEADER && EqualValuesInAllRows(cancellationToken, reportResults, series))
                    {
                        values.Add(new ValueSpec(columnRef, ClusterRole.COLUMNHEADER));
                    }
                    else
                    {
                        var transform = ClusterRole.IsNumericType(series.PropertyType)
                            ? ClusterRole.ZSCORE
                            : ClusterRole.BOOLEAN;
                        values.Add(new ValueSpec(columnRef, transform));
                    }
                }
            }

            using (var propertyEnumerator = pivotedProperties.UngroupedProperties.GetEnumerator())
            {
                while (propertyEnumerator.MoveNext())
                {
                    var columnRef = ColumnRef.FromPropertyDescriptor(propertyEnumerator.Current);
                    if (columnRef == null)
                    {
                        continue;
                    }
                    values.Insert(0, new ValueSpec(columnRef, ClusterRole.ROWHEADER));
                    break;
                }

                if (values.Count == 1)
                {
                    while (propertyEnumerator.MoveNext())
                    {
                        var propertyDescriptor = propertyEnumerator.Current;
                        if (!ClusterRole.IsNumericType(propertyDescriptor?.PropertyType))
                        {
                            continue;
                        }

                        var columnRef = ColumnRef.FromPropertyDescriptor(propertyDescriptor);
                        if (columnRef == null)
                        {
                            continue;
                        }
                        values.Add(new ValueSpec(columnRef, ClusterRole.RAW));
                    }

                    if (values.Count == 1)
                    {
                        return(null);
                    }
                }
            }

            if (values.Count == 0)
            {
                return(null);
            }
            return(new ClusteringSpec(values).ChangeDistanceMetric(ClusterMetricType.EUCLIDEAN.Name));
        }
Example #2
0
        public static ReportColorScheme FromClusteredResults(CancellationToken cancellationToken, ClusteredReportResults clusteredReportResults)
        {
            var discreteColorScheme = new DiscreteColorScheme();
            var numericColorScheme  = new NumericColorScheme();
            var reportResults       = clusteredReportResults;
            var distinctValues      = new HashSet <object>();
            var numericValues       = new HashSet <double>();
            var colorManagers       = new Dictionary <string, ColorManager>();
            var columnHeaderValues  = new Dictionary <string, object>();
            var seriesColorManagers = new Dictionary <object, ColorManager>();

            foreach (var property in reportResults.ClusteredProperties.RowHeaders)
            {
                cancellationToken.ThrowIfCancellationRequested();
                if (ClusterRole.IsNumericType(property.PropertyType))
                {
                    var colorScheme = new NumericColorScheme();
                    colorScheme.AddValues(reportResults.RowItems.Select(row => property.GetValue(row)));
                    colorManagers[property.Name] = new ColorManager(colorScheme, new[] { property }, null);
                }
                else
                {
                    distinctValues.UnionWith(reportResults.RowItems.Select(property.GetValue).Where(v => null != v));
                    colorManagers[property.Name] = new ColorManager(discreteColorScheme, new[] { property }, null);
                }
            }
            foreach (var property in reportResults.ClusteredProperties.PivotedProperties.UngroupedProperties)
            {
                cancellationToken.ThrowIfCancellationRequested();
                var transform = reportResults.ClusteredProperties.GetRowTransform(property);
                if (transform == null)
                {
                    continue;
                }
                colorManagers[property.Name] = new ColorManager(numericColorScheme, new[] { property }, transform);
                numericValues.UnionWith(reportResults.RowItems
                                        .Select(row => transform.TransformRow(new[] { property.GetValue(row) }).First())
                                        .OfType <double>());
            }

            foreach (var group in reportResults.PivotedProperties.SeriesGroups)
            {
                foreach (var series in group.SeriesList)
                {
                    IColorScheme colorScheme = null;
                    var          role        = reportResults.ClusteredProperties.GetColumnRole(series);
                    if (role == ClusterRole.COLUMNHEADER)
                    {
                        var values = new HashSet <object>();
                        foreach (var property in series.PropertyDescriptors)
                        {
                            cancellationToken.ThrowIfCancellationRequested();
                            var columnDistinctValues = reportResults.RowItems.Select(property.GetValue)
                                                       .Where(v => null != v).Distinct().ToList();
                            if (columnDistinctValues.Count == 1)
                            {
                                columnHeaderValues[property.Name] = columnDistinctValues[0];
                            }
                            values.UnionWith(columnDistinctValues);
                        }
                        if (ClusterRole.IsNumericType(series.PropertyType))
                        {
                            colorScheme = new NumericColorScheme();
                            colorScheme.AddValues(values);
                        }
                        else
                        {
                            distinctValues.UnionWith(values);
                            colorScheme = discreteColorScheme;
                        }
                    }
                    else if (role is ClusterRole.Transform transform)
                    {
                        colorScheme = numericColorScheme;
                        numericValues.UnionWith(reportResults.RowItems.SelectMany(row =>
                        {
                            cancellationToken.ThrowIfCancellationRequested();
                            return(transform.TransformRow(
                                       series.PropertyDescriptors.Select(pd => pd.GetValue(row))));
                        }).OfType <double>());
                    }

                    if (colorScheme != null)
                    {
                        var colorManager = new ColorManager(colorScheme, series.PropertyDescriptors, role as ClusterRole.Transform);
                        foreach (var pd in series.PropertyDescriptors)
                        {
                            colorManagers.Add(pd.Name, colorManager);
                        }
                        seriesColorManagers.Add(series.SeriesId, colorManager);
                    }
                }
            }
            numericColorScheme.AddValues(numericValues);
            discreteColorScheme.AddValues(distinctValues);
            var columnColors = new Dictionary <string, Color>();

            foreach (var entry in columnHeaderValues)
            {
                if (colorManagers.TryGetValue(entry.Key, out ColorManager manager))
                {
                    var color = manager.ColorScheme.GetColor(entry.Value);
                    if (color.HasValue)
                    {
                        columnColors.Add(entry.Key, color.Value);
                    }
                }
            }
            return(new ReportColorScheme(reportResults.ClusteredProperties, colorManagers, columnColors, seriesColorManagers));
        }