我有一个Deedle 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))
数据框到二维矩阵
为了构建矩阵,我使用下面的代码。列名数组 ( 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
数据帧到行矩阵的时间序列
我使用下面的代码构建行矩阵的时间序列。
- 将数据保存在 Series 中应确保保留行的顺序。
- 如何过滤列并确保列顺序与传递给函数的列名数组中的顺序完全相同?
这是代码:
// 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:我将所有三个场景放在一起,因为我相信上面的三个示例会更好地帮助其他用户和我自己理解库的工作原理,而不是单独讨论每个案例。