私はディードル 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 つのシナリオすべてをまとめました。