Module: Panomosity::Utils

Instance Method Summary collapse

Instance Method Details

#calculate_average(name: 'value', values: [], logger: nil, ignore_empty: false) ⇒ Object



17
18
19
20
21
22
# File 'lib/panomosity/utils.rb', line 17

def calculate_average(name: 'value', values: [], logger: nil, ignore_empty: false)
  return 0 if ignore_empty && values.empty?
  average_value = values.reduce(:+).to_f / values.count
  logger.debug "average #{name}: #{average_value}" if logger
  average_value
end

#calculate_average_and_std(name: 'value', values: [], logger: nil, ignore_empty: false) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
# File 'lib/panomosity/utils.rb', line 3

def calculate_average_and_std(name: 'value', values: [], logger: nil, ignore_empty: false)
  return [0, 0] if ignore_empty && values.empty?
  average_value = calculate_average(name: name, values: values, logger: logger, ignore_empty: ignore_empty)

  if values.count == 1
    value_std = 0.0
  else
    value_std = Math.sqrt(values.map { |v| (v - average_value) ** 2 }.reduce(:+) / (values.count - 1))
  end
  logger.debug "#{name} std: #{value_std}" if logger

  [average_value, value_std]
end

#remove_outliers(method: :value, values: [], logger: nil) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/panomosity/utils.rb', line 24

def remove_outliers(method: :value, values: [], logger: nil)
  avg, std = *calculate_average_and_std(values: values.map(&method))
  while std >= 0.1
    values.select! { |c| (avg - c.send(method)).abs <= std }
    avg, std = *calculate_average_and_std(values: values.map(&method))
    logger.debug [avg , std, values.count].to_s if logger
  end
  values
end