Free cookie consent management tool by TermsFeed Policy Generator

source: branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.cs @ 14915

Last change on this file since 14915 was 14915, checked in by pfleck, 7 years ago

#2709

  • Added Check All/Inputs&Target/None Icons.
  • Improved location and formatting of the "Show Variables" groupbox in datagrid and statistics view.
  • Added an "Orientation" option for the statistics view.
File size: 10.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections;
24using System.Collections.Generic;
25using System.Linq;
26using System.Windows.Forms;
27using HeuristicLab.Core.Views;
28using HeuristicLab.Data;
29using HeuristicLab.MainForm;
30using HeuristicLab.MainForm.WindowsForms;
31
32namespace HeuristicLab.DataPreprocessing.Views {
33
34  [View("Statistics View")]
35  [Content(typeof(StatisticsContent), true)]
36  public partial class StatisticsView : ItemView {
37
38    private bool horizontal = true;
39
40    private StringMatrix statisticsMatrix;
41
42    private static readonly string[] StatisticsNames = new[] {
43      "Type",
44      "Missing Values",
45      "Min",
46      "Max",
47      "Median",
48      "Average",
49      "Std. Deviation",
50      "Variance",
51      "25th Percentile",
52      "75th Percentile",
53      "Most Common Value",
54      "Num. diff. Values"
55    };
56
57    public new StatisticsContent Content {
58      get { return (StatisticsContent)base.Content; }
59      set { base.Content = value; }
60    }
61
62    public StatisticsView() {
63      InitializeComponent();
64    }
65
66    protected override void OnContentChanged() {
67      base.OnContentChanged();
68      if (Content == null) {
69        rowsTextBox.Text = string.Empty;
70        columnsTextBox.Text = string.Empty;
71        numericColumnsTextBox.Text = string.Empty;
72        nominalColumnsTextBox5.Text = string.Empty;
73        missingValuesTextBox.Text = string.Empty;
74        totalValuesTextBox.Text = string.Empty;
75        stringMatrixView.Content = null;
76        statisticsMatrix = null;
77      } else {
78        UpdateData();
79      }
80    }
81
82    protected override void RegisterContentEvents() {
83      base.RegisterContentEvents();
84      Content.Changed += Content_Changed;
85    }
86
87    protected override void DeregisterContentEvents() {
88      Content.Changed -= Content_Changed;
89      base.DeregisterContentEvents();
90    }
91
92    private void UpdateData(Dictionary<string, bool> oldVisibility = null) {
93      var logic = Content.StatisticsLogic;
94      rowsTextBox.Text = logic.GetColumnCount().ToString();
95      columnsTextBox.Text = logic.GetRowCount().ToString();
96      numericColumnsTextBox.Text = logic.GetNumericColumnCount().ToString();
97      nominalColumnsTextBox5.Text = logic.GetNominalColumnCount().ToString();
98      missingValuesTextBox.Text = logic.GetMissingValueCount().ToString();
99      totalValuesTextBox.Text = (logic.GetColumnCount() * logic.GetRowCount() - logic.GetMissingValueCount()).ToString();
100
101      var variableNames = Content.PreprocessingData.VariableNames.ToList();
102      if (horizontal)
103        statisticsMatrix = new StringMatrix(StatisticsNames.Length, Content.PreprocessingData.Columns) {
104          RowNames = StatisticsView.StatisticsNames,
105          ColumnNames = variableNames
106        };
107      else
108        statisticsMatrix = new StringMatrix(Content.PreprocessingData.Columns, StatisticsNames.Length) {
109          RowNames = variableNames,
110          ColumnNames = StatisticsView.StatisticsNames
111        };
112
113      for (int i = 0; i < logic.GetColumnCount(); i++) {
114        var data = GetStatistics(i);
115        for (int j = 0; j < data.Count; j++) {
116          if (horizontal)
117            statisticsMatrix[j, i] = data[j];
118          else
119            statisticsMatrix[i, j] = data[j];
120        }
121      }
122
123      stringMatrixView.Parent.SuspendRepaint();
124      stringMatrixView.Content = statisticsMatrix;
125
126      var grid = stringMatrixView.DataGridView;
127      int idx = 0;
128      var list = horizontal ? grid.Columns : grid.Rows as IList;
129      foreach (DataGridViewBand band in list) {
130        var variable = variableNames[idx++];
131        if (oldVisibility != null) {
132          band.Visible = !oldVisibility.ContainsKey(variable) || oldVisibility[variable];
133        }
134      }
135      if (horizontal)
136        stringMatrixView.UpdateColumnHeaders();
137      else
138        stringMatrixView.UpdateRowHeaders();
139
140      stringMatrixView.DataGridView.AutoResizeColumns();
141      stringMatrixView.Parent.ResumeRepaint(true);
142    }
143
144    private List<string> GetStatistics(int varIdx) {
145      List<string> list;
146      var logic = Content.StatisticsLogic;
147      if (logic.VariableHasType<double>(varIdx)) {
148        list = GetDoubleColumns(varIdx);
149      } else if (logic.VariableHasType<string>(varIdx)) {
150        list = GetStringColumns(varIdx);
151      } else if (logic.VariableHasType<DateTime>(varIdx)) {
152        list = GetDateTimeColumns(varIdx);
153      } else {
154        list = new List<string>();
155        for (int j = 0; j < StatisticsNames.Length; ++j) {
156          list.Add("unknown column type");
157        }
158      }
159      return list;
160    }
161
162    private List<string> GetDoubleColumns(int statIdx) {
163      var logic = Content.StatisticsLogic;
164      return new List<string> {
165        logic.GetColumnTypeAsString(statIdx),
166        logic.GetMissingValueCount(statIdx).ToString(),
167        logic.GetMin<double>(statIdx, double.NaN).ToString(),
168        logic.GetMax<double>(statIdx, double.NaN).ToString(),
169        logic.GetMedian(statIdx).ToString(),
170        logic.GetAverage(statIdx).ToString(),
171        logic.GetStandardDeviation(statIdx).ToString(),
172        logic.GetVariance(statIdx).ToString(),
173        logic.GetOneQuarterPercentile(statIdx).ToString(),
174        logic.GetThreeQuarterPercentile(statIdx).ToString(),
175        logic.GetMostCommonValue<double>(statIdx, double.NaN).ToString(),
176        logic.GetDifferentValuesCount<double>(statIdx).ToString()
177      };
178    }
179
180    private List<string> GetStringColumns(int statIdx) {
181      var logic = Content.StatisticsLogic;
182      return new List<string> {
183        logic.GetColumnTypeAsString(statIdx),
184        logic.GetMissingValueCount(statIdx).ToString(),
185        "", //min
186        "", //max
187        "", //median
188        "", //average
189        "", //standard deviation
190        "", //variance
191        "", //quarter percentile
192        "", //three quarter percentile
193        logic.GetMostCommonValue<string>(statIdx,string.Empty) ?? "",
194        logic.GetDifferentValuesCount<string>(statIdx).ToString()
195      };
196    }
197
198    private List<string> GetDateTimeColumns(int statIdx) {
199      var logic = Content.StatisticsLogic;
200      return new List<string> {
201        logic.GetColumnTypeAsString(statIdx),
202        logic.GetMissingValueCount(statIdx).ToString(),
203        logic.GetMin<DateTime>(statIdx, DateTime.MinValue).ToString(),
204        logic.GetMax<DateTime>(statIdx, DateTime.MinValue).ToString(),
205        logic.GetMedianDateTime(statIdx).ToString(),
206        logic.GetAverageDateTime(statIdx).ToString(),
207        logic.GetStandardDeviation(statIdx).ToString(),
208        logic.GetVariance(statIdx).ToString(),
209        logic.GetOneQuarterPercentile(statIdx).ToString(),
210        logic.GetThreeQuarterPercentile(statIdx).ToString(),
211        logic.GetMostCommonValue<DateTime>(statIdx, DateTime.MinValue).ToString(),
212        logic.GetDifferentValuesCount<DateTime>(statIdx).ToString()
213      };
214    }
215
216    private void Content_Changed(object sender, DataPreprocessingChangedEventArgs e) {
217      UpdateData();
218    }
219
220    #region Show/Hide Variables
221    private void checkInputsTargetButton_Click(object sender, EventArgs e) {
222      var grid = stringMatrixView.DataGridView;
223      var list = horizontal ? grid.Columns : grid.Rows as IList;
224      var variableNames = Content.PreprocessingData.VariableNames.ToList();
225      int idx = 0;
226      foreach (DataGridViewBand band in list) {
227        var variable = variableNames[idx++];
228        bool isInputTarget = Content.PreprocessingData.InputVariables.Contains(variable)
229                             || Content.PreprocessingData.TargetVariable == variable;
230        band.Visible = isInputTarget;
231        if (horizontal)
232          stringMatrixView.UpdateColumnHeaders();
233        else
234          stringMatrixView.UpdateRowHeaders();
235      }
236
237    }
238    private void checkAllButton_Click(object sender, EventArgs e) {
239      var grid = stringMatrixView.DataGridView;
240      var list = horizontal ? grid.Columns : grid.Rows as IList;
241      foreach (DataGridViewBand band in list) {
242        band.Visible = true;
243      }
244      if (horizontal)
245        stringMatrixView.UpdateColumnHeaders();
246      else
247        stringMatrixView.UpdateRowHeaders();
248    }
249    private void uncheckAllButton_Click(object sender, EventArgs e) {
250      var grid = stringMatrixView.DataGridView;
251      var list = horizontal ? grid.Columns : grid.Rows as IList;
252      foreach (DataGridViewBand band in list) {
253        band.Visible = false;
254      }
255    }
256    #endregion
257
258    #region Orientation
259    private void horizontalRadioButton_CheckedChanged(object sender, EventArgs e) {
260      var grid = stringMatrixView.DataGridView;
261      var oldVisibility = new Dictionary<string, bool>();
262      var variableNames = Content.PreprocessingData.VariableNames.ToList();
263      if (stringMatrixView.Content != null) {
264        var list = horizontal ? grid.Columns : grid.Rows as IList;
265        int idx = 0;
266        foreach (DataGridViewBand band in list) {
267          var variable = variableNames[idx++];
268          oldVisibility.Add(variable, band.Visible);
269        }
270      }
271      horizontal = horizontalRadioButton.Checked;
272      UpdateData(oldVisibility);
273    }
274    private void verticalRadioButton_CheckedChanged(object sender, EventArgs e) {
275      // everything is handled in horizontalRadioButton_CheckedChanged
276    }
277    #endregion
278  }
279}
Note: See TracBrowser for help on using the repository browser.