polars-df 0.10.0-x86_64-linux-musl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +3 -0
  3. data/CHANGELOG.md +175 -0
  4. data/Cargo.lock +2536 -0
  5. data/Cargo.toml +6 -0
  6. data/LICENSE-THIRD-PARTY.txt +38726 -0
  7. data/LICENSE.txt +20 -0
  8. data/README.md +437 -0
  9. data/lib/polars/3.1/polars.so +0 -0
  10. data/lib/polars/3.2/polars.so +0 -0
  11. data/lib/polars/3.3/polars.so +0 -0
  12. data/lib/polars/array_expr.rb +537 -0
  13. data/lib/polars/array_name_space.rb +423 -0
  14. data/lib/polars/batched_csv_reader.rb +98 -0
  15. data/lib/polars/binary_expr.rb +77 -0
  16. data/lib/polars/binary_name_space.rb +66 -0
  17. data/lib/polars/cat_expr.rb +72 -0
  18. data/lib/polars/cat_name_space.rb +125 -0
  19. data/lib/polars/config.rb +530 -0
  20. data/lib/polars/convert.rb +93 -0
  21. data/lib/polars/data_frame.rb +5418 -0
  22. data/lib/polars/data_types.rb +466 -0
  23. data/lib/polars/date_time_expr.rb +1444 -0
  24. data/lib/polars/date_time_name_space.rb +1484 -0
  25. data/lib/polars/dynamic_group_by.rb +52 -0
  26. data/lib/polars/exceptions.rb +31 -0
  27. data/lib/polars/expr.rb +6105 -0
  28. data/lib/polars/expr_dispatch.rb +22 -0
  29. data/lib/polars/functions/aggregation/horizontal.rb +246 -0
  30. data/lib/polars/functions/aggregation/vertical.rb +282 -0
  31. data/lib/polars/functions/as_datatype.rb +248 -0
  32. data/lib/polars/functions/col.rb +47 -0
  33. data/lib/polars/functions/eager.rb +182 -0
  34. data/lib/polars/functions/lazy.rb +1280 -0
  35. data/lib/polars/functions/len.rb +49 -0
  36. data/lib/polars/functions/lit.rb +35 -0
  37. data/lib/polars/functions/random.rb +16 -0
  38. data/lib/polars/functions/range/date_range.rb +103 -0
  39. data/lib/polars/functions/range/int_range.rb +51 -0
  40. data/lib/polars/functions/repeat.rb +144 -0
  41. data/lib/polars/functions/whenthen.rb +96 -0
  42. data/lib/polars/functions.rb +57 -0
  43. data/lib/polars/group_by.rb +548 -0
  44. data/lib/polars/io.rb +890 -0
  45. data/lib/polars/lazy_frame.rb +2833 -0
  46. data/lib/polars/lazy_group_by.rb +84 -0
  47. data/lib/polars/list_expr.rb +791 -0
  48. data/lib/polars/list_name_space.rb +445 -0
  49. data/lib/polars/meta_expr.rb +222 -0
  50. data/lib/polars/name_expr.rb +198 -0
  51. data/lib/polars/plot.rb +109 -0
  52. data/lib/polars/rolling_group_by.rb +37 -0
  53. data/lib/polars/series.rb +4527 -0
  54. data/lib/polars/slice.rb +104 -0
  55. data/lib/polars/sql_context.rb +194 -0
  56. data/lib/polars/string_cache.rb +75 -0
  57. data/lib/polars/string_expr.rb +1519 -0
  58. data/lib/polars/string_name_space.rb +810 -0
  59. data/lib/polars/struct_expr.rb +98 -0
  60. data/lib/polars/struct_name_space.rb +96 -0
  61. data/lib/polars/testing.rb +507 -0
  62. data/lib/polars/utils.rb +422 -0
  63. data/lib/polars/version.rb +4 -0
  64. data/lib/polars/whenthen.rb +83 -0
  65. data/lib/polars-df.rb +1 -0
  66. data/lib/polars.rb +72 -0
  67. metadata +125 -0
@@ -0,0 +1,530 @@
1
+ module Polars
2
+ # Configure polars; offers options for table formatting and more.
3
+ class Config
4
+ POLARS_CFG_ENV_VARS = [
5
+ "POLARS_ACTIVATE_DECIMAL",
6
+ "POLARS_AUTO_STRUCTIFY",
7
+ "POLARS_FMT_MAX_COLS",
8
+ "POLARS_FMT_MAX_ROWS",
9
+ "POLARS_FMT_STR_LEN",
10
+ "POLARS_FMT_TABLE_CELL_ALIGNMENT",
11
+ "POLARS_FMT_TABLE_DATAFRAME_SHAPE_BELOW",
12
+ "POLARS_FMT_TABLE_FORMATTING",
13
+ "POLARS_FMT_TABLE_HIDE_COLUMN_DATA_TYPES",
14
+ "POLARS_FMT_TABLE_HIDE_COLUMN_NAMES",
15
+ "POLARS_FMT_TABLE_HIDE_COLUMN_SEPARATOR",
16
+ "POLARS_FMT_TABLE_HIDE_DATAFRAME_SHAPE_INFORMATION",
17
+ "POLARS_FMT_TABLE_INLINE_COLUMN_DATA_TYPE",
18
+ "POLARS_FMT_TABLE_ROUNDED_CORNERS",
19
+ "POLARS_STREAMING_CHUNK_SIZE",
20
+ "POLARS_TABLE_WIDTH",
21
+ "POLARS_VERBOSE"
22
+ ]
23
+
24
+ POLARS_CFG_DIRECT_VARS = {"set_fmt_float" => Plr.method(:get_float_fmt)}
25
+
26
+ # Initialize a Config object instance for context manager usage.
27
+ def initialize(restore_defaults: false, **options)
28
+ @original_state = self.class.save
29
+
30
+ if restore_defaults
31
+ self.class.restore_defaults
32
+ end
33
+
34
+ options.each do |opt, value|
35
+ opt = "set_#{opt}" unless opt.to_s.start_with?("set_")
36
+ if !self.class.respond_to?(opt)
37
+ raise ArgumentError, "Config has no #{opt} option"
38
+ end
39
+ self.class.public_send(opt, value)
40
+ end
41
+
42
+ yield self.class
43
+
44
+ self.class.restore_defaults.load(@original_state)
45
+ @original_state = ""
46
+ end
47
+
48
+ # Load and set previously saved (or shared) Config options from json/file.
49
+ #
50
+ # @return [Config]
51
+ def self.load(cfg)
52
+ options = JSON.parse(cfg)
53
+ ENV.merge!(options["environment"])
54
+ options.fetch("fetch", {}).each do |cfg_methodname, value|
55
+ if POLARS_CFG_DIRECT_VARS.key?(cfg_methodname)
56
+ public_send(cfg_methodname, value)
57
+ end
58
+ end
59
+ self
60
+ end
61
+
62
+ # Reset all polars Config settings to their default state.
63
+ #
64
+ # @return [Config]
65
+ def self.restore_defaults
66
+ POLARS_CFG_ENV_VARS.each do |var|
67
+ ENV.delete(var)
68
+ end
69
+ set_fmt_float
70
+ self
71
+ end
72
+
73
+ # Save the current set of Config options as a json string or file.
74
+ #
75
+ # @return [Config]
76
+ def self.save
77
+ environment_vars = POLARS_CFG_ENV_VARS.sort.select { |k| ENV.key?(k) }.to_h { |k| [k, ENV[k]] }
78
+ direct_vars = POLARS_CFG_DIRECT_VARS.to_h { |cfg_methodname, get_value| [cfg_methodname, get_value.call] }
79
+ options = JSON.generate({environment: environment_vars, direct: direct_vars})
80
+ options
81
+ end
82
+
83
+ # Show the current state of all Config variables as a dict.
84
+ #
85
+ # @param if_set [Boolean]
86
+ # by default this will show the state of all `Config` environment variables.
87
+ # change this to `true` to restrict the returned dictionary to include only
88
+ # those that have been set to a specific value.
89
+ # @param env_only [Boolean]
90
+ # include only Config environment variables in the output; some options (such
91
+ # as "set_fmt_float") are set directly, not via an environment variable.
92
+ #
93
+ # @return [Object]
94
+ def self.state(if_set: false, env_only: false)
95
+ config_state = POLARS_CFG_ENV_VARS.sort
96
+ .select { |var| !if_set || !ENV[var].nil? }
97
+ .to_h { |var| [var, ENV[var]] }
98
+ if !env_only
99
+ POLARS_CFG_DIRECT_VARS.each do |cfg_methodname, get_value|
100
+ config_state[cfg_methodname] = get_value.call
101
+ end
102
+ end
103
+
104
+ config_state
105
+ end
106
+
107
+ # Activate `Decimal` data types.
108
+ #
109
+ # This is a temporary setting that will be removed later once the
110
+ # `Decimal` type stabilize. This will happens without it being
111
+ # considered a breaking change.
112
+ #
113
+ # Currently, `Decimal` types are in an alpha state.
114
+ #
115
+ # @return [Config]
116
+ def self.activate_decimals(active = true)
117
+ if !active
118
+ ENV.delete("POLARS_ACTIVATE_DECIMAL")
119
+ else
120
+ ENV["POLARS_ACTIVATE_DECIMAL"] = "1"
121
+ end
122
+ self
123
+ end
124
+
125
+ # Use ASCII characters to display table outlines (set False to revert to UTF8).
126
+ #
127
+ # @return [Config]
128
+ #
129
+ # @example
130
+ # df = Polars::DataFrame.new({"abc" => [1.0, 2.5, 5.0], "xyz" => [true, false, true]})
131
+ # Polars::Config.new(ascii_tables: true) do
132
+ # p df
133
+ # end
134
+ # # =>
135
+ # # shape: (3, 2)
136
+ # # +-----+-------+
137
+ # # | abc | xyz |
138
+ # # | --- | --- |
139
+ # # | f64 | bool |
140
+ # # +=============+
141
+ # # | 1.0 | true |
142
+ # # | 2.5 | false |
143
+ # # | 5.0 | true |
144
+ # # +-----+-------+
145
+ def self.set_ascii_tables(active = true)
146
+ fmt = active ? "ASCII_FULL_CONDENSED" : "UTF8_FULL_CONDENSED"
147
+ ENV["POLARS_FMT_TABLE_FORMATTING"] = fmt
148
+ self
149
+ end
150
+
151
+ # Allow multi-output expressions to be automatically turned into Structs.
152
+ #
153
+ # @return [Config]
154
+ def self.set_auto_structify(active = true)
155
+ ENV["POLARS_AUTO_STRUCTIFY"] = active ? "1" : "0"
156
+ self
157
+ end
158
+
159
+ # Control how floating point values are displayed.
160
+ #
161
+ # @param fmt ["mixed", "full"]
162
+ # How to format floating point numbers
163
+ #
164
+ # @return [Config]
165
+ def self.set_fmt_float(fmt = "mixed")
166
+ Plr.set_float_fmt(fmt)
167
+ self
168
+ end
169
+
170
+ # Set the number of characters used to display string values.
171
+ #
172
+ # @param n [Integer]
173
+ # number of characters to display
174
+ #
175
+ # @return [Config]
176
+ #
177
+ # @example
178
+ # df = Polars::DataFrame.new(
179
+ # {
180
+ # "txt" => [
181
+ # "Play it, Sam. Play 'As Time Goes By'.",
182
+ # "This is the beginning of a beautiful friendship.",
183
+ # ]
184
+ # }
185
+ # )
186
+ # Polars::Config.new(fmt_str_lengths: 50) do
187
+ # p df
188
+ # end
189
+ # # =>
190
+ # # shape: (2, 1)
191
+ # # ┌──────────────────────────────────────────────────┐
192
+ # # │ txt │
193
+ # # │ --- │
194
+ # # │ str │
195
+ # # ╞══════════════════════════════════════════════════╡
196
+ # # │ Play it, Sam. Play 'As Time Goes By'. │
197
+ # # │ This is the beginning of a beautiful friendship. │
198
+ # # └──────────────────────────────────────────────────┘
199
+ def self.set_fmt_str_lengths(n)
200
+ if n <= 0
201
+ raise ArgumentError, "number of characters must be > 0"
202
+ end
203
+
204
+ ENV["POLARS_FMT_STR_LEN"] = n.to_s
205
+ self
206
+ end
207
+
208
+ # Overwrite chunk size used in `streaming` engine.
209
+ #
210
+ # By default, the chunk size is determined by the schema
211
+ # and size of the thread pool. For some datasets (esp.
212
+ # when you have large string elements) this can be too
213
+ # optimistic and lead to Out of Memory errors.
214
+ #
215
+ # @param size [Integer]
216
+ # Number of rows per chunk. Every thread will process chunks
217
+ # of this size.
218
+ #
219
+ # @return [Config]
220
+ def self.set_streaming_chunk_size(size)
221
+ if size < 1
222
+ raise ArgumentError, "number of rows per chunk must be >= 1"
223
+ end
224
+
225
+ ENV["POLARS_STREAMING_CHUNK_SIZE"] = size.to_s
226
+ self
227
+ end
228
+
229
+ # Set table cell alignment.
230
+ #
231
+ # @param format [String]
232
+ # * "LEFT": left aligned
233
+ # * "CENTER": center aligned
234
+ # * "RIGHT": right aligned
235
+ #
236
+ # @return [Config]
237
+ #
238
+ # @example
239
+ # df = Polars::DataFrame.new(
240
+ # {"column_abc" => [1.0, 2.5, 5.0], "column_xyz" => [true, false, true]}
241
+ # )
242
+ # Polars::Config.new(tbl_cell_alignment: "RIGHT") do
243
+ # p df
244
+ # end
245
+ # # =>
246
+ # # shape: (3, 2)
247
+ # # ┌────────────┬────────────┐
248
+ # # │ column_abc ┆ column_xyz │
249
+ # # │ --- ┆ --- │
250
+ # # │ f64 ┆ bool │
251
+ # # ╞════════════╪════════════╡
252
+ # # │ 1.0 ┆ true │
253
+ # # │ 2.5 ┆ false │
254
+ # # │ 5.0 ┆ true │
255
+ # # └────────────┴────────────┘
256
+ def self.set_tbl_cell_alignment(format)
257
+ ENV["POLARS_FMT_TABLE_CELL_ALIGNMENT"] = format
258
+ self
259
+ end
260
+
261
+ # Set the number of columns that are visible when displaying tables.
262
+ #
263
+ # @param n [Integer]
264
+ # number of columns to display; if `n < 0` (eg: -1), display all columns.
265
+ #
266
+ # @return [Config]
267
+ #
268
+ # @example Set number of displayed columns to a low value:
269
+ # Polars::Config.new do |cfg|
270
+ # cfg.set_tbl_cols(5)
271
+ # df = Polars::DataFrame.new(100.times.to_h { |i| [i.to_s, [i]] })
272
+ # p df
273
+ # end
274
+ # # =>
275
+ # # shape: (1, 100)
276
+ # # ┌─────┬─────┬─────┬───┬─────┬─────┐
277
+ # # │ 0 ┆ 1 ┆ 2 ┆ … ┆ 98 ┆ 99 │
278
+ # # │ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- │
279
+ # # │ i64 ┆ i64 ┆ i64 ┆ ┆ i64 ┆ i64 │
280
+ # # ╞═════╪═════╪═════╪═══╪═════╪═════╡
281
+ # # │ 0 ┆ 1 ┆ 2 ┆ … ┆ 98 ┆ 99 │
282
+ # # └─────┴─────┴─────┴───┴─────┴─────┘
283
+ def self.set_tbl_cols(n)
284
+ ENV["POLARS_FMT_MAX_COLS"] = n.to_s
285
+ self
286
+ end
287
+
288
+ # Moves the data type inline with the column name (to the right, in parentheses).
289
+ #
290
+ # @return [Config]
291
+ #
292
+ # @example
293
+ # df = Polars::DataFrame.new({"abc" => [1.0, 2.5, 5.0], "xyz" => [true, false, true]})
294
+ # Polars::Config.new(tbl_column_data_type_inline: true) do
295
+ # p df
296
+ # end
297
+ # # =>
298
+ # # shape: (3, 2)
299
+ # # ┌───────────┬────────────┐
300
+ # # │ abc (f64) ┆ xyz (bool) │
301
+ # # ╞═══════════╪════════════╡
302
+ # # │ 1.0 ┆ true │
303
+ # # │ 2.5 ┆ false │
304
+ # # │ 5.0 ┆ true │
305
+ # # └───────────┴────────────┘
306
+ def self.set_tbl_column_data_type_inline(active = true)
307
+ ENV["POLARS_FMT_TABLE_INLINE_COLUMN_DATA_TYPE"] = active ? "1" : "0"
308
+ self
309
+ end
310
+
311
+ # Print the dataframe shape below the dataframe when displaying tables.
312
+ #
313
+ # @return [Config]
314
+ #
315
+ # @example
316
+ # df = Polars::DataFrame.new({"abc" => [1.0, 2.5, 5.0], "xyz" => [true, false, true]})
317
+ # Polars::Config.new(tbl_dataframe_shape_below: true) do
318
+ # p df
319
+ # end
320
+ # # =>
321
+ # # ┌─────┬───────┐
322
+ # # │ abc ┆ xyz │
323
+ # # │ --- ┆ --- │
324
+ # # │ f64 ┆ bool │
325
+ # # ╞═════╪═══════╡
326
+ # # │ 1.0 ┆ true │
327
+ # # │ 2.5 ┆ false │
328
+ # # │ 5.0 ┆ true │
329
+ # # └─────┴───────┘
330
+ # # shape: (3, 2)
331
+ def self.set_tbl_dataframe_shape_below(active = true)
332
+ ENV["POLARS_FMT_TABLE_DATAFRAME_SHAPE_BELOW"] = active ? "1" : "0"
333
+ self
334
+ end
335
+
336
+ # Set table formatting style.
337
+ #
338
+ # @param format [String]
339
+ # * "ASCII_FULL": ASCII, with all borders and lines, including row dividers.
340
+ # * "ASCII_FULL_CONDENSED": Same as ASCII_FULL, but with dense row spacing.
341
+ # * "ASCII_NO_BORDERS": ASCII, no borders.
342
+ # * "ASCII_BORDERS_ONLY": ASCII, borders only.
343
+ # * "ASCII_BORDERS_ONLY_CONDENSED": ASCII, borders only, dense row spacing.
344
+ # * "ASCII_HORIZONTAL_ONLY": ASCII, horizontal lines only.
345
+ # * "ASCII_MARKDOWN": ASCII, Markdown compatible.
346
+ # * "UTF8_FULL": UTF8, with all borders and lines, including row dividers.
347
+ # * "UTF8_FULL_CONDENSED": Same as UTF8_FULL, but with dense row spacing.
348
+ # * "UTF8_NO_BORDERS": UTF8, no borders.
349
+ # * "UTF8_BORDERS_ONLY": UTF8, borders only.
350
+ # * "UTF8_HORIZONTAL_ONLY": UTF8, horizontal lines only.
351
+ # * "NOTHING": No borders or other lines.
352
+ # @param rounded_corners [Boolean]
353
+ # apply rounded corners to UTF8-styled tables (no-op for ASCII formats).
354
+ #
355
+ # @note
356
+ # The UTF8 styles all use one or more of the semigraphic box-drawing characters
357
+ # found in the Unicode Box Drawing block, which are not ASCII compatible:
358
+ # https://en.wikipedia.org/wiki/Box-drawing_character#Box_Drawing
359
+ #
360
+ # @return [Config]
361
+ #
362
+ # @example
363
+ # df = Polars::DataFrame.new(
364
+ # {"abc" => [-2.5, 5.0], "mno" => ["hello", "world"], "xyz" => [true, false]}
365
+ # )
366
+ # Polars::Config.new(
367
+ # tbl_formatting: "ASCII_MARKDOWN",
368
+ # tbl_hide_column_data_types: true,
369
+ # tbl_hide_dataframe_shape: true
370
+ # ) do
371
+ # p df
372
+ # end
373
+ # # =>
374
+ # # | abc | mno | xyz |
375
+ # # |------|-------|-------|
376
+ # # | -2.5 | hello | true |
377
+ # # | 5.0 | world | false |
378
+ def self.set_tbl_formatting(format = nil, rounded_corners: false)
379
+ if format
380
+ ENV["POLARS_FMT_TABLE_FORMATTING"] = format
381
+ end
382
+ ENV["POLARS_FMT_TABLE_ROUNDED_CORNERS"] = rounded_corners ? "1" : "0"
383
+ self
384
+ end
385
+
386
+ # Hide table column data types (i64, f64, str etc.).
387
+ #
388
+ # @return [Config]
389
+ #
390
+ # @example
391
+ # df = Polars::DataFrame.new({"abc" => [1.0, 2.5, 5.0], "xyz" => [true, false, true]})
392
+ # Polars::Config.new(tbl_hide_column_data_types: true) do
393
+ # p df
394
+ # end
395
+ # # =>
396
+ # # shape: (3, 2)
397
+ # # ┌─────┬───────┐
398
+ # # │ abc ┆ xyz │
399
+ # # ╞═════╪═══════╡
400
+ # # │ 1.0 ┆ true │
401
+ # # │ 2.5 ┆ false │
402
+ # # │ 5.0 ┆ true │
403
+ # # └─────┴───────┘
404
+ def self.set_tbl_hide_column_data_types(active = true)
405
+ ENV["POLARS_FMT_TABLE_HIDE_COLUMN_DATA_TYPES"] = active ? "1" : "0"
406
+ self
407
+ end
408
+
409
+ # Hide table column names.
410
+ #
411
+ # @return [Config]
412
+ #
413
+ # @example
414
+ # df = Polars::DataFrame.new({"abc" => [1.0, 2.5, 5.0], "xyz" => [true, false, true]})
415
+ # Polars::Config.new(tbl_hide_column_names: true) do
416
+ # p df
417
+ # end
418
+ # # =>
419
+ # # shape: (3, 2)
420
+ # # ┌─────┬───────┐
421
+ # # │ f64 ┆ bool │
422
+ # # ╞═════╪═══════╡
423
+ # # │ 1.0 ┆ true │
424
+ # # │ 2.5 ┆ false │
425
+ # # │ 5.0 ┆ true │
426
+ # # └─────┴───────┘
427
+ def self.set_tbl_hide_column_names(active = true)
428
+ ENV["POLARS_FMT_TABLE_HIDE_COLUMN_NAMES"] = active ? "1" : "0"
429
+ self
430
+ end
431
+
432
+ # Hide the '---' separator between the column names and column types.
433
+ #
434
+ # @return [Config]
435
+ #
436
+ # @example
437
+ # df = Polars::DataFrame.new({"abc" => [1.0, 2.5, 5.0], "xyz" => [true, false, true]})
438
+ # Polars::Config.new(tbl_hide_dtype_separator: true) do
439
+ # p df
440
+ # end
441
+ # # =>
442
+ # # shape: (3, 2)
443
+ # # ┌─────┬───────┐
444
+ # # │ abc ┆ xyz │
445
+ # # │ f64 ┆ bool │
446
+ # # ╞═════╪═══════╡
447
+ # # │ 1.0 ┆ true │
448
+ # # │ 2.5 ┆ false │
449
+ # # │ 5.0 ┆ true │
450
+ # # └─────┴───────┘
451
+ def self.set_tbl_hide_dtype_separator(active = true)
452
+ ENV["POLARS_FMT_TABLE_HIDE_COLUMN_SEPARATOR"] = active ? "1" : "0"
453
+ self
454
+ end
455
+
456
+ # Hide the shape information of the dataframe when displaying tables.
457
+ #
458
+ # @return [Config]
459
+ #
460
+ # @example
461
+ # df = Polars::DataFrame.new({"abc" => [1.0, 2.5, 5.0], "xyz" => [true, false, true]})
462
+ # Polars::Config.new(tbl_hide_dataframe_shape: true) do
463
+ # p df
464
+ # end
465
+ # # =>
466
+ # # ┌─────┬───────┐
467
+ # # │ abc ┆ xyz │
468
+ # # │ --- ┆ --- │
469
+ # # │ f64 ┆ bool │
470
+ # # ╞═════╪═══════╡
471
+ # # │ 1.0 ┆ true │
472
+ # # │ 2.5 ┆ false │
473
+ # # │ 5.0 ┆ true │
474
+ # # └─────┴───────┘
475
+ def self.set_tbl_hide_dataframe_shape(active = true)
476
+ ENV["POLARS_FMT_TABLE_HIDE_DATAFRAME_SHAPE_INFORMATION"] = active ? "1" : "0"
477
+ self
478
+ end
479
+
480
+ # Set the max number of rows used to draw the table (both Dataframe and Series).
481
+ #
482
+ # @param n [Integer]
483
+ # number of rows to display; if `n < 0` (eg: -1), display all
484
+ # rows (DataFrame) and all elements (Series).
485
+ #
486
+ # @return [Config]
487
+ #
488
+ # @example
489
+ # df = Polars::DataFrame.new(
490
+ # {"abc" => [1.0, 2.5, 3.5, 5.0], "xyz" => [true, false, true, false]}
491
+ # )
492
+ # Polars::Config.new(tbl_rows: 2) do
493
+ # p df
494
+ # end
495
+ # # =>
496
+ # # shape: (4, 2)
497
+ # # ┌─────┬───────┐
498
+ # # │ abc ┆ xyz │
499
+ # # │ --- ┆ --- │
500
+ # # │ f64 ┆ bool │
501
+ # # ╞═════╪═══════╡
502
+ # # │ 1.0 ┆ true │
503
+ # # │ … ┆ … │
504
+ # # │ 5.0 ┆ false │
505
+ # # └─────┴───────┘
506
+ def self.set_tbl_rows(n)
507
+ ENV["POLARS_FMT_MAX_ROWS"] = n.to_s
508
+ self
509
+ end
510
+
511
+ # Set the number of characters used to draw the table.
512
+ #
513
+ # @param width [Integer]
514
+ # number of chars
515
+ #
516
+ # @return [Config]
517
+ def self.set_tbl_width_chars(width)
518
+ ENV["POLARS_TABLE_WIDTH"] = width.to_s
519
+ self
520
+ end
521
+
522
+ # Enable additional verbose/debug logging.
523
+ #
524
+ # @return [Config]
525
+ def self.set_verbose(active = true)
526
+ ENV["POLARS_VERBOSE"] = active ? "1" : "0"
527
+ self
528
+ end
529
+ end
530
+ end
@@ -0,0 +1,93 @@
1
+ module Polars
2
+ module Convert
3
+ # Construct a DataFrame from a dictionary of sequences.
4
+ #
5
+ # This operation clones data, unless you pass in a `Hash<String, Series>`.
6
+ #
7
+ # @param data [Hash]
8
+ # Two-dimensional data represented as a hash. Hash must contain
9
+ # arrays.
10
+ # @param columns [Array]
11
+ # Column labels to use for resulting DataFrame. If specified, overrides any
12
+ # labels already present in the data. Must match data dimensions.
13
+ #
14
+ # @return [DataFrame]
15
+ #
16
+ # @example
17
+ # data = {"a" => [1, 2], "b" => [3, 4]}
18
+ # Polars.from_hash(data)
19
+ # # =>
20
+ # # shape: (2, 2)
21
+ # # ┌─────┬─────┐
22
+ # # │ a ┆ b │
23
+ # # │ --- ┆ --- │
24
+ # # │ i64 ┆ i64 │
25
+ # # ╞═════╪═════╡
26
+ # # │ 1 ┆ 3 │
27
+ # # │ 2 ┆ 4 │
28
+ # # └─────┴─────┘
29
+ def from_hash(data, schema: nil, columns: nil)
30
+ DataFrame._from_hash(data, schema: schema || columns)
31
+ end
32
+
33
+ # Construct a DataFrame from a sequence of dictionaries. This operation clones data.
34
+ #
35
+ # @param hashes [Array]
36
+ # Array with hashes mapping column name to value.
37
+ # @param infer_schema_length [Integer]
38
+ # How many hashes/rows to scan to determine the data types
39
+ # if set to `nil` all rows are scanned. This will be slow.
40
+ # @param schema [Object]
41
+ # Schema that (partially) overwrites the inferred schema.
42
+ #
43
+ # @return [DataFrame]
44
+ #
45
+ # @example
46
+ # data = [{"a" => 1, "b" => 4}, {"a" => 2, "b" => 5}, {"a" => 3, "b" => 6}]
47
+ # Polars.from_hashes(data)
48
+ # # =>
49
+ # # shape: (3, 2)
50
+ # # ┌─────┬─────┐
51
+ # # │ a ┆ b │
52
+ # # │ --- ┆ --- │
53
+ # # │ i64 ┆ i64 │
54
+ # # ╞═════╪═════╡
55
+ # # │ 1 ┆ 4 │
56
+ # # │ 2 ┆ 5 │
57
+ # # │ 3 ┆ 6 │
58
+ # # └─────┴─────┘
59
+ #
60
+ # @example Overwrite first column name and dtype
61
+ # Polars.from_hashes(data, schema: {"c" => :i32})
62
+ # # =>
63
+ # # shape: (3, 2)
64
+ # # ┌─────┬─────┐
65
+ # # │ c ┆ b │
66
+ # # │ --- ┆ --- │
67
+ # # │ i32 ┆ i64 │
68
+ # # ╞═════╪═════╡
69
+ # # │ 1 ┆ 4 │
70
+ # # │ 2 ┆ 5 │
71
+ # # │ 3 ┆ 6 │
72
+ # # └─────┴─────┘
73
+ #
74
+ # @example Let polars infer the dtypes but inform about a 3rd column
75
+ # Polars.from_hashes(data, schema: {"a" => :unknown, "b" => :unknown, "c" => :i32})
76
+ # # shape: (3, 3)
77
+ # # ┌─────┬─────┬──────┐
78
+ # # │ a ┆ b ┆ c │
79
+ # # │ --- ┆ --- ┆ --- │
80
+ # # │ i64 ┆ i64 ┆ i32 │
81
+ # # ╞═════╪═════╪══════╡
82
+ # # │ 1 ┆ 4 ┆ null │
83
+ # # │ 2 ┆ 5 ┆ null │
84
+ # # │ 3 ┆ 6 ┆ null │
85
+ # # └─────┴─────┴──────┘
86
+ # def from_hashes(hashes, infer_schema_length: 50, schema: nil)
87
+ # DataFrame._from_hashes(hashes, infer_schema_length: infer_schema_length, schema: schema)
88
+ # end
89
+
90
+ # def from_records
91
+ # end
92
+ end
93
+ end