计算百分位数(Parse)

时间:2014-11-27 03:13:06

标签: javascript math parse-platform nosql

我需要针对以各种不同方式过滤的大量值来计算特定值的百分等级。数据全部存储在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 reqs /秒,所以这很快就会成为一个问题。

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

1 个答案:

答案 0 :(得分:0)

我对解析知之甚少,但据我所知,你说的是某种云数据库,它可以保存你的核心,每个查询限制你1000行,每个作业3秒,每秒30次查询。

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

也许你可以为每个查询获得几个计数。然而,我在parse / nosql中缺乏专业知识使我无法确定这一点,你必须检查他们的文档。但是,如果有可能,对于您需要同一类别中一系列值的百分位数的情况,我会

  • 订购价值,让他们称之为a,b,c,d,e(一旦订购)
  • 获取间隔[0,a] [a,b] [b,c] [c,d] [d,e]
  • 之间的值数
  • 使用缓存的总数来获取百分位数(其中Nxy是[x,y]中的值的数量):
    • Pa = 100 * N0a / total
    • Pb = 100 *(N0a + Nab)/总计
    • Pc = 100 *(N0a + Nab + Nbc)/总
    • 等......

如果您需要在全球范围内排名的值,其他每个地区,每周都有其他人,等等,这并不适用。在这种情况下,我不认为你可以获得低于1个查询/数字,并缓存总数。