0

最後の行の値に基づいて Deedle データ フレームの列を並べ替える必要があります。したがって、最初の列には最大値があり、最後の列には最後の行の最小値があります。Deedle's Frame は、その機能のほとんどを行に持っています。

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 の最後の行は次のようになり、2 番目の列の値が大きくなります。
2016/05/14 0:00:00 -> 0.143158562780897 0.918480403450541

しかし、私はこの順序でそれをしたいと思います:
2016/05/14 0:00:00 -> 0.918480403450541 0.143158562780897

回答を投稿しましたが、Deedle にまだ慣れていないため、他のアプローチがあるかどうかを確認したいと思います。

4

1 に答える 1

0

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

したがって、データ フレームを転置し、最後の行 (この場合は列) のインデックスを取得し、列を最大から最小に並べ替え、最後に転置します。これは、チャートの凡例がチャートの系列と整列するため、チャート作成に便利です。

于 2016-05-14T10:38:07.580 に答える