polars-df 0.1.3 → 0.1.5

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/Cargo.lock +142 -11
  4. data/Cargo.toml +5 -0
  5. data/ext/polars/Cargo.toml +17 -1
  6. data/ext/polars/src/apply/dataframe.rs +292 -0
  7. data/ext/polars/src/apply/mod.rs +254 -0
  8. data/ext/polars/src/apply/series.rs +1173 -0
  9. data/ext/polars/src/conversion.rs +180 -5
  10. data/ext/polars/src/dataframe.rs +146 -1
  11. data/ext/polars/src/error.rs +12 -0
  12. data/ext/polars/src/lazy/apply.rs +34 -2
  13. data/ext/polars/src/lazy/dataframe.rs +74 -3
  14. data/ext/polars/src/lazy/dsl.rs +136 -0
  15. data/ext/polars/src/lib.rs +199 -1
  16. data/ext/polars/src/list_construction.rs +100 -0
  17. data/ext/polars/src/series.rs +331 -0
  18. data/ext/polars/src/utils.rs +25 -0
  19. data/lib/polars/cat_name_space.rb +54 -0
  20. data/lib/polars/convert.rb +100 -0
  21. data/lib/polars/data_frame.rb +1558 -60
  22. data/lib/polars/date_time_expr.rb +2 -2
  23. data/lib/polars/date_time_name_space.rb +1484 -0
  24. data/lib/polars/dynamic_group_by.rb +49 -0
  25. data/lib/polars/expr.rb +4072 -107
  26. data/lib/polars/expr_dispatch.rb +8 -0
  27. data/lib/polars/functions.rb +192 -3
  28. data/lib/polars/group_by.rb +44 -3
  29. data/lib/polars/io.rb +20 -4
  30. data/lib/polars/lazy_frame.rb +800 -26
  31. data/lib/polars/lazy_functions.rb +687 -43
  32. data/lib/polars/lazy_group_by.rb +1 -0
  33. data/lib/polars/list_expr.rb +502 -5
  34. data/lib/polars/list_name_space.rb +346 -0
  35. data/lib/polars/rolling_group_by.rb +35 -0
  36. data/lib/polars/series.rb +934 -62
  37. data/lib/polars/string_expr.rb +189 -13
  38. data/lib/polars/string_name_space.rb +690 -0
  39. data/lib/polars/struct_name_space.rb +64 -0
  40. data/lib/polars/utils.rb +44 -0
  41. data/lib/polars/version.rb +1 -1
  42. data/lib/polars.rb +14 -1
  43. metadata +15 -3
@@ -0,0 +1,64 @@
1
+ module Polars
2
+ # Series.struct namespace.
3
+ class StructNameSpace
4
+ include ExprDispatch
5
+
6
+ self._accessor = "struct"
7
+
8
+ # @private
9
+ def initialize(series)
10
+ self._s = series._s
11
+ end
12
+
13
+ # Retrieve one of the fields of this `Struct` as a new Series.
14
+ #
15
+ # @return [Series]
16
+ def [](item)
17
+ if item.is_a?(Integer)
18
+ field(fields[item])
19
+ elsif item.is_a?(String)
20
+ field(item)
21
+ else
22
+ raise ArgumentError, "expected type Integer or String, got #{item.class.name}"
23
+ end
24
+ end
25
+
26
+ # Convert this Struct Series to a DataFrame.
27
+ #
28
+ # @return [DataFrame]
29
+ def to_frame
30
+ Utils.wrap_df(_s.struct_to_frame)
31
+ end
32
+
33
+ # Get the names of the fields.
34
+ #
35
+ # @return [Array]
36
+ def fields
37
+ if _s.nil?
38
+ []
39
+ else
40
+ _s.struct_fields
41
+ end
42
+ end
43
+
44
+ # Retrieve one of the fields of this `Struct` as a new Series.
45
+ #
46
+ # @param name [String]
47
+ # Name of the field
48
+ #
49
+ # @return [Series]
50
+ def field(name)
51
+ super
52
+ end
53
+
54
+ # Rename the fields of the struct.
55
+ #
56
+ # @param names [Array]
57
+ # New names in the order of the struct's fields
58
+ #
59
+ # @return [Series]
60
+ def rename_fields(names)
61
+ super
62
+ end
63
+ end
64
+ end
data/lib/polars/utils.rb CHANGED
@@ -11,6 +11,10 @@ module Polars
11
11
  DataFrame._from_rbdf(df)
12
12
  end
13
13
 
14
+ def self.wrap_ldf(ldf)
15
+ LazyFrame._from_rbldf(ldf)
16
+ end
17
+
14
18
  def self.wrap_expr(rbexpr)
15
19
  Expr._from_rbexpr(rbexpr)
16
20
  end
@@ -37,6 +41,34 @@ module Polars
37
41
  end
38
42
  end
39
43
 
44
+ def self._to_ruby_datetime(value, dtype, tu: "ns", tz: nil)
45
+ if dtype == :date
46
+ # days to seconds
47
+ # important to create from utc. Not doing this leads
48
+ # to inconsistencies dependent on the timezone you are in.
49
+ Time.at(value * 86400).utc.to_date
50
+ # TODO fix dtype
51
+ elsif dtype.to_s.start_with?("datetime[")
52
+ if tz.nil? || tz == ""
53
+ if tu == "ns"
54
+ raise Todo
55
+ elsif tu == "us"
56
+ dt = Time.at(value / 1000000, value % 1000000, :usec).utc
57
+ elsif tu == "ms"
58
+ raise Todo
59
+ else
60
+ raise ArgumentError, "tu must be one of {{'ns', 'us', 'ms'}}, got #{tu}"
61
+ end
62
+ else
63
+ raise Todo
64
+ end
65
+
66
+ dt
67
+ else
68
+ raise NotImplementedError
69
+ end
70
+ end
71
+
40
72
  def self.selection_to_rbexpr_list(exprs)
41
73
  if exprs.is_a?(String) || exprs.is_a?(Expr) || exprs.is_a?(Series)
42
74
  exprs = [exprs]
@@ -143,5 +175,17 @@ module Polars
143
175
  def self.bool?(value)
144
176
  value == true || value == false
145
177
  end
178
+
179
+ def self._is_iterable_of(val, eltype)
180
+ val.all? { |x| x.is_a?(eltype) }
181
+ end
182
+
183
+ def self.is_str_sequence(val, allow_str: false)
184
+ if allow_str == false && val.is_a?(String)
185
+ false
186
+ else
187
+ val.is_a?(Array) && _is_iterable_of(val, String)
188
+ end
189
+ end
146
190
  end
147
191
  end
@@ -1,4 +1,4 @@
1
1
  module Polars
2
2
  # @private
3
- VERSION = "0.1.3"
3
+ VERSION = "0.1.5"
4
4
  end
data/lib/polars.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  # ext
2
- require "polars/polars"
2
+ begin
3
+ require "polars/#{RUBY_VERSION.to_f}/polars"
4
+ rescue LoadError
5
+ require "polars/polars"
6
+ end
3
7
 
4
8
  # stdlib
5
9
  require "date"
@@ -8,8 +12,12 @@ require "date"
8
12
  require "polars/expr_dispatch"
9
13
  require "polars/batched_csv_reader"
10
14
  require "polars/cat_expr"
15
+ require "polars/cat_name_space"
16
+ require "polars/convert"
11
17
  require "polars/data_frame"
12
18
  require "polars/date_time_expr"
19
+ require "polars/date_time_name_space"
20
+ require "polars/dynamic_group_by"
13
21
  require "polars/exceptions"
14
22
  require "polars/expr"
15
23
  require "polars/functions"
@@ -19,17 +27,22 @@ require "polars/lazy_frame"
19
27
  require "polars/lazy_functions"
20
28
  require "polars/lazy_group_by"
21
29
  require "polars/list_expr"
30
+ require "polars/list_name_space"
22
31
  require "polars/meta_expr"
32
+ require "polars/rolling_group_by"
23
33
  require "polars/series"
24
34
  require "polars/slice"
25
35
  require "polars/string_expr"
36
+ require "polars/string_name_space"
26
37
  require "polars/struct_expr"
38
+ require "polars/struct_name_space"
27
39
  require "polars/utils"
28
40
  require "polars/version"
29
41
  require "polars/when"
30
42
  require "polars/when_then"
31
43
 
32
44
  module Polars
45
+ extend Convert
33
46
  extend Functions
34
47
  extend IO
35
48
  extend LazyFunctions
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polars-df
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-28 00:00:00.000000000 Z
11
+ date: 2022-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rb_sys
@@ -39,6 +39,9 @@ files:
39
39
  - README.md
40
40
  - ext/polars/Cargo.toml
41
41
  - ext/polars/extconf.rb
42
+ - ext/polars/src/apply/dataframe.rs
43
+ - ext/polars/src/apply/mod.rs
44
+ - ext/polars/src/apply/series.rs
42
45
  - ext/polars/src/batched_csv.rs
43
46
  - ext/polars/src/conversion.rs
44
47
  - ext/polars/src/dataframe.rs
@@ -51,6 +54,7 @@ files:
51
54
  - ext/polars/src/lazy/mod.rs
52
55
  - ext/polars/src/lazy/utils.rs
53
56
  - ext/polars/src/lib.rs
57
+ - ext/polars/src/list_construction.rs
54
58
  - ext/polars/src/series.rs
55
59
  - ext/polars/src/set.rs
56
60
  - ext/polars/src/utils.rs
@@ -58,8 +62,12 @@ files:
58
62
  - lib/polars.rb
59
63
  - lib/polars/batched_csv_reader.rb
60
64
  - lib/polars/cat_expr.rb
65
+ - lib/polars/cat_name_space.rb
66
+ - lib/polars/convert.rb
61
67
  - lib/polars/data_frame.rb
62
68
  - lib/polars/date_time_expr.rb
69
+ - lib/polars/date_time_name_space.rb
70
+ - lib/polars/dynamic_group_by.rb
63
71
  - lib/polars/exceptions.rb
64
72
  - lib/polars/expr.rb
65
73
  - lib/polars/expr_dispatch.rb
@@ -70,11 +78,15 @@ files:
70
78
  - lib/polars/lazy_functions.rb
71
79
  - lib/polars/lazy_group_by.rb
72
80
  - lib/polars/list_expr.rb
81
+ - lib/polars/list_name_space.rb
73
82
  - lib/polars/meta_expr.rb
83
+ - lib/polars/rolling_group_by.rb
74
84
  - lib/polars/series.rb
75
85
  - lib/polars/slice.rb
76
86
  - lib/polars/string_expr.rb
87
+ - lib/polars/string_name_space.rb
77
88
  - lib/polars/struct_expr.rb
89
+ - lib/polars/struct_name_space.rb
78
90
  - lib/polars/utils.rb
79
91
  - lib/polars/version.rb
80
92
  - lib/polars/when.rb
@@ -98,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
110
  - !ruby/object:Gem::Version
99
111
  version: '0'
100
112
  requirements: []
101
- rubygems_version: 3.3.7
113
+ rubygems_version: 3.3.26
102
114
  signing_key:
103
115
  specification_version: 4
104
116
  summary: Blazingly fast DataFrames for Ruby