我正在尝试获取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
但是无论组合如何,我似乎都无法使它工作。
提前谢谢
答案 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.max
和Stats.min
的问题在于,当系列为空时,它们返回的选项为None
-这使它无法直接传递给applyLevel
(我承认这有点不方便)
但是,您可以将自定义函数传递给applyLevel
,这也允许您同时执行min
和max
:
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
中缺少一些值时才会发生)。