Class: Daru::CategoricalIndex
- Defined in:
- lib/daru/index/categorical_index.rb
Instance Attribute Summary
Attributes inherited from Index
Instance Method Summary collapse
-
#==(other) ⇒ true, false
Compares two index object.
-
#add(*indexes) ⇒ Daru::CategoricalIndex
Add specified index values to the index object.
-
#at(*positions) ⇒ object
Takes positional values and returns subset of the self capturing the categories at mentioned positions.
-
#categories ⇒ Object
Returns array of categories.
-
#dup ⇒ Daru::CategoricalIndex
Duplicates the index object and return it.
-
#each ⇒ Enumerator
Returns enumerator enumerating all index values in the order they occur.
-
#empty? ⇒ true, false
Returns true if index object is storing no category.
-
#include?(index) ⇒ true, false
Returns true index or category is valid.
-
#index_from_pos(pos) ⇒ object
Returns index value from position.
-
#initialize(indexes) ⇒ Daru::CategoricalIndex
constructor
Create a categorical index object.
-
#pos(*indexes) ⇒ Object
Returns positions given categories or positions.
-
#size ⇒ Integer
Returns size of the index object.
-
#subset(*indexes) ⇒ Daru::CategoricalIndex
Return subset given categories or positions.
-
#to_a ⇒ Array
Returns all the index values.
-
#to_h ⇒ Hash
Returns hash table mapping category to positions at which they occur.
Methods inherited from Index
#&, #[], __new__, #_dump, _load, coerce, #conform, inherited, #inspect, #is_values, #key, new, #reorder, #slice, #sort, #subset_slice, #valid?, #|
Constructor Details
#initialize(indexes) ⇒ Daru::CategoricalIndex
Create a categorical index object.
9 10 11 12 13 14 15 16 17 18 19 20 |
# File 'lib/daru/index/categorical_index.rb', line 9 def initialize indexes # Create a hash to map each category to positional indexes categories = indexes.each_with_index.group_by(&:first) @cat_hash = categories.map { |cat, group| [cat, group.map(&:last)] }.to_h # Map each category to a unique integer for effective storage in @array map_cat_int = categories.keys.each_with_index.to_h # To link every instance to its category, # it stores integer for every instance representing its category @array = map_cat_int.values_at(*indexes) end |
Instance Method Details
#==(other) ⇒ true, false
Compares two index object. Returns true if every instance of category occur at the same position
101 102 103 104 105 |
# File 'lib/daru/index/categorical_index.rb', line 101 def == other self.class == other.class && size == other.size && to_h == other.to_h end |
#add(*indexes) ⇒ Daru::CategoricalIndex
Add specified index values to the index object
187 188 189 |
# File 'lib/daru/index/categorical_index.rb', line 187 def add *indexes Daru::CategoricalIndex.new(to_a + indexes) end |
#at(*positions) ⇒ object
Takes positional values and returns subset of the self
capturing the categories at mentioned positions
170 171 172 173 174 175 176 177 178 |
# File 'lib/daru/index/categorical_index.rb', line 170 def at *positions positions = preprocess_positions(*positions) validate_positions(*positions) if positions.is_a? Integer index_from_pos(positions) else Daru::CategoricalIndex.new positions.map(&method(:index_from_pos)) end end |
#categories ⇒ Object
Returns array of categories
41 42 43 |
# File 'lib/daru/index/categorical_index.rb', line 41 def categories @cat_hash.keys end |
#dup ⇒ Daru::CategoricalIndex
Duplicates the index object and return it
24 25 26 27 |
# File 'lib/daru/index/categorical_index.rb', line 24 def dup # Improve it by intializing index by hash Daru::CategoricalIndex.new to_a end |
#each ⇒ Enumerator
Returns enumerator enumerating all index values in the order they occur
86 87 88 89 90 |
# File 'lib/daru/index/categorical_index.rb', line 86 def each return enum_for(:each) unless block_given? @array.each { |pos| yield cat_from_int pos } self end |
#empty? ⇒ true, false
Returns true if index object is storing no category
143 144 145 |
# File 'lib/daru/index/categorical_index.rb', line 143 def empty? @array.empty? end |
#include?(index) ⇒ true, false
Returns true index or category is valid
32 33 34 |
# File 'lib/daru/index/categorical_index.rb', line 32 def include? index @cat_hash.include? index end |
#index_from_pos(pos) ⇒ object
Returns index value from position
76 77 78 |
# File 'lib/daru/index/categorical_index.rb', line 76 def index_from_pos pos cat_from_int @array[pos] end |
#pos(*indexes) ⇒ Object
If the argument does not a valid category it treats it as position value and return it as it is.
Returns positions given categories or positions
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/daru/index/categorical_index.rb', line 53 def pos *indexes positions = indexes.map do |index| if include? index @cat_hash[index] elsif index.is_a?(Numeric) && index < @array.size index else raise IndexError, "#{index.inspect} is neither a valid category"\ ' nor a valid position' end end positions.flatten! positions.size == 1 ? positions.first : positions.sort end |
#size ⇒ Integer
Returns size of the index object
132 133 134 |
# File 'lib/daru/index/categorical_index.rb', line 132 def size @array.size end |
#subset(*indexes) ⇒ Daru::CategoricalIndex
Return subset given categories or positions
155 156 157 158 159 160 |
# File 'lib/daru/index/categorical_index.rb', line 155 def subset *indexes positions = pos(*indexes) new_index = positions.map { |pos| index_from_pos pos } Daru::CategoricalIndex.new new_index.flatten end |
#to_a ⇒ Array
Returns all the index values
112 113 114 |
# File 'lib/daru/index/categorical_index.rb', line 112 def to_a each.to_a end |
#to_h ⇒ Hash
Returns hash table mapping category to positions at which they occur
122 123 124 |
# File 'lib/daru/index/categorical_index.rb', line 122 def to_h @cat_hash end |