Мне нужно рассчитать ранги процентиля определенного значения против большого количества значений, отфильтрованных различными способами. Все данные хранятся на 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 запросов. Все вычисления должны завершиться менее чем за 3 секунды до того, как Parse прекратит работу, и я ограничусь 30 reqs/second, так что это очень быстро станет проблемой.
Есть ли у кого-нибудь какие-либо предложения о том, как еще я мог бы подойти к этому? Я подумал о том, чтобы каким-то образом предварительно обработать некоторые из них, но не могу понять, как это сделать, поскольку фильтры будут основываться на времени и местоположении (городе и стране), поэтому существует потенциально много предварительных вычислений которые должны выполняться через равные промежутки времени. Результаты не должны быть на 100% точными, но что-то близко.
Спасибо за ваш ввод @Cimblali. Это интересный подход, который был бы полезен в несколько ином сценарии. Это не совсем соответствует моим требованиям (мне нужны ценности, оцененные по всему миру, по стране/городу, за определенный промежуток времени, а также комбинация каждого из них - город на прошлой неделе, страна за последнюю неделю и т. Д.), Но может быть способный использовать подобный подход. Я думаю, что мой лучший выбор может состоять в том, чтобы перейти на базу данных на основе SQL. – JoGoFo
@JoGoFo Ну, слишком плохо. Надеемся, вы все равно можете кэшировать общие числа. Хотя эти запросы могут выполняться довольно быстро, если у вас есть индексы или что-то в этом роде, это все равно поможет вам с ограничением на общее количество запросов. – Cimbali