1

我有以下变量:

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 语法有点困惑

谢谢!

4

1 回答 1

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
  • 最后,我们得到所有嵌套的系列并使用Series.mergeAll.
于 2015-05-26T08:11:21.057 回答