in core/src/main/scala/com/spotify/featran/transformers/NHotWeightedEncoder.scala [81:117]
override def prepare(a: Seq[WeightedLabel]): Set[String] =
Set(a.map(_.name): _*)
override def buildFeatures(
a: Option[Seq[WeightedLabel]],
c: SortedMap[String, Int],
fb: FeatureBuilder[_]
): Unit = a match {
case Some(xs) =>
val weights = MMap.empty[String, Double].withDefaultValue(0.0)
xs.foreach(x => weights(x.name) += x.value)
var unseenWeight = 0.0
val keys = weights.keySet.toList.sorted
var prev = -1
val unseen = MSet[String]()
keys.foreach { key =>
c.get(key) match {
case Some(curr) =>
val gap = curr - prev - 1
if (gap > 0) fb.skip(gap)
fb.add(name + '_' + key, weights(key))
prev = curr
case None =>
unseen += key
unseenWeight += weights(key)
}
}
val gap = c.size - prev - 1
if (gap > 0) fb.skip(gap)
if (encodeMissingValue) {
addMissingValue(fb, unseen, keys, unseenWeight)
}
if (unseen.nonEmpty) {
fb.reject(this, FeatureRejection.Unseen(unseen.toSet))
}
case None => addMissingItem(c, fb)
}