Changeset 16308 for branches/2845_EnhancedProgress/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs
- Timestamp:
- 11/20/18 13:52:40 (5 years ago)
- Location:
- branches/2845_EnhancedProgress
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2845_EnhancedProgress
- Property svn:mergeinfo changed
/stable reverse-merged: 15587-15588 /trunk/sources removed
- Property svn:mergeinfo changed
-
branches/2845_EnhancedProgress/HeuristicLab.DataPreprocessing
- Property svn:mergeinfo changed
/stable/HeuristicLab.DataPreprocessing reverse-merged: 15587 /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing removed /trunk/sources/HeuristicLab.DataPreprocessing removed
- Property svn:mergeinfo changed
-
branches/2845_EnhancedProgress/HeuristicLab.DataPreprocessing/3.4
- Property svn:mergeinfo changed
/stable/HeuristicLab.DataPreprocessing/3.4 reverse-merged: 15587 /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4 removed /trunk/sources/HeuristicLab.DataPreprocessing/3.4 removed
- Property svn:mergeinfo changed
-
branches/2845_EnhancedProgress/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs
r16307 r16308 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 8Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 27 27 using HeuristicLab.Core; 28 28 using HeuristicLab.Data; 29 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;30 using HeuristicLab.Random;31 29 32 30 namespace HeuristicLab.DataPreprocessing { 31 33 32 [Item("Data Grid", "Represents a data grid.")] 34 [StorableClass] 35 public class DataGridContent : PreprocessingContent, IStringConvertibleMatrix, IViewShortcut { 33 public class DataGridContent : Item, IStringConvertibleMatrix, IViewShortcut { 36 34 public static new Image StaticItemImage { 37 35 get { return HeuristicLab.Common.Resources.VSImageLibrary.Table; } 38 36 } 39 37 38 public ITransactionalPreprocessingData PreProcessingData { get; private set; } 39 40 public ManipulationLogic ManipulationLogic { get; private set; } 41 public FilterLogic FilterLogic { get; private set; } 42 40 43 public int Rows { 41 get { return Pre processingData.Rows; }44 get { return PreProcessingData.Rows; } 42 45 set { } 43 46 } 44 47 45 48 public int Columns { 46 get { return Pre processingData.Columns; }49 get { return PreProcessingData.Columns; } 47 50 set { } 48 51 } 49 52 50 53 public IEnumerable<string> ColumnNames { 51 get { return Pre processingData.VariableNames; }54 get { return PreProcessingData.VariableNames; } 52 55 set { } 53 56 } … … 68 71 69 72 public IDictionary<int, IList<int>> Selection { 70 get { return Pre processingData.Selection; }71 set { Pre processingData.Selection = value; }73 get { return PreProcessingData.Selection; } 74 set { PreProcessingData.Selection = value; } 72 75 } 73 76 74 #region Constructor, Cloning & Persistence 75 public DataGridContent(IFilteredPreprocessingData preprocessingData) 76 : base(preprocessingData) { 77 public DataGridContent(ITransactionalPreprocessingData preProcessingData, ManipulationLogic theManipulationLogic, FilterLogic theFilterLogic) { 78 ManipulationLogic = theManipulationLogic; 79 FilterLogic = theFilterLogic; 80 PreProcessingData = preProcessingData; 77 81 } 78 82 79 public DataGridContent(DataGridContent original, Cloner cloner) 80 : base(original, cloner) { 83 public DataGridContent(DataGridContent dataGridContent, Cloner cloner) 84 : base(dataGridContent, cloner) { 85 81 86 } 82 87 public override IDeepCloneable Clone(Cloner cloner) { … … 84 89 } 85 90 86 [StorableConstructor]87 protected DataGridContent(bool deserializing)88 : base(deserializing) { }89 #endregion90 91 91 public void DeleteRows(IEnumerable<int> rows) { 92 Pre processingData.DeleteRowsWithIndices(rows);92 PreProcessingData.DeleteRowsWithIndices(rows); 93 93 } 94 94 95 95 public void DeleteColumn(int column) { 96 Pre processingData.DeleteColumn(column);96 PreProcessingData.DeleteColumn(column); 97 97 } 98 98 99 99 public bool Validate(string value, out string errorMessage, int columnIndex) { 100 return Pre processingData.Validate(value, out errorMessage, columnIndex);100 return PreProcessingData.Validate(value, out errorMessage, columnIndex); 101 101 } 102 102 103 103 public string GetValue(int rowIndex, int columnIndex) { 104 return Pre processingData.GetCellAsString(columnIndex, rowIndex);104 return PreProcessingData.GetCellAsString(columnIndex, rowIndex); 105 105 } 106 106 107 107 public bool SetValue(string value, int rowIndex, int columnIndex) { 108 return Pre processingData.SetValue(value, columnIndex, rowIndex);108 return PreProcessingData.SetValue(value, columnIndex, rowIndex); 109 109 } 110 110 111 111 public event DataPreprocessingChangedEventHandler Changed { 112 add { Pre processingData.Changed += value; }113 remove { Pre processingData.Changed -= value; }112 add { PreProcessingData.Changed += value; } 113 remove { PreProcessingData.Changed -= value; } 114 114 } 115 115 … … 132 132 #pragma warning restore 0067 133 133 #endregion 134 135 #region Manipulations136 private void ReplaceIndicesByValue(IDictionary<int, IList<int>> cells, Func<int, double> doubleAggregator = null,137 Func<int, DateTime> dateTimeAggregator = null, Func<int, string> stringAggregator = null) {138 PreprocessingData.InTransaction(() => {139 foreach (var column in cells) {140 if (doubleAggregator != null && PreprocessingData.VariableHasType<double>(column.Key)) {141 var value = doubleAggregator(column.Key);142 foreach (int index in column.Value)143 PreprocessingData.SetCell<double>(column.Key, index, value);144 } else if (dateTimeAggregator != null && PreprocessingData.VariableHasType<DateTime>(column.Key)) {145 var value = dateTimeAggregator(column.Key);146 foreach (int index in column.Value)147 PreprocessingData.SetCell<DateTime>(column.Key, index, value);148 } else if (stringAggregator != null && PreprocessingData.VariableHasType<string>(column.Key)) {149 var value = stringAggregator(column.Key);150 foreach (int index in column.Value)151 PreprocessingData.SetCell<string>(column.Key, index, value);152 }153 }154 });155 }156 157 private void ReplaceIndicesByValues(IDictionary<int, IList<int>> cells, Func<int, IEnumerable<double>> doubleAggregator = null,158 Func<int, IEnumerable<DateTime>> dateTimeAggregator = null, Func<int, IEnumerable<string>> stringAggregator = null) {159 PreprocessingData.InTransaction(() => {160 foreach (var column in cells) {161 if (doubleAggregator != null && PreprocessingData.VariableHasType<double>(column.Key)) {162 var values = doubleAggregator(column.Key);163 foreach (var pair in column.Value.Zip(values, (row, value) => new { row, value }))164 PreprocessingData.SetCell<double>(column.Key, pair.row, pair.value);165 } else if (dateTimeAggregator != null && PreprocessingData.VariableHasType<DateTime>(column.Key)) {166 var values = dateTimeAggregator(column.Key);167 foreach (var pair in column.Value.Zip(values, (row, value) => new { row, value }))168 PreprocessingData.SetCell<DateTime>(column.Key, pair.row, pair.value);169 } else if (stringAggregator != null && PreprocessingData.VariableHasType<string>(column.Key)) {170 var values = stringAggregator(column.Key);171 foreach (var pair in column.Value.Zip(values, (row, value) => new { row, value }))172 PreprocessingData.SetCell<string>(column.Key, pair.row, pair.value);173 }174 }175 });176 }177 178 public void ReplaceIndicesByMean(IDictionary<int, IList<int>> cells, bool considerSelection = false) {179 ReplaceIndicesByValue(cells,180 col => PreprocessingData.GetMean<double>(col, considerSelection),181 col => PreprocessingData.GetMean<DateTime>(col, considerSelection));182 }183 184 public void ReplaceIndicesByMedianValue(IDictionary<int, IList<int>> cells, bool considerSelection = false) {185 ReplaceIndicesByValue(cells,186 col => PreprocessingData.GetMedian<double>(col, considerSelection),187 col => PreprocessingData.GetMedian<DateTime>(col, considerSelection));188 }189 190 public void ReplaceIndicesByMode(IDictionary<int, IList<int>> cells, bool considerSelection = false) {191 ReplaceIndicesByValue(cells,192 col => PreprocessingData.GetMode<double>(col, considerSelection),193 col => PreprocessingData.GetMode<DateTime>(col, considerSelection),194 col => PreprocessingData.GetMode<string>(col, considerSelection));195 }196 197 public void ReplaceIndicesByRandomValue(IDictionary<int, IList<int>> cells, bool considerSelection = false) {198 var rand = new FastRandom();199 ReplaceIndicesByValues(cells,200 col => {201 double min = PreprocessingData.GetMin<double>(col, considerSelection);202 double max = PreprocessingData.GetMax<double>(col, considerSelection);203 double range = max - min;204 return cells[col].Select(_ => rand.NextDouble() * range + min);205 },206 col => {207 var min = PreprocessingData.GetMin<DateTime>(col, considerSelection);208 var max = PreprocessingData.GetMax<DateTime>(col, considerSelection);209 double range = (max - min).TotalSeconds;210 return cells[col].Select(_ => min + TimeSpan.FromSeconds(rand.NextDouble() * range));211 });212 }213 214 public void ReplaceIndicesByString(IDictionary<int, IList<int>> cells, string value) {215 PreprocessingData.InTransaction(() => {216 foreach (var column in cells) {217 foreach (var rowIdx in column.Value) {218 PreprocessingData.SetValue(value, column.Key, rowIdx);219 }220 }221 });222 }223 224 225 public void ReplaceIndicesByLinearInterpolationOfNeighbours(IDictionary<int, IList<int>> cells) {226 PreprocessingData.InTransaction(() => {227 foreach (var column in cells) {228 IList<Tuple<int, int>> startEndings = GetStartAndEndingsForInterpolation(column);229 foreach (var tuple in startEndings) {230 Interpolate(column, tuple.Item1, tuple.Item2);231 }232 }233 });234 }235 236 private List<Tuple<int, int>> GetStartAndEndingsForInterpolation(KeyValuePair<int, IList<int>> column) {237 var startEndings = new List<Tuple<int, int>>();238 var rowIndices = column.Value.OrderBy(x => x).ToList();239 var count = rowIndices.Count;240 int start = int.MinValue;241 for (int i = 0; i < count; ++i) {242 if (start == int.MinValue) {243 start = IndexOfPrevPresentValue(column.Key, rowIndices[i]);244 }245 if (i + 1 == count || (i + 1 < count && rowIndices[i + 1] - rowIndices[i] > 1)) {246 int next = IndexOfNextPresentValue(column.Key, rowIndices[i]);247 if (start > 0 && next < PreprocessingData.Rows) {248 startEndings.Add(new Tuple<int, int>(start, next));249 }250 start = int.MinValue;251 }252 }253 return startEndings;254 }255 256 private void Interpolate(KeyValuePair<int, IList<int>> column, int prevIndex, int nextIndex) {257 int valuesToInterpolate = nextIndex - prevIndex;258 259 if (PreprocessingData.VariableHasType<double>(column.Key)) {260 double prev = PreprocessingData.GetCell<double>(column.Key, prevIndex);261 double next = PreprocessingData.GetCell<double>(column.Key, nextIndex);262 double interpolationStep = (next - prev) / valuesToInterpolate;263 264 for (int i = prevIndex; i < nextIndex; ++i) {265 double interpolated = prev + (interpolationStep * (i - prevIndex));266 PreprocessingData.SetCell<double>(column.Key, i, interpolated);267 }268 } else if (PreprocessingData.VariableHasType<DateTime>(column.Key)) {269 DateTime prev = PreprocessingData.GetCell<DateTime>(column.Key, prevIndex);270 DateTime next = PreprocessingData.GetCell<DateTime>(column.Key, nextIndex);271 double interpolationStep = (next - prev).TotalSeconds / valuesToInterpolate;272 273 for (int i = prevIndex; i < nextIndex; ++i) {274 DateTime interpolated = prev.AddSeconds(interpolationStep * (i - prevIndex));275 PreprocessingData.SetCell<DateTime>(column.Key, i, interpolated);276 }277 }278 }279 280 private int IndexOfPrevPresentValue(int columnIndex, int start) {281 int offset = start - 1;282 while (offset >= 0 && PreprocessingData.IsCellEmpty(columnIndex, offset)) {283 offset--;284 }285 286 return offset;287 }288 289 private int IndexOfNextPresentValue(int columnIndex, int start) {290 int offset = start + 1;291 while (offset < PreprocessingData.Rows && PreprocessingData.IsCellEmpty(columnIndex, offset)) {292 offset++;293 }294 295 return offset;296 }297 298 public void Shuffle(bool shuffleRangesSeparately) {299 var random = new FastRandom();300 301 if (shuffleRangesSeparately) {302 var ranges = new[] { PreprocessingData.TestPartition, PreprocessingData.TrainingPartition };303 PreprocessingData.InTransaction(() => {304 // process all given ranges - e.g. TrainingPartition, TestPartition305 foreach (IntRange range in ranges) {306 var indices = Enumerable.Range(0, PreprocessingData.Rows).ToArray();307 var shuffledIndices = Enumerable.Range(range.Start, range.Size).Shuffle(random).ToArray();308 for (int i = range.Start, j = 0; i < range.End; i++, j++)309 indices[i] = shuffledIndices[j];310 311 ReOrderToIndices(indices);312 }313 });314 315 } else {316 PreprocessingData.InTransaction(() => {317 var indices = Enumerable.Range(0, PreprocessingData.Rows).ToArray();318 indices.ShuffleInPlace(random);319 ReOrderToIndices(indices);320 });321 }322 }323 324 public void ReOrderToIndices(int[] indices) {325 PreprocessingData.InTransaction(() => {326 for (int i = 0; i < PreprocessingData.Columns; ++i) {327 if (PreprocessingData.VariableHasType<double>(i))328 ReOrderToIndices<double>(i, indices);329 else if (PreprocessingData.VariableHasType<string>(i))330 ReOrderToIndices<string>(i, indices);331 else if (PreprocessingData.VariableHasType<DateTime>(i))332 ReOrderToIndices<DateTime>(i, indices);333 }334 });335 }336 337 private void ReOrderToIndices<T>(int columnIndex, int[] indices) {338 var originalData = new List<T>(PreprocessingData.GetValues<T>(columnIndex));339 if (indices.Length != originalData.Count) throw new InvalidOperationException("The number of provided indices does not match the values.");340 341 for (int i = 0; i < indices.Length; i++) {342 T newValue = originalData[indices[i]];343 PreprocessingData.SetCell<T>(columnIndex, i, newValue);344 }345 }346 #endregion347 134 } 348 135 }
Note: See TracChangeset
for help on using the changeset viewer.