我使用的命令之日起关键一系列动态的移动窗口计算简单的统计。 我希望能够在窗口的末端设置的边界。 例如每月移动平均时间序列一个,每月通过决定
(fun d1 d2 -> d1.addMonths(1) <= d2)
然而deedle系列功能
windowWhileInto cond f series
始终使用开始为界。 因此,它总是创建产生从所述第一数据实例的数据点系列的下一个n个数据点(n由乐趣上述决定)。 我想有从第n个数据的数据点系列和向后回顾过去。
我还试图用Series.Rev
第一扭转系列,但deedle认为系列虽然以相反的顺序不再订购。
就是我在寻找可能的?
如果你看一下列表聚合功能的文档 ,你会发现一个功能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