数据框 - 转换为矩阵时的订单一致性

时间:2013-12-11 11:01:54

标签: matrix f# deedle

我有Deedle Frame<DateTime,string>。 这些列包含float个值且密集(没有缺失值)。

我需要从string []构建数据框,然后:

  • 使用整个数据构建2D 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:我将所有这三个场景保持在一起,因为我相信上面的三个例子可以更好地帮助其他用户和我自己理解图书馆的工作方式而不是单独讨论每个案例。

1 个答案:

答案 0 :(得分:2)

要回答第一部分,订单会更改,因为您正在连接有序框架(仅包含一个系列),并且框架结构在此情况下保留了排序。您可以仅使用Frame.ofColumns替换最后两行而不是使用显式连接(这将始终执行外连接,但如果您需要内连接,则可以使用Frame.dropSparseRows删除缺少的值)

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

frame.GetSeries<float>(colname).Values

第三个样本看起来也不错,你可以把它缩短一点:

row.As<float>().Values