“如何执行”;排名;(如SAS或SQL中的“密集等级”)在Deedle中

“如何执行”;排名;(如SAS或SQL中的“密集等级”)在Deedle中,sas,deedle,dense-rank,Sas,Deedle,Dense Rank,Sas有一个称为的过程,它根据变量的有序集合中的位置为数据帧中的每一行分配一个“秩”,类似于;但排名不仅仅是位置:我们必须告诉程序有多少组在排名中使用。排名实际上是该行所属的组 在SQL术语中,这称为 示例(出于一般性考虑,包含工资变量,但本示例中未使用): 假设我们有这个数据框: 如果我们使用4组按年龄进行排名,sas会给出以下信息: 如果我们按照我们排名的变量对数据进行排序,则更容易理解发生了什么: 现在我们可以明白为什么秩给了我们在有序集合中的位置,有点 排名过程非常有用和酷,但我在

Sas有一个称为的过程,它根据变量的有序集合中的位置为数据帧中的每一行分配一个“秩”,类似于;但排名不仅仅是位置:我们必须告诉程序有多少组在排名中使用。排名实际上是该行所属的组

在SQL术语中,这称为

示例(出于一般性考虑,包含工资变量,但本示例中未使用):

假设我们有这个数据框:

如果我们使用4组按年龄进行排名,sas会给出以下信息:

如果我们按照我们排名的变量对数据进行排序,则更容易理解发生了什么:

现在我们可以明白为什么秩给了我们在有序集合中的位置,有点

排名过程非常有用和酷,但我在Deedle的文档中找不到如何执行它。有没有直接的方法在Deedle中实现,或者我需要创建自己的扩展

我想我可以用这些函数来实现:

SortRows(frame, key)
chunk size series

我写了我自己的扩展:

type Frame<'TRowKey, 'TColumnKey
        when 'TRowKey : equality
        and 'TColumnKey : equality> with
    static member denseRank column (groups:int) rankName frame =
        let frameLength = Frame.countRows frame |> float
        let chunkSize =  frameLength / (float groups) |> Math.Ceiling |> int64

        let sorted =
            frame
            |> Frame.sortRows column

        let ranks =
            Frame.getCol column frame
            |> Series.map(fun k _ ->
                int ((Frame.indexForKey k sorted) / chunkSize)
            )

        let clone = frame.Clone()
        clone.AddColumn(rankName, ranks)
        clone
    // index for row with key
    // index starting at 0
    static member indexForKey (key:'K) (frame:Frame<'K,_>) : int64 =
        frame.RowIndex.Locate key
        |> frame.RowIndex.AddressOperations.OffsetOf
使用
静态成员denseRank列(组:int)rankName框架=
设frameLength=Frame.countRows Frame |>float
让chunkSize=frameLength/(浮点组)|>Math.天花板|>int64
分类=
框架
|>Frame.sortRows列
让队伍=
Frame.getCol列框架
|>系列地图(趣味k->
int((Frame.indexworkey k排序)/chunkSize)
)
让clone=frame.clone()
clone.AddColumn(rankName,ranks)
克隆
其中IndexWorkey是另一个自定义扩展:

type Frame<'TRowKey, 'TColumnKey
        when 'TRowKey : equality
        and 'TColumnKey : equality> with
    static member denseRank column (groups:int) rankName frame =
        let frameLength = Frame.countRows frame |> float
        let chunkSize =  frameLength / (float groups) |> Math.Ceiling |> int64

        let sorted =
            frame
            |> Frame.sortRows column

        let ranks =
            Frame.getCol column frame
            |> Series.map(fun k _ ->
                int ((Frame.indexForKey k sorted) / chunkSize)
            )

        let clone = frame.Clone()
        clone.AddColumn(rankName, ranks)
        clone
    // index for row with key
    // index starting at 0
    static member indexForKey (key:'K) (frame:Frame<'K,_>) : int64 =
        frame.RowIndex.Locate key
        |> frame.RowIndex.AddressOperations.OffsetOf
//带键行的索引
//从0开始的索引

静态成员索引workey(key:'K)(frame:frame我编写了自己的扩展:

type Frame<'TRowKey, 'TColumnKey
        when 'TRowKey : equality
        and 'TColumnKey : equality> with
    static member denseRank column (groups:int) rankName frame =
        let frameLength = Frame.countRows frame |> float
        let chunkSize =  frameLength / (float groups) |> Math.Ceiling |> int64

        let sorted =
            frame
            |> Frame.sortRows column

        let ranks =
            Frame.getCol column frame
            |> Series.map(fun k _ ->
                int ((Frame.indexForKey k sorted) / chunkSize)
            )

        let clone = frame.Clone()
        clone.AddColumn(rankName, ranks)
        clone
    // index for row with key
    // index starting at 0
    static member indexForKey (key:'K) (frame:Frame<'K,_>) : int64 =
        frame.RowIndex.Locate key
        |> frame.RowIndex.AddressOperations.OffsetOf
使用
静态成员denseRank列(组:int)rankName框架=
设frameLength=Frame.countRows Frame |>float
让chunkSize=frameLength/(浮点组)|>Math.天花板|>int64
分类=
框架
|>Frame.sortRows列
让队伍=
Frame.getCol列框架
|>系列地图(趣味k->
int((Frame.indexworkey k排序)/chunkSize)
)
让clone=frame.clone()
clone.AddColumn(rankName,ranks)
克隆
其中IndexWorkey是另一个自定义扩展:

type Frame<'TRowKey, 'TColumnKey
        when 'TRowKey : equality
        and 'TColumnKey : equality> with
    static member denseRank column (groups:int) rankName frame =
        let frameLength = Frame.countRows frame |> float
        let chunkSize =  frameLength / (float groups) |> Math.Ceiling |> int64

        let sorted =
            frame
            |> Frame.sortRows column

        let ranks =
            Frame.getCol column frame
            |> Series.map(fun k _ ->
                int ((Frame.indexForKey k sorted) / chunkSize)
            )

        let clone = frame.Clone()
        clone.AddColumn(rankName, ranks)
        clone
    // index for row with key
    // index starting at 0
    static member indexForKey (key:'K) (frame:Frame<'K,_>) : int64 =
        frame.RowIndex.Locate key
        |> frame.RowIndex.AddressOperations.OffsetOf
//带键行的索引
//从0开始的索引

静态成员indexworkey(key:'K)(frame:FrameDeedle没有内置的
rank
函数-我认为您使用排序和分块的想法是模拟它的最好方法。@TomasPetricek我写了自己的扩展(请参阅我自己对这篇文章的回答).我尝试使用chunk函数,但结果表明,只有序列按键排序时才能使用chunk,但我需要它在按列的值排序时对其进行分块…因此我做了不同的操作。Deedle没有内置的
rank
函数-我认为使用排序和分块是模拟它的最佳方法。@TomasPetricek我编写了自己的扩展(参见我自己对这篇文章的回答)。我尝试使用chunk函数,但结果表明,只有当序列按键排序时,才能使用chunk,但当按列的值排序时,我需要它来对其进行分块…所以我的做法不同。