2011-11-15 26 views
17

Quiero imitar la función PERCENTIL equivalente a Excel en C# (o en algún pseudo código). ¿Cómo puedo hacer eso? La función debe tomar dos argumentos donde el primero es una lista de valores y el segundo es para qué percentil debe calcular la función.Cálculo del percentil

Tanques!

Edit: Lo siento si mi pregunta fue como si no la hubiera intentado. Simplemente no podía entender cómo funcionaba la función de Excel (sí, traté de wikipedia y wolfram primero) y pensé que lo entendería mejor si alguien lo presentara en código. @CodeInChaos dio una respuesta que parece ser lo que estoy buscando.

+0

Podría dar un ejemplo de pseudocódigo uso de la función, los datos de entrada y de salida resultado esperado? – sll

+5

[¿Qué has probado?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Justin

Respuesta

26

creo Wikipedia page tiene fórmulas que necesita para escribir su propia función ...
yo probamos este:

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]); 
    } 
} 

editado después CodeInChaos comentario:
Excel utiliza un valor percentil entre 0 y 1 (Así que cambié mi código para implementar esto con las fórmulas de Wikipedia) y el otro método para calcular n (así que cambié el comentario).

+0

@picknick: Acabo de escribir la función correspondiente de la página de Wikipedia. Este debería ser el utilizado (según Wikipedia) por Excel. – Marco

+0

Dos problemas: 1) Excel parece usar el método (N-1) 2) Representa el percentil por un número entre 0 y 1. – CodesInChaos

+0

@CodeInChaos: gracias por su comentario. No sé cómo funciona Excel, acabo de traducir las fórmulas de Wikipedia en C#, suponiendo que la parte relacionada con Excel era correcta. ¿Qué piensas? ¿Están equivocados? Creo que OP necesitaba _ "una forma" de calcular el percentil, incluso porque hay muchos métodos. De todos modos, tu punto de vista es importante para mí. Déjame saber algo. ¡Gracias! :) – Marco

1

Agregue los valores a una lista, ordene esa lista y tome el valor de índice ceil (longitud de la lista * percentil).

+2

Eso no coincide con la función Percentil de Excel. Parece usar interpolación lineal entre los valores más cercanos. – CodesInChaos

11

tratando de reproducir los resultados en: http://www.techonthenet.com/excel/formulas/percentile.php me ocurrió:

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]; 
} 

(no controla y NaN infinitos).

Unos pocos casos de prueba:

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