【问题标题】:Sorting Deedle Frame by columns based on the value of the last row根据最后一行的值按列对 Deedle Frame 进行排序
【发布时间】:2016-09-10 13:41:36
【问题描述】:

我需要根据最后一行的值对 Deedle 数据框的列进行排序。因此,第一列将具有最大值,最后一列将具有最后一行中的最小值。 Deedle 的框架在行上具有大部分功能。

这是一些生成示例数据的代码,其中 Item2 的值最终会大于 Item1:

#load @"..\..\FSLAB\packages\FsLab\FsLab.fsx"
open System
open System.Drawing
open System.Windows.Forms
open Deedle
open FSharp.Charting
open FSharp.Charting.ChartTypes

let rnd = new System.Random()
let dateRange = [for i in 9..-1..0 ->  DateTime.Today.AddDays(float -i)]
let makeData x = [for i in 0..x-2 -> rnd.NextDouble()-0.5] |> List.scan (+) 0.
let series = makeData 10 |> List.zip <| (makeData 10 |> List.map (fun x -> x + 1.))
let df = series |> Frame.ofRecords
df?DateIndex <- dateRange |> Series.ofValues 
let df = df.IndexRows<DateTime>("DateIndex")

在这种情况下,Frame 的最后一行将如下所示,第二列中的值较大:
2016/05/14 0:00:00 -&gt; 0.143158562780897 0.918480403450541

但我想按这个顺序:
2016/05/14 0:00:00 -&gt; 0.918480403450541 0.143158562780897

我发布了一个答案,但想看看是否还有其他方法,因为我对 Deedle 还不太熟悉。

【问题讨论】:

    标签: f# deedle fslab


    【解决方案1】:

    Frame.sortRowsWith 需要一个排序函数:

    let reverser (a:float) (b:float) =
        if a > b then
            -1
        else if  a < b then
            1
        else
            0
    
    let df1 = df |> Frame.transpose
    let coldIdx = df1.ColumnKeys |> Seq.max
    Frame.sortRowsWith coldIdx reverser df1 |> Frame.transpose
    

    所以它转置数据帧,然后获取最后一行(在本例中为列)的索引,并将列从最大到最小排序,最后将其转回。这对于制图很方便,因为这样图表图例将与图表中的系列对齐。

    【讨论】:

    • @FoggyFinder 感谢这个建议:let reverser (a:'T) (b:'T when 'T:&gt;System.IComparable) = b.CompareTo(a)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多