Matrix 数据帧-转换为矩阵时的顺序一致性

Matrix 数据帧-转换为矩阵时的顺序一致性,matrix,f#,deedle,Matrix,F#,Deedle,我有一个框架。 列包含float值,且密集(无缺失值) 我需要从字符串[]构建数据帧,然后: 用整个数据构建一个2D矩阵 构建一个系列系列,在1xn矩阵中折叠行 在我的例子中,我正在用fcoreby进行实验,但将来我可能会使用另一个线性代数库 我关心的是,我需要确保在这个过程中,行和列的顺序不会改变 数据帧构造 我使用以下方法获取数据。 我注意到,列的顺序不同于初始的ticker列表。 为什么呢?使用Array.Parallel.Map会改变顺序吗 /// get the selected

我有一个
框架
。 列包含
float
值,且密集(无缺失值)

我需要从
字符串[]
构建数据帧,然后:

  • 用整个数据构建一个2D
    矩阵
  • 构建一个系列
    系列
    ,在
    1xn
    矩阵中折叠行
在我的例子中,我正在用fcoreby进行实验,但将来我可能会使用另一个线性代数库

我关心的是,我需要确保在这个过程中,行和列的顺序不会改变

数据帧构造

我使用以下方法获取数据。 我注意到,列的顺序不同于初始的ticker列表。 为什么呢?使用
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
// 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) )
///构建一个矩阵
让buildMatrix选择Cols(帧:帧)=
设矩阵=
精选可乐
|>Array.map(fun colname->frame.GetSeries(colname))
|>Array.map(趣味系列->Series.values系列)
|>Array.map(fun aSeq->Seq.map unbox aSeq)
|>Array.map(趣味aSeq->矩阵(aSeq))
|>Array.reduce(趣味acc矩阵->acc.|矩阵)
矩阵.T
行矩阵时间序列的数据帧

我用下面的代码构建行矩阵的时间序列

  • 将数据保留在序列中应确保行的顺序 它被保存了下来
  • 如何筛选列并确保列顺序与传递给函数的列名数组中的列顺序完全相同
代码如下:

/// 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) )
//行矩阵的时间序列-将用于运行模拟
让timeSeriesOfMatrix帧=
框架
|>Frame.filterRows(有趣的一天目标->一天>=startKalman)
|>Frame.mapRowValues(有趣的行->行.Values |>Seq.map unbox)
|>Series.mapValues(趣味行->矩阵(行))
非常感谢


PS:我将这三个场景放在一起,因为我相信上面的三个示例将更好地帮助其他用户和我自己理解库的工作原理,而不是单独讨论每个案例。

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

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

frame.GetSeries<float>(colname).Values
frame.GetSeries(colname).Values
第三个示例看起来也不错,您可以将其缩短一点:

row.As<float>().Values 
row.As().值

我认为
dataframe
会自动按字母顺序将列放在一起。有没有一种方法可以保持我在输入到函数的向量中定义的顺序?非常感谢您对此进行研究。如果您使用
frame.ofColumns
创建一个框架,那么(我相信)它将不会对它们进行重新排序。