2016-05-14 3 views
1

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

Вот код для генерации данных выборки, где Элемент2 будет в конечном итоге со значением больше, чем 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") 

В этом случае последний ряд кадр будет выглядеть следующим образом, имея большее из значений во второй колонке:
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 

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

+0

@FoggyFinder thx для этого предложения: 'let reverseer (a: 'T) (b:' T when 'T:> System.IComparable) = b.CompareTo (a)' – s952163

 Смежные вопросы

  • Нет связанных вопросов^_^