Come calcolare percentile in Java senza usare Library

4

Sto tentando di calcolare 95th Percentile dai set di dati che ho inserito nel mio sotto ConcurrentHashMap .

Sono interessato a scoprire quante chiamate sono arrivate nel 95 ° percentile di tempo

La mia mappa sarà simile a questa e sarà sempre ordinata in ordine crescente sui tasti- in cui

key - means number of milliseconds
value - means number of calls that took that much milliseconds


Milliseconds    Number

0               1702
1               15036
2               14262
3               13190
4               9137
5               5635
6               3742
7               2628
8               1899
9               1298
10              963
11              727
12              503
13              415
14              311
15              235
16              204
17              140
18              109
19              83
20              72

Ad esempio, dai set di dati sopra, significa

1702 calls came back in 0 milliseconds

15036 calls came back in 1 milliseconds

Ora posso calcolare il 95 ° percentile collegando i set di dati sopra indicati in Excel sheet . Ma stavo pensando di calcolare il percentile nel codice Java.

So che l'algoritmo sarà simile a questo -

Sommare tutti i valori dalla mappa, calcolare il 95% della somma, scorrere le chiavi della mappa in ordine crescente mantenendo un totale parziale di valori e quando la somma equivale o supera il 95% precedentemente calcolato della somma totale, la chiave deve essere il 95 ° percentile credo.

Ma non sono in grado di collegare questo algoritmo nel codice Java. Di seguito è riportata la mappa che avrà sopra i set di dati.

Map<Long, Long> histogram = new ConcurrentHashMap<Long, Long>

Non sono sicuro di quale sia il modo migliore per calcolare il percentile in Java. Non sono sicuro che l'algoritmo sia corretto o meno. Sto solo cercando di scoprire quante chiamate sono arrivate nel 95 ° percentile di tempo.

private static void calculatePercentile() {

    for (Long time : CassandraTimer.histogram.keySet()) {


    }

}

Qualcuno può fornire qualche esempio su come farlo?

Qualsiasi aiuto sarà apprezzato.

Codice aggiornato: -

Di seguito è riportato il codice che ho ottenuto finora. Fammi sapere se ho ottenuto tutto corretto nel calcolo del 95 ° percentile -

/**
 * 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) {
           //this is the 95th percentile I guess
            System.out.println(key);
        }
    }

}
    
posta user21973 22.04.2013 - 02:00
fonte

1 risposta

3

Non sono sicuro di cosa stai provando a realizzare qui, ma è facile ottenere un percentile. Supponiamo di avere 100 numeri. Si ordinano e si estrae il 95 ° (se si desidera il 95 ° percentile). Se non si dispone di un numero multiplo di 100 numeri, potrebbe essere necessario eseguire alcune interpolazioni. Presumo tu sappia come farlo.

EDIT: OK, hai già i numeri in ordine. Per prima cosa prendi il totale della colonna chiamata "Numero". Chiama quel Tot. Quindi elencare attraverso di loro, mantenendo una somma parziale della colonna e chiamare quella RS. Quando RS passa 0,95 * Tot, lo hai trovato. Come ho già detto, potresti voler eseguire alcune interpolazioni in modo da ottenere un numero frazionario di millisecondi.

La tua domanda ha l'idea giusta. Non è un grosso problema.

for (i=0, sum=0; i<n; i++) sum += Number[i];
tot = sum;
for (i=0, sum=0; i<n && sum < 0.95*tot; i++) sum += Number[i];
// i is about it
    
risposta data 22.04.2013 - 02:44
fonte

Leggi altre domande sui tag