Сортировка кадра по столбцам по значению последней строки

Мне нужно отсортировать столбцы фрейма данных Deedle на основе значения последней строки. Таким образом, первый столбец будет иметь наибольшее значение, а последний столбец будет иметь наименьшее значение в последней строке. Рамка Deedle's имеет большую часть своей функциональности в строках.

Вот некоторый код для генерации примеров данных, где 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 -> 0.143158562780897 0.918480403450541

Но я хотел бы иметь это в следующем порядке:
2016/05/14 0:00:00 -> 0.918480403450541 0.143158562780897

Я опубликовал ответ, но хотел бы посмотреть, есть ли другие подходы, так как я еще не слишком знаком с Deedle.

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

Таким образом, он транспонирует фрейм данных, затем получает индекс последней строки (в данном случае столбец) и сортирует столбцы от наибольшего к наименьшему, в итоге транспонируя его обратно. Это удобно для построения графиков, потому что таким образом легенды на графике будут совпадать с сериями на графике.

Другие вопросы по тегам