我想计算的是 95% percentile
我的数据集在Java中。我的数据集会有类似这样的内容-
我将有一个 ConcurrentHashMap
它的键值对是这样的
Key = 30
Value = 10
这意味着30毫秒内有10个电话打回来了。
另一个例子-
Key = 20
Value = 5
也就是说,在20毫秒内有5个电话打回来了。
所以从上面的地图,我想用Java计算95%的百分位数。
谁能提供任何例子,如何在Java中从我的上述地图做?谢谢你的帮助
更新代码:-
以下是我得到的代码,它可以计算出地图中的第95个百分位数。
/**
* A simple method to log 95th percentile information
*/
private static void logPercentileInfo() {
double total = 0;
for (Map.Entry<Long, Long> entry : CassandraTimer.histogram.entrySet()) {
long value = entry.getKey() * entry.getValue();
total += value;
}
double sum = 0.95*total;
double totalSum = 0;
SortedSet<Long> keys = new TreeSet<Long>(CassandraTimer.histogram.keySet());
for (long key : keys) {
totalSum += CassandraTimer.histogram.get(key);
if(totalSum >= sum) {
System.out.println(key);
}
}
}
谁能看一下,让我知道我写的是否正确?
算法是:将地图中的所有值相加,计算出总和的95%,按升序迭代地图中的键值,保持总值的运行,当总和等于或超过之前计算出的总和的95%时,键值应该是第95个百分位数。
你也可以看看Apache Commons的DescriptiveStatistics。