2011-11-15 22 views
17

Voglio simulare la funzione PERCENTILE equivalente di Excel in C# (o in qualche pseudo codice). Come lo posso fare? La funzione dovrebbe prendere due argomenti in cui il primo è un elenco di valori e il secondo è per quale percentile deve essere calcolata la funzione.Calcolo percentuale

Serbatoi!

Modifica: Mi dispiace se la mia domanda si è presentata come se non avessi provato da solo. Non riuscivo a capire come funzionasse la funzione excel (sì, ho provato prima wikipedia e wolfram) e ho pensato che avrei capito meglio se qualcuno l'avesse presentato in codice. @CodeInChaos ha dato una risposta che sembra essere quello che sto cercando.

+0

potrebbe fare un esempio pseudocodice di uso della funzione, i dati di ingresso e di uscita risultato atteso? – sll

+5

[Cosa hai provato?] (Http://mattgemmell.com/2008/12/08/what-have-tried/) – Justin

risposta

26

penso Wikipedia page ha formule necessarie per scrivere la propria funzione ...
ho provato questo:

public double Percentile(double[] sequence, double excelPercentile) 
{ 
    Array.Sort(sequence); 
    int N = sequence.Length; 
    double n = (N - 1) * excelPercentile + 1; 
    // Another method: double n = (N + 1) * excelPercentile; 
    if (n == 1d) return sequence[0]; 
    else if (n == N) return sequence[N - 1]; 
    else 
    { 
     int k = (int)n; 
     double d = n - k; 
     return sequence[k - 1] + d * (sequence[k] - sequence[k - 1]); 
    } 
} 

modificato dopo CodeInChaos commento:
Excel utilizza un valore percentile compreso tra 0 e 1 (così ho cambiato il mio codice per implementarlo con le formule di Wikipedia) e l'altro metodo per calulare n (quindi ho modificato quello commentato).

+0

@picknick: ho appena scritto la funzione corrispondente dalla pagina di Wikipedia. Questo dovrebbe essere quello usato da Excel (secondo Wikipedia). – Marco

+0

Due problemi: 1) Excel sembra utilizzare il metodo (N-1) 2) Rappresenta il percentile di un numero compreso tra 0 e 1. – CodesInChaos

+0

@CodeInChaos: grazie per il tuo commento. Non so come funzioni Excel, ho appena tradotto le formule di Wikipedia in C#, assumendo che la parte relativa a Excel fosse corretta. Cosa ne pensi? Quelli sbagliano? Penso che OP abbia bisogno di "un modo" per calcolare il percentile, anche perché ci sono molti metodi. Ad ogni modo il tuo punto di vista è importante per me. Fammi sapere qualcosa. Grazie! :) – Marco

1

Aggiungere i valori a un elenco, ordinare l'elenco e prendere il valore di indice ceil (lunghezza dell'elenco * percentile).

+2

Che non corrisponde alla funzione Percentile di Excel. Sembra utilizzare l'interpolazione lineare tra i valori più vicini. – CodesInChaos

11

cercando di riprodurre i risultati a: http://www.techonthenet.com/excel/formulas/percentile.php mi si avvicinò con:

public static double Percentile(IEnumerable<double> seq,double percentile) 
{ 
    var elements=seq.ToArray(); 
    Array.Sort(elements); 
    double realIndex=percentile*(elements.Length-1); 
    int index=(int)realIndex; 
    double frac=realIndex-index; 
    if(index+1<elements.Length) 
     return elements[index]*(1-frac)+elements[index+1]*frac; 
    else 
     return elements[index]; 
} 

(Non gestire NaN e infiniti).

Alcuni casi di test:

Percentile(new double[]{1,2,3,4}, 0.8).Dump();// 3.4 
Percentile(new double[]{7,8,9,20}, 0.35).Dump();// 8.05 
Percentile(new double[]{1,2,3,4}, 0.3).Dump();// 1.9