1

我有一个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:我将所有三个场景放在一起,因为我相信上面的三个示例会更好地帮助其他用户和我自己理解库的工作原理,而不是单独讨论每个案例。

4

1 回答 1

2

要回答第一部分,顺序会发生变化,因为您正在加入有序框架(仅包含一个系列),并且框架结构在这种情况下保留了顺序。您可能可以使用仅替换最后两行Frame.ofColumns而不是使用显式连接(这将始终进行外连接,但如果您需要内连接,则可以使用Frame.dropSparseRows删除缺失值)。

在您的第二个示例中,一切看起来都不错 - 您可以通过直接将数据作为浮点数来节省一些工作;

frame.GetSeries<float>(colname).Values

第三个示例看起来也不错,您可以将其缩短一点:

row.As<float>().Values 
于 2013-12-11T13:45:24.020 回答