red_amber 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,52 @@
6
6
  module RedAmber
7
7
  # mix-ins for class Vector
8
8
  # Functions to make up some data (especially missing) for new data.
9
- module VectorCompensable
9
+ module VectorUpdatable
10
+ # Replace data
11
+ # @param arg [Array, Vector, Arrow::Array] index specifier
12
+ # @param replacer [Array, Vector, Arrow::Array] new data to replace for.
13
+ # @return [Vector] Replaced new Vector
14
+ def replace(args, replacer)
15
+ args = args.is_a?(Array) ? args : Array(args)
16
+ replacer = Array(replacer)
17
+ return self if args.empty? || args[0].nil?
18
+
19
+ replacer = nil if replacer.empty?
20
+ vector = parse_to_vector(args)
21
+ booleans =
22
+ if vector.boolean?
23
+ vector
24
+ elsif vector.numeric?
25
+ Vector.new(indices).is_in(vector)
26
+ else
27
+ raise VectorArgumentError, "Invalid data type #{args}"
28
+ end
29
+ replace_with(booleans, replacer)
30
+ end
31
+
32
+ # (related functions)
33
+ # fill_null_backward, fill_null_forward
34
+
35
+ # [Ternary element-wise]: boolean_vector.func(if_true, else) => vector
36
+ def if_else(true_choice, false_choice)
37
+ true_choice = true_choice.data if true_choice.is_a? Vector
38
+ false_choice = false_choice.data if false_choice.is_a? Vector
39
+ raise VectorTypeError, 'Reciever must be a boolean' unless boolean?
40
+
41
+ datum = find(:if_else).execute([data, true_choice, false_choice])
42
+ Vector.new(datum.value)
43
+ end
44
+
45
+ # same behavior as Ruby's invert
46
+ # ![true, false, nil] #=> [false, true, true]
47
+ def primitive_invert
48
+ raise VectorTypeError, "Not a boolean Vector: #{self}" unless boolean?
49
+
50
+ is_nil.if_else(false, self).invert
51
+ end
52
+
53
+ private
54
+
10
55
  # [Ternary]: replace_with(booleans, replacements) => vector
11
56
  # Replace items selected with a boolean mask
12
57
  #
@@ -18,7 +63,7 @@ module RedAmber
18
63
  # or with null if the mask is null.
19
64
  # Hence, for replacement arrays, len(replacements) == sum(mask == true).
20
65
 
21
- def replace_with(booleans, replacements = nil)
66
+ def replace_with(booleans, replacer = nil)
22
67
  specifier =
23
68
  if booleans.is_a?(Arrow::BooleanArray)
24
69
  booleans
@@ -32,14 +77,14 @@ module RedAmber
32
77
  raise VectorArgumentError, 'Booleans size unmatch' if specifier.length != size
33
78
  raise VectorArgumentError, 'Booleans not have any `true`' unless specifier.any?
34
79
 
35
- r = Array(replacements) # scalar to [scalar]
80
+ r = Array(replacer) # scalar to [scalar]
36
81
  r = [nil] if r.empty?
37
82
 
38
83
  replacer =
39
84
  if r.size == 1
40
- case replacements
41
- when Arrow::Array then replacements
42
- when Vector then replacements.data
85
+ case replacer
86
+ when Arrow::Array then replacer
87
+ when Vector then replacer.data
43
88
  else
44
89
  Arrow::Array.new(r * specifier.to_a.count(true)) # broadcast
45
90
  end
@@ -53,16 +98,7 @@ module RedAmber
53
98
  values = replacer.class.new(data)
54
99
 
55
100
  datum = find('replace_with_mask').execute([values, specifier, replacer])
56
- take_out_element_wise(datum)
57
- end
58
-
59
- # (related functions)
60
- # fill_null_backward, fill_null_forward
61
-
62
- private
63
-
64
- def booleans?(enum)
65
- enum.all? { |e| e.is_a?(TrueClass) || e.is_a?(FalseClass) || e.is_a?(NilClass) }
101
+ Vector.new(datum.value)
66
102
  end
67
103
  end
68
104
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RedAmber
4
- VERSION = '0.1.5'
4
+ VERSION = '0.1.6'
5
5
  end
data/lib/red_amber.rb CHANGED
@@ -1,26 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'arrow'
4
- require 'rover-df'
5
-
6
- require_relative 'red_amber/data_frame_displayable'
7
- require_relative 'red_amber/data_frame_helper'
8
- require_relative 'red_amber/data_frame_indexable'
9
- require_relative 'red_amber/data_frame_selectable'
10
- require_relative 'red_amber/data_frame_observation_operation'
11
- require_relative 'red_amber/data_frame_variable_operation'
12
- require_relative 'red_amber/data_frame'
13
- require_relative 'red_amber/vector_compensable'
14
- require_relative 'red_amber/vector_functions'
15
- require_relative 'red_amber/vector'
16
- require_relative 'red_amber/version'
17
-
18
- module RedAmber
19
- class Error < StandardError; end
20
-
21
- class DataFrameArgumentError < ArgumentError; end
22
- class DataFrameTypeError < TypeError; end
23
-
24
- class VectorArgumentError < ArgumentError; end
25
- class VectorTypeError < TypeError; end
26
- end
3
+ require_relative 'red-amber'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: red_amber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hirokazu SUZUKI (heronshoes)
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-12 00:00:00.000000000 Z
11
+ date: 2022-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: red-arrow
@@ -90,17 +90,19 @@ files:
90
90
  - doc/image/vector/unary_element_wise.png
91
91
  - doc/tdr.md
92
92
  - doc/tdr_ja.md
93
+ - lib/red-amber.rb
93
94
  - lib/red_amber.rb
94
95
  - lib/red_amber/data_frame.rb
95
96
  - lib/red_amber/data_frame_displayable.rb
96
- - lib/red_amber/data_frame_helper.rb
97
97
  - lib/red_amber/data_frame_indexable.rb
98
98
  - lib/red_amber/data_frame_observation_operation.rb
99
99
  - lib/red_amber/data_frame_selectable.rb
100
100
  - lib/red_amber/data_frame_variable_operation.rb
101
+ - lib/red_amber/helper.rb
101
102
  - lib/red_amber/vector.rb
102
- - lib/red_amber/vector_compensable.rb
103
103
  - lib/red_amber/vector_functions.rb
104
+ - lib/red_amber/vector_selectable.rb
105
+ - lib/red_amber/vector_updatable.rb
104
106
  - lib/red_amber/version.rb
105
107
  - red_amber.gemspec
106
108
  - sig/red_amber.rbs
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RedAmber
4
- # mix-in for the class DataFrame
5
- module DataFrameHelper
6
- private
7
-
8
- def expand_range(args)
9
- ary = args.each_with_object([]) do |e, a|
10
- e.is_a?(Range) ? a.concat(normalized_array(e)) : a.append(e)
11
- end
12
- ary.map do |e|
13
- if e.is_a?(Integer) && e.negative?
14
- e + size
15
- else
16
- e
17
- end
18
- end
19
- end
20
-
21
- def normalized_array(range)
22
- both_end = [range.begin, range.end]
23
- both_end[1] -= 1 if range.exclude_end? && range.end.is_a?(Integer)
24
-
25
- if both_end.any?(Integer) || both_end.all?(&:nil?)
26
- if both_end.any? { |e| e&.>=(size) || e&.<(-size) }
27
- raise DataFrameArgumentError, "Index out of range: #{range} for 0..#{size - 1}"
28
- end
29
-
30
- (0...size).to_a[range]
31
- else
32
- range.to_a
33
- end
34
- end
35
-
36
- def out_of_range?(indeces)
37
- indeces.max >= size || indeces.min < -size
38
- end
39
-
40
- def integers?(enum)
41
- enum.all?(Integer)
42
- end
43
-
44
- def sym_or_str?(enum)
45
- enum.all? { |e| e.is_a?(Symbol) || e.is_a?(String) }
46
- end
47
-
48
- def booleans?(enum)
49
- enum.all? { |e| e.is_a?(TrueClass) || e.is_a?(FalseClass) || e.is_a?(NilClass) }
50
- end
51
-
52
- def create_dataframe_from_vector(key, vector)
53
- DataFrame.new(key => vector.data)
54
- end
55
-
56
- def select_obs_by_boolean(array)
57
- DataFrame.new(@table.filter(array))
58
- end
59
-
60
- def keys_by_booleans(booleans)
61
- keys.select.with_index { |_, i| booleans[i] }
62
- end
63
- end
64
- end