df_percentile_integer Function

public function df_percentile_integer(df, col_index, percentile) result(perc)

Calculate percentile of integer column

Arguments

Type IntentOptional Attributes Name
type(data_frame), intent(in) :: df
integer, intent(in) :: col_index
real(kind=rk), intent(in) :: percentile

Return Value real(kind=rk)


Source Code

    function df_percentile_integer(df, col_index, percentile) result(perc)
        type(data_frame), intent(in) :: df
        integer, intent(in) :: col_index
        real(rk), intent(in) :: percentile
        real(rk) :: perc

        integer(ik), dimension(:), allocatable :: col, sorted_col
        integer :: n, idx
        real(rk) :: pos
        type(column) :: data_col

        if (percentile < 0.0_rk .or. percentile > 100.0_rk) error stop "percentile must be between 0 and 100"

        if (col_index < 1 .or. col_index > df % ncols()) error stop "column index out of range"

        data_col = df % get_data_col(col_index)
        if (data_col % get_type() /= INTEGER_NUM) error stop "column is not integer type"

        col = data_col % geti()
        n = size(col)
        sorted_col = col

        call quick_sort_integer(sorted_col, 1, n)

        pos = (percentile / 100.0_rk) * real(n - 1, rk) + 1.0_rk
        idx = int(pos)

        if (idx >= n) then
            perc = real(sorted_col(n), rk)
        else if (idx < 1) then
            perc = real(sorted_col(1), rk)
        else
            ! Linear interpolation
            perc = real(sorted_col(idx), rk) + (pos - real(idx, rk)) * &
                   (real(sorted_col(idx + 1), rk) - real(sorted_col(idx), rk))
        end if
    end function df_percentile_integer