如果您查看文档中的聚合函数列表,您会发现一个函数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 问题。