daru_lite 0.1.3 → 0.2.0
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/.github/dependabot.yml +11 -0
- data/.github/workflows/ci.yml +2 -2
- data/.rubocop.yml +2 -2
- data/benchmarks/db_loading.rb +0 -1
- data/daru_lite.gemspec +10 -12
- data/daru_lite_test-shm +0 -0
- data/daru_lite_test-wal +0 -0
- data/lib/daru_lite/accessors/array_wrapper.rb +4 -4
- data/lib/daru_lite/core/merge.rb +8 -8
- data/lib/daru_lite/data_frame/calculatable.rb +2 -2
- data/lib/daru_lite/data_frame/filterable.rb +4 -4
- data/lib/daru_lite/data_frame/i_o_able.rb +17 -14
- data/lib/daru_lite/data_frame/iterable.rb +11 -11
- data/lib/daru_lite/data_frame/queryable.rb +5 -5
- data/lib/daru_lite/dataframe.rb +15 -13
- data/lib/daru_lite/date_time/index.rb +10 -10
- data/lib/daru_lite/extensions/which_dsl.rb +2 -2
- data/lib/daru_lite/index/index.rb +3 -3
- data/lib/daru_lite/index/multi_index.rb +4 -4
- data/lib/daru_lite/io/io.rb +10 -9
- data/lib/daru_lite/io/sql_data_source.rb +7 -24
- data/lib/daru_lite/maths/statistics/dataframe.rb +2 -2
- data/lib/daru_lite/maths/statistics/vector.rb +16 -16
- data/lib/daru_lite/vector/aggregatable.rb +2 -2
- data/lib/daru_lite/vector/filterable.rb +2 -2
- data/lib/daru_lite/vector/queryable.rb +4 -4
- data/lib/daru_lite/vector/sortable.rb +4 -4
- data/lib/daru_lite/vector.rb +4 -6
- data/lib/daru_lite/version.rb +1 -1
- data/spec/io/io_spec.rb +0 -16
- data/spec/io/sql_data_source_spec.rb +0 -8
- data/spec/spec_helper.rb +1 -1
- data/spec/support/database_helper.rb +0 -1
- metadata +30 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bebf18b1b341f84a4728386060168694ffb47fdd49af1c4621db8a4a3591aa44
|
4
|
+
data.tar.gz: 1f1bbf2e6ef445496d1f7c58a79e8b74054a78b6cfdcf1f8e4431870cddce437
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1a020700e73fb9a48bfefb225ab79d465658df60fd95bed92ad4053533a0f6f4d6ea1d4e7b5e4dd10a11b79d7f2a5ade80345a87a81efb2eea5124db29d77be
|
7
|
+
data.tar.gz: 148611db5a2ef6c16b2974131f1c7a1e8298f7537d9868d26a248181478266bae61ce2e1810f6d513391fbfa7deaf66c239491102eae56d698791da26665827a
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# To get started with Dependabot version updates, you'll need to specify which
|
2
|
+
# package ecosystems to update and where the package manifests are located.
|
3
|
+
# Please see the documentation for all configuration options:
|
4
|
+
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
5
|
+
|
6
|
+
version: 2
|
7
|
+
updates:
|
8
|
+
- package-ecosystem: "bundler" # See documentation for possible values
|
9
|
+
directory: "/" # Location of package manifests
|
10
|
+
schedule:
|
11
|
+
interval: "daily"
|
data/.github/workflows/ci.yml
CHANGED
@@ -19,7 +19,7 @@ jobs:
|
|
19
19
|
- name: Set up Ruby
|
20
20
|
uses: ruby/setup-ruby@v1
|
21
21
|
with:
|
22
|
-
ruby-version: 3.
|
22
|
+
ruby-version: 3.4
|
23
23
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
24
24
|
- name: Run linters
|
25
25
|
run: |
|
@@ -29,7 +29,7 @@ jobs:
|
|
29
29
|
runs-on: ubuntu-latest
|
30
30
|
strategy:
|
31
31
|
matrix:
|
32
|
-
ruby-version: ['3.
|
32
|
+
ruby-version: ['3.4']
|
33
33
|
|
34
34
|
steps:
|
35
35
|
- uses: actions/checkout@v3
|
data/.rubocop.yml
CHANGED
data/benchmarks/db_loading.rb
CHANGED
data/daru_lite.gemspec
CHANGED
@@ -28,29 +28,27 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
29
29
|
spec.require_paths = ["lib"]
|
30
30
|
|
31
|
-
spec.add_development_dependency 'activerecord', '~>
|
31
|
+
spec.add_development_dependency 'activerecord', '~> 8.0'
|
32
32
|
spec.add_development_dependency 'awesome_print', '~> 1.9.2'
|
33
|
-
spec.add_development_dependency 'bundler', '~> 2.
|
34
|
-
spec.add_development_dependency '
|
35
|
-
spec.add_development_dependency '
|
33
|
+
spec.add_development_dependency 'bundler', '~> 2.6'
|
34
|
+
spec.add_development_dependency 'csv', '~> 3.3.4'
|
35
|
+
spec.add_development_dependency 'debug', '>= 1.0.0'
|
36
36
|
spec.add_development_dependency 'distribution', '~> 0.8'
|
37
37
|
spec.add_development_dependency 'matrix', '~> 0.4.2'
|
38
|
-
spec.add_development_dependency 'nokogiri', '~> 1.
|
38
|
+
spec.add_development_dependency 'nokogiri', '~> 1.18.0'
|
39
39
|
spec.add_development_dependency 'prime', '~> 0.1.2'
|
40
|
-
spec.add_development_dependency 'pry', '~> 0.14'
|
41
|
-
spec.add_development_dependency 'pry-byebug', '~> 3.10.1'
|
42
40
|
spec.add_development_dependency 'rake', '~> 13.0'
|
43
41
|
spec.add_development_dependency 'rspec', '~> 3.11'
|
44
|
-
spec.add_development_dependency 'rspec-its', '~>
|
42
|
+
spec.add_development_dependency 'rspec-its', '~> 2.0.0'
|
45
43
|
spec.add_development_dependency 'rubocop', '~> 1.60'
|
46
|
-
spec.add_development_dependency 'rubocop-performance', '~> 1.
|
47
|
-
spec.add_development_dependency 'rubocop-rspec', '~>
|
44
|
+
spec.add_development_dependency 'rubocop-performance', '~> 1.25.0'
|
45
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 3.6'
|
48
46
|
spec.add_development_dependency 'ruby-prof', '~> 1.7.0'
|
49
47
|
spec.add_development_dependency 'simplecov', '~> 0.22.0'
|
50
48
|
spec.add_development_dependency 'simplecov_json_formatter', '~> 0.1.4'
|
51
49
|
spec.add_development_dependency 'spreadsheet', '~> 1.3.0'
|
52
|
-
spec.add_development_dependency 'sqlite3', '~>
|
50
|
+
spec.add_development_dependency 'sqlite3', '~> 2.6.0'
|
53
51
|
# issue : https://github.com/SciRuby/daru/issues/493 occured
|
54
52
|
# with latest version of sqlite3
|
55
|
-
spec.add_development_dependency 'webmock', '~> 3.
|
53
|
+
spec.add_development_dependency 'webmock', '~> 3.25.0'
|
56
54
|
end
|
data/daru_lite_test-shm
ADDED
Binary file
|
data/daru_lite_test-wal
ADDED
File without changes
|
data/lib/daru_lite/core/merge.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
module DaruLite
|
2
2
|
module Core
|
3
3
|
class MergeFrame
|
4
|
+
LEFT_RIGHT_COMBINATIONS = {
|
5
|
+
# left right
|
6
|
+
inner: [false, false],
|
7
|
+
left: [true, false],
|
8
|
+
right: [false, true],
|
9
|
+
outer: [true, true]
|
10
|
+
}.freeze
|
11
|
+
|
4
12
|
class NilSorter
|
5
13
|
include Comparable
|
6
14
|
|
@@ -55,14 +63,6 @@ module DaruLite
|
|
55
63
|
|
56
64
|
attr_accessor :merge_key
|
57
65
|
|
58
|
-
LEFT_RIGHT_COMBINATIONS = {
|
59
|
-
# left right
|
60
|
-
inner: [false, false],
|
61
|
-
left: [true, false],
|
62
|
-
right: [false, true],
|
63
|
-
outer: [true, true]
|
64
|
-
}.freeze
|
65
|
-
|
66
66
|
def init_opts(opts)
|
67
67
|
@on = opts[:on]
|
68
68
|
@keep_left, @keep_right = extract_left_right(opts[:how])
|
@@ -110,8 +110,8 @@ module DaruLite
|
|
110
110
|
# # 4 555
|
111
111
|
# # 5 666
|
112
112
|
# # 6 777
|
113
|
-
def vector_by_calculation(&
|
114
|
-
a = each_row.map { |r| r.instance_eval(&
|
113
|
+
def vector_by_calculation(&)
|
114
|
+
a = each_row.map { |r| r.instance_eval(&) }
|
115
115
|
|
116
116
|
DaruLite::Vector.new a, index: @index
|
117
117
|
end
|
@@ -68,8 +68,8 @@ module DaruLite
|
|
68
68
|
# df.filter(:row) do |row|
|
69
69
|
# row[:a] + row[:d] < 100
|
70
70
|
# end
|
71
|
-
def filter(axis = :vector, &
|
72
|
-
dispatch_to_axis_pl
|
71
|
+
def filter(axis = :vector, &)
|
72
|
+
dispatch_to_axis_pl(axis, :filter, &)
|
73
73
|
end
|
74
74
|
|
75
75
|
# Returns a dataframe in which rows with any of the mentioned values
|
@@ -113,8 +113,8 @@ module DaruLite
|
|
113
113
|
end
|
114
114
|
|
115
115
|
# creates a new vector with the data of a given field which the block returns true
|
116
|
-
def filter_vector(vec, &
|
117
|
-
DaruLite::Vector.new(each_row.select(&
|
116
|
+
def filter_vector(vec, &)
|
117
|
+
DaruLite::Vector.new(each_row.select(&).map { |row| row[vec] })
|
118
118
|
end
|
119
119
|
|
120
120
|
# Iterates over each row and retains it in a new DataFrame if the block returns
|
@@ -32,8 +32,8 @@ module DaruLite
|
|
32
32
|
# :col_sep => ',',
|
33
33
|
# :converters => :numeric
|
34
34
|
# }
|
35
|
-
def from_csv(path, opts = {}, &
|
36
|
-
DaruLite::IO.from_csv
|
35
|
+
def from_csv(path, opts = {}, &)
|
36
|
+
DaruLite::IO.from_csv(path, opts, &)
|
37
37
|
end
|
38
38
|
|
39
39
|
# Read data from an Excel file into a DataFrame.
|
@@ -45,28 +45,30 @@ module DaruLite
|
|
45
45
|
# == Options
|
46
46
|
#
|
47
47
|
# *:worksheet_id - ID of the worksheet that is to be read.
|
48
|
-
def from_excel(path, opts = {}, &
|
49
|
-
DaruLite::IO.from_excel
|
48
|
+
def from_excel(path, opts = {}, &)
|
49
|
+
DaruLite::IO.from_excel(path, opts, &)
|
50
50
|
end
|
51
51
|
|
52
52
|
# Read a database query and returns a Dataset
|
53
53
|
#
|
54
|
-
# @param
|
54
|
+
# @param arh [ActiveRecord::ConnectionAdapters::AbstractAdapter, String] An ActiveRecord connection
|
55
|
+
# OR Path to a SQlite3 database.
|
55
56
|
# @param query [String] The query to be executed
|
56
57
|
#
|
57
58
|
# @return A dataframe containing the data resulting from the query
|
58
59
|
#
|
59
60
|
# USE:
|
60
61
|
#
|
61
|
-
#
|
62
|
+
# ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: "path/to/sqlite.db")
|
63
|
+
# arh = ActiveRecord::Base.connection
|
62
64
|
# DaruLite::DataFrame.from_sql(dbh, "SELECT * FROM test")
|
63
65
|
#
|
64
66
|
# #Alternatively
|
65
67
|
#
|
66
|
-
# require '
|
68
|
+
# require 'active_record'
|
67
69
|
# DaruLite::DataFrame.from_sql("path/to/sqlite.db", "SELECT * FROM test")
|
68
|
-
def from_sql(
|
69
|
-
DaruLite::IO.from_sql
|
70
|
+
def from_sql(arh, query)
|
71
|
+
DaruLite::IO.from_sql arh, query
|
70
72
|
end
|
71
73
|
|
72
74
|
# Read a dataframe from AR::Relation
|
@@ -149,16 +151,17 @@ module DaruLite
|
|
149
151
|
#
|
150
152
|
# == Arguments
|
151
153
|
#
|
152
|
-
# *
|
154
|
+
# * arh - ActiveRecord database connection object.
|
153
155
|
# * query - Query string.
|
154
156
|
#
|
155
157
|
# == Usage
|
156
158
|
#
|
157
159
|
# ds = DaruLite::DataFrame.new({:id=>DaruLite::Vector.new([1,2,3]), :name=>DaruLite::Vector.new(["a","b","c"])})
|
158
|
-
#
|
159
|
-
#
|
160
|
-
|
161
|
-
|
160
|
+
# ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: "path/to/sqlite.db")
|
161
|
+
# arh = ActiveRecord::Base.connection
|
162
|
+
# ds.write_sql(arh,"test")
|
163
|
+
def write_sql(arh, table)
|
164
|
+
DaruLite::IO.dataframe_write_sql self, arh, table
|
162
165
|
end
|
163
166
|
|
164
167
|
# Use marshalling to save dataframe to a file.
|
@@ -68,8 +68,8 @@ module DaruLite
|
|
68
68
|
#
|
69
69
|
# * +axis+ - The axis to iterate over. Can be :vector (or :column)
|
70
70
|
# or :row. Default to :vector.
|
71
|
-
def each(axis = :vector, &
|
72
|
-
dispatch_to_axis
|
71
|
+
def each(axis = :vector, &)
|
72
|
+
dispatch_to_axis(axis, :each, &)
|
73
73
|
end
|
74
74
|
|
75
75
|
# Iterate over a row or vector and return results in a DaruLite::Vector.
|
@@ -87,8 +87,8 @@ module DaruLite
|
|
87
87
|
#
|
88
88
|
# * +axis+ - The axis to iterate over. Can be :vector (or :column)
|
89
89
|
# or :row. Default to :vector.
|
90
|
-
def collect(axis = :vector, &
|
91
|
-
dispatch_to_axis_pl
|
90
|
+
def collect(axis = :vector, &)
|
91
|
+
dispatch_to_axis_pl(axis, :collect, &)
|
92
92
|
end
|
93
93
|
|
94
94
|
# Map over each vector or row of the data frame according to
|
@@ -107,8 +107,8 @@ module DaruLite
|
|
107
107
|
#
|
108
108
|
# * +axis+ - The axis to map over. Can be :vector (or :column) or :row.
|
109
109
|
# Default to :vector.
|
110
|
-
def map(axis = :vector, &
|
111
|
-
dispatch_to_axis_pl
|
110
|
+
def map(axis = :vector, &)
|
111
|
+
dispatch_to_axis_pl(axis, :map, &)
|
112
112
|
end
|
113
113
|
|
114
114
|
# Destructive map. Modifies the DataFrame. Each run of the block
|
@@ -119,11 +119,11 @@ module DaruLite
|
|
119
119
|
#
|
120
120
|
# * +axis+ - The axis to map over. Can be :vector (or :column) or :row.
|
121
121
|
# Default to :vector.
|
122
|
-
def map!(axis = :vector, &
|
122
|
+
def map!(axis = :vector, &)
|
123
123
|
if %i[vector column].include?(axis)
|
124
|
-
map_vectors!(&
|
124
|
+
map_vectors!(&)
|
125
125
|
elsif axis == :row
|
126
|
-
map_rows!(&
|
126
|
+
map_rows!(&)
|
127
127
|
end
|
128
128
|
end
|
129
129
|
|
@@ -144,8 +144,8 @@ module DaruLite
|
|
144
144
|
#
|
145
145
|
# * +axis+ - The axis to map over. Can be :vector (or :column) or :row.
|
146
146
|
# Default to :vector.
|
147
|
-
def recode(axis = :vector, &
|
148
|
-
dispatch_to_axis_pl
|
147
|
+
def recode(axis = :vector, &)
|
148
|
+
dispatch_to_axis_pl(axis, :recode, &)
|
149
149
|
end
|
150
150
|
|
151
151
|
# Replace specified values with given value
|
@@ -31,9 +31,9 @@ module DaruLite
|
|
31
31
|
# df.any?(:row) do |row|
|
32
32
|
# row[:a] < 3 and row[:b] == 'b'
|
33
33
|
# end #=> true
|
34
|
-
def any?(axis = :vector, &
|
34
|
+
def any?(axis = :vector, &)
|
35
35
|
if %i[vector column].include?(axis)
|
36
|
-
@data.any?(&
|
36
|
+
@data.any?(&)
|
37
37
|
elsif axis == :row
|
38
38
|
each_row do |row|
|
39
39
|
return true if yield(row)
|
@@ -53,11 +53,11 @@ module DaruLite
|
|
53
53
|
# df.all?(:row) do |row|
|
54
54
|
# row[:a] < 10
|
55
55
|
# end #=> true
|
56
|
-
def all?(axis = :vector, &
|
56
|
+
def all?(axis = :vector, &)
|
57
57
|
if %i[vector column].include?(axis)
|
58
|
-
@data.all?(&
|
58
|
+
@data.all?(&)
|
59
59
|
elsif axis == :row
|
60
|
-
each_row.all?(&
|
60
|
+
each_row.all?(&)
|
61
61
|
else
|
62
62
|
raise ArgumentError, "Unidentified axis #{axis}"
|
63
63
|
end
|
data/lib/daru_lite/dataframe.rb
CHANGED
@@ -38,6 +38,8 @@ module DaruLite
|
|
38
38
|
include DaruLite::Maths::Arithmetic::DataFrame
|
39
39
|
include DaruLite::Maths::Statistics::DataFrame
|
40
40
|
|
41
|
+
AXES = %i[row vector].freeze
|
42
|
+
|
41
43
|
attr_accessor(*Configuration::INSPECT_OPTIONS_KEYS)
|
42
44
|
|
43
45
|
extend Gem::Deprecate
|
@@ -478,15 +480,17 @@ module DaruLite
|
|
478
480
|
self
|
479
481
|
end
|
480
482
|
|
481
|
-
def method_missing(name, *args, &
|
482
|
-
|
483
|
-
|
483
|
+
def method_missing(name, *args, &)
|
484
|
+
stringified_name = name.to_s
|
485
|
+
|
486
|
+
if /^([^=]+)=/.match?(stringified_name)
|
487
|
+
name = stringified_name[/^([^=]+)=/].delete('=')
|
484
488
|
name = name.to_sym unless has_vector?(name)
|
485
489
|
insert_or_modify_vector [name], args[0]
|
486
490
|
elsif has_vector?(name)
|
487
491
|
self[name]
|
488
|
-
elsif has_vector?(
|
489
|
-
self[
|
492
|
+
elsif has_vector?(stringified_name)
|
493
|
+
self[stringified_name]
|
490
494
|
else
|
491
495
|
super
|
492
496
|
end
|
@@ -527,28 +531,26 @@ module DaruLite
|
|
527
531
|
end
|
528
532
|
end
|
529
533
|
|
530
|
-
def dispatch_to_axis(axis, method,
|
534
|
+
def dispatch_to_axis(axis, method, *, &)
|
531
535
|
if %i[vector column].include?(axis)
|
532
|
-
send(:"#{method}_vector",
|
536
|
+
send(:"#{method}_vector", *, &)
|
533
537
|
elsif axis == :row
|
534
|
-
send(:"#{method}_row",
|
538
|
+
send(:"#{method}_row", *, &)
|
535
539
|
else
|
536
540
|
raise ArgumentError, "Unknown axis #{axis}"
|
537
541
|
end
|
538
542
|
end
|
539
543
|
|
540
|
-
def dispatch_to_axis_pl(axis, method,
|
544
|
+
def dispatch_to_axis_pl(axis, method, *, &)
|
541
545
|
if %i[vector column].include?(axis)
|
542
|
-
send(:"#{method}_vectors",
|
546
|
+
send(:"#{method}_vectors", *, &)
|
543
547
|
elsif axis == :row
|
544
|
-
send(:"#{method}_rows",
|
548
|
+
send(:"#{method}_rows", *, &)
|
545
549
|
else
|
546
550
|
raise ArgumentError, "Unknown axis #{axis}"
|
547
551
|
end
|
548
552
|
end
|
549
553
|
|
550
|
-
AXES = %i[row vector].freeze
|
551
|
-
|
552
554
|
def extract_axis(names, default = :vector)
|
553
555
|
if AXES.include?(names.last)
|
554
556
|
names.pop
|
@@ -30,7 +30,7 @@ module DaruLite
|
|
30
30
|
(
|
31
31
|
(?<offset>MONTH|YEAR|S|H|MB|ME|M|D|YB|YE) |
|
32
32
|
(?<offset>W)(-(?<weekday>#{DOW_REGEXP}))?
|
33
|
-
)$/x
|
33
|
+
)$/x
|
34
34
|
|
35
35
|
# Generates a DaruLite::DateOffset object for generic offsets or one of the
|
36
36
|
# specialized classed within DaruLite::Offsets depending on the 'frequency'
|
@@ -131,7 +131,7 @@ module DaruLite
|
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
134
|
-
DATE_PRECISION_REGEXP = /^(\d\d\d\d)(-\d{1,2}(-\d{1,2}( \d{1,2}(:\d{1,2}(:\d{1,2})?)?)?)?)
|
134
|
+
DATE_PRECISION_REGEXP = /^(\d\d\d\d)(-\d{1,2}(-\d{1,2}( \d{1,2}(:\d{1,2}(:\d{1,2})?)?)?)?)?$/
|
135
135
|
DATE_PRECISIONS = [nil, :year, :month, :day, :hour, :min, :sec].freeze
|
136
136
|
|
137
137
|
def determine_date_precision_of(date_string)
|
@@ -222,8 +222,8 @@ module DaruLite
|
|
222
222
|
new(source, freq: :infer) if source && ArrayHelper.array_of?(source, ::DateTime)
|
223
223
|
end
|
224
224
|
|
225
|
-
def each(&
|
226
|
-
to_a.each(&
|
225
|
+
def each(&)
|
226
|
+
to_a.each(&)
|
227
227
|
end
|
228
228
|
|
229
229
|
attr_reader :frequency, :offset, :periods, :keys
|
@@ -367,20 +367,20 @@ module DaruLite
|
|
367
367
|
end
|
368
368
|
end
|
369
369
|
|
370
|
-
def pos(*
|
370
|
+
def pos(*)
|
371
371
|
# to filled
|
372
|
-
out = self[*
|
372
|
+
out = self[*]
|
373
373
|
return out if out.is_a? Numeric
|
374
374
|
|
375
375
|
out.map { |date| self[date] }
|
376
376
|
end
|
377
377
|
|
378
|
-
def subset(*
|
379
|
-
self[*
|
378
|
+
def subset(*)
|
379
|
+
self[*]
|
380
380
|
end
|
381
381
|
|
382
|
-
def valid?(*
|
383
|
-
self[*
|
382
|
+
def valid?(*)
|
383
|
+
self[*]
|
384
384
|
true
|
385
385
|
rescue IndexError
|
386
386
|
false
|
@@ -12,8 +12,8 @@ module DaruLite
|
|
12
12
|
# df.which{ (`NameTitle` == 'Dr') & (`Sex` == 'female') }
|
13
13
|
# equals
|
14
14
|
# df.where( df['NameTitle'].eq('Dr') & df['Sex'].eq('female') )
|
15
|
-
def which(&
|
16
|
-
WhichQuery.new(self, &
|
15
|
+
def which(&)
|
16
|
+
WhichQuery.new(self, &).exec
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -20,7 +20,7 @@ module DaruLite
|
|
20
20
|
|
21
21
|
# We over-ride the .new method so that any sort of Index can be generated
|
22
22
|
# from DaruLite::Index based on the types of arguments supplied.
|
23
|
-
def self.new(*args, &
|
23
|
+
def self.new(*args, &)
|
24
24
|
# FIXME: I'm not sure this clever trick really deserves our attention.
|
25
25
|
# Most of common ruby libraries just avoid it in favor of usual
|
26
26
|
# factor method, like `Index.create`. When `Index.new(...).class != Index`
|
@@ -29,7 +29,7 @@ module DaruLite
|
|
29
29
|
|
30
30
|
MultiIndex.try_from_tuples(source) ||
|
31
31
|
DateTimeIndex.try_create(source) ||
|
32
|
-
allocate.tap { |i| i.send
|
32
|
+
allocate.tap { |i| i.send(:initialize, *args, &) }
|
33
33
|
end
|
34
34
|
|
35
35
|
def self.coerce(maybe_index)
|
@@ -377,7 +377,7 @@ module DaruLite
|
|
377
377
|
def numeric_pos(key)
|
378
378
|
if @relation_hash.key?(key)
|
379
379
|
@relation_hash[key]
|
380
|
-
elsif key.is_a?(Numeric) &&
|
380
|
+
elsif key.is_a?(Numeric) && key < size && key >= -size
|
381
381
|
key
|
382
382
|
else
|
383
383
|
raise IndexError, "Specified index #{key.inspect} does not exist"
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module DaruLite
|
2
2
|
class MultiIndex < Index # rubocop:disable Metrics/ClassLength
|
3
|
-
def each(&
|
4
|
-
to_a.each(&
|
3
|
+
def each(&)
|
4
|
+
to_a.each(&)
|
5
5
|
end
|
6
6
|
|
7
|
-
def map(&
|
8
|
-
to_a.map(&
|
7
|
+
def map(&)
|
8
|
+
to_a.map(&)
|
9
9
|
end
|
10
10
|
|
11
11
|
attr_reader :labels, :name
|
data/lib/daru_lite/io/io.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
module DaruLite
|
2
2
|
require_relative 'csv/converters'
|
3
|
+
|
3
4
|
module IOHelpers
|
4
5
|
class << self
|
6
|
+
INT_PATTERN = /^[-+]?\d+$/
|
7
|
+
FLOAT_PATTERN = /^[-+]?\d+[,.]?\d*(e-?\d+)?$/
|
8
|
+
|
5
9
|
def process_row(row, empty)
|
6
10
|
row.to_a.map do |c|
|
7
11
|
if empty.include?(c)
|
@@ -23,9 +27,6 @@ module DaruLite
|
|
23
27
|
|
24
28
|
private
|
25
29
|
|
26
|
-
INT_PATTERN = /^[-+]?\d+$/.freeze
|
27
|
-
FLOAT_PATTERN = /^[-+]?\d+[,.]?\d*(e-?\d+)?$/.freeze
|
28
|
-
|
29
30
|
def try_string_to_number(s)
|
30
31
|
case s
|
31
32
|
when INT_PATTERN
|
@@ -41,6 +42,8 @@ module DaruLite
|
|
41
42
|
|
42
43
|
module IO
|
43
44
|
class << self
|
45
|
+
DARU_OPT_KEYS = %i[clone order index name].freeze
|
46
|
+
|
44
47
|
# Functions for loading/writing Excel files.
|
45
48
|
|
46
49
|
def from_excel(path, opts = {})
|
@@ -124,7 +127,8 @@ module DaruLite
|
|
124
127
|
|
125
128
|
# Execute a query and create a data frame from the result
|
126
129
|
#
|
127
|
-
# @param db [
|
130
|
+
# @param db [ActiveRecord::ConnectionAdapters::AbstractAdapter, String] An ActiveRecord connection
|
131
|
+
# OR Path to a SQlite3 database.
|
128
132
|
# @param query [String] The query to be executed
|
129
133
|
#
|
130
134
|
# @return A dataframe containing the data resulting from the query
|
@@ -134,7 +138,6 @@ module DaruLite
|
|
134
138
|
end
|
135
139
|
|
136
140
|
def dataframe_write_sql(ds, dbh, table)
|
137
|
-
require 'dbi'
|
138
141
|
query = "INSERT INTO #{table} (#{ds.vectors.to_a.join(',')}) VALUES (#{(['?'] * ds.vectors.size).join(',')})"
|
139
142
|
sth = dbh.prepare(query)
|
140
143
|
ds.each_row { |c| sth.execute(*c.to_a) }
|
@@ -196,8 +199,6 @@ module DaruLite
|
|
196
199
|
DaruLite.error "\nInstall the #{name} gem version #{version} for using #{name} functions."
|
197
200
|
end
|
198
201
|
|
199
|
-
DARU_OPT_KEYS = %i[clone order index name].freeze
|
200
|
-
|
201
202
|
def from_csv_prepare_opts(opts)
|
202
203
|
opts[:col_sep] ||= ','
|
203
204
|
opts[:skip_blanks] ||= true
|
@@ -245,7 +246,7 @@ module DaruLite
|
|
245
246
|
def html_parse_table(table)
|
246
247
|
headers, headers_size = html_scrape_tag(table, 'th')
|
247
248
|
data, size = html_scrape_tag(table, 'td')
|
248
|
-
data
|
249
|
+
data.keep_if { |x| x.count == size }
|
249
250
|
order, indice = html_parse_hash(headers, size, headers_size) if headers_size >= size
|
250
251
|
return unless (indice.nil? || indice.count == data.count) && !order.nil? && order.count.positive?
|
251
252
|
|
@@ -272,7 +273,7 @@ module DaruLite
|
|
272
273
|
end
|
273
274
|
|
274
275
|
def html_search(table, match = nil)
|
275
|
-
match.nil?
|
276
|
+
match.nil? || (table.to_s.include? match)
|
276
277
|
end
|
277
278
|
|
278
279
|
# Allows user to override the scraped order / index / data
|
@@ -16,24 +16,6 @@ module DaruLite
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
# Private adapter class for DBI::DatabaseHandle
|
20
|
-
# @private
|
21
|
-
class DbiAdapter < Adapter
|
22
|
-
private
|
23
|
-
|
24
|
-
def column_names
|
25
|
-
result.column_names
|
26
|
-
end
|
27
|
-
|
28
|
-
def rows
|
29
|
-
result.to_a.map(&:to_a)
|
30
|
-
end
|
31
|
-
|
32
|
-
def result
|
33
|
-
@result ||= @conn.execute(@query)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
19
|
# Private adapter class for connections of ActiveRecord
|
38
20
|
# @private
|
39
21
|
class ActiveRecordConnectionAdapter < Adapter
|
@@ -52,7 +34,6 @@ module DaruLite
|
|
52
34
|
end
|
53
35
|
end
|
54
36
|
|
55
|
-
private_constant :DbiAdapter
|
56
37
|
private_constant :ActiveRecordConnectionAdapter
|
57
38
|
|
58
39
|
def self.make_dataframe(db, query)
|
@@ -76,8 +57,6 @@ module DaruLite
|
|
76
57
|
db = attempt_sqlite3_connection(db) if db.is_a?(String) && Pathname(db).exist?
|
77
58
|
|
78
59
|
case db
|
79
|
-
when DBI::DatabaseHandle
|
80
|
-
DbiAdapter.new(db, query)
|
81
60
|
when ActiveRecord::ConnectionAdapters::AbstractAdapter
|
82
61
|
ActiveRecordConnectionAdapter.new(db, query)
|
83
62
|
else
|
@@ -86,11 +65,15 @@ module DaruLite
|
|
86
65
|
end
|
87
66
|
|
88
67
|
def attempt_sqlite3_connection(db)
|
89
|
-
|
90
|
-
|
68
|
+
ActiveRecord::Base.establish_connection(
|
69
|
+
adapter: 'sqlite3',
|
70
|
+
database: db
|
71
|
+
)
|
72
|
+
ActiveRecord::Base.connection.tap(&:verify!)
|
73
|
+
rescue ActiveRecord::StatementInvalid
|
91
74
|
raise ArgumentError, "Expected #{db} to point to a SQLite3 database"
|
92
75
|
rescue NameError
|
93
|
-
raise NameError, "In order to establish a connection to #{db}, please require '
|
76
|
+
raise NameError, "In order to establish a connection to #{db}, please require 'ActiveRecord'"
|
94
77
|
end
|
95
78
|
end
|
96
79
|
end
|
@@ -165,10 +165,10 @@ module DaruLite
|
|
165
165
|
|
166
166
|
private
|
167
167
|
|
168
|
-
def apply_method_to_numerics(method, *
|
168
|
+
def apply_method_to_numerics(method, *)
|
169
169
|
numerics = @vectors.to_a.map { |n| [n, @data[@vectors[n]]] }
|
170
170
|
.select { |_n, v| v.numeric? }
|
171
|
-
computed = numerics.map { |_n, v| v.send(method, *
|
171
|
+
computed = numerics.map { |_n, v| v.send(method, *) }
|
172
172
|
|
173
173
|
DaruLite::DataFrame.new(computed, index: @index, order: numerics.map(&:first), clone: false)
|
174
174
|
end
|
@@ -89,8 +89,8 @@ module DaruLite
|
|
89
89
|
#
|
90
90
|
# dv.max(2) { |a,b| a.size <=> b.size }
|
91
91
|
# #=> ["Jon Starkgaryen","Daenerys"]
|
92
|
-
def max(size = nil, &
|
93
|
-
reject_values(*DaruLite::MISSING_VALUES).to_a.max(size, &
|
92
|
+
def max(size = nil, &)
|
93
|
+
reject_values(*DaruLite::MISSING_VALUES).to_a.max(size, &)
|
94
94
|
end
|
95
95
|
|
96
96
|
# Returns the maximum value(s) present in the vector, with a compulsory object block.
|
@@ -134,8 +134,8 @@ module DaruLite
|
|
134
134
|
#
|
135
135
|
# dv.min(2) { |a,b| a.size <=> b.size }
|
136
136
|
# #=> ["Tyrion","Daenerys"]
|
137
|
-
def min(size = nil, &
|
138
|
-
reject_values(*DaruLite::MISSING_VALUES).to_a.min(size, &
|
137
|
+
def min(size = nil, &)
|
138
|
+
reject_values(*DaruLite::MISSING_VALUES).to_a.min(size, &)
|
139
139
|
end
|
140
140
|
|
141
141
|
# Returns the minimum value(s) present in the vector, with a compulsory object block.
|
@@ -179,9 +179,9 @@ module DaruLite
|
|
179
179
|
#
|
180
180
|
# dv.max(2) { |a,b| a.size <=> b.size }
|
181
181
|
# #=> ["Jon Starkgaryen","Daenerys"]
|
182
|
-
def max(size = nil, &
|
182
|
+
def max(size = nil, &)
|
183
183
|
range = size.nil? ? 0 : (0..size - 1)
|
184
|
-
reject_values(*DaruLite::MISSING_VALUES).to_a.sort(&
|
184
|
+
reject_values(*DaruLite::MISSING_VALUES).to_a.sort(&).reverse[range]
|
185
185
|
end
|
186
186
|
|
187
187
|
# Returns the maximum value(s) present in the vector, with a compulsory object block.
|
@@ -225,9 +225,9 @@ module DaruLite
|
|
225
225
|
#
|
226
226
|
# dv.min(2) { |a,b| a.size <=> b.size }
|
227
227
|
# #=> ["Tyrion","Daenerys"]
|
228
|
-
def min(size = nil, &
|
228
|
+
def min(size = nil, &)
|
229
229
|
range = size.nil? ? 0 : (0..size - 1)
|
230
|
-
reject_values(*DaruLite::MISSING_VALUES).to_a.sort(&
|
230
|
+
reject_values(*DaruLite::MISSING_VALUES).to_a.sort(&)[range]
|
231
231
|
end
|
232
232
|
|
233
233
|
# Returns the minimum value(s) present in the vector, with a compulsory object block.
|
@@ -276,8 +276,8 @@ module DaruLite
|
|
276
276
|
#
|
277
277
|
# dv.index_of_max(2) { |a,b| a.size <=> b.size }
|
278
278
|
# #=> [:j, :d]
|
279
|
-
def index_of_max(size = nil, &
|
280
|
-
vals = max(size, &
|
279
|
+
def index_of_max(size = nil, &)
|
280
|
+
vals = max(size, &)
|
281
281
|
dv = reject_values(*DaruLite::MISSING_VALUES)
|
282
282
|
vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
|
283
283
|
end
|
@@ -299,8 +299,8 @@ module DaruLite
|
|
299
299
|
#
|
300
300
|
# dv.index_of_max_by(2) { |i| i.size }
|
301
301
|
# #=> [:j, :d]
|
302
|
-
def index_of_max_by(size = nil, &
|
303
|
-
vals = max_by(size, &
|
302
|
+
def index_of_max_by(size = nil, &)
|
303
|
+
vals = max_by(size, &)
|
304
304
|
dv = reject_values(*DaruLite::MISSING_VALUES)
|
305
305
|
vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
|
306
306
|
end
|
@@ -325,8 +325,8 @@ module DaruLite
|
|
325
325
|
#
|
326
326
|
# dv.index_of_min(2) { |a,b| a.size <=> b.size }
|
327
327
|
# #=> [:t, :d]
|
328
|
-
def index_of_min(size = nil, &
|
329
|
-
vals = min(size, &
|
328
|
+
def index_of_min(size = nil, &)
|
329
|
+
vals = min(size, &)
|
330
330
|
dv = reject_values(*DaruLite::MISSING_VALUES)
|
331
331
|
vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
|
332
332
|
end
|
@@ -348,8 +348,8 @@ module DaruLite
|
|
348
348
|
#
|
349
349
|
# dv.index_of_min(2) { |i| i.size }
|
350
350
|
# #=> [:t, :d]
|
351
|
-
def index_of_min_by(size = nil, &
|
352
|
-
vals = min_by(size, &
|
351
|
+
def index_of_min_by(size = nil, &)
|
352
|
+
vals = min_by(size, &)
|
353
353
|
dv = reject_values(*DaruLite::MISSING_VALUES)
|
354
354
|
vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
|
355
355
|
end
|
@@ -58,8 +58,8 @@ module DaruLite
|
|
58
58
|
# # 0 3 days
|
59
59
|
# # 1 35 days
|
60
60
|
# # 2 14 days
|
61
|
-
def apply_where(bool_array, &
|
62
|
-
DaruLite::Core::Query.vector_apply_where
|
61
|
+
def apply_where(bool_array, &)
|
62
|
+
DaruLite::Core::Query.vector_apply_where(self, bool_array, &)
|
63
63
|
end
|
64
64
|
|
65
65
|
# Keep only unique elements of the vector alongwith their indexes.
|
@@ -17,12 +17,12 @@ module DaruLite
|
|
17
17
|
values.any? { |v| include_with_nan? @data, v }
|
18
18
|
end
|
19
19
|
|
20
|
-
def any?(&
|
21
|
-
@data.data.any?(&
|
20
|
+
def any?(&)
|
21
|
+
@data.data.any?(&)
|
22
22
|
end
|
23
23
|
|
24
|
-
def all?(&
|
25
|
-
@data.data.all?(&
|
24
|
+
def all?(&)
|
25
|
+
@data.data.all?(&)
|
26
26
|
end
|
27
27
|
|
28
28
|
# Returns an array of either none or integer values, indicating the
|
@@ -17,10 +17,10 @@ module DaruLite
|
|
17
17
|
# v = DaruLite::Vector.new ["My first guitar", "jazz", "guitar"]
|
18
18
|
# # Say you want to sort these strings by length.
|
19
19
|
# v.sort(ascending: false) { |a,b| a.length <=> b.length }
|
20
|
-
def sort(opts = {}, &
|
20
|
+
def sort(opts = {}, &)
|
21
21
|
opts = { ascending: true }.merge(opts)
|
22
22
|
|
23
|
-
vector_index = resort_index(@data.each_with_index, opts, &
|
23
|
+
vector_index = resort_index(@data.each_with_index, opts, &)
|
24
24
|
vector, index = vector_index.transpose
|
25
25
|
|
26
26
|
index = @index.reorder index
|
@@ -68,8 +68,8 @@ module DaruLite
|
|
68
68
|
# Just sort the data and get an Array in return using Enumerable#sort.
|
69
69
|
# Non-destructive.
|
70
70
|
# :nocov:
|
71
|
-
def sorted_data(&
|
72
|
-
@data.to_a.sort(&
|
71
|
+
def sorted_data(&)
|
72
|
+
@data.to_a.sort(&)
|
73
73
|
end
|
74
74
|
# :nocov:
|
75
75
|
|
data/lib/daru_lite/vector.rb
CHANGED
@@ -413,7 +413,7 @@ module DaruLite
|
|
413
413
|
|
414
414
|
"#<#{self.class}(#{size})#{':category' if category?}>\n" +
|
415
415
|
Formatters::Table.format(
|
416
|
-
to_a.lazy.
|
416
|
+
to_a.lazy.zip,
|
417
417
|
headers: @name && [@name],
|
418
418
|
row_headers: row_headers,
|
419
419
|
threshold: threshold,
|
@@ -508,7 +508,7 @@ module DaruLite
|
|
508
508
|
DaruLite::DataFrame.new ps
|
509
509
|
end
|
510
510
|
|
511
|
-
DATE_REGEXP = /^(\d{2}-\d{2}-\d{4}|\d{4}-\d{2}-\d{2})
|
511
|
+
DATE_REGEXP = /^(\d{2}-\d{2}-\d{4}|\d{4}-\d{2}-\d{2})$/
|
512
512
|
|
513
513
|
# Returns the database type for the vector, according to its content
|
514
514
|
def db_type
|
@@ -563,10 +563,8 @@ module DaruLite
|
|
563
563
|
dv
|
564
564
|
end
|
565
565
|
|
566
|
-
def method_missing(name, *args, &
|
567
|
-
|
568
|
-
# (string/symbol dychotomy, informative errors) or removed totally. - zverok
|
569
|
-
if name =~ /(.+)=/
|
566
|
+
def method_missing(name, *args, &)
|
567
|
+
if name =~ /^([^=]+)=/
|
570
568
|
self[Regexp.last_match(1).to_sym] = args[0]
|
571
569
|
elsif has_index?(name)
|
572
570
|
self[name]
|
data/lib/daru_lite/version.rb
CHANGED
data/spec/io/io_spec.rb
CHANGED
@@ -175,22 +175,6 @@ describe DaruLite::IO do
|
|
175
175
|
context ".from_sql" do
|
176
176
|
include_context 'with accounts table in sqlite3 database'
|
177
177
|
|
178
|
-
context 'with a database handler of DBI' do
|
179
|
-
let(:db) do
|
180
|
-
DBI.connect("DBI:SQLite3:#{db_name}")
|
181
|
-
end
|
182
|
-
|
183
|
-
subject { DaruLite::DataFrame.from_sql(db, "select * from accounts") }
|
184
|
-
|
185
|
-
it "loads data from an SQL database" do
|
186
|
-
accounts = subject
|
187
|
-
expect(accounts.class).to eq DaruLite::DataFrame
|
188
|
-
expect(accounts.nrows).to eq 2
|
189
|
-
expect(accounts.row[0][:id]).to eq 1
|
190
|
-
expect(accounts.row[0][:name]).to eq "Homer"
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
178
|
context 'with a database connection of ActiveRecord' do
|
195
179
|
let(:connection) do
|
196
180
|
DaruLite::RSpec::Account.establish_connection "sqlite3:#{db_name}"
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'daru_lite/io/sql_data_source'
|
2
2
|
require 'sqlite3'
|
3
|
-
require 'dbi'
|
4
3
|
require 'active_record'
|
5
4
|
|
6
5
|
RSpec.describe DaruLite::IO::SqlDataSource do
|
@@ -18,13 +17,6 @@ RSpec.describe DaruLite::IO::SqlDataSource do
|
|
18
17
|
describe '.make_dataframe' do
|
19
18
|
subject(:df) { DaruLite::IO::SqlDataSource.make_dataframe(source, query) }
|
20
19
|
|
21
|
-
context 'with DBI::DatabaseHandle' do
|
22
|
-
let(:source) { DBI.connect("DBI:SQLite3:#{db_name}") }
|
23
|
-
it { is_expected.to be_a(DaruLite::DataFrame) }
|
24
|
-
it { expect(df.row[0]).to have_attributes(id: 1, age: 20) }
|
25
|
-
its(:nrows) { is_expected.to eq 2 }
|
26
|
-
end
|
27
|
-
|
28
20
|
context 'with ActiveRecord::Connection' do
|
29
21
|
it { is_expected.to be_a(DaruLite::DataFrame) }
|
30
22
|
it { expect(df.row[0]).to have_attributes(id: 1, age: 20) }
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: daru_lite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Naude-Filonnière
|
@@ -9,10 +9,9 @@ authors:
|
|
9
9
|
- Julie Thomas
|
10
10
|
- Amar Slaoua
|
11
11
|
- Mourtada Belhantri
|
12
|
-
autorequire:
|
13
12
|
bindir: bin
|
14
13
|
cert_chain: []
|
15
|
-
date:
|
14
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
16
15
|
dependencies:
|
17
16
|
- !ruby/object:Gem::Dependency
|
18
17
|
name: activerecord
|
@@ -20,14 +19,14 @@ dependencies:
|
|
20
19
|
requirements:
|
21
20
|
- - "~>"
|
22
21
|
- !ruby/object:Gem::Version
|
23
|
-
version: '
|
22
|
+
version: '8.0'
|
24
23
|
type: :development
|
25
24
|
prerelease: false
|
26
25
|
version_requirements: !ruby/object:Gem::Requirement
|
27
26
|
requirements:
|
28
27
|
- - "~>"
|
29
28
|
- !ruby/object:Gem::Version
|
30
|
-
version: '
|
29
|
+
version: '8.0'
|
31
30
|
- !ruby/object:Gem::Dependency
|
32
31
|
name: awesome_print
|
33
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -48,48 +47,42 @@ dependencies:
|
|
48
47
|
requirements:
|
49
48
|
- - "~>"
|
50
49
|
- !ruby/object:Gem::Version
|
51
|
-
version: '2.
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 2.1.4
|
50
|
+
version: '2.6'
|
55
51
|
type: :development
|
56
52
|
prerelease: false
|
57
53
|
version_requirements: !ruby/object:Gem::Requirement
|
58
54
|
requirements:
|
59
55
|
- - "~>"
|
60
56
|
- !ruby/object:Gem::Version
|
61
|
-
version: '2.
|
62
|
-
- - ">="
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: 2.1.4
|
57
|
+
version: '2.6'
|
65
58
|
- !ruby/object:Gem::Dependency
|
66
|
-
name:
|
59
|
+
name: csv
|
67
60
|
requirement: !ruby/object:Gem::Requirement
|
68
61
|
requirements:
|
69
62
|
- - "~>"
|
70
63
|
- !ruby/object:Gem::Version
|
71
|
-
version:
|
64
|
+
version: 3.3.4
|
72
65
|
type: :development
|
73
66
|
prerelease: false
|
74
67
|
version_requirements: !ruby/object:Gem::Requirement
|
75
68
|
requirements:
|
76
69
|
- - "~>"
|
77
70
|
- !ruby/object:Gem::Version
|
78
|
-
version:
|
71
|
+
version: 3.3.4
|
79
72
|
- !ruby/object:Gem::Dependency
|
80
|
-
name:
|
73
|
+
name: debug
|
81
74
|
requirement: !ruby/object:Gem::Requirement
|
82
75
|
requirements:
|
83
|
-
- - "
|
76
|
+
- - ">="
|
84
77
|
- !ruby/object:Gem::Version
|
85
|
-
version: 0.
|
78
|
+
version: 1.0.0
|
86
79
|
type: :development
|
87
80
|
prerelease: false
|
88
81
|
version_requirements: !ruby/object:Gem::Requirement
|
89
82
|
requirements:
|
90
|
-
- - "
|
83
|
+
- - ">="
|
91
84
|
- !ruby/object:Gem::Version
|
92
|
-
version: 0.
|
85
|
+
version: 1.0.0
|
93
86
|
- !ruby/object:Gem::Dependency
|
94
87
|
name: distribution
|
95
88
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,14 +117,14 @@ dependencies:
|
|
124
117
|
requirements:
|
125
118
|
- - "~>"
|
126
119
|
- !ruby/object:Gem::Version
|
127
|
-
version: 1.
|
120
|
+
version: 1.18.0
|
128
121
|
type: :development
|
129
122
|
prerelease: false
|
130
123
|
version_requirements: !ruby/object:Gem::Requirement
|
131
124
|
requirements:
|
132
125
|
- - "~>"
|
133
126
|
- !ruby/object:Gem::Version
|
134
|
-
version: 1.
|
127
|
+
version: 1.18.0
|
135
128
|
- !ruby/object:Gem::Dependency
|
136
129
|
name: prime
|
137
130
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,34 +139,6 @@ dependencies:
|
|
146
139
|
- - "~>"
|
147
140
|
- !ruby/object:Gem::Version
|
148
141
|
version: 0.1.2
|
149
|
-
- !ruby/object:Gem::Dependency
|
150
|
-
name: pry
|
151
|
-
requirement: !ruby/object:Gem::Requirement
|
152
|
-
requirements:
|
153
|
-
- - "~>"
|
154
|
-
- !ruby/object:Gem::Version
|
155
|
-
version: '0.14'
|
156
|
-
type: :development
|
157
|
-
prerelease: false
|
158
|
-
version_requirements: !ruby/object:Gem::Requirement
|
159
|
-
requirements:
|
160
|
-
- - "~>"
|
161
|
-
- !ruby/object:Gem::Version
|
162
|
-
version: '0.14'
|
163
|
-
- !ruby/object:Gem::Dependency
|
164
|
-
name: pry-byebug
|
165
|
-
requirement: !ruby/object:Gem::Requirement
|
166
|
-
requirements:
|
167
|
-
- - "~>"
|
168
|
-
- !ruby/object:Gem::Version
|
169
|
-
version: 3.10.1
|
170
|
-
type: :development
|
171
|
-
prerelease: false
|
172
|
-
version_requirements: !ruby/object:Gem::Requirement
|
173
|
-
requirements:
|
174
|
-
- - "~>"
|
175
|
-
- !ruby/object:Gem::Version
|
176
|
-
version: 3.10.1
|
177
142
|
- !ruby/object:Gem::Dependency
|
178
143
|
name: rake
|
179
144
|
requirement: !ruby/object:Gem::Requirement
|
@@ -208,14 +173,14 @@ dependencies:
|
|
208
173
|
requirements:
|
209
174
|
- - "~>"
|
210
175
|
- !ruby/object:Gem::Version
|
211
|
-
version:
|
176
|
+
version: 2.0.0
|
212
177
|
type: :development
|
213
178
|
prerelease: false
|
214
179
|
version_requirements: !ruby/object:Gem::Requirement
|
215
180
|
requirements:
|
216
181
|
- - "~>"
|
217
182
|
- !ruby/object:Gem::Version
|
218
|
-
version:
|
183
|
+
version: 2.0.0
|
219
184
|
- !ruby/object:Gem::Dependency
|
220
185
|
name: rubocop
|
221
186
|
requirement: !ruby/object:Gem::Requirement
|
@@ -236,28 +201,28 @@ dependencies:
|
|
236
201
|
requirements:
|
237
202
|
- - "~>"
|
238
203
|
- !ruby/object:Gem::Version
|
239
|
-
version: 1.
|
204
|
+
version: 1.25.0
|
240
205
|
type: :development
|
241
206
|
prerelease: false
|
242
207
|
version_requirements: !ruby/object:Gem::Requirement
|
243
208
|
requirements:
|
244
209
|
- - "~>"
|
245
210
|
- !ruby/object:Gem::Version
|
246
|
-
version: 1.
|
211
|
+
version: 1.25.0
|
247
212
|
- !ruby/object:Gem::Dependency
|
248
213
|
name: rubocop-rspec
|
249
214
|
requirement: !ruby/object:Gem::Requirement
|
250
215
|
requirements:
|
251
216
|
- - "~>"
|
252
217
|
- !ruby/object:Gem::Version
|
253
|
-
version: '
|
218
|
+
version: '3.6'
|
254
219
|
type: :development
|
255
220
|
prerelease: false
|
256
221
|
version_requirements: !ruby/object:Gem::Requirement
|
257
222
|
requirements:
|
258
223
|
- - "~>"
|
259
224
|
- !ruby/object:Gem::Version
|
260
|
-
version: '
|
225
|
+
version: '3.6'
|
261
226
|
- !ruby/object:Gem::Dependency
|
262
227
|
name: ruby-prof
|
263
228
|
requirement: !ruby/object:Gem::Requirement
|
@@ -320,28 +285,28 @@ dependencies:
|
|
320
285
|
requirements:
|
321
286
|
- - "~>"
|
322
287
|
- !ruby/object:Gem::Version
|
323
|
-
version:
|
288
|
+
version: 2.6.0
|
324
289
|
type: :development
|
325
290
|
prerelease: false
|
326
291
|
version_requirements: !ruby/object:Gem::Requirement
|
327
292
|
requirements:
|
328
293
|
- - "~>"
|
329
294
|
- !ruby/object:Gem::Version
|
330
|
-
version:
|
295
|
+
version: 2.6.0
|
331
296
|
- !ruby/object:Gem::Dependency
|
332
297
|
name: webmock
|
333
298
|
requirement: !ruby/object:Gem::Requirement
|
334
299
|
requirements:
|
335
300
|
- - "~>"
|
336
301
|
- !ruby/object:Gem::Version
|
337
|
-
version: 3.
|
302
|
+
version: 3.25.0
|
338
303
|
type: :development
|
339
304
|
prerelease: false
|
340
305
|
version_requirements: !ruby/object:Gem::Requirement
|
341
306
|
requirements:
|
342
307
|
- - "~>"
|
343
308
|
- !ruby/object:Gem::Version
|
344
|
-
version: 3.
|
309
|
+
version: 3.25.0
|
345
310
|
description: |
|
346
311
|
Daru (Data Analysis in RUby) is a library for analysis, manipulation and visualization
|
347
312
|
of data. Daru works seamlessly accross interpreters and leverages interpreter-specific
|
@@ -351,13 +316,13 @@ description: |
|
|
351
316
|
and can be used with many others like mixed_models, gnuplotrb and iruby.
|
352
317
|
|
353
318
|
Daru Lite is a fork of Daru that aims to focus on data manipulation and stability.
|
354
|
-
email:
|
355
319
|
executables: []
|
356
320
|
extensions: []
|
357
321
|
extra_rdoc_files: []
|
358
322
|
files:
|
359
323
|
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
360
324
|
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
325
|
+
- ".github/dependabot.yml"
|
361
326
|
- ".github/workflows/ci.yml"
|
362
327
|
- ".gitignore"
|
363
328
|
- ".rspec"
|
@@ -386,6 +351,8 @@ files:
|
|
386
351
|
- benchmarks/where_clause.rb
|
387
352
|
- benchmarks/where_vs_filter.rb
|
388
353
|
- daru_lite.gemspec
|
354
|
+
- daru_lite_test-shm
|
355
|
+
- daru_lite_test-wal
|
389
356
|
- images/README.md
|
390
357
|
- images/con0.png
|
391
358
|
- images/con1.png
|
@@ -564,7 +531,6 @@ homepage: https://github.com/pollandroll/daru
|
|
564
531
|
licenses:
|
565
532
|
- BSD-2-Clause
|
566
533
|
metadata: {}
|
567
|
-
post_install_message:
|
568
534
|
rdoc_options: []
|
569
535
|
require_paths:
|
570
536
|
- lib
|
@@ -579,8 +545,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
579
545
|
- !ruby/object:Gem::Version
|
580
546
|
version: '0'
|
581
547
|
requirements: []
|
582
|
-
rubygems_version: 3.
|
583
|
-
signing_key:
|
548
|
+
rubygems_version: 3.6.8
|
584
549
|
specification_version: 4
|
585
550
|
summary: Data Analysis in RUby, stripped down
|
586
551
|
test_files:
|