red_amber 0.2.1 → 0.2.2

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/CHANGELOG.md +69 -2
  4. data/README.md +83 -280
  5. data/doc/DataFrame.md +279 -265
  6. data/doc/Vector.md +28 -36
  7. data/doc/image/basic_verbs.png +0 -0
  8. data/doc/image/dataframe/assign.png +0 -0
  9. data/doc/image/dataframe/assign_operation.png +0 -0
  10. data/doc/image/dataframe/drop.png +0 -0
  11. data/doc/image/dataframe/pick.png +0 -0
  12. data/doc/image/dataframe/pick_operation.png +0 -0
  13. data/doc/image/dataframe/remove.png +0 -0
  14. data/doc/image/dataframe/rename.png +0 -0
  15. data/doc/image/dataframe/rename_operation.png +0 -0
  16. data/doc/image/dataframe/reshaping_DataFrames.png +0 -0
  17. data/doc/image/dataframe/slice.png +0 -0
  18. data/doc/image/dataframe/slice_operation.png +0 -0
  19. data/doc/image/dataframe_model.png +0 -0
  20. data/doc/image/group_operation.png +0 -0
  21. data/doc/image/replace-if_then.png +0 -0
  22. data/doc/image/reshaping_dataframe.png +0 -0
  23. data/doc/image/screenshot.png +0 -0
  24. data/doc/image/vector/binary_element_wise.png +0 -0
  25. data/doc/image/vector/unary_aggregation.png +0 -0
  26. data/doc/image/vector/unary_aggregation_w_option.png +0 -0
  27. data/doc/image/vector/unary_element_wise.png +0 -0
  28. data/lib/red_amber/data_frame.rb +10 -37
  29. data/lib/red_amber/data_frame_displayable.rb +56 -3
  30. data/lib/red_amber/data_frame_loadsave.rb +36 -0
  31. data/lib/red_amber/data_frame_reshaping.rb +8 -6
  32. data/lib/red_amber/data_frame_variable_operation.rb +25 -19
  33. data/lib/red_amber/group.rb +5 -3
  34. data/lib/red_amber/helper.rb +20 -18
  35. data/lib/red_amber/vector.rb +49 -30
  36. data/lib/red_amber/vector_selectable.rb +9 -1
  37. data/lib/red_amber/vector_updatable.rb +6 -3
  38. data/lib/red_amber/version.rb +1 -1
  39. data/lib/red_amber.rb +1 -0
  40. metadata +13 -3
  41. data/doc/examples_of_red_amber.ipynb +0 -8979
@@ -17,10 +17,6 @@ module RedAmber
17
17
  enum.all?(Integer)
18
18
  end
19
19
 
20
- def sym_or_str?(enum)
21
- enum.all? { |e| e.is_a?(Symbol) || e.is_a?(String) }
22
- end
23
-
24
20
  def booleans?(enum)
25
21
  enum.all? { |e| e.is_a?(TrueClass) || e.is_a?(FalseClass) || e.is_a?(NilClass) }
26
22
  end
@@ -29,32 +25,38 @@ module RedAmber
29
25
  DataFrame.new(key => vector.data)
30
26
  end
31
27
 
32
- def parse_to_vector(args)
28
+ def parse_to_vector(args, vsize: size)
33
29
  a = args.reduce([]) do |accum, elem|
34
- accum.concat(normalize_element(elem))
30
+ accum.concat(normalize_element(elem, vsize: vsize))
35
31
  end
36
32
  Vector.new(a)
37
33
  end
38
34
 
39
- def normalize_element(elem)
35
+ def normalize_element(elem, vsize: size)
40
36
  case elem
41
- when Numeric, String, Symbol, TrueClass, FalseClass, NilClass
42
- [elem]
37
+ when NilClass
38
+ [nil]
43
39
  when Range
44
- both_end = [elem.begin, elem.end]
45
- both_end[1] -= 1 if elem.exclude_end? && elem.end.is_a?(Integer)
46
-
47
- if both_end.any?(Integer) || both_end.all?(&:nil?)
48
- if both_end.any? { |e| e&.>=(size) || e&.<(-size) }
49
- raise DataFrameArgumentError, "Index out of range: #{elem} for 0..#{size - 1}"
40
+ bg = elem.begin
41
+ en = elem.end
42
+ if [bg, en].any?(Integer)
43
+ bg += vsize if bg&.negative?
44
+ en += vsize if en&.negative?
45
+ en -= 1 if en.is_a?(Integer) && elem.exclude_end?
46
+ if bg&.negative? || (en && en >= vsize)
47
+ raise DataFrameArgumentError, "Index out of range: #{elem} for 0..#{vsize - 1}"
50
48
  end
51
49
 
52
- (0...size).to_a[elem]
50
+ Array(0...vsize)[elem]
51
+ elsif bg.nil? && en.nil?
52
+ Array(0...vsize)
53
53
  else
54
- elem.to_a
54
+ Array[elem]
55
55
  end
56
+ when Enumerator
57
+ elem.to_a
56
58
  else
57
- Array(elem)
59
+ Array[elem]
58
60
  end
59
61
  end
60
62
  end
@@ -11,27 +11,28 @@ module RedAmber
11
11
  include Helper
12
12
 
13
13
  def initialize(*array)
14
- @key = nil # default is 'headless'
15
- if array.empty? || array[0].nil?
14
+ @key = nil # default is 'headless' Vector
15
+ if array.empty? || array.first.nil?
16
16
  Vector.new([])
17
17
  else
18
18
  array.flatten!
19
- case array[0]
20
- when Vector
21
- @data = array[0].data
22
- return
23
- when Arrow::Array, Arrow::ChunkedArray
24
- @data = array[0]
25
- return
26
- when Range
27
- @data = Arrow::Array.new(Array(array[0]))
28
- return
29
- end
30
- begin
31
- @data = Arrow::Array.new(Array(array))
32
- rescue Error
33
- raise VectorArgumentError, "Invalid argument: #{array}"
34
- end
19
+ @data =
20
+ case array
21
+ in [Vector => v]
22
+ v.data
23
+ in [Arrow::Array => a]
24
+ a
25
+ in [Arrow::ChunkedArray => ca]
26
+ ca
27
+ in [Range => r]
28
+ Arrow::Array.new(Array(r))
29
+ else
30
+ begin
31
+ Arrow::Array.new(Array(array))
32
+ rescue Error
33
+ raise VectorArgumentError, "Invalid argument: #{array}"
34
+ end
35
+ end
35
36
  end
36
37
  end
37
38
 
@@ -43,19 +44,24 @@ module RedAmber
43
44
  end
44
45
 
45
46
  def inspect(limit: 80)
46
- sio = StringIO.new << '['
47
- to_a.each_with_object(sio).with_index do |(e, s), i|
48
- next_str = "#{s.size > 1 ? ', ' : ''}#{e.inspect}"
49
- if (s.size + next_str.size) < limit
50
- s << next_str
51
- else
52
- s << ', ... ' if i < size
53
- break
47
+ if ENV.fetch('RED_AMBER_OUTPUT_MODE', 'Table').casecmp('MINIMUM').zero?
48
+ # Better performance than `.upcase == 'MINIMUM'``
49
+ "#{self.class}(:#{type}, size=#{size})"
50
+ else
51
+ sio = StringIO.new << '['
52
+ to_a.each_with_object(sio).with_index do |(e, s), i|
53
+ next_str = "#{s.size > 1 ? ', ' : ''}#{e.inspect}"
54
+ if (s.size + next_str.size) < limit
55
+ s << next_str
56
+ else
57
+ s << ', ... ' if i < size
58
+ break
59
+ end
54
60
  end
55
- end
56
- sio << ']'
61
+ sio << ']'
57
62
 
58
- format "#<#{self.class}(:#{type}, size=#{size}):0x%016x>\n%s\n", object_id, sio.string
63
+ format "#<#{self.class}(:#{type}, size=#{size}):0x%016x>\n%s\n", object_id, sio.string
64
+ end
59
65
  end
60
66
 
61
67
  def values
@@ -71,7 +77,7 @@ module RedAmber
71
77
  alias_method :indeces, :indices
72
78
 
73
79
  def to_ary
74
- to_a
80
+ values
75
81
  end
76
82
 
77
83
  def size
@@ -110,6 +116,10 @@ module RedAmber
110
116
  type_class == Arrow::StringDataType
111
117
  end
112
118
 
119
+ def dictionary?
120
+ type_class == Arrow::DictionaryDataType
121
+ end
122
+
113
123
  def temporal?
114
124
  type_class < Arrow::TemporalDataType
115
125
  end
@@ -126,10 +136,19 @@ module RedAmber
126
136
  end
127
137
  end
128
138
 
139
+ def map(&block)
140
+ return enum_for(:map) unless block
141
+
142
+ Vector.new(to_a.map(&block))
143
+ end
144
+ alias_method :collect, :map
145
+
146
+ # undocumented
129
147
  def chunked?
130
148
  @data.is_a? Arrow::ChunkedArray
131
149
  end
132
150
 
151
+ # undocumented
133
152
  def n_chunks
134
153
  chunked? ? @data.n_chunks : 0
135
154
  end
@@ -25,7 +25,13 @@ module RedAmber
25
25
  end
26
26
 
27
27
  # TODO: support for option {null_selection_behavior: :drop}
28
- def filter(*booleans)
28
+ def filter(*booleans, &block)
29
+ if block
30
+ raise VectorArgumentError, 'Must not specify both arguments and block.' unless booleans.empty?
31
+
32
+ booleans = [yield]
33
+ end
34
+
29
35
  booleans.flatten!
30
36
  return Vector.new([]) if booleans.empty?
31
37
 
@@ -46,6 +52,8 @@ module RedAmber
46
52
 
47
53
  filter_by_array(boolean_array) # returns sub Vector
48
54
  end
55
+ alias_method :select, :filter
56
+ alias_method :find_all, :filter
49
57
 
50
58
  # @param indices
51
59
  # @param booleans
@@ -8,9 +8,10 @@ module RedAmber
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
11
+ # @param arg [Array, Vector, Arrow::Array] index specifier or boolean
12
12
  # @param replacer [Array, Vector, Arrow::Array] new data to replace for.
13
- # @return [Vector] Replaced new Vector
13
+ # @return [Vector] Replaced new Vector.
14
+ # If arg has no true, return self.
14
15
  def replace(args, replacer)
15
16
  args =
16
17
  case args
@@ -24,10 +25,12 @@ module RedAmber
24
25
  replacer = Array(replacer)
25
26
  return self if args.empty? || args[0].nil?
26
27
 
27
- replacer = nil if replacer.empty?
28
28
  vector = parse_to_vector(args)
29
+ replacer = nil if replacer.empty?
29
30
  booleans =
30
31
  if vector.boolean?
32
+ return self unless vector.any
33
+
31
34
  vector
32
35
  elsif vector.numeric?
33
36
  replacer.sort_by! { |x| args[replacer.index(x)] } if replacer # rubocop:disable Style/SafeNavigation
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RedAmber
4
- VERSION = '0.2.1'
4
+ VERSION = '0.2.2'
5
5
  end
data/lib/red_amber.rb CHANGED
@@ -5,6 +5,7 @@ require 'arrow'
5
5
  require_relative 'red_amber/helper'
6
6
  require_relative 'red_amber/data_frame_displayable'
7
7
  require_relative 'red_amber/data_frame_indexable'
8
+ require_relative 'red_amber/data_frame_loadsave'
8
9
  require_relative 'red_amber/data_frame_reshaping'
9
10
  require_relative 'red_amber/data_frame_selectable'
10
11
  require_relative 'red_amber/data_frame_variable_operation'
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.1
4
+ version: 0.2.2
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-09-07 00:00:00.000000000 Z
11
+ date: 2022-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: red-arrow
@@ -45,16 +45,25 @@ files:
45
45
  - doc/CODE_OF_CONDUCT.md
46
46
  - doc/DataFrame.md
47
47
  - doc/Vector.md
48
- - doc/examples_of_red_amber.ipynb
49
48
  - doc/image/arrow_table_new.png
49
+ - doc/image/basic_verbs.png
50
50
  - doc/image/dataframe/assign.png
51
+ - doc/image/dataframe/assign_operation.png
51
52
  - doc/image/dataframe/drop.png
52
53
  - doc/image/dataframe/pick.png
54
+ - doc/image/dataframe/pick_operation.png
53
55
  - doc/image/dataframe/remove.png
54
56
  - doc/image/dataframe/rename.png
57
+ - doc/image/dataframe/rename_operation.png
58
+ - doc/image/dataframe/reshaping_DataFrames.png
55
59
  - doc/image/dataframe/slice.png
60
+ - doc/image/dataframe/slice_operation.png
56
61
  - doc/image/dataframe_model.png
57
62
  - doc/image/example_in_red_arrow.png
63
+ - doc/image/group_operation.png
64
+ - doc/image/replace-if_then.png
65
+ - doc/image/reshaping_dataframe.png
66
+ - doc/image/screenshot.png
58
67
  - doc/image/tdr.png
59
68
  - doc/image/tdr_and_table.png
60
69
  - doc/image/tidy_data_in_TDR.png
@@ -69,6 +78,7 @@ files:
69
78
  - lib/red_amber/data_frame.rb
70
79
  - lib/red_amber/data_frame_displayable.rb
71
80
  - lib/red_amber/data_frame_indexable.rb
81
+ - lib/red_amber/data_frame_loadsave.rb
72
82
  - lib/red_amber/data_frame_reshaping.rb
73
83
  - lib/red_amber/data_frame_selectable.rb
74
84
  - lib/red_amber/data_frame_variable_operation.rb