Deedle移动窗口统计测算与动态条件和boundary.atending(Deedle movin

2019-10-20 14:33发布

我使用的命令之日起关键一系列动态的移动窗口计算简单的统计。 我希望能够在窗口的末端设置的边界。 例如每月移动平均时间序列一个,每月通过决定

(fun d1 d2 -> d1.addMonths(1) <= d2)

然而deedle系列功能

windowWhileInto cond f series

始终使用开始为界。 因此,它总是创建产生从所述第一数据实例的数据点系列的下一个n个数据点(n由乐趣上述决定)。 我想有从第n个数据的数据点系列和向后回顾过去。

我还试图用Series.Rev第一扭转系列,但deedle认为系列虽然以相反的顺序不再订购。

就是我在寻找可能的?

Answer 1:

如果你看一下列表聚合功能的文档 ,你会发现一个功能aggregate是所有窗口化和分块功能的推广,也需要一个关键的选择。

这意味着你可以做这样的事情:

ts |> Series.aggregateInto
        (WindowWhile(fun d1 d2 -> d1.AddMonths(1) >= d2))  // Aggregation to perform
        (fun seg -> seg.Data.LastKey())                    // Key selector (use last)
        (fun ds -> OptionalValue(ds.Data))                 // Value selector

该函数采用3个参数包括密钥选择器,并且获取“数据段”(其与标志是否它是完整的或不完整的共同拥有的窗口 - 例如在窗结束时)的功能。

可悲的是,这并不完全在这里工作,因为它会造成重复键系列(以及那些不被Deedle支持)。 在块结束时的窗口将都具有相同的日期结束,所以你会得到重复键(实际上它运行,但你不能做很多同系列)。

一个丑陋的解决方法是记住最后一个块的结束并返回缺失值,一旦年底开始重复:

let lastKey = ref None
let r = 
  ts |> Series.aggregateInto
      (WindowWhile(fun d1 d2 -> d1.AddMonths(1) >= d2)) (fun seg -> seg.Data.LastKey())
      (fun ds -> 
         match lastKey.Value, ds.Data.LastKey() with 
         | Some lk, clk when lk = clk -> OptionalValue.Missing
         | _, clk -> lastKey := Some clk; OptionalValue(ds.Data))
     |> Series.dropMissing

编辑 :我登录一个GitHub的问题,为此 。



文章来源: Deedle moving window stats calcuation with a dynamic condition and boundary.atending
标签: f# window deedle