我正在使用动态移动窗口来计算日期键上订购的系列的简单统计数据。我希望能够在窗口的末尾设置边界。例如,具有月平均值的时间序列,每月由
决定(fun d1 d2 -> d1.addMonths(1) <= d2)
然而deedle系列函数
windowWhileInto cond f series
始终使用begin作为边界。因此,它总是从第一个数据实例为下一个n个数据点创建一个n数据点系列(n由上面的乐趣决定)。我希望从第n个数据中获得n个数据点系列,然后回顾过去。
我还试图首先使用Series.Rev
来反转该系列,但是deedle认为该系列虽然顺序相反,但不再有序。
我正在寻找的是什么?
答案 0 :(得分:3)
如果查看aggregation functions in the docs列表,您会找到一个函数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
编辑:我记录了a GitHub issue for this。