GroupBy Year然后采用Pairwise差异除了头部值然后Flatten使用Deedle和F#

时间:2015-05-25 12:04:12

标签: f# f#-data deedle

我有以下变量:

data:seq<(DateTime*float)>

我想做以下F#代码但使用Deedle:

data
|> Seq.groupBy (fun (k,v) -> k.Year) 
|> Seq.map (fun (k,v) -> 
    let vals = v |> Seq.pairwise 
    let first  = seq { yield v |> Seq.head }
    let diffs = vals |> Seq.map (fun ((t0,v0),(t1,v1)) -> (t1, v1 - v0))
    (k, diffs |> Seq.append first))
|> Seq.collect snd

使用F#序列可以正常工作,但我想使用Deedle系列。我知道我可以这样做:

(data:Series<DateTime*float>) |> Series.groupBy (fun k v -> k.Year)... 

但是接下来我需要取组内年份差异,除了头值,它应该只是值本身,然后将结果展平为系列......我对deedle语法有点困惑

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为以下可能正在做你需要的事情:

ts 
|> Series.groupInto 
    (fun k _ -> k.Month)
    (fun m s -> 
      let first = series [ fst s.KeyRange => s.[fst s.KeyRange]]
      Series.merge first (Series.diff 1 s))
|> Series.values
|> Series.mergeAll
  • groupInto函数允许您指定应在每个组上调用的函数
  • 对于每个组,我们使用Series.diff创建包含差异的系列,并使用Series.merge在开头添加第一个值的系列。
  • 最后,我们得到了所有嵌套系列&amp;使用Series.mergeAll展平它们。