计算百分位排名(解析)

Calculate percentile rank (Parse)

本文关键字:解析 百分 计算      更新时间:2023-09-26

我需要根据以各种不同方式过滤的大量值计算特定值的百分位排名。数据全部存储在 Parse.com 上,这限制了每个查询最多返回 1000 行。存储的值数可能远远超过 100,000。

通过"百分位排名",我的意思是我需要计算提供的值大于的值的百分比。我不是在尝试计算提供的百分位数的值。例如,给定一个值列表 {20, 23, 24, 29, 30, 31, 35, 40, 40, 43},则提供的值 35 的百分位排名为 70%。此算法只是值的秩/值计数 * 100。不确定"百分位排名"是否是正确的术语。

我考虑了几种不同的方法。第一种是下拉完整的值列表(进入 Parse Cloud),然后从那里计算百分位排名,然后过滤列表并再次计算,根据需要多次重复最后两个步骤。这种方法的问题在于,一旦我们达到 1000 个值,它就不起作用,我们可以很快预料到。

另一个选项,

也是我迄今为止能想到的最好的选项,是查询项目计数和所提供值的排名。例如:

var rank_world_alltime = new Parse.Query("Values")
    .lessThan("value", request.params.value)  // Filters query to values less than the provided value, so counting this query will return the rank
    .count();
var count_world_alltime = new Parse.Query("Values")
    .count();
Parse.Promise.when(rank_world_alltime, count_world_alltime).then(function(rank, count) {
    percentile = rank / count * 100;
    console.log("world_alltime_percentile = " + percentile);
});

这适用于单个计算,但我需要执行多个计算,这种方法很快就会变成很多查询。我预计每次调用需要运行大约 15 个计算,即 30 个查询。在 Parse 终止作业之前,所有计算都需要在 3 秒内完成,而我被限制为 30 个请求/秒,所以这很快就会成为一个问题。

有没有人对我还能解决这个问题有任何建议?我已经考虑过以某种方式预处理其中的一些,但无法完全弄清楚如何做到这一点,因为过滤器将基于时间和位置(城市和国家),因此可能需要定期运行大量预计算。结果不需要 100% 准确,但很接近。

我对解析了解不多,但据我所知,它是某种云数据库的东西,它保存了你的历史,并限制你每个查询 1000 行,每个作业 3 秒,每秒 30 个查询。

为了进行近似计算并将查询数除以 2,我首先会缓存总数(count_world_alltime、count_region、周等)。如果您可以将它们保存在本地的某个地方。对于 100K 的数字,只需获得数量级(因此不是最新更新的数字)应该足以获得百分位数。

也许您可以为每个查询获取多个计数。但是,我缺乏解析/nosql方面的专业知识使我无法确定这一点,您必须检查他们的文档。但是,如果可能的话,对于同一类别中一系列值都需要百分位数的情况,我会

  • 对值进行排序,我们称它们为 a,b,c,d,e(一旦排序)
  • 获取间隔 [0,a] [a,b] [b,c] [c,d] [d,e] 之间的值数
  • 使用缓存的总计获取百分位数(其中 Nxy 是 [x,y] 中的值数):
    • Pa = 100 * N0a/总计
    • 铅 = 100 * ( N0a + Nab )/总计
    • Pc = 100 * ( N0a + Nab + Nbc )/总计
    • 等等...

如果您需要一个全球排名的值,另一个按地区排名,一些每周其他所有时间排名的值,等等,这不适用。在这种情况下,我认为您无法通过缓存总数来获得低于 1 个查询/数字。