red_amber 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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