# 2020-04-06 | IA | DataPreparation ###### tags: `swift` `ia` `gobelins` ## Class ```swift import Foundation class DataPreparation { enum CoordOrganization { case pair,seq } var values = [Double]() var org:CoordOrganization init(array:[Double],org:CoordOrganization = .pair){ self.values = array self.org = org } init(array:[CGPoint],org:CoordOrganization = .pair) { // TO DO erreur si != de pair if org != .pair { print("/.pair/ Coming soon...") } self.org = org self.values = convert(coords:array, org:self.org) } } extension DataPreparation { // mean func calcArrayMean() -> [Double] { var sums:[Double] = [0.0,0.0] for i in 0..<self.values.count { sums[i % 2] += self.values[i] } var meanArray = sums.map{ $0 / (Double(self.values.count) / 2.0) } return meanArray } } extension DataPreparation { // normalize private func convert(coords:[CGPoint], org:CoordOrganization) -> [Double] { var values = [Double]() switch org { case .pair: values = getCGPointToDoubleCouple(pos:coords) case .seq: values = getCGPointToDouble(pos:coords) } return values } func normalize() -> [Double] { let min = self.values.min()! let max = self.values.max()! var finalArray = [Double]() if min == max { for item in values { finalArray.append(1.0 / Double(self.values.count)) } }else{ finalArray = self.values.map{($0 - min)/(max - min)} } return finalArray } func formatArray(n:Int) -> [Double]{ var finalArray = [Double]() for i in 0..<n{ if i < self.values.count { finalArray.append(self.values[i]) } else{ finalArray.append(0.0) } } return finalArray } private func getCGPointToDouble(pos:[CGPoint]) -> [Double] { var values = [Double]() var coordX = [Double]() var coordY = [Double]() coordX = pos.map{Double($0.x)} coordY = pos.map{Double($0.y)} values = coordX + coordY return values } private func getCGPointToDoubleCouple(pos:[CGPoint]) -> [Double] { var values = [Double]() var t = pos.map{[Double($0.x),Double($0.y)]} values = t.flatMap{$0} return values } // standardisation func standardization() -> [Double] { var means:[Double] = self.calcArrayMean() var standardDeviations:[Double] = self.calcStandardDeviation(means:means) var standardizedArray = self.values.enumerated().map{ ($0.element - means[$0.offset % 2] ) / standardDeviations[$0.offset % 2] } return standardizedArray } private func calcStandardDeviation(means:[Double]) -> [Double]{ var sums:[Double] = [0.0,0.0] var deviations = [Double]() for i in 0..<self.values.count { sums[i % 2] += pow(self.values[i] - means[i % 2], 2.0) } deviations = sums.map{ sqrt($0 / (Double(self.values.count) / 2.0)) } return deviations } } ``` ## How to use ```swift var pos = [CGPoint(x: 0, y: 1),CGPoint(x: 2, y: 5),CGPoint(x: 4, y: 1),CGPoint(x: 1, y: 0),CGPoint(x: 4, y: 9),CGPoint(x: 0, y: 1),CGPoint(x: 2, y: 5),CGPoint(x: 4, y: 1),CGPoint(x: 1, y: 0),CGPoint(x: 4, y: 9),CGPoint(x: 0, y: 1),CGPoint(x: 2, y: 5),CGPoint(x: 4, y: 1),CGPoint(x: 1, y: 0),CGPoint(x: 4, y: 9),CGPoint(x: 0, y: 1),CGPoint(x: 2, y: 5),CGPoint(x: 4, y: 1),CGPoint(x: 1, y: 0),CGPoint(x: 4, y: 9)] var posDouble = [0.0,1.0,2.0,5.0,4.0,1.0,1.0,0.0,4.0,9.0,0.0,1.0,2.0,5.0,4.0,1.0,1.0,0.0,4.0,9.0,0.0,1.0,2.0,5.0,4.0,1.0,1.0,0.0,4.0,9.0,0.0,1.0,2.0,5.0,4.0,1.0,1.0,0.0,4.0,9.0] print("Data CGPoint") let data = DataPreparation(array:pos) print(data.normalize()) print(data.formatArray(n:50)) print(data.calcArrayMean()) print("Data Double") let dataDouble = DataPreparation(array:posDouble) print(dataDouble.normalize()) print(data.formatArray(n:5)) print(dataDouble.calcArrayMean()) ``` ## Result ```console Data CGPoint [0.0, 0.1111111111111111, 0.2222222222222222, 0.5555555555555556, 0.4444444444444444, 0.1111111111111111, 0.1111111111111111, 0.0, 0.4444444444444444, 1.0, 0.0, 0.1111111111111111, 0.2222222222222222, 0.5555555555555556, 0.4444444444444444, 0.1111111111111111, 0.1111111111111111, 0.0, 0.4444444444444444, 1.0, 0.0, 0.1111111111111111, 0.2222222222222222, 0.5555555555555556, 0.4444444444444444, 0.1111111111111111, 0.1111111111111111, 0.0, 0.4444444444444444, 1.0, 0.0, 0.1111111111111111, 0.2222222222222222, 0.5555555555555556, 0.4444444444444444, 0.1111111111111111, 0.1111111111111111, 0.0, 0.4444444444444444, 1.0] [0.0, 1.0, 2.0, 5.0, 4.0, 1.0, 1.0, 0.0, 4.0, 9.0, 0.0, 1.0, 2.0, 5.0, 4.0, 1.0, 1.0, 0.0, 4.0, 9.0, 0.0, 1.0, 2.0, 5.0, 4.0, 1.0, 1.0, 0.0, 4.0, 9.0, 0.0, 1.0, 2.0, 5.0, 4.0, 1.0, 1.0, 0.0, 4.0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] [2.2, 3.2] Data Double [0.0, 0.1111111111111111, 0.2222222222222222, 0.5555555555555556, 0.4444444444444444, 0.1111111111111111, 0.1111111111111111, 0.0, 0.4444444444444444, 1.0, 0.0, 0.1111111111111111, 0.2222222222222222, 0.5555555555555556, 0.4444444444444444, 0.1111111111111111, 0.1111111111111111, 0.0, 0.4444444444444444, 1.0, 0.0, 0.1111111111111111, 0.2222222222222222, 0.5555555555555556, 0.4444444444444444, 0.1111111111111111, 0.1111111111111111, 0.0, 0.4444444444444444, 1.0, 0.0, 0.1111111111111111, 0.2222222222222222, 0.5555555555555556, 0.4444444444444444, 0.1111111111111111, 0.1111111111111111, 0.0, 0.4444444444444444, 1.0] [0.0, 1.0, 2.0, 5.0, 4.0] [2.2, 3.2] ```