我目前正在构建一个小型电子商务网站,对于主页,我想根据受欢迎程度对产品进行排名。产品架构具有以下数据:
{
...
noViews: Number, // Number of times a user has clicked on the product
avgRating: Number, // Average star rating (1 - 5)
datePosted: Date // Date the product was posted
}
Run Code Online (Sandbox Code Playgroud)
我可以使用什么(相对)简单的算法/代码来实现这一点(使用 Node.js),其中产品将根据受欢迎程度进行排名(考虑到时间,因此内容不会过时)。
谢谢。
我听说过一类数据结构,称为简洁等级数据结构。这些数据结构有什么作用呢?这里的“简洁”是什么意思?它们是如何工作的?
假设一个矩阵:
> a <- matrix(c(100, 90, 80, 20), 2, 2)
> a
[,1] [,2]
[1,] 100 80
[2,] 90 20
Run Code Online (Sandbox Code Playgroud)
假设我想将矩阵的元素转换为rank:
>rank.a <- rank(a)
> rank.a
[1] 4 3 2 1
Run Code Online (Sandbox Code Playgroud)
这返回一个向量,即矩阵结构丢失.是否可以对矩阵进行排序,使输出具有以下形式:
[,1] [,2]
[1,] 4 2
[2,] 3 1
Run Code Online (Sandbox Code Playgroud) 轮盘赌选择与遗传算法中基于排名的选择有何不同.
我很困惑哪一个对我来说最好.这就是为什么只想知道差异.
我想计算一个向量中每个索引的等级,例如:
x <- c(0.82324952352792, 0.11953364405781, 0.588659686036408, 0.41683742380701,
0.11452184105292, 0.438547774450853, 0.586471405345947, 0.943002870306373,
0.28184655145742, 0.722095313714817)
calcRank <- function(x){
sorted <- x[order(x)]
ranks <- sapply(x, function(x) which(sorted==x))
return(ranks)
}
calcRank(x)
> calcRank(x)
[1] 9 2 7 4 1 5 6 10 3 8
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我一直在寻找在python中的graphviz中指定图中节点位置的方法。我在点中找到了一个子图的等级命令,这就是我想要的,但是我找不到在python中的graphviz中组合子图和等级的方法。我也尝试强行设置节点位置,但也没有用。我创建了一个想要实现的简单示例。
这是我的代码:
from graphviz import Digraph
top_nodes = ['a', 'b', 'c']
other_nodes = ['d', 'e', 'f', 'g', 'm', 'n']
g = Digraph('test', format='png')
for n in top_nodes:
g.node(str(n), color='red')
for n in other_nodes:
g.node(str(n))
g.edge('a', 'd')
g.edge('d', 'g')
g.edge('g', 'm')
g.edge('m', 'n')
g.edge('b', 'e')
g.edge('b', 'f')
g.edge('e', 'n')
g.edge('c', 'f')
g.view()
Run Code Online (Sandbox Code Playgroud)
这是输出:

我希望红色节点(“源”)位于同一级别的图形顶部,其他节点的位置并不重要,只要保留层次结构即可。
我试图获得一个独特的排名值(例如{1, 2, 3, 4}来自我的数据中的一个子组ties{1, 1, 3, 4}.SUMPRODUCT 将产生,我试图将COUNTIFS添加到最后以调整重复排名.
subgroup
col B col M rank
LMN 01 1
XYZ 02
XYZ 02
ABC 03
ABC 01
XYZ 01
LMN 02 3
ABC 01
LMN 03 4
LMN 03 4 'should be 5
ABC 02
XYZ 02
LMN 01 1 'should be 2
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经想出了这个.
=SUMPRODUCT(($B$2:$B$38705=B2)*(M2>$M$2:$M$38705))+countifs(B2:B38705=B2,M2:M38705=M2)
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
我有一个示例数据集,我正在尝试根据"HP"列中的值进行排名:
import pandas as pd
d = {
'unit': ['UD', 'UD', 'UD' ,'UC','UC', 'UC','UA','UA','UA','UB','UB','UB'],
'N-D': [ 'C1', 'C2', 'C3','Q1', 'Q2', 'Q3','D1','D2','D3','E1','E2','E3'],
'HP': [24, 24, 24,7,7,7,7,7,7,5,5,5]
}
df = pd.DataFrame(d)
df['rank']=df['HP'].rank(ascending=False, method='dense')
df
Run Code Online (Sandbox Code Playgroud)
看起来像:
HP N-D unit rank
0 24 C1 UD 1.0
1 24 C2 UD 1.0
2 24 C3 UD 1.0
3 7 Q1 UC 2.0
4 7 Q2 UC 2.0
5 7 Q3 UC 2.0
6 7 D1 UA 2.0
7 7 D2 UA 2.0
8 7 D3 …Run Code Online (Sandbox Code Playgroud) 这是我的数据框:
my_df = pd.DataFrame({'group':['a','a', 'a','b','b'], 'date':['2017-01-02', '2017-01-02','2017-03-01', '2018-02-05', '2018-04-06']})
my_df['date']= pd.to_datetime(my_df['date'], format = '%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)
我想为每个组添加等级,其中将为相同的值分配相同的等级。
这是我想要的输出:
date group rank
0 2017-01-02 a 1
1 2017-01-02 a 1
2 2017-03-01 a 2
3 2018-02-05 b 1
4 2018-04-06 b 2
Run Code Online (Sandbox Code Playgroud)
我想我可以通过分组两次并进行排名和重新加入原始数据框来做到这一点,但是我想知道是否有更快的方法来做到这一点。