计算百分位排名(解析)
Calculate percentile rank (Parse)
我需要根据以各种不同方式过滤的大量值计算特定值的百分位排名。数据全部存储在 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 个查询/数字。
- Dojo不解析自定义小部件的模板html中的小部件声明性
- 使用JQuery解析JSON嵌套数组
- 可以简化嵌套的延迟Q Promises解析吗
- 我的模板未被解析
- 如何在Javascript中解析AJAX数组的特定部分
- 主干集合重置和解析
- 解析javascript表单验证器
- 可以't使用Angular解析/检索JSON
- 如何使用Node.js最有效地解析网页
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- 可以't使用Appcelerator将JSON文件解析为JavaScript中的TableView
- 解析JSON并从中删除对象会出错
- jquery创建的数据-*有时无法解析
- 延期承诺值未更新/解析/延期
- [Vue warn]:未能解析组件
- 在解析对象.save()中;没有返回任何原因
- 测试角度解析方法
- 对象未在Javascript中进行字符串化和解析
- AngularJS加载JSON数据,然后从中解析/加载HTML
- 计算百分位排名(解析)