Deedle F# - 查找索引组中的最大行数

Deedle F# - Find the max rows within an index group

我正在尝试获取 deedle 数据框中组内第一个值和最后一个值之间的差异。我坚持尝试获取每个点的最大值和最小值。我有一个按 "TimeStamp" 排序的数据框,按 "Test" 分组,并且有一个名为 "Value" 的浮点类型的列。例如使用以下数据:

Test1,2018/01/01 => 3
Test1,2018/01/02 => 5
Test1,2018/01/03 => 15
Test1,2018/01/04 => 25
Test1,2018/01/05 => 35
Test2,2018/01/01 => 5
Test2,2018/01/02 => 15
Test2,2018/01/03 => 15
Test2,2018/01/04 => 25
Test2,2018/01/05 => 30

我期待

的结果
Test1 => 32    (35-3)
Test2 => 25    (30-5)

我想我可以使用类似

的东西
input |> applyLevel fst Stats.maxBy |> Frame.ofRows
input |> applyLevel fst Stats.minBy |> Frame.ofRows

但无论组合如何,我似乎都无法让它工作。

提前致谢

为了对此进行测试,我将您的样本数据保存在 CSV 文件中,格式如下:

Category, Timestamp, Value
Test1, 2018/01/01, 3
Test1, 2018/01/02, 5
Test1, 2018/01/03, 15
Test1, 2018/01/04, 25
Test1, 2018/01/05, 35
Test2, 2018/01/01, 5
Test2, 2018/01/02, 15
Test2, 2018/01/03, 15
Test2, 2018/01/04, 25
Test2, 2018/01/05, 30

现在,我认为使用 Stats.maxStats.min 的问题在于它们的 return 选项是 None 当系列为空时 - 这很遗憾不可能直接传给applyLevel(我承认这个设计有点不方便)

但是,您可以将自定义函数传递给 applyLevel,这也允许您同时执行 minmax

Frame.ReadCsv("sample.csv")
|> Frame.groupRowsByString "Category"
|> Frame.applyLevel fst (fun s -> 
    match Stats.min s, Stats.max s with
    | Some lo, Some hi -> hi - lo
    | _ -> nan)

这会读取 CSV 文件(这将引入一个新的序号键),然后按类别对数据进行分组(这会为您提供一个具有行键 string * int 的数据框),然后我们将所有行汇总为使用 applyLevel fst 的相同 string 键。自定义函数获取值系列的最小值和最大值并将其减去(nan 的情况只有在 s 中有一些缺失值时才会发生)。