red_amber 0.2.2 → 0.2.3

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