class Rover::Group

Public Class Methods

new(df, columns) click to toggle source
# File lib/rover/group.rb, line 3
def initialize(df, columns)
  @df = df
  @columns = columns
end

Public Instance Methods

group(*columns) click to toggle source
# File lib/rover/group.rb, line 8
def group(*columns)
  Group.new(@df, @columns + columns.flatten)
end

Private Instance Methods

grouped_dfs() click to toggle source

TODO make more efficient

# File lib/rover/group.rb, line 28
def grouped_dfs
  # cache here so we can reuse for multiple calcuations if needed
  @grouped_dfs ||= begin
    raise ArgumentError, "No columns given" if @columns.empty?
    missing_keys = @columns - @df.keys
    raise ArgumentError, "Missing keys: #{missing_keys.join(", ")}" if missing_keys.any?

    groups = Hash.new { |hash, key| hash[key] = [] }
    i = 0
    @df.each_row do |row|
      groups[row.slice(*@columns)] << i
      i += 1
    end

    result = {}
    groups.keys.each do |k|
      result[k] = @df[groups[k]]
    end
    result
  end
end