c# algorithm math percentile

c# - Calculo percentil



algorithm math (3)

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

Quiero imitar la función PERCENTILE equivalente de 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 para qué percentil debe calcular la función.

Tanques

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


Creo que la página de Wikipedia tiene fórmulas que necesitas para escribir tu propia función ...
Intenté esto:

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 del comentario de CodeInChaos:
Excel usa un valor de 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 comentado).


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 maneja NaN e infinitos).

Algunos 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