2011-11-15 22 views
17

Chcę naśladować równoważną funkcję PERCENTYLY programu Excel w C# (lub w jakimś pseudo-kodzie). Jak mogę to zrobić? Funkcja powinna przyjmować dwa argumenty, gdzie pierwszy jest listą wartości, a drugi jest dla tego, za jaki percentyl funkcja powinna obliczyć.Obliczanie percentyla

Czołgi!

Edytuj: Przepraszam, jeśli moje pytanie napotkało jakbym nie próbował tego sam. Po prostu nie mogłem zrozumieć, jak działa funkcja Excela (tak, najpierw próbowałem wikipedia i wolfram) i pomyślałem, że lepiej to zrozumiem, jeśli ktoś przedstawi to w kodzie. @CodeInChaos udzielił odpowiedzi, która wydaje się być tym, o co mi chodzi.

+0

można dają pseudokod Przykład użycia funkcji, dane wejściowe i wyjściowe oczekiwany wynik? – sll

+5

[Co próbowaliście?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Justin

Odpowiedz

26

myślę Wikipedia page ma formuł musisz napisać własną funkcję ...
Próbowałem to:

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

edytować po CodeInChaos komentarza:
Excel używa wartości percentyla pomiędzy 0 a 1 (zmieniłem kod, aby zaimplementować to za pomocą formuł Wikipedii) i drugą metodę do obliczenia n (zmieniłem skomentowaną).

+0

@picknick: Właśnie napisałem odpowiednią funkcję ze strony Wikipedii. To powinno być używane (zgodnie z Wikipedią) przez Excel. – Marco

+0

Dwa problemy: 1) Wydaje się, że Excel używa metody (N-1) 2) Przedstawia percentyl o wartości od 0 do 1. – CodesInChaos

+0

@CodeInChaos: dziękuję za komentarz. Nie wiem, jak działa program Excel, właśnie przetłumaczyłem formuły Wikipedii w języku C#, zakładając, że część związana z programem Excel była poprawna. Co myślisz? Czy to źle? Uważam, że OP potrzebował _ "drogi" _ do percentyla calc, nawet dlatego, że istnieje wiele metod. W każdym razie twój punkt widzenia ma dla mnie znaczenie. Daj mi coś wiedzieć. Dzięki! :) – Marco

1

Dodaj wartości do listy, posortuj listę i pobierz wartość indeksu ceil (długość listy * percentyl).

+2

To nie pasuje do funkcji Percentyl Excela. Wydaje się korzystać z interpolacji liniowej pomiędzy najbliższymi wartościami. – CodesInChaos

11

Próbując odtworzyć wyniki na: http://www.techonthenet.com/excel/formulas/percentile.php wymyśliłem:

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

(nie obsługuje NaN i nieskończoności).

Kilka przypadków testowych:

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