Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 在动态条件和边界条件下进行移动窗口统计计算_F#_Window_Deedle - Fatal编程技术网

F# 在动态条件和边界条件下进行移动窗口统计计算

F# 在动态条件和边界条件下进行移动窗口统计计算,f#,window,deedle,F#,Window,Deedle,我使用一个动态移动窗口来计算在日期键上排序的序列的简单统计数据。我希望能够在窗口的末尾设置边界。例如,具有月移动平均值的时间序列,月移动平均值由 (fun d1 d2 -> d1.addMonths(1) <= d2) 始终使用“开始”作为边界。因此,它总是从第一个数据实例为下一个n个数据点创建并生成一个n个数据点系列(n由上面的公式决定)。我想从第n个数据中得到一个n个数据点系列,并回顾过去 我还尝试先使用Series.Rev来反转序列,但deedle认为序列虽然以相反的顺序排列

我使用一个动态移动窗口来计算在日期键上排序的序列的简单统计数据。我希望能够在窗口的末尾设置边界。例如,具有月移动平均值的时间序列,月移动平均值由

(fun d1 d2 -> d1.addMonths(1) <= d2)
始终使用“开始”作为边界。因此,它总是从第一个数据实例为下一个n个数据点创建并生成一个n个数据点系列(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

编辑:我已登录。

谢谢。这个解决方案非常有效。我想我对deedle的了解和如何使用函数式方法解决实际问题一样多。顺便说一下,我在xamarin studio中测试了这个解决方案。deedle在Mac上的工作原理与预期一样!!
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