private void OnShowPredictions(object parameter)
        {
            lock (_lockPredictionValuesObject)
            {
                if (parameter is DataGrid dataGrid && SelectedPredictionColumnIndex >= 0 && ColumnsDictionary.Any())
                {
                    PredictionValues = new List <Dictionary <int, string> >();
                    var selectedPredictionColumnKey = ColumnsDictionary.ElementAt(SelectedPredictionColumnIndex).Key;
                    var distinctPredicitonValues    = CleanDataItems.SelectMany(x => x.Data.Where(z => z.Key == selectedPredictionColumnKey))
                                                      .Select(c => c.Value).Distinct();

                    foreach (var prediction in distinctPredicitonValues)
                    {
                        var columns = new Dictionary <int, string>();

                        for (var colIndex = 0; colIndex < ColumnsDictionary.Count; colIndex++)
                        {
                            var keyValuePairs = CleanDataItems.Select(x => x.Data).Where(c => c.Values.Contains(prediction));

                            var allPredictionsForColumn = keyValuePairs.SelectMany(x => x).Where(c => c.Key == ColumnsDictionary.ElementAt(colIndex).Key)
                                                          .GroupBy(z => z.Value)
                                                          .OrderByDescending(v => v.Count()).FirstOrDefault();

                            if (allPredictionsForColumn != null)
                            {
                                foreach (var c in allPredictionsForColumn)
                                {
                                    columns.Add(ColumnsDictionary.ElementAt(colIndex).Key, c.Value);
                                    break;
                                }
                            }
                        }
                        PredictionValues.Add(columns);
                    }

                    Application.Current.Dispatcher.Invoke(() => dataGrid.ItemsSource = PredictionValues);
                    Application.Current.Dispatcher.Invoke(() => dataGrid.Columns.Clear());
                    var colCount = 0;
                    foreach (var prediction in ColumnsDictionary)
                    {
                        Application.Current.Dispatcher.Invoke(() => dataGrid.Columns.Add(new DataGridTextColumn()
                        {
                            Header       = prediction.Value,
                            Binding      = new Binding($".[{prediction.Key}]"),
                            DisplayIndex = colCount
                        }));

                        colCount++;
                    }
                }
            }
        }
        private void OnDeleteColumn(object parameter)
        {
            if (parameter is DataGrid dataGrid && SelectedColumnIndex >= 0 && ColumnsDictionary.Any())
            {
                foreach (var cleanDataItem in CleanDataItems)
                {
                    cleanDataItem.Data.Remove(ColumnsDictionary.ElementAt(SelectedColumnIndex).Key);
                }
                dataGrid.Columns.Remove(dataGrid.Columns.FirstOrDefault(x =>
                                                                        string.Equals(x.Header.ToString(), ColumnsDictionary.ElementAt(SelectedColumnIndex).Value, StringComparison.OrdinalIgnoreCase)));
                ColumnsDictionary.Remove(ColumnsDictionary.ElementAt(SelectedColumnIndex).Key);

                ColumnsDictionary = new Dictionary <int, string>(ColumnsDictionary);
            }
        }
        private void OnVisualiseColumnn()
        {
            if (SelectedVisualisationColumnIndex >= 0 && ColumnsDictionary.Any())
            {
                try
                {
                    SelectedColumnItemsCount = new ObservableCollection <KeyValuePair <string, int> >();
                    var selectedColumnKey   = ColumnsDictionary.ElementAt(SelectedVisualisationColumnIndex).Key;
                    var visualiseColumnData = CleanDataItems.SelectMany(x => x.Data).Where(c => c.Key == selectedColumnKey);

                    foreach (var visualColumnData in visualiseColumnData.Select(x => x.Value).Distinct())
                    {
                        Application.Current.Dispatcher.Invoke(() => SelectedColumnItemsCount.Add(new KeyValuePair <string, int>(visualColumnData,
                                                                                                                                visualiseColumnData.Select(x => x).Where(c => string.Equals(c.Value, visualColumnData, StringComparison.OrdinalIgnoreCase)).Count())));
                    }
                }
                catch (Exception ex)
                {
                    _exceptionLogDataAccess.LogException(ex.ToString());
                }
            }
        }