将鞍座系列连接成一个框架

时间:2013-11-29 20:35:32

标签: scala saddle

我正在使用Scala Saddle FramesSeries

可以将Saddle Series转换为Frames,并且可以使用concat方法连接Saddle Frames:

val frame3 = frame1.concat(frame2)

因为我是Scala的新手,所以我一直试图转换

Map[String, Series[String, Double] 

Frame[String, String, Double] 

其中Frame列索引是Map键,列是Map值。

有人可以提出解决方案吗?

2 个答案:

答案 0 :(得分:1)

你可能已经解决了这个问题。如果没有,这是一个似乎适合的解决方案:

object TheApp extends App {

  import org.saddle.{Frame, Index, Series, Vec}

  val inMap = Map(
    "s1" -> Series(Vec(1.0, 2.0, 3.0, 4.0), Index("a", "b", "b", "c")),
    "s2" -> Series(Vec(2.0, 3.0, 4.0, 5.0), Index("A", "B", "B", "C")),
    "s3" -> Series(Vec(3.0, 4.0, 5.0, 6.8), Index("t", "C", "v", "v"))
  )

  val frame = inMap.foldLeft(Frame.empty[String,String,Double]) { (prevFrame, mapElement) =>
    val (key, series) = mapElement
    val f = Frame(key -> series)
    prevFrame.concat(f)
  }

  println(s"Saddle Test map=$inMap frame=$frame")
}

这里发生的是foldLeft将每个地图元素与先前计算的结果一起并调用提供的函数来计算下一个值。

感谢您让我了解Saddle,我觉得它非常有用!

答案 1 :(得分:1)

为了将来参考,当索引在它们中很常见时,这是一种并排连接向量的简单方法:

import org.saddle.{Frame, Index, Series, Vec}

val ix = Index("2015-03-19", "2015-03-20", "2015-03-21", "2015-03-22", "2015-03-23")
val s1 = Series( Vec(1.0,        2.0,        3.0, 4.0, 5.0), ix)
val s2 = Series( Vec(Double.NaN, 1.0,        2.0, 3.0, 4.0), ix)
val s3 = Series( Vec(Double.NaN, Double.NaN, 1.0, 2.0, 3.0), ix)

val map = Map( "RSI" -> s1, "ADX" -> s2, "SAR" -> s3)

val frame =
  map
  .foldLeft(Frame.empty[String,String,Double]) {
    case (prevFrame, mapElement) =>
      val (key, series) = mapElement
      val f = Frame(key -> series)
      prevFrame.rconcat(f) }

输出结果为:

[5 x 3]
                 RSI    ADX    SAR 
              ------ ------ ------ 
2015-03-19 -> 1.0000     NA     NA 
2015-03-20 -> 2.0000 1.0000     NA 
2015-03-21 -> 3.0000 2.0000 1.0000 
2015-03-22 -> 4.0000 3.0000 2.0000 
2015-03-23 -> 5.0000 4.0000 3.0000 

请注意,正在使用 rconcat