//Function called to adapt the given column to match the DateTime type private Input updateTime(Input curInput, DateTimeTypes curType) { for (int i = 0; i < curInput.vals2.Count; i++) { if (curInput.vals.Count - 1 < i) curInput.vals.Add(0.0); DateTime tempVal = new DateTime(1900, 1, 1); if (DateTime.TryParse(curInput.vals2[i], Common.curCulture, System.Globalization.DateTimeStyles.None, out tempVal)) { double newVal = valueFromDateTimeType(tempVal, curType); if (!curInput.conversionDict.ContainsKey(curInput.vals2[i])) curInput.conversionDict.Add(curInput.vals2[i], newVal); curInput.vals[i] = newVal; } else { curInput.wrongRowsCount = curInput.wrongRowsCount + 1; } } return curInput; }
//Function converting the values in the given column into categorical type, that is: assigning each value with a unique index (starting from zero) private Input updateCategorical(Input curInput) { curInput.conversionDict = new Dictionary<string, double>(); double newCateg = -1.0; foreach (string item in curInput.vals2.Distinct().OrderBy(x => x)) { newCateg = newCateg + 1.0; curInput.conversionDict.Add(item, newCateg); } for (int i = 0; i < curInput.vals2.Count; i++) { if (curInput.vals.Count - 1 < i) curInput.vals.Add(0.0); curInput.vals[i] = curInput.conversionDict[curInput.vals2[i]]; } return curInput; }
public int noDec; //Number of decimals to be considered while dealing with the given variable #endregion Fields #region Constructors public Variable() { input = new Input(); }
//Most of the (data) assessment is performed at a later stage (i.e., while analysing the given combination/fit). //This is a pre-analysis of the raw input information which will have a (slight) influence in the later assessment private Input preAnalyseColumn(Input curInput) { curInput.preAnalysis.averValue = curInput.vals.Average(); curInput.preAnalysis.commonValsCount = curInput.vals.Count - curInput.vals.Distinct().Count() + 1; if (curInput.preAnalysis.commonValsCount == curInput.vals.Count) { curInput.type.mainType = MainTypes.Constant; return curInput; } curInput.preAnalysis.averVariabilityValue = curInput.vals.Select(x => Math.Abs(x - curInput.preAnalysis.averValue)).Average(); //Preliminary rating of the given input (column) on account of the number of common values and the variability of its error curInput.preAnalysis.rating = 10; double ratio = (double)curInput.preAnalysis.commonValsCount / (double)curInput.vals.Count; if (curInput.preAnalysis.commonValsCount > 5 || ratio >= 0.05) { curInput.preAnalysis.rating = curInput.preAnalysis.rating - 1; if (ratio >= 0.7) { curInput.preAnalysis.rating = 4; } else if (ratio >= 0.5) { curInput.preAnalysis.rating = 5; } else if (ratio >= 0.35) { curInput.preAnalysis.rating = 6; } else if (ratio >= 0.2) { curInput.preAnalysis.rating = 7; } } double diffRatio = Common.errorCalcs(curInput.preAnalysis.averVariabilityValue, curInput.preAnalysis.averValue); if (diffRatio <= 0.05) { curInput.preAnalysis.rating = curInput.preAnalysis.rating - 5; } else if (diffRatio <= 0.1) { curInput.preAnalysis.rating = curInput.preAnalysis.rating - 4; } else if (diffRatio <= 0.2) { curInput.preAnalysis.rating = curInput.preAnalysis.rating - 3; } else if (diffRatio <= 0.3) { curInput.preAnalysis.rating = curInput.preAnalysis.rating - 2; } else if (diffRatio <= 0.5) { curInput.preAnalysis.rating = curInput.preAnalysis.rating - 1; } if (curInput.preAnalysis.rating < 0) curInput.preAnalysis.rating = 0; return curInput; }
//Method called by the one above to update the associated Label (lblNonNumerical2) with a message explaining the performed conversion private void operationFromMainSecType(Input curInput) { if (curInput.type.mainType == MainTypes.Categorical) { lblNonNumerical2.Text = "Conversion [categorical]: unique index (" + curInput.min.ToString() + "-" + curInput.max.ToString() + ")."; } else if (curInput.type.mainType == MainTypes.DateTime) { if (curInput.type.secType == DateTimeTypes.Time) { lblNonNumerical2.Text = "Conversion [time]: 10000 " + Common.getSignFromoperation(Operation.Multiplication, false) + " hours + 100 " + Common.getSignFromoperation(Operation.Multiplication, false) + " minutes + seconds."; } else { lblNonNumerical2.Text = "Conversion [date]: corresponding " + curInput.type.secType.ToString().ToLower() + "."; } } }