red_amber 0.2.1 → 0.2.2

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