red_amber 0.2.3 → 0.4.0

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