red_amber 0.1.1 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -10
  3. data/.rubocop_todo.yml +1 -7
  4. data/CHANGELOG.md +109 -8
  5. data/README.md +66 -279
  6. data/doc/DataFrame.md +690 -0
  7. data/doc/Vector.md +195 -0
  8. data/doc/image/TDR_operations.pdf +0 -0
  9. data/doc/image/arrow_table_new.png +0 -0
  10. data/doc/image/dataframe/assign.png +0 -0
  11. data/doc/image/dataframe/drop.png +0 -0
  12. data/doc/image/dataframe/pick.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/slice.png +0 -0
  16. data/doc/image/dataframe_model.png +0 -0
  17. data/doc/image/example_in_red_arrow.png +0 -0
  18. data/doc/image/tdr.png +0 -0
  19. data/doc/image/tdr_and_table.png +0 -0
  20. data/doc/image/tidy_data_in_TDR.png +0 -0
  21. data/doc/image/vector/binary_element_wise.png +0 -0
  22. data/doc/image/vector/unary_aggregation.png +0 -0
  23. data/doc/image/vector/unary_aggregation_w_option.png +0 -0
  24. data/doc/image/vector/unary_element_wise.png +0 -0
  25. data/doc/tdr.md +53 -0
  26. data/doc/tdr_ja.md +53 -0
  27. data/lib/red_amber/data_frame.rb +42 -21
  28. data/lib/red_amber/data_frame_displayable.rb +131 -0
  29. data/lib/red_amber/data_frame_helper.rb +64 -0
  30. data/lib/red_amber/data_frame_observation_operation.rb +72 -0
  31. data/lib/red_amber/data_frame_selectable.rb +29 -35
  32. data/lib/red_amber/data_frame_variable_operation.rb +133 -0
  33. data/lib/red_amber/vector.rb +35 -2
  34. data/lib/red_amber/vector_functions.rb +134 -58
  35. data/lib/red_amber/version.rb +1 -1
  36. data/lib/red_amber.rb +4 -1
  37. data/red_amber.gemspec +5 -5
  38. metadata +35 -10
  39. data/lib/red_amber/data_frame_output.rb +0 -116
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 00ba2e99b2b1d6f977b2e2e5c7d60b9313972cf3e831918606e5388d51442137
4
- data.tar.gz: f0fc831937bff5fede4ee0f0537b0ef5fdfb8a1faa8a57082a197a627562252c
3
+ metadata.gz: 6ceace9db54b82c03ccf00fcd1b7bf2af57d94ea4e54183dc6af1da47e21ef00
4
+ data.tar.gz: f30578dcec45fd5efec9219c6438fd0108a0690b1cd69b1c398dffacd38aeba1
5
5
  SHA512:
6
- metadata.gz: 7bc020b8663c3523426461e3bd54642d4eb85a86296a8db3f5d94315091ee4475ec8b910fb87165c5d029e35fa9dc45f119bea6278e023d3cc63ad011388fbfb
7
- data.tar.gz: 78dd55182b40ee9bec769efdbcac23adb85ad93bbafe3f74c4ded9d56ab40e39da0ce1e34a841d5705e6b94fea85312057e360140965fa217243eede0d238eb5
6
+ metadata.gz: ee26fd212d0cb0758bc4611c5b43b302fe5c1b958239b5a9ac81ee09e936bdded733a719507e24e5434c33fc5d7ece43c973dd66d51413f23cc435ea0bd7570c
7
+ data.tar.gz: 674f56a11ddf906f608ecf7d7c852bec654a749e9052092553d19be967072d5acec95a096fbecc60ffd4b33fad3f4322354d93fade67230078fff15b6b7398dd
data/.rubocop.yml CHANGED
@@ -45,7 +45,7 @@ Lint/BinaryOperatorWithIdenticalOperands:
45
45
 
46
46
  # Max: 120
47
47
  Layout/LineLength:
48
- Max: 100
48
+ Max: 118
49
49
  Exclude:
50
50
  - 'test/**/*'
51
51
 
@@ -53,16 +53,18 @@ Layout/LineLength:
53
53
  # 18..30 unsatisfactory
54
54
  # > 30 dangerous
55
55
  Metrics/AbcSize:
56
- Max: 19
56
+ Max: 23
57
57
  Exclude:
58
- - 'lib/red_amber/data_frame_output.rb' # Max: 78
58
+ - 'lib/red_amber/data_frame_displayable.rb' # Max: 55
59
+ - 'lib/red_amber/data_frame_selectable.rb' # Max: 27
60
+ - 'lib/red_amber/data_frame_observation_operation.rb' # Max: 29
61
+ - 'lib/red_amber/data_frame_variable_operation.rb' # Max: 26
59
62
 
60
63
  # Max: 25
61
64
  Metrics/BlockLength:
62
65
  Max: 25
63
66
  Exclude:
64
67
  - 'test/**/*'
65
- - '*.gemspec'
66
68
 
67
69
  # Max: 100
68
70
  Metrics/ClassLength:
@@ -72,18 +74,32 @@ Metrics/ClassLength:
72
74
 
73
75
  # Max: 7
74
76
  Metrics/CyclomaticComplexity:
75
- Max: 10
76
- Exclude:
77
- - 'lib/red_amber/data_frame_output.rb' # Max: 11
77
+ Max: 12
78
78
 
79
79
  # Max: 10
80
80
  Metrics/MethodLength:
81
81
  Max: 18
82
82
  Exclude:
83
- - 'lib/red_amber/data_frame_output.rb' # Max: 35
83
+ - 'lib/red_amber/data_frame_displayable.rb' # Max: 33
84
+ - 'lib/red_amber/data_frame_observation_operation.rb' # Max: 21
85
+ - 'lib/red_amber/data_frame_variable_operation.rb' # Max: 20
86
+
87
+ # Max: 100
88
+ Metrics/ModuleLength:
89
+ Max: 100
90
+ Exclude:
91
+ - 'lib/red_amber/vector_functions.rb' # Max: 114
84
92
 
85
93
  # Max: 8
86
94
  Metrics/PerceivedComplexity:
87
- Max: 9
95
+ Max: 13
96
+
97
+ # Necessary to define is_na
98
+ Naming/PredicateName:
99
+ Exclude:
100
+ - 'lib/red_amber/vector_functions.rb'
101
+
102
+ # Necessary to test when range.end == -1
103
+ Style/SlicingWithRange:
88
104
  Exclude:
89
- - 'lib/red_amber/data_frame_output.rb' # Max: 12
105
+ - 'test/test_data_frame_selectable.rb'
data/.rubocop_todo.yml CHANGED
@@ -1,17 +1,11 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2022-04-27 00:29:57 UTC using RuboCop version 1.27.0.
3
+ # on 2022-05-08 02:37:36 UTC using RuboCop version 1.27.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 1
10
- # This cop supports unsafe auto-correction (--auto-correct-all).
11
- Style/SlicingWithRange:
12
- Exclude:
13
- - 'lib/red_amber/data_frame_selectable.rb'
14
-
15
9
  # Offense count: 1
16
10
  # This cop supports unsafe auto-correction (--auto-correct-all).
17
11
  # Configuration parameters: EnforcedStyle.
data/CHANGELOG.md CHANGED
@@ -1,17 +1,118 @@
1
- ## [0.1.2] - Unreleased
1
+ ## - Unreleased
2
+
3
+ - Feedback something to Red Arrow
2
4
 
3
- - Add support for Arrow 8.0.0
4
5
  - `DataFrame`
5
- - Introduce updating
6
- - Introduce NA support
7
- - Add slice method
6
+ - Introduce `group_by`
7
+ - Introduce `summarize`
8
+ - Introduce `summary` or ``describe`
9
+ - Improve dataframe obs. manipuration methods to accept float as a index (#10)
10
+ - More performant
11
+
8
12
  - `Vector`
9
- - Add NaN support for functions
10
- - More functions
13
+ - Support more functions
14
+
15
+ - Document
16
+ - YARD support
17
+
18
+ ## [0.1.4] - 2022-05-29 (experimental)
19
+
20
+ - Bug fixes
21
+ - Fix missing support for scalar argument (#1)
22
+ - Fix type name of boolean in DF#types to be same as Vector#type (#6, #7)
23
+ - Fix zero picking to return empty DataFrame (#8)
24
+ - Fix code at both args and a block given (#8)
25
+
26
+ - New features and improvements
27
+ - `DataFrame`
28
+ - Refine module name `Displayable`
29
+ - Rename nrow/ncol methods to `size`/`n_keys` to align with TDR concept (#4)
30
+ - Remain `n_row`/`n_col` for compatibility
31
+ - Rename `ls` method to `tdr` (#4)
32
+ - Add limit option to `tdr`
33
+ - Shorten option name (#11)
34
+ - Introduce `pick` method to create sub DataFrame (#8)
35
+ - Add boolean support (#8)
36
+ - Refactor `pick` (#9)
37
+ - Introduce `drop` method to create sub DataFrame (#8)
38
+ - Add boolean support (#8)
39
+ - Refactor `drop` (#9)
40
+ - Add boolean array support for `[]` (#9)
41
+ - Add `indexes`/`indices` to use with selecting observations (#9)
42
+ - Introduce `slice` method to create sub DataFrame (#8)
43
+ - Refactor `slice` (#9)
44
+ - Introduce `remove` method to create sub DataFrame (#9)
45
+ - Introduce `rename` method to create sub DataFrame (#14)
46
+ - Introduce `assign` method to create sub DataFrame (#14)
47
+ - Improve to call block by instance_eval (#13)
48
+
49
+ - `Vector`
50
+ - Refine `find(function)`
51
+ - Add `min_max` method (#2)
52
+ - Add `std`/`sd` method (ddof=0 version: `stddev`) (#2)
53
+ - Add `var` method (ddof=0 version: `variance`) (#2)
54
+ - Add `VectorFunctions.arrow_doc(func_name)` (temporally)
55
+
56
+ - Documentation
57
+ - Show code in README
58
+ - Change row/column names for **TDR** concept (#4)
59
+ - Add documents about **TDR** concept (#4)
60
+ - Add example about TDR (#4)
61
+ - Separate README to create DataFrame and Vector documents (#12)
62
+ - Add DataFrame model concept image to README (#12)
63
+
64
+ - GitHub site
65
+ - Switched to use merge on GitHub (not to push merged master) (#1)
66
+ - Create lifetime issue #3 to show the goal of this project (#3)
67
+
68
+ ## [0.1.3] - 2022-05-15 (experimental)
69
+
70
+ - Bug fixes
71
+ - Fix boolean functions in `Vector` to align with Ruby's behavior
72
+ - `&` == `and_kleene`
73
+ - `|` == `or_kleene`
74
+ - Quote strings of data-preview in `DataFrame#inspect`
75
+ - Quote empty and blank keys in `DataFrame#inspect`
76
+ - Respond to error for a wrong key in `DataFrame#[]`
77
+
78
+ - New features and improvements
79
+ - `DataFrame`
80
+ - Display nil elements in `inspect`
81
+ - Show NaN and nil counts in `inspect`
82
+ - Refactor `inspect`
83
+ - Add method `key` and `key_index`
84
+ - Add how to load/save Parquet to README
85
+
86
+ - `Vector`
87
+ - Add categorization functions
88
+
89
+ This is an important step to support `slice` method and NA treatment features.
90
+ - `is_finite`
91
+ - `is_inf`
92
+ - `is_na` (RedAmber original)
93
+ - `is_nan`
94
+ - `is_nil`, `is_null`
95
+ - `is_valid`
96
+ - Show in a reduced representation for long array in `inspect`
97
+ - Support options in aggregatiton functions
98
+ - Return values in non-arrow object for scalar aggregation functions
99
+
100
+ ## [0.1.2] - 2022-05-08 (experimental)
101
+
102
+ - Bug fixes:
103
+ - `DataFrame`
104
+ - Fix bug in `#[]` with end-less Range
105
+ - New features and improvements
106
+ - Add support for Arrow 8.0.0
107
+ - `DataFrame`
108
+ - `types` and `data_types`
109
+ - Range is usable to specify columns in `#[]`
110
+ - `Vector`
111
+ - `type` and `data_type`
11
112
 
12
113
  ## [0.1.1] - 2022-05-06 (experimental)
13
114
 
14
- - Release on rubygem.org
115
+ - Release on rubygems.org
15
116
  - Introduce class `DataFrame`
16
117
  - New from Hash, schema/rows, `Arrow::Table`, `Rover::DataFrame`
17
118
  - Load from file, string, URI
data/README.md CHANGED
@@ -8,8 +8,8 @@ A simple dataframe library for Ruby (experimental)
8
8
  ## Requirements
9
9
 
10
10
  ```ruby
11
- gem 'red-arrow', '~> 7.0.0'
12
- gem 'red-parquet', '~> 7.0.0' # if you use IO from/to parquet
11
+ gem 'red-arrow', '>= 7.0.0'
12
+ gem 'red-parquet', '>= 7.0.0' # if you use IO from/to parquet
13
13
  gem 'rover-df', '~> 0.3.0' # if you use IO from/to Rover::DataFrame
14
14
  ```
15
15
 
@@ -23,308 +23,95 @@ gem 'red_amber'
23
23
 
24
24
  And then execute:
25
25
 
26
- $ bundle install
26
+ ```shell
27
+ bundle install
28
+ ```
27
29
 
28
30
  Or install it yourself as:
29
31
 
30
- $ gem install red_amber
32
+ ```shell
33
+ gem install red_amber
34
+ ```
31
35
 
32
36
  ## `RedAmber::DataFrame`
33
37
 
34
- ### Constructors and saving
35
-
36
- - [x] `new` from a columnar Hash
37
- - `RedAmber::DataFrame.new(x: [1, 2, 3])`
38
-
39
- - [x] `new` from a schema (by Hash) and rows (by Array)
40
- - `RedAmber::DataFrame.new({:x=>:uint8}, [[1], [2], [3]])`
41
-
42
- - [x] `new` from an Arrow::Table
43
- - `RedAmber::DataFrame.new(Arrow::Table.new(x: [1, 2, 3]))`
44
-
45
- - [x] `new` from a Rover::DataFrame
46
- - `RedAmber::DataFrame.new(Rover::DataFrame.new(x: [1, 2, 3]))`
47
-
48
- - [ ] `load` (class method)
49
-
50
- - [x] from a [`.arrow`, `.arrows`, `.csv`, `.csv.gz`, `.tsv`] file
51
- - `RedAmber::DataFrame.load("test/entity/with_header.csv")`
52
-
53
- - [x] from a string buffer
54
-
55
- - [x] from a URI
56
- - `RedAmber::DataFrame.load(URI("https://github.com/heronshoes/red_amber/blob/master/test/entity/with_header.csv"))`
57
-
58
- - [ ] from a parquet file
59
-
60
- - [ ] `save` (instance method)
61
-
62
- - [x] to a [`.arrow`, `.arrows`, `.csv`, `.csv.gz`, `.tsv`] file
63
-
64
- - [x] to a string buffer
65
-
66
- - [x] to a URI
67
-
68
- - [ ] to a parquet file
69
-
70
- ### Properties
71
-
72
- - [x] `table`
73
-
74
- Reader of Arrow::Table object inside.
75
-
76
- - [x] `n_rows`, `nrow`, `size`, `length`
77
-
78
- Returns num of rows (data size).
79
-
80
- - [x] `n_columns`, `ncol`, `width`
81
-
82
- Returns num of columns (num of vectors).
83
-
84
- - [x] `shape`
85
-
86
- Returns shape in an Array[n_rows, n_cols].
87
-
88
- - [x] `column_names`, `keys`
89
-
90
- Returns num of column names by an Array.
91
-
92
- - [x] `types(class_name: false)`
93
-
94
- Returns types of columns by an Array.
95
- If `class_name: true` returns an Array of `Arrow::DataType`.
96
-
97
- - [x] `vectors`
98
-
99
- Returns an Array of Vectors.
100
-
101
- - [x] `to_h`
102
-
103
- Returns column-oriented data in a Hash.
104
-
105
- - [x] `to_a`, `raw_records`
106
-
107
- Returns an array of row-oriented data without header. If you need a column-oriented full array, use `.to_h.to_a`
108
-
109
- - [x] `schema`
110
-
111
- Returns column name and data type in a Hash.
112
-
113
- - [x] `==`
114
-
115
- - [x] `empty?`
116
-
117
- ### Output
118
-
119
- - [x] `to_s`
120
-
121
- - [ ] summary, describe
122
-
123
- - [x] `to_rover`
38
+ Represents a set of data in 2D-shape.
124
39
 
125
- Returns a `Rover::DataFrame`.
126
-
127
- - [x] `inspect(tally_level: 5, max_element: 5)`
128
-
129
- Shows some information about self.
130
-
131
- - tally_level: max level to use tally mode
132
- - max_element: max num of element to show values in each row
133
-
134
- ### Selecting
135
-
136
- - [x] Selecting columns by `[]`
137
-
138
- `[key]`, `[keys]`, `[keys[index]]`
139
-
140
- - [x] Selecting rows by `[]`
141
-
142
- `[index]`, `[range]`, `[array]`
143
-
144
- - [x] Selecting rows from top or bottom
145
-
146
- `head(n=5)`, `tail(n=5)`, `first(n=1)`, `last(n=1)`
147
-
148
- - [ ] slice
149
-
150
- ### Updating
151
-
152
- - [ ] Add a new column
153
-
154
- - [ ] Update a single element
155
-
156
- - [ ] Update multiple elements
157
-
158
- - [ ] Update all elements
159
-
160
- - [ ] Update elements matching a condition
161
-
162
- - [ ] Clamp
163
-
164
- - [ ] Delete columns
165
-
166
- - [ ] Rename a column
167
-
168
- - [ ] Sort rows
169
-
170
- - [ ] Clear data
171
-
172
- ### Treat na data
40
+ ```ruby
41
+ require 'red_amber'
42
+ require 'datasets-arrow'
43
+
44
+ penguins = Datasets::Penguins.new.to_arrow
45
+ puts RedAmber::DataFrame.new(penguins).tdr
46
+ # =>
47
+ RedAmber::DataFrame : 344 x 8 Vectors
48
+ Vectors : 5 numeric, 3 strings
49
+ # key type level data_preview
50
+ 1 :species string 3 {"Adelie"=>152, "Chinstrap"=>68, "Gentoo"=>124}
51
+ 2 :island string 3 {"Torgersen"=>52, "Biscoe"=>168, "Dream"=>124}
52
+ 3 :bill_length_mm double 165 [39.1, 39.5, 40.3, nil, 36.7, ... ], 2 nils
53
+ 4 :bill_depth_mm double 81 [18.7, 17.4, 18.0, nil, 19.3, ... ], 2 nils
54
+ 5 :flipper_length_mm uint8 56 [181, 186, 195, nil, 193, ... ], 2 nils
55
+ 6 :body_mass_g uint16 95 [3750, 3800, 3250, nil, 3450, ... ], 2 nils
56
+ 7 :sex string 3 {"male"=>168, "female"=>165, nil=>11}
57
+ 8 :year uint16 3 {2007=>110, 2008=>114, 2009=>120}
58
+ ```
173
59
 
174
- - [ ] Drop na (NaN, nil)
60
+ ### DataFrame model
61
+ ![dataframe model of RedAmber](doc/image/dataframe_model.png)
175
62
 
176
- - [ ] Replace na with value
63
+ For example, `DataFrame#pick` accepts keys as an argument and returns a sub DataFrame.
177
64
 
178
- - [ ] Interpolate na with convolution array
65
+ ```ruby
66
+ df = penguins.pick(:body_mass_g)
67
+ # =>
68
+ #<RedAmber::DataFrame : 344 x 1 Vector, 0x000000000000fa14>
69
+ Vector : 1 numeric
70
+ # key type level data_preview
71
+ 1 :body_mass_g int64 95 [3750, 3800, 3250, nil, 3450, ... ], 2 nils
72
+ ```
179
73
 
180
- ### Combining DataFrames
74
+ `DataFrame#assign` can accept a block and create new variables.
181
75
 
182
- - [ ] Add rows
76
+ ```ruby
77
+ df.assign do
78
+ {:body_mass_kg => penguins[:body_mass_g] / 1000.0}
79
+ end
80
+ # =>
81
+ #<RedAmber::DataFrame : 344 x 2 Vectors, 0x000000000000fa28>
82
+ Vectors : 2 numeric
83
+ # key type level data_preview
84
+ 1 :body_mass_g int64 95 [3750, 3800, 3250, nil, 3450, ... ], 2 nils
85
+ 2 :body_mass_kg double 95 [3.75, 3.8, 3.25, nil, 3.45, ... ], 2 nils
86
+ ```
183
87
 
184
- - [ ] Add columns
88
+ Other DataFrame manipulating methods like `pick`, `drop`, `slice`, `remove` and `rename` also accept a block.
185
89
 
186
- - [ ] Inner join
90
+ See [DataFrame.md](doc/DataFrame.md) for details.
187
91
 
188
- - [ ] Left join
189
92
 
190
- ### Encoding
93
+ ## `RedAmber::Vector`
191
94
 
192
- - [ ] One-hot encoding
95
+ Class `RedAmber::Vector` represents a series of data in the DataFrame.
193
96
 
194
- ### Iteration (not impremented)
97
+ ```ruby
98
+ penguins[:species]
99
+ # =>
100
+ #<RedAmber::Vector(:string, size=344):0x000000000000f8e8>
101
+ ["Adelie", "Adelie", "Adelie", "Adelie", "Adelie", "Adelie", "Adelie", "Adelie", ... ]
102
+ ```
195
103
 
196
- ### Filtering (not impremented)
104
+ Vectors accepts some [functional methods from Arrow](https://arrow.apache.org/docs/cpp/compute.html).
197
105
 
106
+ See [Vector.md](doc/Vector.md) for details.
198
107
 
199
- ## `RedAmber::Vector`
200
- ### Constructor
201
-
202
- - [x] Create from a column in a DataFrame
203
-
204
- - [x] New from an Array
205
-
206
- ### Properties
207
-
208
- - [x] `to_s`
209
-
210
- - [x] `values`, `to_a`, `entries`
211
-
212
- - [x] `size`, `length`, `n_rows`, `nrow`
213
-
214
- - [x] `type`
215
-
216
- - [ ] `each`
217
-
218
- - [ ] `chunked?`
219
-
220
- - [ ] `n_chunks`
221
-
222
- - [ ] `each_chunk`
223
-
224
- - [x] `tally`
225
-
226
- - [ ] `n_nulls`
227
-
228
- ### Functions
229
- #### Unary aggregations: vector.func => Scalar
230
-
231
- | Method |Boolean|Numeric|String|Remarks|
232
- | ------------ | --- | --- | --- | ----- |
233
- |[x] `all` | [x] | | | |
234
- |[x] `any` | [x] | | | |
235
- |[x] `approximate_median`| | [x] | | |
236
- |[x] `count` | [x] | [x] | [x] | |
237
- |[x] `count_distinct`| [x] | [x] | [x] | |
238
- |[x] `count_uniq` | [x] | [x] | [x] |an alias of `count_distinct`|
239
- |[ ] `index` | | | | |
240
- |[x] `max` | [x] | [x] | [x] | |
241
- |[x] `mean` | [x] | [x] | | |
242
- |[x] `min` | [x] | [x] | [x] | |
243
- |[ ] `min_max` | | | | |
244
- |[ ] `mode` | | | | |
245
- |[x] `product` | [x] | [x] | | |
246
- |[ ] `quantile`| | | | |
247
- |[x] `stddev` | | [x] | | |
248
- |[x] `sum` | [x] | [x] | | |
249
- |[ ] `tdigest` | | | | |
250
- |[x] `variance`| | [x] | | |
251
-
252
- #### Unary element-wise: vector.func => Vector
253
-
254
- | Method |Boolean|Numeric|String|Remarks|
255
- | ------------ | --- | --- | --- | ----- |
256
- |[x] `-@` | | [x] | |as `-vector`|
257
- |[x] `negate` | | [x] | |`-@` |
258
- |[x] `abs` | | [x] | | |
259
- |[ ] `acos` | | [ ] | | |
260
- |[ ] `asin` | | [ ] | | |
261
- |[x] `atan` | | [x] | | |
262
- |[ ] `ceil` | | [x] | | |
263
- |[x] `cos` | | [x] | | |
264
- |[ ] `floor` | | [x] | | |
265
- |[ ] `ln` | | [ ] | | |
266
- |[ ] `log10` | | [ ] | | |
267
- |[ ] `log1p` | | [ ] | | |
268
- |[ ] `log2` | | [ ] | | |
269
- |[x] `sign` | | [x] | | |
270
- |[x] `sin` | | [x] | | |
271
- |[x] `tan` | | [x] | | |
272
- |[ ] `trunc` | | [x] | | |
273
-
274
- #### Binary element-wise: vector.func(vector) => Vector
275
-
276
- | Method |Boolean|Numeric|String|Remarks|
277
- | ------------------ | --- | --- | --- | ----- |
278
- |[x] `add` | | [x] | | `+` |
279
- |[x] `atan2` | | [x] | | |
280
- |[x] `and` | [x] | | | |
281
- |[x] `and_kleene` | [x] | | | |
282
- |[x] `and_not` | [x] | | | |
283
- |[x] `and_not_kleene`| [x] | | | |
284
- |[x] `bit_wise_and` | |([x])| |`&`, integer only|
285
- |[ ] `bit_wise_not` | |([x])| |`!`, integer only|
286
- |[x] `bit_wise_or` | |([x])| |`|`, integer only|
287
- |[x] `bit_wise_xor` | |([x])| |`^`, integer only|
288
- |[x] `divide` | | [x] | | `/` |
289
- |[x] `equal` | [x] | [x] | [x] |`==`, alias `eq`|
290
- |[x] `greater` | [x] | [x] | [x] |`>`, alias `gt`|
291
- |[x] `greater_equal` | [x] | [x] | [x] |`>=`, alias `ge`|
292
- |[x] `less` | [x] | [x] | [x] |`<`, alias `lt`|
293
- |[x] `less_equal` | [x] | [x] | [x] |`<=`, alias `le`|
294
- |[ ] `logb` | | [ ] | | |
295
- |[ ] `mod` | | [ ] | | |
296
- |[x] `multiply` | | [x] | | `*` |
297
- |[x] `not_equal` | [x] | [x] | [x] |`!=`, alias `ne`|
298
- |[x] `or` | [x] | | | |
299
- |[x] `or_kleene` | [x] | | | |
300
- |[x] `power` | | [x] | | `**` |
301
- |[x] `subtract` | | [x] | | `-` |
302
- |[x] `shift_left` | |([x])| |`<<`, integer only|
303
- |[x] `shift_right` | |([x])| |`>>`, integer only|
304
- |[x] `xor` | [x] | | | |
305
-
306
- ##### (Not impremented)
307
- - [ ] invert, round, round_to_multiple
308
- - [ ] sort, sort_index
309
- - [ ] minmax, var, median, quantile
310
- - [ ] argmin, argmax
311
- - [ ] (array functions)
312
- - [ ] (strings functions)
313
- - [ ] (temporal functions)
314
- - [ ] (conditional functions)
315
- - [ ] (index functions)
316
- - [ ] (other functions)
317
-
318
- ### Coerce (not impremented)
319
-
320
- ### Updating (not impremented)
321
-
322
- ### DSL in a block for faster calculation ?
108
+ ## TDR concept
323
109
 
110
+ I named the data frame representation style in the model above as TDR (Transposed DataFrame Representation). See [TDR.md](doc/tdr.md) for details.
324
111
 
325
112
  ## Development
326
113
 
327
- ```
114
+ ```shell
328
115
  git clone https://github.com/heronshoes/red_amber.git
329
116
  cd red_amber
330
117
  bundle install