“如何执行”;排名;(如SAS或SQL中的“密集等级”)在Deedle中
Sas有一个称为的过程,它根据变量的有序集合中的位置为数据帧中的每一行分配一个“秩”,类似于;但排名不仅仅是位置:我们必须告诉程序有多少组在排名中使用。排名实际上是该行所属的组 在SQL术语中,这称为 示例(出于一般性考虑,包含工资变量,但本示例中未使用): 假设我们有这个数据框: 如果我们使用4组按年龄进行排名,sas会给出以下信息: 如果我们按照我们排名的变量对数据进行排序,则更容易理解发生了什么: 现在我们可以明白为什么秩给了我们在有序集合中的位置,有点 排名过程非常有用和酷,但我在Deedle的文档中找不到如何执行它。有没有直接的方法在Deedle中实现,或者我需要创建自己的扩展 我想我可以用这些函数来实现:“如何执行”;排名;(如SAS或SQL中的“密集等级”)在Deedle中,sas,deedle,dense-rank,Sas,Deedle,Dense Rank,Sas有一个称为的过程,它根据变量的有序集合中的位置为数据帧中的每一行分配一个“秩”,类似于;但排名不仅仅是位置:我们必须告诉程序有多少组在排名中使用。排名实际上是该行所属的组 在SQL术语中,这称为 示例(出于一般性考虑,包含工资变量,但本示例中未使用): 假设我们有这个数据框: 如果我们使用4组按年龄进行排名,sas会给出以下信息: 如果我们按照我们排名的变量对数据进行排序,则更容易理解发生了什么: 现在我们可以明白为什么秩给了我们在有序集合中的位置,有点 排名过程非常有用和酷,但我在
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,但当按列的值排序时,我需要它来对其进行分块…所以我的做法不同。