1

私はディードル Frame<DateTime,string>を持っています。列にはfloat値が含まれており、密度が高い (欠損値がない)。

からデータ フレームを作成する必要がありますstring []

  • Matrixデータ全体で 2D を構築する
  • Series を構築し、行列Series<DateTime,Matrix<float,CpuLib>>の行を折りたたむ1xn

私の場合、StatFactory によるFCoreで実験していますが、将来的には別の線形代数ライブラリを使用する可能性があります。

私の懸念は、プロセスで行と列の順序が変更されていないことを確認する必要があることです。

データフレームの構築

以下を使用してデータをフェッチします。列の順序がティッカーの最初のリストと異なることに気付きました。何故ですか?を使用するとArray.Parallel.Map順序が変わりますか?

/// get the selected tickers in a DataFrame from a DataContext  
let fetchTickers tickers joinKind =

    let getTicker ticker = 
        query {
            for row in db.PriceBarsDay do
            where (row.Ticker = ticker)
            select row } 
       |> Seq.map (fun row -> row.DateTime, float row.Close)
       |> dict

    tickers
    |> Array.map (fun ticker -> getTicker ticker)  // returns a dict(DateTime, ClosePrice)
    |> Array.map (fun dictionary -> Series(dictionary))
    |> Array.map2 (fun ticker series -> [ticker => series] |> frame ) tickers
    |> Array.reduce (fun accumFrame frame -> accumFrame.Join(frame, joinKind))

データ フレームから 2D マトリックスへ

マトリックスを構築するために、以下のコードを使用します。列名の配列 ( ) をマッピングすると、selectedCols列の順序がずれません。を使用して行の順序で単体テストを実行しましたがArray.Map、すべて問題ないように見えますが、知りたいです

  • ライブラリに一貫性チェックがあれば、問題が発生しない可能性がありますか?
  • Array.Parallel.map列の順序が保持されると思います。

コードは次のとおりです。

/// Build a matrix 
let buildMatrix selectedCols (frame: Frame<DateTime, String>) = 
    let matrix = 
        selectedCols 
        |> Array.map (fun colname -> frame.GetSeries(colname))
        |> Array.map (fun serie -> Series.values serie)
        |> Array.map (fun aSeq -> Seq.map unbox<float> aSeq)
        |> Array.map (fun aSeq -> Matrix(aSeq) )
        |> Array.reduce (fun acc matrix -> acc .| matrix)
    matrix.T

データ フレームから行行列の時系列へ

以下のコードを使用して、行行列の時系列を作成します。

  • シリーズにデータを保持すると、行の順序が確実に保持されます。
  • 列をフィルタリングして、列の順序が関数に渡された列名の配列とまったく同じであることを確認するにはどうすればよいですか?

コードは次のとおりです。

// Time series of row matrices - it'll be used to run a simulation
let timeSeriesOfMatrix frame = 
    frame
    |> Frame.filterRows (fun day target -> day >= startKalman)   
    |> Frame.mapRowValues ( fun row -> row.Values |> Seq.map unbox<float> )
    |> Series.mapValues( fun row -> Matrix(row) )

どうもありがとう。

PS: 上記の 3 つの例は、個々のケースを個別に説明するよりも、他のユーザーや私自身がライブラリの仕組みを理解するのに役立つと信じているため、3 つのシナリオすべてをまとめました。

4

1 に答える 1