Free cookie consent management tool by TermsFeed Policy Generator

source: branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/SearchLogic.cs @ 10785

Last change on this file since 10785 was 10776, checked in by rstoll, 11 years ago
  • Missing values manipulations
File size: 5.2 KB
RevLine 
[10539]1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2013 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;
[10661]23using System.Collections;
[10236]24using System.Collections.Generic;
25using System.Linq;
26
27namespace HeuristicLab.DataPreprocessing {
[10557]28  public class SearchLogic : ISearchLogic {
[10586]29    private readonly ITransactionalPreprocessingData preprocessingData;
[10236]30
[10776]31    private Dictionary<int, IList<int>> MissingValueIndicies { get; set; }
[10661]32    private Dictionary<int, IEnumerable> ValuesWithoutNaN { get; set; }
33
[10586]34    public SearchLogic(ITransactionalPreprocessingData thePreprocessingData) {
[10236]35      preprocessingData = thePreprocessingData;
[10661]36
[10776]37      MissingValueIndicies = new Dictionary<int, IList<int>>();
[10661]38      ValuesWithoutNaN = new Dictionary<int, IEnumerable>();
39
40      preprocessingData.Changed += preprocessingData_Changed;
[10236]41    }
42
[10661]43    void preprocessingData_Changed(object sender, DataPreprocessingChangedEventArgs e)
44    {
[10737]45      switch (e.Type) {
46        case DataPreprocessingChangedEventType.DeleteColumn:
47        case DataPreprocessingChangedEventType.ChangeColumn:
48          MissingValueIndicies.Remove(e.Column);
49          ValuesWithoutNaN.Remove(e.Column);
50          break;
51        case DataPreprocessingChangedEventType.AddColumn:
52          //cache does not need to be updated, will be calculated the first time it is requested
53          break;
54        case DataPreprocessingChangedEventType.DeleteRow:
55        case DataPreprocessingChangedEventType.AddRow:
56        case DataPreprocessingChangedEventType.ChangeItem:
57        case DataPreprocessingChangedEventType.Any:
58        case DataPreprocessingChangedEventType.Transformation:
[10776]59          MissingValueIndicies = new Dictionary<int, IList<int>>();
[10737]60          ValuesWithoutNaN = new Dictionary<int, IEnumerable>();
61          break;
62      }
[10661]63    }
64
[10776]65    public IDictionary<int, IList<int>> GetMissingValueIndices() {
66      var dic = new Dictionary<int, IList<int>>();
67      for (int i = 0; i < preprocessingData.Columns; ++i) {
68        dic.Add(i, GetMissingValueIndices(i));
[10236]69      }
70      return dic;
71    }
72
[10367]73    public bool IsMissingValue(int columnIndex, int rowIndex) {
74      if (preprocessingData.IsType<double>(columnIndex)) {
75        return double.IsNaN(preprocessingData.GetCell<double>(columnIndex, rowIndex));
76      } else if (preprocessingData.IsType<string>(columnIndex)) {
77        return string.IsNullOrEmpty(preprocessingData.GetCell<string>(columnIndex, rowIndex));
78      } else if (preprocessingData.IsType<DateTime>(columnIndex)) {
79        return preprocessingData.GetCell<DateTime>(columnIndex, rowIndex).Equals(DateTime.MinValue);
[10236]80      } else {
[10367]81        throw new ArgumentException("cell in column " + columnIndex + " and row index " + rowIndex + " contains a non supported type.");
[10236]82      }
83    }
84
[10776]85    public IList<int> GetMissingValueIndices(int columnIndex) {
[10661]86      if (!MissingValueIndicies.ContainsKey(columnIndex)){       
87          if (preprocessingData.IsType<double>(columnIndex)) {
88            MissingValueIndicies[columnIndex] = GetMissingValueIndices<double>(columnIndex);
89          } else if (preprocessingData.IsType<string>(columnIndex)) {
90            MissingValueIndicies[columnIndex] = GetMissingValueIndices<string>(columnIndex);
91          } else if (preprocessingData.IsType<DateTime>(columnIndex)) {
92            MissingValueIndicies[columnIndex] = GetMissingValueIndices<DateTime>(columnIndex);
93          } else {
94            throw new ArgumentException("column " + columnIndex + " contains a non supported type.");
95          }
96      }
97
98      return MissingValueIndicies[columnIndex];
99   }
[10776]100    private IList<int> GetMissingValueIndices<T>(int columnIndex) {
[10661]101      List<int> missingIndices = new List<int>();
102     
103      for(int row = 0; row < preprocessingData.Rows; ++row) {
104        if (IsMissingValue(columnIndex, row)) {
105          missingIndices.Add(row);
106        }
[10236]107      }
[10661]108
109      return missingIndices;
[10236]110    }
111
[10661]112    public IEnumerable<T> GetValuesWithoutNaN<T>(int columnIndex)
113    {
114      if (!ValuesWithoutNaN.ContainsKey(columnIndex))
115      {
116        List<T> values = new List<T>();
117
118        for (int row = 0; row < preprocessingData.Rows; ++row)
119        {
120          if (!IsMissingValue(columnIndex, row))
121          {
122            values.Add(preprocessingData.GetCell<T>(columnIndex, row));
123          }
124        }
125
126        ValuesWithoutNaN[columnIndex] = values;
127      }
128
129      return (IEnumerable<T>)ValuesWithoutNaN[columnIndex];
130    }
[10236]131  }
132}
Note: See TracBrowser for help on using the repository browser.