2013-12-09 23 views
5

Ho cercato un modo per calcolare il grado percentile per ogni valore in un elenco dato e fino ad ora non ho avuto esito positivo.Calcolo del punteggio percentuale per ogni valore nell'elenco

org.apache.commons.math3 fornisce un modo per recuperare il p% di percentile da un elenco di valori ma quello che voglio è il contrario. Voglio avere una classifica per ogni valore nella lista. Qualcuno è a conoscenza di una biblioteca o di un modo in cui Apache utilizza la matematica per riuscirci?

Per esempio: data una lista di valori {1,2,3,4,5}, avrei voluto avere il rango percentile per ogni valore con i percentile massima è 99 o 100 e il minimo pari a 0 o 1.

codice aggiornato:

public class TestPercentile { 

public static void main(String args[]) { 
    double x[] = { 10, 11, 12, 12, 12, 12, 15, 18, 19, 20 }; 
    calculatePercentiles(x); 
} 

public static void calculatePercentiles(double[] arr) { 
    for (int i = 0; i < arr.length; i++) { 
     int count = 0; 
     int start = i; 
     if (i > 0) { 
      while (i > 0 && arr[i] == arr[i - 1]) { 
       count++; 
       i++; 
      } 
     } 
     double perc = ((start - 0) + (0.5 * count)); 
     perc = perc/(arr.length - 1); 
     for (int k = 0; k < count + 1; k++) 
      System.out.println("Percentile for value " + (start + k + 1) 
        + " = " + perc * 100); 
    } 
}} 

Sample Output: 
Percentile for value 1 = 0.0 
Percentile for value 2 = 11.11111111111111 
Percentile for value 3 = 22.22222222222222 
Percentile for value 4 = 50.0 
Percentile for value 5 = 50.0 
Percentile for value 6 = 50.0 
Percentile for value 7 = 50.0 
Percentile for value 8 = 77.77777777777779 
Percentile for value 9 = 88.88888888888889 
Percentile for value 10 = 100.0 

Qualcuno può farmi sapere se questo è corretto e se c'è una libreria per farlo in modo più pulito?

Grazie!

+1

Cosa ne pensi di mostrare ciò che hai provato –

+0

Ho fatto gli aggiornamenti! – LizardKing

risposta

5

Dipende davvero dalla tua definizione di percentile. Di seguito è riportata una soluzione che utilizza NaturalRanking e riscalalizza l'intervallo 0-1. È bello che NaturalRanking abbia alcune strategie per gestire valori uguali e nans già implementati.

import java.util.Arrays; 
import org.apache.commons.math3.stat.ranking.NaNStrategy; 
import org.apache.commons.math3.stat.ranking.NaturalRanking; 
import org.apache.commons.math3.stat.ranking.TiesStrategy; 

public class Main { 

    public static void main(String[] args) { 
     double[] arr = {Double.NaN, 10, 11, 12, 12, 12, 12, 15, 18, 19, 20}; 

     PercentilesScaledRanking ranking = new PercentilesScaledRanking(NaNStrategy.REMOVED, TiesStrategy.MAXIMUM); 
     double[] ranks = ranking.rank(arr); 

     System.out.println(Arrays.toString(ranks)); 
     //prints: 
     //[0.1, 0.2, 0.6, 0.6, 0.6, 0.6, 0.7, 0.8, 0.9, 1.0] 
    } 
} 

class PercentilesScaledRanking extends NaturalRanking { 

    public PercentilesScaledRanking(NaNStrategy nanStrategy, TiesStrategy tiesStrategy) { 
     super(nanStrategy, tiesStrategy); 
    } 

    @Override 
    public double[] rank(double[] data) { 
     double[] rank = super.rank(data); 
     for (int i = 0; i < rank.length; i++) { 
      rank[i] = rank[i]/rank.length; 
     } 
     return rank; 
    } 
}