red_amber 0.2.2 → 0.2.3

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.
@@ -4,41 +4,47 @@
4
4
  # reference: https://arrow.apache.org/docs/cpp/compute.html
5
5
 
6
6
  module RedAmber
7
- # mix-ins for class Vector
7
+ # mix-in for class Vector
8
8
  # Functions to make up some data (especially missing) for new data.
9
9
  module VectorUpdatable
10
10
  # Replace data
11
- # @param arg [Array, Vector, Arrow::Array] index specifier or boolean
12
- # @param replacer [Array, Vector, Arrow::Array] new data to replace for.
11
+ # @param specifier [Array, Vector, Arrow::Array] index or booleans.
12
+ # @param replacer [Scalar, Array, Vector, Arrow::Array] new data to replace for.
13
13
  # @return [Vector] Replaced new Vector.
14
- # If arg has no true, return self.
15
- def replace(args, replacer)
16
- args =
17
- case args
18
- when Array
19
- args
20
- when Range
21
- normalize_element(args)
22
- else
23
- Array(args)
24
- end
25
- replacer = Array(replacer)
26
- return self if args.empty? || args[0].nil?
14
+ # If specifier has no true, return self.
15
+ #
16
+ def replace(specifier, replacer)
17
+ vector = parse_to_vector(Array(specifier))
18
+ return self if vector.empty? || empty?
27
19
 
28
- vector = parse_to_vector(args)
29
- replacer = nil if replacer.empty?
30
20
  booleans =
31
21
  if vector.boolean?
32
- return self unless vector.any
33
-
34
22
  vector
35
23
  elsif vector.numeric?
36
- replacer.sort_by! { |x| args[replacer.index(x)] } if replacer # rubocop:disable Style/SafeNavigation
37
24
  Vector.new(indices).is_in(vector)
38
25
  else
39
- raise VectorArgumentError, "Invalid data type #{args}"
26
+ raise VectorArgumentError, "Invalid data type #{specifier}"
27
+ end
28
+ return self if booleans.sum.zero?
29
+
30
+ replacer_array =
31
+ case replacer
32
+ in []
33
+ return self
34
+ in nil | [nil]
35
+ return replace_to_nil(booleans.data)
36
+ in Arrow::Array
37
+ # nop
38
+ in Vector
39
+ replacer.data
40
+ in Array
41
+ Arrow::Array.new(replacer)
42
+ else # Broadcast scalar to Array
43
+ Arrow::Array.new(Array(replacer) * booleans.to_a.count(true))
40
44
  end
41
- replace_with(booleans, replacer)
45
+ raise VectorArgumentError, 'Replacements size unmatch' if booleans.sum != replacer_array.length
46
+
47
+ replace_with(booleans.data, replacer_array)
42
48
  end
43
49
 
44
50
  # (related functions)
@@ -76,52 +82,41 @@ module RedAmber
76
82
 
77
83
  private
78
84
 
79
- # [Ternary]: replace_with(booleans, replacements) => vector
80
- # Replace items selected with a boolean mask
85
+ # Replace elements selected with a boolean mask
81
86
  #
82
- # (from Arrow C++ inline doc.)
83
- # Given an array and a boolean mask (either scalar or of equal length),
84
- # along with replacement values (either scalar or array),
85
- # each element of the array for which the corresponding mask element is
86
- # true will be replaced by the next value from the replacements,
87
- # or with null if the mask is null.
88
- # Hence, for replacement arrays, len(replacements) == sum(mask == true).
89
-
90
- def replace_with(booleans, replacer = nil)
91
- specifier =
92
- if booleans.is_a?(Arrow::BooleanArray)
93
- booleans
94
- elsif booleans.is_a?(Vector) && booleans.boolean?
95
- booleans.data
96
- elsif booleans.is_a?(Array) && booleans?(booleans)
97
- Arrow::BooleanArray.new(booleans)
98
- else
99
- raise VectorTypeError, 'Not a valid type'
100
- end
101
- raise VectorArgumentError, 'Booleans size unmatch' if specifier.length != size
102
- raise VectorArgumentError, 'Booleans not have any `true`' unless specifier.any?
103
-
104
- r = Array(replacer) # scalar to [scalar]
105
- r = [nil] if r.empty?
106
-
107
- replacer =
108
- if r.size == 1
109
- case replacer
110
- when Arrow::Array then replacer
111
- when Vector then replacer.data
112
- else
113
- Arrow::Array.new(r * specifier.to_a.count(true)) # broadcast
114
- end
115
- else
116
- Arrow::Array.new(r)
117
- end
118
- replacer = data.class.new(replacer) if replacer.uniq == [nil]
87
+ # @param boolean_mask [Arrow::BooleanArray] Boolean mask which indicates the position to be replaced.
88
+ # - Position with true will be replaced.
89
+ # - Position with nil will be nil.
90
+ #
91
+ # @param replacer [Arrow::Array] Values after replaced
92
+ # (either scalar or array). If Array is given, original values are replaced by
93
+ # each element of the array at the corresponding position of mask element.
94
+ # - `replacer.size` must be equal to `mask.count(true)`.
95
+ # - Types of self and replacer must be same
96
+ #
97
+ # @return [Vector] Replaced vector.
98
+ # Type of returned Vector is upcasted if needed.
99
+ #
100
+ def replace_with(boolean_mask, replacer)
101
+ raise VectorArgumentError, 'Booleans size unmatch' if boolean_mask.length != size
102
+ raise VectorArgumentError, 'Booleans not have any `true`' unless boolean_mask.any?
119
103
 
120
- raise VectorArgumentError, 'Replacements size unmatch' if Array(specifier).count(true) != replacer.length
104
+ values = replacer.class.new(data) # Upcast
121
105
 
122
- values = replacer.class.new(data)
106
+ datum = find(:replace_with_mask).execute([values, boolean_mask, replacer])
107
+ Vector.new(datum.value)
108
+ end
123
109
 
124
- datum = find('replace_with_mask').execute([values, specifier, replacer])
110
+ # Replace elements selected with a boolean mask by nil
111
+ #
112
+ # @param boolean_mask [Arrow::BooleanArray] Boolean mask which indicates the position to be replaced.
113
+ # - Position with true will be replaced by nil
114
+ # - Position with nil will remain as nil.
115
+ # @return [Vector] Replaced vector.
116
+ #
117
+ def replace_to_nil(boolean_mask)
118
+ nil_array = data.class.new([nil] * size) # Casted nil Array
119
+ datum = find(:if_else).execute([boolean_mask, nil_array, data])
125
120
  Vector.new(datum.value)
126
121
  end
127
122
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RedAmber
4
- VERSION = '0.2.2'
4
+ VERSION = '0.2.3'
5
5
  end
data/lib/red_amber.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'arrow'
4
4
 
5
5
  require_relative 'red_amber/helper'
6
+ require_relative 'red_amber/data_frame_combinable'
6
7
  require_relative 'red_amber/data_frame_displayable'
7
8
  require_relative 'red_amber/data_frame_indexable'
8
9
  require_relative 'red_amber/data_frame_loadsave'
data/red_amber.gemspec CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ['lib']
32
32
 
33
- spec.add_dependency 'red-arrow', '>= 9.0.0'
33
+ spec.add_dependency 'red-arrow', '~> 10.0.0'
34
34
 
35
35
  # Development dependency has gone to the Gemfile (rubygems/bundler#7237)
36
36
 
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: red_amber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hirokazu SUZUKI (heronshoes)
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-03 00:00:00.000000000 Z
11
+ date: 2022-11-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: red-arrow
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 9.0.0
19
+ version: 10.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 9.0.0
26
+ version: 10.0.0
27
27
  description: RedAmber is a simple dataframe library inspired by Rover-df and powered
28
28
  by Red Arrow.
29
29
  email:
@@ -40,8 +40,16 @@ files:
40
40
  - LICENSE
41
41
  - README.md
42
42
  - Rakefile
43
- - benchmark/csv_load_penguins.yml
43
+ - benchmark/basic.yml
44
+ - benchmark/combine.yml
44
45
  - benchmark/drop_nil.yml
46
+ - benchmark/group.yml
47
+ - benchmark/reshape.yml
48
+ - benchmark/rover/csv_load_penguins.yml
49
+ - benchmark/rover/flights.yml
50
+ - benchmark/rover/penguins.yml
51
+ - benchmark/rover/planes.yml
52
+ - benchmark/rover/weather.yml
45
53
  - doc/CODE_OF_CONDUCT.md
46
54
  - doc/DataFrame.md
47
55
  - doc/Vector.md
@@ -50,12 +58,14 @@ files:
50
58
  - doc/image/dataframe/assign.png
51
59
  - doc/image/dataframe/assign_operation.png
52
60
  - doc/image/dataframe/drop.png
61
+ - doc/image/dataframe/join.png
53
62
  - doc/image/dataframe/pick.png
54
63
  - doc/image/dataframe/pick_operation.png
55
64
  - doc/image/dataframe/remove.png
56
65
  - doc/image/dataframe/rename.png
57
66
  - doc/image/dataframe/rename_operation.png
58
67
  - doc/image/dataframe/reshaping_DataFrames.png
68
+ - doc/image/dataframe/set_and_bind.png
59
69
  - doc/image/dataframe/slice.png
60
70
  - doc/image/dataframe/slice_operation.png
61
71
  - doc/image/dataframe_model.png
@@ -76,6 +86,7 @@ files:
76
86
  - lib/red-amber.rb
77
87
  - lib/red_amber.rb
78
88
  - lib/red_amber/data_frame.rb
89
+ - lib/red_amber/data_frame_combinable.rb
79
90
  - lib/red_amber/data_frame_displayable.rb
80
91
  - lib/red_amber/data_frame_indexable.rb
81
92
  - lib/red_amber/data_frame_loadsave.rb
@@ -99,7 +110,7 @@ metadata:
99
110
  source_code_uri: https://github.com/heronshoes/red_amber
100
111
  changelog_uri: https://github.com/heronshoes/red_amber/blob/main/CHANGELOG.md
101
112
  rubygems_mfa_required: 'true'
102
- post_install_message:
113
+ post_install_message:
103
114
  rdoc_options: []
104
115
  require_paths:
105
116
  - lib
@@ -115,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
126
  version: '0'
116
127
  requirements: []
117
128
  rubygems_version: 3.3.7
118
- signing_key:
129
+ signing_key:
119
130
  specification_version: 4
120
131
  summary: Simple dataframe library for Ruby
121
132
  test_files: []