diff --git a/core/src/main/scala/com/salesforce/op/stages/impl/feature/DateMapToUnitCircleVectorizer.scala b/core/src/main/scala/com/salesforce/op/stages/impl/feature/DateMapToUnitCircleVectorizer.scala index 8c7a0e5358..09b9f8ca60 100644 --- a/core/src/main/scala/com/salesforce/op/stages/impl/feature/DateMapToUnitCircleVectorizer.scala +++ b/core/src/main/scala/com/salesforce/op/stages/impl/feature/DateMapToUnitCircleVectorizer.scala @@ -125,7 +125,7 @@ final class DateMapToUnitCircleVectorizerModel[T <: DateMap] private[op] val cleanedMap = cleanMap(map, shouldClean, shouldCleanValue = false) keys.map(k => { val vOpt = cleanedMap.get(k) - DateToUnitCircle.convertToRandians(vOpt, timePeriod) + DateToUnitCircle.convertToRadians(vOpt, timePeriod) }) }.toArray Vectors.dense(eachPivoted.flatten).compressed.toOPVector diff --git a/core/src/main/scala/com/salesforce/op/stages/impl/feature/DateToUnitCircleTransformer.scala b/core/src/main/scala/com/salesforce/op/stages/impl/feature/DateToUnitCircleTransformer.scala index 00c34e7f18..f42ccd34d2 100644 --- a/core/src/main/scala/com/salesforce/op/stages/impl/feature/DateToUnitCircleTransformer.scala +++ b/core/src/main/scala/com/salesforce/op/stages/impl/feature/DateToUnitCircleTransformer.scala @@ -83,8 +83,8 @@ class DateToUnitCircleTransformer[T <: Date] ) with DateToUnitCircleParams { override def transformFn: Seq[T] => OPVector = timestamp => { - val randians = timestamp.flatMap(ts => DateToUnitCircle.convertToRandians(ts.v, getTimePeriod)).toArray - Vectors.dense(randians).toOPVector + val radians = timestamp.flatMap(ts => DateToUnitCircle.convertToRadians(ts.v, getTimePeriod)).toArray + Vectors.dense(radians).toOPVector } override def onGetMetadata(): Unit = { @@ -101,17 +101,20 @@ class DateToUnitCircleTransformer[T <: Date] private[op] object DateToUnitCircle { + val defaultRadians: Array[Double] = Array(1.0, 0.0) + def metadataValues(timePeriod: TimePeriod): Seq[String] = Seq(s"x_$timePeriod", s"y_$timePeriod") def convertToBin(timestamp: Long, timePeriodDesired: TimePeriod): Double = getPeriodWithSize(timestamp, timePeriodDesired)._1 - def convertToRandians(timestamp: Option[Long], timePeriodDesired: TimePeriod): Array[Double] = + def convertToRadians(timestamp: Option[Long], timePeriodDesired: TimePeriod, + nullRadians: Array[Double] = defaultRadians): Array[Double] = timestamp.map { ts => val (timePeriod, periodSize) = getPeriodWithSize(ts, timePeriodDesired) val radians = (2 * math.Pi * timePeriod) / periodSize Array(math.cos(radians), math.sin(radians)) - }.getOrElse(Array(0.0, 0.0)) + }.getOrElse(nullRadians) private def getPeriodWithSize(timestamp: Long, timePeriod: TimePeriod): (Double, Int) = { val tpv = timePeriod.extractTimePeriodVal(timestamp) diff --git a/core/src/test/scala/com/salesforce/op/stages/impl/feature/DateMapToUnitCircleVectorizerTest.scala b/core/src/test/scala/com/salesforce/op/stages/impl/feature/DateMapToUnitCircleVectorizerTest.scala index e56a1d0970..1098e452d2 100644 --- a/core/src/test/scala/com/salesforce/op/stages/impl/feature/DateMapToUnitCircleVectorizerTest.scala +++ b/core/src/test/scala/com/salesforce/op/stages/impl/feature/DateMapToUnitCircleVectorizerTest.scala @@ -69,7 +69,7 @@ class DateMapToUnitCircleVectorizerTest extends OpEstimatorSpec[OPVector, Sequen */ override val expectedResult: Seq[OPVector] = sampleDateTimes .map{ v => - val rad = DateToUnitCircle.convertToRandians(Option(v.getMillis), TimePeriod.HourOfDay) + val rad = DateToUnitCircle.convertToRadians(Option(v.getMillis), TimePeriod.HourOfDay) (rad ++ rad).toOPVector } diff --git a/core/src/test/scala/com/salesforce/op/stages/impl/feature/DateToUnitCircleTransformerTest.scala b/core/src/test/scala/com/salesforce/op/stages/impl/feature/DateToUnitCircleTransformerTest.scala index ec21ef4706..b3d182a1a5 100644 --- a/core/src/test/scala/com/salesforce/op/stages/impl/feature/DateToUnitCircleTransformerTest.scala +++ b/core/src/test/scala/com/salesforce/op/stages/impl/feature/DateToUnitCircleTransformerTest.scala @@ -125,7 +125,7 @@ class DateToUnitCircleTransformerTest extends OpTransformerSpec[OPVector, DateTo val vector = vectorizer.getOutput() val actual = transformed.collect(vector) val expected = Array( - Array(0.0, 0.0), + Array(1.0, 0.0), Array(1.0, 0.0) ).map(Vectors.dense(_).toOPVector) all(actual.zip(expected).map(g => Vectors.sqdist(g._1.value, g._2.value))) should be < eps