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

时间:2018-07-31 06:05:07

标签: dataframe f# deedle

我正在尝试获取deedle数据帧中组内第一个和最后一个值之间的差异。我一直试图获取每个点的最大值和最小值。我有一个数据框,按“ TimeStamp”排序,按“ Test”分组,并带有一个名为float的“ 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

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

提前谢谢

1 个答案:

答案 0 :(得分:0)

要对此进行测试,我将您的示例数据以以下格式保存在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的问题在于,当系列为空时,它们返回的选项为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为您提供一个数据帧),然后我们将所有行汇总为相同使用string的{​​{1}}键。自定义函数获取值序列的最小值和最大值并减去它(applyLevel fst的情况只有在nan中缺少一些值时才会发生)。