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.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +69 -2
- data/README.md +83 -280
- data/doc/DataFrame.md +279 -265
- data/doc/Vector.md +28 -36
- data/doc/image/basic_verbs.png +0 -0
- data/doc/image/dataframe/assign.png +0 -0
- data/doc/image/dataframe/assign_operation.png +0 -0
- data/doc/image/dataframe/drop.png +0 -0
- data/doc/image/dataframe/pick.png +0 -0
- data/doc/image/dataframe/pick_operation.png +0 -0
- data/doc/image/dataframe/remove.png +0 -0
- data/doc/image/dataframe/rename.png +0 -0
- data/doc/image/dataframe/rename_operation.png +0 -0
- data/doc/image/dataframe/reshaping_DataFrames.png +0 -0
- data/doc/image/dataframe/slice.png +0 -0
- data/doc/image/dataframe/slice_operation.png +0 -0
- data/doc/image/dataframe_model.png +0 -0
- data/doc/image/group_operation.png +0 -0
- data/doc/image/replace-if_then.png +0 -0
- data/doc/image/reshaping_dataframe.png +0 -0
- data/doc/image/screenshot.png +0 -0
- data/doc/image/vector/binary_element_wise.png +0 -0
- data/doc/image/vector/unary_aggregation.png +0 -0
- data/doc/image/vector/unary_aggregation_w_option.png +0 -0
- data/doc/image/vector/unary_element_wise.png +0 -0
- data/lib/red_amber/data_frame.rb +10 -37
- data/lib/red_amber/data_frame_displayable.rb +56 -3
- data/lib/red_amber/data_frame_loadsave.rb +36 -0
- data/lib/red_amber/data_frame_reshaping.rb +8 -6
- data/lib/red_amber/data_frame_variable_operation.rb +25 -19
- data/lib/red_amber/group.rb +5 -3
- data/lib/red_amber/helper.rb +20 -18
- data/lib/red_amber/vector.rb +49 -30
- data/lib/red_amber/vector_selectable.rb +9 -1
- data/lib/red_amber/vector_updatable.rb +6 -3
- data/lib/red_amber/version.rb +1 -1
- data/lib/red_amber.rb +1 -0
- metadata +13 -3
- data/doc/examples_of_red_amber.ipynb +0 -8979
data/lib/red_amber/helper.rb
CHANGED
@@ -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
|
42
|
-
[
|
37
|
+
when NilClass
|
38
|
+
[nil]
|
43
39
|
when Range
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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...
|
50
|
+
Array(0...vsize)[elem]
|
51
|
+
elsif bg.nil? && en.nil?
|
52
|
+
Array(0...vsize)
|
53
53
|
else
|
54
|
-
elem
|
54
|
+
Array[elem]
|
55
55
|
end
|
56
|
+
when Enumerator
|
57
|
+
elem.to_a
|
56
58
|
else
|
57
|
-
Array
|
59
|
+
Array[elem]
|
58
60
|
end
|
59
61
|
end
|
60
62
|
end
|
data/lib/red_amber/vector.rb
CHANGED
@@ -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
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
s
|
53
|
-
|
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
|
-
|
56
|
-
sio << ']'
|
61
|
+
sio << ']'
|
57
62
|
|
58
|
-
|
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
|
-
|
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
|
data/lib/red_amber/version.rb
CHANGED
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.
|
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-
|
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
|