Sha256: fb4a16b40181ec792df5f604a07a664f5f156cb96de4e68537b29dbfe58afc2a

Contents?: true

Size: 873 Bytes

Versions: 1

Compression:

Stored size: 873 Bytes

Contents

module NumberCrusher
  def Quantile(numbers = nil, quant:)
    function = Quantile.new(quant: quant)
    numbers ? function.call(numbers) : function
  end

  class Quantile
    using EnumeratorExtension

    def initialize(quant:)
      unless (0.0..1.0).include?(quant)
        fail %(Expect quant: between 0.0 and 1.0 (inclusive), got "#{quant}")
      end
      @quant = quant
    end

    def call(numbers)
      return nil if numbers.empty?
      sorted = numbers.sort
      return sorted.first if @quant == 0
      return sorted.last if @quant == 1

      quantile(sorted)
    end

    private

    def quantile(numbers)
      quantile_index = numbers.size * @quant
      index = quantile_index.ceil
      if quantile_index == quantile_index.to_int
        (numbers[index - 1] + numbers[index]) / 2.0
      else
        numbers[index - 1]
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
number_crusher-0.1.1 lib/number_crusher/quantile.rb