red_amber 0.2.3 → 0.4.0

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +133 -51
  3. data/.yardopts +2 -0
  4. data/CHANGELOG.md +203 -1
  5. data/Gemfile +2 -1
  6. data/LICENSE +1 -1
  7. data/README.md +61 -45
  8. data/benchmark/basic.yml +11 -4
  9. data/benchmark/combine.yml +3 -4
  10. data/benchmark/dataframe.yml +62 -0
  11. data/benchmark/group.yml +7 -1
  12. data/benchmark/reshape.yml +6 -2
  13. data/benchmark/vector.yml +63 -0
  14. data/doc/DataFrame.md +35 -12
  15. data/doc/DataFrame_Comparison.md +65 -0
  16. data/doc/SubFrames.md +11 -0
  17. data/doc/Vector.md +295 -1
  18. data/doc/yard-templates/default/fulldoc/html/css/common.css +6 -0
  19. data/lib/red_amber/data_frame.rb +537 -68
  20. data/lib/red_amber/data_frame_combinable.rb +776 -123
  21. data/lib/red_amber/data_frame_displayable.rb +248 -18
  22. data/lib/red_amber/data_frame_indexable.rb +122 -19
  23. data/lib/red_amber/data_frame_loadsave.rb +81 -10
  24. data/lib/red_amber/data_frame_reshaping.rb +216 -21
  25. data/lib/red_amber/data_frame_selectable.rb +781 -120
  26. data/lib/red_amber/data_frame_variable_operation.rb +561 -85
  27. data/lib/red_amber/group.rb +195 -21
  28. data/lib/red_amber/helper.rb +114 -32
  29. data/lib/red_amber/refinements.rb +206 -0
  30. data/lib/red_amber/subframes.rb +1066 -0
  31. data/lib/red_amber/vector.rb +435 -58
  32. data/lib/red_amber/vector_aggregation.rb +312 -0
  33. data/lib/red_amber/vector_binary_element_wise.rb +387 -0
  34. data/lib/red_amber/vector_selectable.rb +321 -69
  35. data/lib/red_amber/vector_unary_element_wise.rb +436 -0
  36. data/lib/red_amber/vector_updatable.rb +397 -24
  37. data/lib/red_amber/version.rb +2 -1
  38. data/lib/red_amber.rb +15 -1
  39. data/red_amber.gemspec +4 -3
  40. metadata +19 -11
  41. data/doc/image/dataframe/reshaping_DataFrames.png +0 -0
  42. data/lib/red_amber/vector_functions.rb +0 -294
@@ -4,17 +4,117 @@
4
4
  # reference: https://arrow.apache.org/docs/cpp/compute.html
5
5
 
6
6
  module RedAmber
7
- # mix-in 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
- # Replace data
11
- # @param specifier [Array, Vector, Arrow::Array] index or booleans.
12
- # @param replacer [Scalar, Array, Vector, Arrow::Array] new data to replace for.
13
- # @return [Vector] Replaced new Vector.
14
- # If specifier has no true, return self.
10
+ # Add properties to Arrow::Array and Arrow::ChunkedArray
11
+ using RefineArrayLike
12
+
13
+ # Replace data in self by position specifier and replacer.
14
+ #
15
+ # - Scalar value may be broadcasted.
16
+ # - Returned value type may be automatically up-casted by replacer.
17
+ #
18
+ # @overload replace(booleans, replacer_by_scalar)
19
+ # Replace the value where true in boolean specifier to scalar replacer.
20
+ #
21
+ # @param booleans [Array, Vector, Arrow::Array]
22
+ # boolean position specifier to specify the position to be replaced by true.
23
+ # @param replacer_by_scalar [Scalar]
24
+ # new data to replace for.
25
+ # @return [Vector]
26
+ # a new replaced Vector.
27
+ # If specifier has no true, returns self.
28
+ # @example Replace with boolean specifier and scalar replacer
29
+ # Vector.new([1, 2, 3]).replace([true, false, true], 0)
30
+ #
31
+ # # =>
32
+ # #<RedAmber::Vector(:uint8, size=3):0x000000000001ee10>
33
+ # [0, 2, 0]
34
+ #
35
+ # @example Type of result is up-casted by replacer.
36
+ # ector.new([1, 2, 3]).replace([true, false, true], -1.0)
37
+ #
38
+ # # =>
39
+ # #<RedAmber::Vector(:double, size=3):0x0000000000025d78>
40
+ # [-1.0, 2.0, -1.0]
41
+ #
42
+ # @example Position of nil in booleans is replaced with nil
43
+ # Vector.new([1, 2, 3]).replace([true, false, nil], -1)
44
+ #
45
+ # # =>
46
+ # #<RedAmber::Vector(:int8, size=3):0x00000000000304d0>
47
+ # [-1, 2, nil]
48
+ #
49
+ # @example Replace 'NA' to nil
50
+ # vector = Vector.new(['A', 'B', 'NA'])
51
+ # vector.replace(vector == 'NA', nil)
52
+ #
53
+ # # =>
54
+ # #<RedAmber::Vector(:string, size=3):0x000000000000f8ac>
55
+ # ["A", "B", nil]
56
+ #
57
+ # @overload replace(indices, replacer_by_scalar)
58
+ # Replace the value at the index specifier to scalar replacer.
59
+ #
60
+ # @param indices [Array, Vector, Arrow::Array]
61
+ # index specifier to specify the position to be replaced.
62
+ # @param replacer_by_scalar [Scalar]
63
+ # new data to replace for.
64
+ # @return [Vector]
65
+ # a new replaced Vector.
66
+ # If specifier is empty, returns self.
67
+ # @example Replace with index specifier and scalar replacer
68
+ # Vector.new([1, 2, 3]).replace([0, 2], 0)
69
+ #
70
+ # # =>
71
+ # #<RedAmber::Vector(:uint8, size=3):0x000000000000c15c>
72
+ # [0, 2, 0]
73
+ #
74
+ # @overload replace(booleans, replacer_array)
75
+ # Replace the value where true in boolean specifier to replacer array.
76
+ #
77
+ # @param booleans [Array, Vector, Arrow::Array]
78
+ # boolean position specifier to specify the position to be replaced by true.
79
+ # @param replacer_array [Vector, Array, Arrow::Array]
80
+ # new data to replace for.
81
+ # The number of true in booleans must be equal to the length of replacer array.
82
+ # @return [Vector]
83
+ # a new replaced Vector.
84
+ # If specifier has no true, returns self.
85
+ # @example Replace with boolean specifier and replacer array
86
+ # vector = Vector.new([1, 2, 3])
87
+ # booleans = [true, false, true]
88
+ # replacer = [4, 5]
89
+ # vector.replace(booleans, replacer)
90
+ #
91
+ # # =>
92
+ # #<RedAmber::Vector(:uint8, size=3):0x000000000001ee10>
93
+ # [4, 2, 5]
94
+ #
95
+ # @overload replace(indices, replacer_array)
96
+ # Replace the value at the index specifier to replacer array.
97
+ #
98
+ # @param indices [Array, Vector, Arrow::Array]
99
+ # index specifier to specify the position to be replaced.
100
+ # @param replacer_array [Vector, Array, Arrow::Array]
101
+ # new data to replace for.
102
+ # The length of index specifier must be equal to the length of replacer array.
103
+ # @return [Vector]
104
+ # a new replaced Vector.
105
+ # If specifier is empty, returns self.
106
+ # @example Replace with index specifier and replacer array
107
+ # vector = Vector.new([1, 2, 3])
108
+ # indices = [0, 2]
109
+ # replacer = [4, 5]
110
+ # vector.replace(indices, replacer)
111
+ #
112
+ # # =>
113
+ # #<RedAmber::Vector(:uint8, size=3):0x000000000001ee10>
114
+ # [4, 2, 5]
15
115
  #
16
116
  def replace(specifier, replacer)
17
- vector = parse_to_vector(Array(specifier))
117
+ vector = Vector.new(parse_args(Array(specifier), size))
18
118
  return self if vector.empty? || empty?
19
119
 
20
120
  booleans =
@@ -34,7 +134,7 @@ module RedAmber
34
134
  in nil | [nil]
35
135
  return replace_to_nil(booleans.data)
36
136
  in Arrow::Array
37
- # nop
137
+ replacer
38
138
  in Vector
39
139
  replacer.data
40
140
  in Array
@@ -42,49 +142,319 @@ module RedAmber
42
142
  else # Broadcast scalar to Array
43
143
  Arrow::Array.new(Array(replacer) * booleans.to_a.count(true))
44
144
  end
45
- raise VectorArgumentError, 'Replacements size unmatch' if booleans.sum != replacer_array.length
145
+ if booleans.sum != replacer_array.length
146
+ raise VectorArgumentError, 'Replacements size unmatch'
147
+ end
46
148
 
47
149
  replace_with(booleans.data, replacer_array)
48
150
  end
49
151
 
50
- # (related functions)
51
- # fill_null_backward, fill_null_forward
52
-
53
- # [Ternary element-wise]: boolean_vector.func(if_true, else) => vector
152
+ # Choose values based on self.
153
+ #
154
+ # [Ternary element-wise function] Returns a Vector.
155
+ # - Self must be a boolean Vector.
156
+ # - `true_choice`, `false_choice` must be of the same type scalar / array / Vector.
157
+ # - `nil` values in self will be promoted to the output.
158
+ #
159
+ # @overload if_else(true_choise, false_choise)
160
+ # replace with a scalar.
161
+ #
162
+ # @param true_choice [scalar]
163
+ # a value to be replaced with true.
164
+ # @param false_choice [scalar]
165
+ # a value to be replaced with false.
166
+ # @return [Vector]
167
+ # replaced result.
168
+ # @example Replace with scalar choices
169
+ # Vector.new(true, true, false, nil, false).if_else(1, 2)
170
+ #
171
+ # # =>
172
+ # #<RedAmber::Vector(:uint8, size=5):0x000000000000c198>
173
+ # [1, 1, 2, nil, 2]
174
+ #
175
+ # @overload if_else(true_choise, false_choise)
176
+ # replace with a scalar.
177
+ #
178
+ # @param true_choice [Vector, Array, Arrow::Array]
179
+ # values to be replaced with true.
180
+ # The size of true_choice must be same as self.
181
+ # @param false_choice [Vector, Array, Arrow::Array]
182
+ # values to be replaced with false.
183
+ # The size of false_choice must be same as self.
184
+ # @return [Vector]
185
+ # replaced result.
186
+ # @example Replace with Array choices
187
+ # boolean_vector = Vector.new(true, true, false, nil, false)
188
+ # true_choise = Vector.new([1.1, 2.2, 3.3, 4.4, 5.5])
189
+ # false_choise = -true_choise
190
+ # boolean_vector.if_else(true_choise, false_choise)
191
+ #
192
+ # # =>
193
+ # #<RedAmber::Vector(:double, size=5):0x000000000000cd28>
194
+ # [1.1, 2.2, -3.3, nil, -5.5]
195
+ #
196
+ # @example Normalize negative indices to positive ones
197
+ # indices = Vector.new([1, -1, 3, -4])
198
+ # array_size = 10
199
+ # normalized_indices = (indices < 0).if_else(indices + array_size, indices)
200
+ #
201
+ # # =>
202
+ # #<RedAmber::Vector(:int16, size=4):0x000000000000f85c>
203
+ # [1, 9, 3, 6]
204
+ #
54
205
  def if_else(true_choice, false_choice)
55
206
  true_choice = true_choice.data if true_choice.is_a? Vector
56
207
  false_choice = false_choice.data if false_choice.is_a? Vector
57
208
  raise VectorTypeError, 'Reciever must be a boolean' unless boolean?
58
209
 
59
210
  datum = find(:if_else).execute([data, true_choice, false_choice])
60
- Vector.new(datum.value)
211
+ Vector.create(datum.value)
61
212
  end
62
213
 
63
- # same behavior as Ruby's invert
214
+ # Another #invert which is same behavior as Ruby's invert.
215
+ #
64
216
  # ![true, false, nil] #=> [false, true, true]
217
+ # @return [Vector]
218
+ # follows Ruby's BasicObject#!'s behavior.
219
+ # @example
220
+ # vector = Vector.new([true, true, false, nil])
221
+ #
222
+ # # =>
223
+ # #<RedAmber::Vector(:boolean, size=4):0x000000000000fa8c>
224
+ # [true, true, false, nil]
225
+ #
226
+ # # nil is converted to nil by Vector#invert.
227
+ # vector.invert
228
+ # # or
229
+ # !vector
230
+ #
231
+ # #<RedAmber::Vector(:boolean, size=4):0x000000000000faa0>
232
+ # [false, false, true, nil]
233
+ #
234
+ # # On the other hand,
235
+ # # Vector#primitive_invert follows Ruby's BasicObject#!'s behavior.
236
+ # vector.primitive_invert
237
+ #
238
+ # # =>
239
+ # #<RedAmber::Vector(:boolean, size=4):0x000000000000fab4>
240
+ # [false, false, true, true]
241
+ #
65
242
  def primitive_invert
66
243
  raise VectorTypeError, "Not a boolean Vector: #{self}" unless boolean?
67
244
 
68
245
  is_nil.if_else(false, self).invert
69
246
  end
70
247
 
248
+ # Shift elements in self.
249
+ #
250
+ # @param amount [Integer]
251
+ # amount of shift. Positive value will shift right, negative will shift left.
252
+ # @param fill [Object]
253
+ # complementary element to fill the new seat.
254
+ # @return [Vector]
255
+ # shifted Vector.
256
+ #
71
257
  def shift(amount = 1, fill: nil)
72
- raise VectorArgumentError, 'Shift amount is too large' if amount.abs > size
258
+ raise VectorArgumentError, 'Shift amount is too large' if amount.abs >= size
73
259
 
74
260
  if amount.positive?
75
- replace(amount..-1, self[0...-amount]).replace(0...amount, fill)
261
+ filler = [fill] * amount
262
+ Vector.new(filler.concat(Array(self[0...-amount])))
76
263
  elsif amount.negative?
77
- replace(0...amount, self[-amount..]).replace(amount..-1, fill)
264
+ filler = [fill] * -amount
265
+ Vector.new(Array(self[-amount...]).concat(filler))
78
266
  else # amount == 0
79
267
  self
80
268
  end
81
269
  end
82
270
 
271
+ # Split string Vector and returns Array of columns.
272
+ #
273
+ # @param sep [nil, String, Regexp]
274
+ # separator.
275
+ # If separator is nil (or no argeument given),
276
+ # the column will be splitted by Arrow's split function
277
+ # using any ASCII whitespace.
278
+ # Otherwise, sep will passed to String#split.
279
+ # @param limit [Integer]
280
+ # maximum number to limit separation. Passed to String#split.
281
+ # @return [Array<Vector>]
282
+ # an Array of Vectors.
283
+ # @note nil will separated as nil's at same row.
284
+ # ex) `nil => [nil, nil]`
285
+ #
286
+ def split_to_columns(sep = nil, limit = 0)
287
+ l = split(sep, limit)
288
+ l.list_separate
289
+ end
290
+
291
+ # Split string Vector and flatten into rows.
292
+ #
293
+ # @param sep [nil, String, Regexp]
294
+ # separater.
295
+ # If separator is nil (or no argeument given),
296
+ # the column will be splitted by Arrow's split function
297
+ # using any ASCII whitespace.
298
+ # Otherwise, sep will passed to String#split.
299
+ # @param limit [Integer]
300
+ # maximum number to limit separation. Passed to String#split.
301
+ # @return [Vector]
302
+ # a flatten Vector.
303
+ # @note nil will separated as nil's at same row.
304
+ # ex) `nil => [nil, nil]`
305
+ #
306
+ def split_to_rows(sep = nil, limit = 0)
307
+ l = split(sep, limit)
308
+ l.list_flatten
309
+ end
310
+
311
+ # Return element size Array for list Vector.
312
+ #
313
+ # @api private
314
+ #
315
+ def list_sizes
316
+ Vector.create find(:list_value_length).execute([data]).value
317
+ end
318
+
319
+ # Separate list Vector by columns.
320
+ #
321
+ # @api private
322
+ #
323
+ def list_separate
324
+ len = list_sizes.data
325
+ min, max = Arrow::Function.find(:min_max).execute([len]).value.value.map(&:value)
326
+
327
+ result = []
328
+ (0...min).each do |i|
329
+ result << Vector.create(find(:list_element).execute([data, i]).value)
330
+ end
331
+ return result if min == max
332
+
333
+ (min...max).each do |i|
334
+ result << Vector.new(data.map { |e| e&.[](i) })
335
+ end
336
+ result
337
+ end
338
+
339
+ # Flatten list Vector for rows.
340
+ #
341
+ # @api private
342
+ #
343
+ def list_flatten
344
+ Vector.create find(:list_flatten).execute([data]).value
345
+ end
346
+
347
+ # Split string Vector by each element with separator and returns list Array.
348
+ #
349
+ # @note if sep is not specified, use Arrow's ascii_split_whitespace.
350
+ # It will separate string by ascii whitespaces.
351
+ # @note if sep specified, sep and limit will passed to String#split.
352
+ #
353
+ def split(sep = nil, limit = 0)
354
+ if empty? || !string?
355
+ raise VectorTypeError, "self is not a valid string Vector: #{self}"
356
+ end
357
+ if self[0].nil? && uniq.to_a == [nil] # Avoid heavy check to be activated always.
358
+ raise VectorTypeError, 'self contains only nil'
359
+ end
360
+
361
+ list =
362
+ if sep
363
+ Arrow::Array.new(to_a.map { |e| e&.split(sep, limit) })
364
+ else
365
+ find(:ascii_split_whitespace).execute([data]).value
366
+ end
367
+ Vector.create(list)
368
+ end
369
+
370
+ # Merge String or other string Vector to self.
371
+ # Self must be a string Vector.
372
+ #
373
+ # @param other [String, Vector]
374
+ # merger from right. It will be broadcasted if it is a scalar String.
375
+ # @param sep [String]
376
+ # separator.
377
+ # @return [Vector]
378
+ # merged Vector
379
+ #
380
+ def merge(other, sep: ' ')
381
+ if empty? || !string?
382
+ raise VectorTypeError,
383
+ "self is not a string Vector: #{self}"
384
+ end
385
+ unless sep.is_a?(String)
386
+ raise VectorArgumentError, "separator is not a String: #{sep}"
387
+ end
388
+
389
+ other_array =
390
+ case other
391
+ in String => s
392
+ [s] * size
393
+ in (Vector | Arrow::Array | Arrow::ChunkedArray) => x if x.string?
394
+ x.to_a
395
+ else
396
+ raise VectorArgumentError,
397
+ "other is not a String or a string Vector: #{self}"
398
+ end
399
+
400
+ list = Arrow::Array.new(to_a.zip(other_array))
401
+ datum = find(:binary_join).execute([list, sep])
402
+ Vector.create(datum.value)
403
+ end
404
+
405
+ # Concatenate other array-like to self.
406
+ #
407
+ # @param other [Vector, Array, Arrow::Array, Arrow::ChunkedArray]
408
+ # other array-like to concatenate.
409
+ # @return [Vector]
410
+ # concatenated Vector.
411
+ # @example Concatenate to string
412
+ # string_vector
413
+ #
414
+ # # =>
415
+ # #<RedAmber::Vector(:string, size=2):0x00000000000037b4>
416
+ # ["A", "B"]
417
+ #
418
+ # string_vector.concatenate([1, 2])
419
+ #
420
+ # # =>
421
+ # #<RedAmber::Vector(:string, size=4):0x0000000000003818>
422
+ # ["A", "B", "1", "2"]
423
+ #
424
+ # @example Concatenate to integer
425
+ # integer_vector
426
+ #
427
+ # # =>
428
+ # #<RedAmber::Vector(:uint8, size=2):0x000000000000382c>
429
+ # [1, 2]
430
+ #
431
+ # integer_vector.concatenate(["A", "B"])
432
+ # # =>
433
+ # #<RedAmber::Vector(:uint8, size=4):0x0000000000003840>
434
+ # [1, 2, 65, 66]
435
+ #
436
+ # @since 0.4.0
437
+ #
438
+ def concatenate(other)
439
+ concatenated_array =
440
+ case other
441
+ when Vector
442
+ data + other.data
443
+ when Arrow::ChunkedArray
444
+ data + other.pack
445
+ else
446
+ data + other
447
+ end
448
+ Vector.create(concatenated_array)
449
+ end
450
+ alias_method :concat, :concatenate
451
+
83
452
  private
84
453
 
85
454
  # Replace elements selected with a boolean mask
86
455
  #
87
- # @param boolean_mask [Arrow::BooleanArray] Boolean mask which indicates the position to be replaced.
456
+ # @param boolean_mask [Arrow::BooleanArray]
457
+ # Boolean mask which indicates the position to be replaced.
88
458
  # - Position with true will be replaced.
89
459
  # - Position with nil will be nil.
90
460
  #
@@ -94,7 +464,8 @@ module RedAmber
94
464
  # - `replacer.size` must be equal to `mask.count(true)`.
95
465
  # - Types of self and replacer must be same
96
466
  #
97
- # @return [Vector] Replaced vector.
467
+ # @return [Vector]
468
+ # replaced vector.
98
469
  # Type of returned Vector is upcasted if needed.
99
470
  #
100
471
  def replace_with(boolean_mask, replacer)
@@ -104,20 +475,22 @@ module RedAmber
104
475
  values = replacer.class.new(data) # Upcast
105
476
 
106
477
  datum = find(:replace_with_mask).execute([values, boolean_mask, replacer])
107
- Vector.new(datum.value)
478
+ Vector.create(datum.value)
108
479
  end
109
480
 
110
481
  # Replace elements selected with a boolean mask by nil
111
482
  #
112
- # @param boolean_mask [Arrow::BooleanArray] Boolean mask which indicates the position to be replaced.
483
+ # @param boolean_mask [Arrow::BooleanArray]
484
+ # Boolean mask which indicates the position to be replaced.
113
485
  # - Position with true will be replaced by nil
114
486
  # - Position with nil will remain as nil.
115
- # @return [Vector] Replaced vector.
487
+ # @return [Vector]
488
+ # replaced vector.
116
489
  #
117
490
  def replace_to_nil(boolean_mask)
118
491
  nil_array = data.class.new([nil] * size) # Casted nil Array
119
492
  datum = find(:if_else).execute([boolean_mask, nil_array, data])
120
- Vector.new(datum.value)
493
+ Vector.create(datum.value)
121
494
  end
122
495
  end
123
496
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RedAmber
4
- VERSION = '0.2.3'
4
+ # Library version
5
+ VERSION = '0.4.0'
5
6
  end
data/lib/red_amber.rb CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  require 'arrow'
4
4
 
5
+ require_relative 'red_amber/refinements'
5
6
  require_relative 'red_amber/helper'
7
+
6
8
  require_relative 'red_amber/data_frame_combinable'
7
9
  require_relative 'red_amber/data_frame_displayable'
8
10
  require_relative 'red_amber/data_frame_indexable'
@@ -12,20 +14,32 @@ require_relative 'red_amber/data_frame_selectable'
12
14
  require_relative 'red_amber/data_frame_variable_operation'
13
15
  require_relative 'red_amber/data_frame'
14
16
  require_relative 'red_amber/group'
15
- require_relative 'red_amber/vector_functions'
17
+ require_relative 'red_amber/subframes'
18
+ require_relative 'red_amber/vector_aggregation'
19
+ require_relative 'red_amber/vector_binary_element_wise'
20
+ require_relative 'red_amber/vector_unary_element_wise'
16
21
  require_relative 'red_amber/vector_updatable'
17
22
  require_relative 'red_amber/vector_selectable'
18
23
  require_relative 'red_amber/vector'
19
24
  require_relative 'red_amber/version'
20
25
 
21
26
  module RedAmber
27
+ # Generic error
22
28
  class Error < StandardError; end
23
29
 
30
+ # Argument error in DataFrame
24
31
  class DataFrameArgumentError < ArgumentError; end
32
+ # Data type error in DataFrame
25
33
  class DataFrameTypeError < TypeError; end
26
34
 
35
+ # Argument error in Vector
27
36
  class VectorArgumentError < ArgumentError; end
37
+ # Data type error in DataFrame
28
38
  class VectorTypeError < TypeError; end
29
39
 
40
+ # Argument error in Group
30
41
  class GroupArgumentError < ArgumentError; end
42
+
43
+ # Argument error in SubFrames
44
+ class SubFramesArgumentError < ArgumentError; end
31
45
  end
data/red_amber.gemspec CHANGED
@@ -9,10 +9,11 @@ Gem::Specification.new do |spec|
9
9
  spec.email = ['heronshoes877@gmail.com']
10
10
 
11
11
  spec.summary = 'Simple dataframe library for Ruby'
12
- spec.description = 'RedAmber is a simple dataframe library inspired by Rover-df and powered by Red Arrow.'
12
+ spec.description = 'RedAmber is a simple dataframe library ' \
13
+ 'inspired by Rover-df and powered by Red Arrow.'
13
14
  spec.homepage = 'https://github.com/heronshoes/red_amber'
14
15
  spec.license = 'MIT'
15
- spec.required_ruby_version = '>= 2.7'
16
+ spec.required_ruby_version = '>= 3.0'
16
17
 
17
18
  spec.metadata['homepage_uri'] = spec.homepage
18
19
  spec.metadata['source_code_uri'] = 'https://github.com/heronshoes/red_amber'
@@ -30,7 +31,7 @@ Gem::Specification.new do |spec|
30
31
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
32
  spec.require_paths = ['lib']
32
33
 
33
- spec.add_dependency 'red-arrow', '~> 10.0.0'
34
+ spec.add_dependency 'red-arrow', '~> 11.0.0'
34
35
 
35
36
  # Development dependency has gone to the Gemfile (rubygems/bundler#7237)
36
37
 
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.2.3
4
+ version: 0.4.0
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-11-16 00:00:00.000000000 Z
11
+ date: 2023-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: red-arrow
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 10.0.0
19
+ version: 11.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: 10.0.0
26
+ version: 11.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:
@@ -42,6 +42,7 @@ files:
42
42
  - Rakefile
43
43
  - benchmark/basic.yml
44
44
  - benchmark/combine.yml
45
+ - benchmark/dataframe.yml
45
46
  - benchmark/drop_nil.yml
46
47
  - benchmark/group.yml
47
48
  - benchmark/reshape.yml
@@ -50,8 +51,11 @@ files:
50
51
  - benchmark/rover/penguins.yml
51
52
  - benchmark/rover/planes.yml
52
53
  - benchmark/rover/weather.yml
54
+ - benchmark/vector.yml
53
55
  - doc/CODE_OF_CONDUCT.md
54
56
  - doc/DataFrame.md
57
+ - doc/DataFrame_Comparison.md
58
+ - doc/SubFrames.md
55
59
  - doc/Vector.md
56
60
  - doc/image/arrow_table_new.png
57
61
  - doc/image/basic_verbs.png
@@ -64,7 +68,6 @@ files:
64
68
  - doc/image/dataframe/remove.png
65
69
  - doc/image/dataframe/rename.png
66
70
  - doc/image/dataframe/rename_operation.png
67
- - doc/image/dataframe/reshaping_DataFrames.png
68
71
  - doc/image/dataframe/set_and_bind.png
69
72
  - doc/image/dataframe/slice.png
70
73
  - doc/image/dataframe/slice_operation.png
@@ -83,6 +86,7 @@ files:
83
86
  - doc/image/vector/unary_element_wise.png
84
87
  - doc/tdr.md
85
88
  - doc/tdr_ja.md
89
+ - doc/yard-templates/default/fulldoc/html/css/common.css
86
90
  - lib/red-amber.rb
87
91
  - lib/red_amber.rb
88
92
  - lib/red_amber/data_frame.rb
@@ -95,9 +99,13 @@ files:
95
99
  - lib/red_amber/data_frame_variable_operation.rb
96
100
  - lib/red_amber/group.rb
97
101
  - lib/red_amber/helper.rb
102
+ - lib/red_amber/refinements.rb
103
+ - lib/red_amber/subframes.rb
98
104
  - lib/red_amber/vector.rb
99
- - lib/red_amber/vector_functions.rb
105
+ - lib/red_amber/vector_aggregation.rb
106
+ - lib/red_amber/vector_binary_element_wise.rb
100
107
  - lib/red_amber/vector_selectable.rb
108
+ - lib/red_amber/vector_unary_element_wise.rb
101
109
  - lib/red_amber/vector_updatable.rb
102
110
  - lib/red_amber/version.rb
103
111
  - red_amber.gemspec
@@ -110,7 +118,7 @@ metadata:
110
118
  source_code_uri: https://github.com/heronshoes/red_amber
111
119
  changelog_uri: https://github.com/heronshoes/red_amber/blob/main/CHANGELOG.md
112
120
  rubygems_mfa_required: 'true'
113
- post_install_message:
121
+ post_install_message:
114
122
  rdoc_options: []
115
123
  require_paths:
116
124
  - lib
@@ -118,15 +126,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
118
126
  requirements:
119
127
  - - ">="
120
128
  - !ruby/object:Gem::Version
121
- version: '2.7'
129
+ version: '3.0'
122
130
  required_rubygems_version: !ruby/object:Gem::Requirement
123
131
  requirements:
124
132
  - - ">="
125
133
  - !ruby/object:Gem::Version
126
134
  version: '0'
127
135
  requirements: []
128
- rubygems_version: 3.3.7
129
- signing_key:
136
+ rubygems_version: 3.2.33
137
+ signing_key:
130
138
  specification_version: 4
131
139
  summary: Simple dataframe library for Ruby
132
140
  test_files: []