polars-df 0.15.0 → 0.26.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.
Files changed (206) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +274 -0
  3. data/Cargo.lock +1465 -867
  4. data/Cargo.toml +3 -0
  5. data/LICENSE.txt +2 -2
  6. data/README.md +87 -37
  7. data/ext/polars/Cargo.toml +47 -16
  8. data/ext/polars/src/c_api/allocator.rs +7 -0
  9. data/ext/polars/src/c_api/mod.rs +1 -0
  10. data/ext/polars/src/catalog/mod.rs +1 -0
  11. data/ext/polars/src/catalog/unity.rs +470 -0
  12. data/ext/polars/src/conversion/any_value.rs +99 -84
  13. data/ext/polars/src/conversion/categorical.rs +30 -0
  14. data/ext/polars/src/conversion/chunked_array.rs +71 -62
  15. data/ext/polars/src/conversion/datetime.rs +63 -0
  16. data/ext/polars/src/conversion/mod.rs +796 -312
  17. data/ext/polars/src/dataframe/construction.rs +6 -18
  18. data/ext/polars/src/dataframe/export.rs +30 -39
  19. data/ext/polars/src/dataframe/general.rs +294 -362
  20. data/ext/polars/src/dataframe/io.rs +33 -150
  21. data/ext/polars/src/dataframe/map.rs +175 -0
  22. data/ext/polars/src/dataframe/mod.rs +37 -5
  23. data/ext/polars/src/dataframe/serde.rs +23 -8
  24. data/ext/polars/src/error.rs +44 -7
  25. data/ext/polars/src/exceptions.rs +21 -8
  26. data/ext/polars/src/expr/array.rs +86 -22
  27. data/ext/polars/src/expr/binary.rs +50 -1
  28. data/ext/polars/src/expr/bitwise.rs +39 -0
  29. data/ext/polars/src/expr/categorical.rs +20 -0
  30. data/ext/polars/src/expr/datatype.rs +51 -0
  31. data/ext/polars/src/expr/datetime.rs +99 -41
  32. data/ext/polars/src/expr/extension.rs +12 -0
  33. data/ext/polars/src/expr/general.rs +252 -128
  34. data/ext/polars/src/expr/list.rs +56 -60
  35. data/ext/polars/src/expr/meta.rs +30 -35
  36. data/ext/polars/src/expr/mod.rs +28 -6
  37. data/ext/polars/src/expr/name.rs +29 -14
  38. data/ext/polars/src/expr/rolling.rs +111 -3
  39. data/ext/polars/src/expr/selector.rs +219 -0
  40. data/ext/polars/src/expr/serde.rs +28 -0
  41. data/ext/polars/src/expr/string.rs +118 -20
  42. data/ext/polars/src/expr/struct.rs +14 -1
  43. data/ext/polars/src/file.rs +194 -86
  44. data/ext/polars/src/functions/aggregation.rs +13 -12
  45. data/ext/polars/src/functions/business.rs +2 -3
  46. data/ext/polars/src/functions/eager.rs +3 -2
  47. data/ext/polars/src/functions/io.rs +90 -18
  48. data/ext/polars/src/functions/lazy.rs +267 -118
  49. data/ext/polars/src/functions/meta.rs +8 -7
  50. data/ext/polars/src/functions/misc.rs +1 -1
  51. data/ext/polars/src/functions/mod.rs +2 -1
  52. data/ext/polars/src/functions/range.rs +88 -31
  53. data/ext/polars/src/functions/strings.rs +6 -0
  54. data/ext/polars/src/functions/utils.rs +8 -0
  55. data/ext/polars/src/interop/arrow/mod.rs +52 -1
  56. data/ext/polars/src/interop/arrow/{to_ruby.rs → to_rb.rs} +37 -7
  57. data/ext/polars/src/interop/arrow/to_rust.rs +43 -0
  58. data/ext/polars/src/interop/numo/to_numo_df.rs +1 -1
  59. data/ext/polars/src/interop/numo/to_numo_series.rs +72 -50
  60. data/ext/polars/src/io/cloud_options.rs +107 -0
  61. data/ext/polars/src/io/mod.rs +4 -0
  62. data/ext/polars/src/io/scan_options.rs +113 -0
  63. data/ext/polars/src/io/sink_options.rs +46 -0
  64. data/ext/polars/src/io/sink_output.rs +21 -0
  65. data/ext/polars/src/lazyframe/exitable.rs +39 -0
  66. data/ext/polars/src/lazyframe/general.rs +846 -368
  67. data/ext/polars/src/lazyframe/mod.rs +58 -5
  68. data/ext/polars/src/lazyframe/optflags.rs +59 -0
  69. data/ext/polars/src/lazyframe/serde.rs +36 -4
  70. data/ext/polars/src/lazyframe/sink.rs +46 -0
  71. data/ext/polars/src/lazygroupby.rs +38 -9
  72. data/ext/polars/src/lib.rs +574 -165
  73. data/ext/polars/src/map/lazy.rs +44 -74
  74. data/ext/polars/src/map/mod.rs +18 -254
  75. data/ext/polars/src/map/series.rs +241 -1087
  76. data/ext/polars/src/on_startup.rs +192 -9
  77. data/ext/polars/src/prelude.rs +1 -0
  78. data/ext/polars/src/rb_modules.rs +10 -57
  79. data/ext/polars/src/ruby/exceptions.rs +26 -0
  80. data/ext/polars/src/ruby/gvl.rs +104 -0
  81. data/ext/polars/src/ruby/lazy.rs +46 -0
  82. data/ext/polars/src/ruby/mod.rs +11 -0
  83. data/ext/polars/src/ruby/numo.rs +52 -0
  84. data/ext/polars/src/ruby/plan_callback.rs +198 -0
  85. data/ext/polars/src/ruby/rb_modules.rs +16 -0
  86. data/ext/polars/src/ruby/ruby_convert_registry.rs +51 -0
  87. data/ext/polars/src/ruby/ruby_function.rs +11 -0
  88. data/ext/polars/src/ruby/ruby_udf.rs +164 -0
  89. data/ext/polars/src/ruby/thread.rs +65 -0
  90. data/ext/polars/src/ruby/utils.rs +39 -0
  91. data/ext/polars/src/series/aggregation.rs +116 -91
  92. data/ext/polars/src/series/arithmetic.rs +16 -22
  93. data/ext/polars/src/series/comparison.rs +101 -222
  94. data/ext/polars/src/series/construction.rs +80 -70
  95. data/ext/polars/src/series/export.rs +98 -56
  96. data/ext/polars/src/series/general.rs +323 -440
  97. data/ext/polars/src/series/import.rs +22 -5
  98. data/ext/polars/src/series/map.rs +103 -0
  99. data/ext/polars/src/series/mod.rs +57 -15
  100. data/ext/polars/src/series/scatter.rs +139 -82
  101. data/ext/polars/src/sql.rs +16 -9
  102. data/ext/polars/src/testing/frame.rs +31 -0
  103. data/ext/polars/src/testing/mod.rs +5 -0
  104. data/ext/polars/src/testing/series.rs +31 -0
  105. data/ext/polars/src/timeout.rs +105 -0
  106. data/ext/polars/src/utils.rs +105 -4
  107. data/lib/polars/array_expr.rb +500 -22
  108. data/lib/polars/array_name_space.rb +384 -10
  109. data/lib/polars/batched_csv_reader.rb +48 -66
  110. data/lib/polars/binary_expr.rb +217 -0
  111. data/lib/polars/binary_name_space.rb +155 -1
  112. data/lib/polars/cat_expr.rb +224 -0
  113. data/lib/polars/cat_name_space.rb +132 -32
  114. data/lib/polars/catalog/unity/catalog_info.rb +20 -0
  115. data/lib/polars/catalog/unity/column_info.rb +31 -0
  116. data/lib/polars/catalog/unity/namespace_info.rb +21 -0
  117. data/lib/polars/catalog/unity/table_info.rb +50 -0
  118. data/lib/polars/catalog.rb +448 -0
  119. data/lib/polars/collect_batches.rb +22 -0
  120. data/lib/polars/config.rb +3 -3
  121. data/lib/polars/convert.rb +201 -36
  122. data/lib/polars/data_frame.rb +2851 -1017
  123. data/lib/polars/data_frame_plot.rb +173 -0
  124. data/lib/polars/data_type_expr.rb +52 -0
  125. data/lib/polars/data_type_group.rb +6 -0
  126. data/lib/polars/data_types.rb +118 -18
  127. data/lib/polars/date_time_expr.rb +426 -84
  128. data/lib/polars/date_time_name_space.rb +384 -111
  129. data/lib/polars/dynamic_group_by.rb +102 -10
  130. data/lib/polars/exceptions.rb +50 -5
  131. data/lib/polars/expr.rb +2159 -915
  132. data/lib/polars/extension_expr.rb +39 -0
  133. data/lib/polars/extension_name_space.rb +39 -0
  134. data/lib/polars/functions/aggregation/horizontal.rb +11 -6
  135. data/lib/polars/functions/aggregation/vertical.rb +2 -3
  136. data/lib/polars/functions/as_datatype.rb +290 -8
  137. data/lib/polars/functions/business.rb +95 -0
  138. data/lib/polars/functions/col.rb +6 -5
  139. data/lib/polars/functions/datatype.rb +62 -0
  140. data/lib/polars/functions/eager.rb +426 -24
  141. data/lib/polars/functions/escape_regex.rb +21 -0
  142. data/lib/polars/functions/lazy.rb +813 -195
  143. data/lib/polars/functions/lit.rb +21 -10
  144. data/lib/polars/functions/range/int_range.rb +74 -2
  145. data/lib/polars/functions/range/linear_space.rb +195 -0
  146. data/lib/polars/functions/range/time_range.rb +1 -1
  147. data/lib/polars/functions/repeat.rb +7 -12
  148. data/lib/polars/functions/whenthen.rb +2 -2
  149. data/lib/polars/group_by.rb +188 -58
  150. data/lib/polars/iceberg_dataset.rb +108 -0
  151. data/lib/polars/in_process_query.rb +37 -0
  152. data/lib/polars/io/cloud.rb +18 -0
  153. data/lib/polars/io/csv.rb +336 -128
  154. data/lib/polars/io/database.rb +19 -4
  155. data/lib/polars/io/delta.rb +134 -0
  156. data/lib/polars/io/iceberg.rb +34 -0
  157. data/lib/polars/io/ipc.rb +63 -63
  158. data/lib/polars/io/json.rb +16 -0
  159. data/lib/polars/io/lines.rb +172 -0
  160. data/lib/polars/io/ndjson.rb +176 -20
  161. data/lib/polars/io/parquet.rb +173 -95
  162. data/lib/polars/io/scan_options.rb +55 -0
  163. data/lib/polars/io/sink_options.rb +27 -0
  164. data/lib/polars/io/utils.rb +17 -0
  165. data/lib/polars/lazy_frame.rb +3017 -622
  166. data/lib/polars/lazy_group_by.rb +436 -2
  167. data/lib/polars/list_expr.rb +551 -59
  168. data/lib/polars/list_name_space.rb +465 -51
  169. data/lib/polars/meta_expr.rb +146 -24
  170. data/lib/polars/name_expr.rb +87 -2
  171. data/lib/polars/query_opt_flags.rb +264 -0
  172. data/lib/polars/rolling_group_by.rb +90 -5
  173. data/lib/polars/scan_cast_options.rb +86 -0
  174. data/lib/polars/schema.rb +128 -0
  175. data/lib/polars/selector.rb +245 -0
  176. data/lib/polars/selectors.rb +1048 -201
  177. data/lib/polars/series.rb +2522 -774
  178. data/lib/polars/series_plot.rb +72 -0
  179. data/lib/polars/slice.rb +1 -1
  180. data/lib/polars/sql_context.rb +13 -6
  181. data/lib/polars/string_cache.rb +19 -72
  182. data/lib/polars/string_expr.rb +561 -107
  183. data/lib/polars/string_name_space.rb +781 -109
  184. data/lib/polars/struct_expr.rb +139 -18
  185. data/lib/polars/struct_name_space.rb +19 -1
  186. data/lib/polars/testing.rb +24 -273
  187. data/lib/polars/utils/constants.rb +2 -0
  188. data/lib/polars/utils/construction/data_frame.rb +410 -0
  189. data/lib/polars/utils/construction/series.rb +350 -0
  190. data/lib/polars/utils/construction/utils.rb +9 -0
  191. data/lib/polars/utils/convert.rb +18 -8
  192. data/lib/polars/utils/deprecation.rb +11 -0
  193. data/lib/polars/utils/parse.rb +62 -9
  194. data/lib/polars/utils/reduce_balanced.rb +43 -0
  195. data/lib/polars/utils/serde.rb +22 -0
  196. data/lib/polars/utils/unstable.rb +19 -0
  197. data/lib/polars/utils/various.rb +86 -1
  198. data/lib/polars/utils.rb +63 -48
  199. data/lib/polars/version.rb +1 -1
  200. data/lib/polars.rb +85 -2
  201. metadata +80 -28
  202. data/ext/polars/src/allocator.rs +0 -13
  203. data/ext/polars/src/batched_csv.rs +0 -138
  204. data/ext/polars/src/functions/string_cache.rs +0 -25
  205. data/ext/polars/src/map/dataframe.rs +0 -338
  206. data/lib/polars/plot.rb +0 -109
@@ -31,58 +31,158 @@ module Polars
31
31
 
32
32
  # Return whether or not the column is a local categorical.
33
33
  #
34
- # @return [Boolean]
34
+ # Always returns false.
35
35
  #
36
- # @example Categoricals constructed without a string cache are considered local.
37
- # s = Polars::Series.new(["a", "b", "a"], dtype: Polars::Categorical)
38
- # s.cat.is_local
39
- # # => true
36
+ # @deprecated
37
+ # `cat.is_local` is deprecated; Categoricals no longer have a local scope.
40
38
  #
41
- # @example Categoricals constructed with a string cache are considered global.
42
- # s = nil
43
- # Polars::StringCache.new do
44
- # s = Polars::Series.new(["a", "b", "a"], dtype: Polars::Categorical)
45
- # end
46
- # s.cat.is_local
47
- # # => false
39
+ # @return [Boolean]
48
40
  def is_local
49
41
  _s.cat_is_local
50
42
  end
51
43
 
52
- # Convert a categorical column to its local representation.
44
+ # Simply returns the column as-is, local representations are deprecated.
45
+ #
46
+ # @return [Series]
47
+ def to_local
48
+ Utils.wrap_s(_s.cat_to_local)
49
+ end
50
+
51
+ # Indicate whether the Series uses lexical ordering.
53
52
  #
54
- # This may change the underlying physical representation of the column.
53
+ # @deprecated
54
+ # `cat.uses_lexical_ordering` is deprecated; Categoricals are now always ordered lexically.
55
+ #
56
+ # @return [Boolean]
57
+ #
58
+ # @example
59
+ # s = Polars::Series.new(["b", "a", "b"]).cast(Polars::Categorical)
60
+ # s.cat.uses_lexical_ordering
61
+ # # => true
62
+ def uses_lexical_ordering
63
+ _s.cat_uses_lexical_ordering
64
+ end
65
+
66
+ # Return the byte-length of the string representation of each value.
55
67
  #
56
68
  # @return [Series]
57
69
  #
58
- # @example Compare the global and local representations of a categorical.
59
- # s = nil
60
- # Polars::StringCache.new do
61
- # _ = Polars::Series.new("x", ["a", "b", "a"], dtype: Polars::Categorical)
62
- # s = Polars::Series.new("y", ["c", "b", "d"], dtype: Polars::Categorical)
63
- # end
64
- # s.to_physical
70
+ # @example
71
+ # s = Polars::Series.new(["Café", "345", "東京", nil], dtype: Polars::Categorical)
72
+ # s.cat.len_bytes
65
73
  # # =>
66
- # # shape: (3,)
67
- # # Series: 'y' [u32]
74
+ # # shape: (4,)
75
+ # # Series: '' [u32]
68
76
  # # [
69
- # # 2
70
- # # 1
77
+ # # 5
71
78
  # # 3
79
+ # # 6
80
+ # # null
72
81
  # # ]
82
+ def len_bytes
83
+ super
84
+ end
85
+
86
+ # Return the number of characters of the string representation of each value.
87
+ #
88
+ # @return [Series]
73
89
  #
74
90
  # @example
75
- # s.cat.to_local.to_physical
91
+ # s = Polars::Series.new(["Café", "345", "東京", nil], dtype: Polars::Categorical)
92
+ # s.cat.len_chars
76
93
  # # =>
77
- # # shape: (3,)
78
- # # Series: 'y' [u32]
94
+ # # shape: (4,)
95
+ # # Series: '' [u32]
79
96
  # # [
80
- # # 0
81
- # # 1
97
+ # # 4
98
+ # # 3
82
99
  # # 2
100
+ # # null
83
101
  # # ]
84
- def to_local
85
- Utils.wrap_s(_s.cat_to_local)
102
+ def len_chars
103
+ super
104
+ end
105
+
106
+ # Check if string representations of values start with a substring.
107
+ #
108
+ # @param prefix [String]
109
+ # Prefix substring.
110
+ #
111
+ # @return [Series]
112
+ #
113
+ # @example
114
+ # s = Polars::Series.new("fruits", ["apple", "mango", nil], dtype: Polars::Categorical)
115
+ # s.cat.starts_with("app")
116
+ # # =>
117
+ # # shape: (3,)
118
+ # # Series: 'fruits' [bool]
119
+ # # [
120
+ # # true
121
+ # # false
122
+ # # null
123
+ # # ]
124
+ def starts_with(prefix)
125
+ super
126
+ end
127
+
128
+ # Check if string representations of values end with a substring.
129
+ #
130
+ # @param suffix [String]
131
+ # Suffix substring.
132
+ #
133
+ # @return [Series]
134
+ #
135
+ # @example
136
+ # s = Polars::Series.new("fruits", ["apple", "mango", nil], dtype: Polars::Categorical)
137
+ # s.cat.ends_with("go")
138
+ # # =>
139
+ # # shape: (3,)
140
+ # # Series: 'fruits' [bool]
141
+ # # [
142
+ # # false
143
+ # # true
144
+ # # null
145
+ # # ]
146
+ def ends_with(suffix)
147
+ super
148
+ end
149
+
150
+ # Extract a substring from the string representation of each string value.
151
+ #
152
+ # @param offset [Integer]
153
+ # Start index. Negative indexing is supported.
154
+ # @param length [Integer]
155
+ # Length of the slice. If set to `nil` (default), the slice is taken to the
156
+ # end of the string.
157
+ #
158
+ # @return [Series]
159
+ #
160
+ # @example
161
+ # s = Polars::Series.new(["pear", nil, "papaya", "dragonfruit"], dtype: Polars::Categorical)
162
+ # s.cat.slice(-3)
163
+ # # =>
164
+ # # shape: (4,)
165
+ # # Series: '' [str]
166
+ # # [
167
+ # # "ear"
168
+ # # null
169
+ # # "aya"
170
+ # # "uit"
171
+ # # ]
172
+ #
173
+ # @example Using the optional `length` parameter
174
+ # s.cat.slice(4, 3)
175
+ # # =>
176
+ # # shape: (4,)
177
+ # # Series: '' [str]
178
+ # # [
179
+ # # ""
180
+ # # null
181
+ # # "ya"
182
+ # # "onf"
183
+ # # ]
184
+ def slice(offset, length = nil)
185
+ super
86
186
  end
87
187
  end
88
188
  end
@@ -0,0 +1,20 @@
1
+ module Polars
2
+ class Catalog
3
+ module Unity
4
+ # Information for a catalog within a metastore.
5
+ CatalogInfo =
6
+ ::Struct.new(
7
+ :name,
8
+ :comment,
9
+ :properties,
10
+ :options,
11
+ :storage_location,
12
+ :created_at,
13
+ :created_by,
14
+ :updated_at,
15
+ :updated_by,
16
+ keyword_init: true
17
+ )
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,31 @@
1
+ module Polars
2
+ class Catalog
3
+ module Unity
4
+ # Information for a column within a catalog table.
5
+ ColumnInfo =
6
+ ::Struct.new(
7
+ :name,
8
+ :type_name,
9
+ :type_text,
10
+ :type_json,
11
+ :position,
12
+ :comment,
13
+ :partition_index,
14
+ keyword_init: true
15
+ )
16
+
17
+ class ColumnInfo
18
+ # Get the native polars datatype of this column.
19
+ #
20
+ # @note
21
+ # This functionality is considered **unstable**. It may be changed
22
+ # at any point without it being considered a breaking change.
23
+ #
24
+ # @return [Object]
25
+ def get_polars_dtype
26
+ RbCatalogClient.type_json_to_polars_type(type_json)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ module Polars
2
+ class Catalog
3
+ module Unity
4
+ # Information for a namespace within a catalog.
5
+ #
6
+ # This is also known by the name "schema" in unity catalog terminology.
7
+ NamespaceInfo =
8
+ ::Struct.new(
9
+ :name,
10
+ :comment,
11
+ :properties,
12
+ :storage_location,
13
+ :created_at,
14
+ :created_by,
15
+ :updated_at,
16
+ :updated_by,
17
+ keyword_init: true
18
+ )
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,50 @@
1
+ module Polars
2
+ class Catalog
3
+ module Unity
4
+ # Information for a catalog table.
5
+ TableInfo =
6
+ ::Struct.new(
7
+ :name,
8
+ :comment,
9
+ :table_id,
10
+ :table_type,
11
+ :storage_location,
12
+ :data_source_format,
13
+ :columns,
14
+ :properties,
15
+ :created_at,
16
+ :created_by,
17
+ :updated_at,
18
+ :updated_by,
19
+ keyword_init: true
20
+ )
21
+
22
+ class TableInfo
23
+ # Get the native polars schema of this table.
24
+ #
25
+ # @note
26
+ # This functionality is considered **unstable**. It may be changed
27
+ # at any point without it being considered a breaking change.
28
+ #
29
+ # @return [Schema]
30
+ def get_polars_schema
31
+ if columns.nil?
32
+ return nil
33
+ end
34
+
35
+ schema = Schema.new(check_dtypes: false)
36
+
37
+ columns.each do |column_info|
38
+ if schema[column_info.name]
39
+ msg = "duplicate column name: #{column_info.name}"
40
+ raise DuplicateError, msg
41
+ end
42
+ schema[column_info.name] = column_info.get_polars_dtype
43
+ end
44
+
45
+ schema
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end