我有Deedle Frame<DateTime,string>
。
这些列包含float
个值且密集(没有缺失值)。
我需要从string []
构建数据框,然后:
Matrix
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:我将所有这三个场景保持在一起,因为我相信上面的三个例子可以更好地帮助其他用户和我自己理解图书馆的工作方式而不是单独讨论每个案例。答案 0 :(得分:2)
要回答第一部分,订单会更改,因为您正在连接有序框架(仅包含一个系列),并且框架结构在此情况下保留了排序。您可以仅使用Frame.ofColumns
替换最后两行而不是使用显式连接(这将始终执行外连接,但如果您需要内连接,则可以使用Frame.dropSparseRows
删除缺少的值)
在第二个示例中,一切看起来都很好 - 您可以通过直接将数据作为浮点数来节省一些工作;
frame.GetSeries<float>(colname).Values
第三个样本看起来也不错,你可以把它缩短一点:
row.As<float>().Values