Sha256: 12b398c8a3075fd9706c8248366201c9033be4ee3111bd752d4dab1e05fe7d1a

Contents?: true

Size: 1.78 KB

Versions: 1

Compression:

Stored size: 1.78 KB

Contents

# frozen_string_literal: true

module RedAmber
  # mix-in for the class DataFrame
  module DataFrameSelectable
    # select columns: [symbol] or [string]
    # select rows: [array of index], [range]
    def [](*args)
      raise DataFrameArgumentError, 'Empty dataframe' if empty?
      raise DataFrameArgumentError, 'Empty argument' if args.empty?

      if args.one?
        case args[0]
        when Vector
          return select_obs_by_boolean(Arrow::BooleanArray.new(args[0].data))
        when Arrow::BooleanArray
          return select_obs_by_boolean(args[0])
        when Array
          return select_obs_by_boolean(Arrow::BooleanArray.new(args[0]))

          # when Hash
          # specify conditions to select by a Hash
        end
      end

      return select_obs_by_boolean(args) if booleans?(args)

      # expand Range like [1..3, 4] to [1, 2, 3, 4]
      expanded = expand_range(args)
      return select_obs_by_indeces(expanded) if integers?(expanded)
      return select_vars_by_keys(expanded.map(&:to_sym)) if sym_or_str?(expanded)

      raise DataFrameArgumentError, "Invalid argument #{args}"
    end

    def head(n_rows = 5)
      raise DataFrameArgumentError, "Index is out of range #{n_rows}" if n_rows.negative?

      self[0...[n_rows, size].min]
    end

    def tail(n_rows = 5)
      raise DataFrameArgumentError, "Index is out of range #{n_rows}" if n_rows.negative?

      self[-[n_rows, size].min..]
    end

    def first(n_rows = 1)
      head(n_rows)
    end

    def last(n_rows = 1)
      tail(n_rows)
    end

    private

    def select_vars_by_keys(keys)
      if keys.one?
        t = @table[*keys]
        raise DataFrameArgumentError, "Key does not exist #{keys}" unless t

        Vector.new(t.data)
      else
        DataFrame.new(@table[keys])
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
red_amber-0.1.4 lib/red_amber/data_frame_selectable.rb