df-script 1.4.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 (134) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +269 -0
  3. package/dist/api.d.ts +39 -0
  4. package/dist/api.js +18 -0
  5. package/dist/bundle.min.js +1 -0
  6. package/dist/columnExpressions/ColumnExpr.d.ts +368 -0
  7. package/dist/columnExpressions/ColumnExpr.js +23 -0
  8. package/dist/columnExpressions/ExprBase.d.ts +24 -0
  9. package/dist/columnExpressions/ExprBase.js +133 -0
  10. package/dist/columnExpressions/constants.d.ts +2 -0
  11. package/dist/columnExpressions/constants.js +5 -0
  12. package/dist/columnExpressions/functions/all.d.ts +5 -0
  13. package/dist/columnExpressions/functions/all.js +11 -0
  14. package/dist/columnExpressions/functions/coalesce.d.ts +3 -0
  15. package/dist/columnExpressions/functions/coalesce.js +40 -0
  16. package/dist/columnExpressions/functions/exclude.d.ts +5 -0
  17. package/dist/columnExpressions/functions/exclude.js +13 -0
  18. package/dist/columnExpressions/functions/lit.d.ts +5 -0
  19. package/dist/columnExpressions/functions/lit.js +22 -0
  20. package/dist/columnExpressions/functions/when.d.ts +24 -0
  21. package/dist/columnExpressions/functions/when.js +81 -0
  22. package/dist/columnExpressions/index.d.ts +19 -0
  23. package/dist/columnExpressions/index.js +81 -0
  24. package/dist/columnExpressions/mixins/AggregationExpr.d.ts +50 -0
  25. package/dist/columnExpressions/mixins/AggregationExpr.js +172 -0
  26. package/dist/columnExpressions/mixins/ArithmeticExpr.d.ts +67 -0
  27. package/dist/columnExpressions/mixins/ArithmeticExpr.js +143 -0
  28. package/dist/columnExpressions/mixins/ComparisonExpr.d.ts +60 -0
  29. package/dist/columnExpressions/mixins/ComparisonExpr.js +389 -0
  30. package/dist/columnExpressions/mixins/ListExpr.d.ts +63 -0
  31. package/dist/columnExpressions/mixins/ListExpr.js +248 -0
  32. package/dist/columnExpressions/mixins/LogicalExpr.d.ts +33 -0
  33. package/dist/columnExpressions/mixins/LogicalExpr.js +54 -0
  34. package/dist/columnExpressions/mixins/ManipulationExpr.d.ts +31 -0
  35. package/dist/columnExpressions/mixins/ManipulationExpr.js +35 -0
  36. package/dist/columnExpressions/mixins/StringExpr.d.ts +79 -0
  37. package/dist/columnExpressions/mixins/StringExpr.js +249 -0
  38. package/dist/columnExpressions/mixins/TemporalExpr.d.ts +69 -0
  39. package/dist/columnExpressions/mixins/TemporalExpr.js +127 -0
  40. package/dist/columnExpressions/mixins/WindowExpr.d.ts +50 -0
  41. package/dist/columnExpressions/mixins/WindowExpr.js +281 -0
  42. package/dist/columnExpressions/types.d.ts +7 -0
  43. package/dist/columnExpressions/types.js +2 -0
  44. package/dist/dataframe/constants.d.ts +1 -0
  45. package/dist/dataframe/constants.js +4 -0
  46. package/dist/dataframe/dataframe.d.ts +42 -0
  47. package/dist/dataframe/dataframe.js +749 -0
  48. package/dist/dataframe/grouped/grouped.d.ts +15 -0
  49. package/dist/dataframe/grouped/grouped.js +113 -0
  50. package/dist/dataframe/index.d.ts +4 -0
  51. package/dist/dataframe/index.js +20 -0
  52. package/dist/dataframe/types.d.ts +33 -0
  53. package/dist/dataframe/types.js +2 -0
  54. package/dist/dataframe/utils.d.ts +11 -0
  55. package/dist/dataframe/utils.js +215 -0
  56. package/dist/datatypes/DataType.d.ts +40 -0
  57. package/dist/datatypes/DataType.js +47 -0
  58. package/dist/datatypes/index.d.ts +29 -0
  59. package/dist/datatypes/index.js +46 -0
  60. package/dist/datatypes/types/Binary.d.ts +9 -0
  61. package/dist/datatypes/types/Binary.js +18 -0
  62. package/dist/datatypes/types/Boolean.d.ts +9 -0
  63. package/dist/datatypes/types/Boolean.js +19 -0
  64. package/dist/datatypes/types/Date.d.ts +8 -0
  65. package/dist/datatypes/types/Date.js +21 -0
  66. package/dist/datatypes/types/Datetime.d.ts +8 -0
  67. package/dist/datatypes/types/Datetime.js +17 -0
  68. package/dist/datatypes/types/Decimal.d.ts +10 -0
  69. package/dist/datatypes/types/Decimal.js +28 -0
  70. package/dist/datatypes/types/Duration.d.ts +8 -0
  71. package/dist/datatypes/types/Duration.js +17 -0
  72. package/dist/datatypes/types/Float32.d.ts +8 -0
  73. package/dist/datatypes/types/Float32.js +17 -0
  74. package/dist/datatypes/types/Float64.d.ts +8 -0
  75. package/dist/datatypes/types/Float64.js +17 -0
  76. package/dist/datatypes/types/Int16.d.ts +8 -0
  77. package/dist/datatypes/types/Int16.js +17 -0
  78. package/dist/datatypes/types/Int32.d.ts +8 -0
  79. package/dist/datatypes/types/Int32.js +17 -0
  80. package/dist/datatypes/types/Int64.d.ts +8 -0
  81. package/dist/datatypes/types/Int64.js +17 -0
  82. package/dist/datatypes/types/Int8.d.ts +8 -0
  83. package/dist/datatypes/types/Int8.js +17 -0
  84. package/dist/datatypes/types/List.d.ts +10 -0
  85. package/dist/datatypes/types/List.js +31 -0
  86. package/dist/datatypes/types/Null.d.ts +9 -0
  87. package/dist/datatypes/types/Null.js +17 -0
  88. package/dist/datatypes/types/Object.d.ts +9 -0
  89. package/dist/datatypes/types/Object.js +17 -0
  90. package/dist/datatypes/types/Struct.d.ts +14 -0
  91. package/dist/datatypes/types/Struct.js +39 -0
  92. package/dist/datatypes/types/Time.d.ts +8 -0
  93. package/dist/datatypes/types/Time.js +29 -0
  94. package/dist/datatypes/types/UInt16.d.ts +8 -0
  95. package/dist/datatypes/types/UInt16.js +17 -0
  96. package/dist/datatypes/types/UInt32.d.ts +8 -0
  97. package/dist/datatypes/types/UInt32.js +17 -0
  98. package/dist/datatypes/types/UInt64.d.ts +8 -0
  99. package/dist/datatypes/types/UInt64.js +17 -0
  100. package/dist/datatypes/types/UInt8.d.ts +8 -0
  101. package/dist/datatypes/types/UInt8.js +17 -0
  102. package/dist/datatypes/types/Utf8.d.ts +10 -0
  103. package/dist/datatypes/types/Utf8.js +20 -0
  104. package/dist/datatypes/types.d.ts +172 -0
  105. package/dist/datatypes/types.js +286 -0
  106. package/dist/exceptions/index.d.ts +13 -0
  107. package/dist/exceptions/index.js +43 -0
  108. package/dist/exceptions/utils.d.ts +2 -0
  109. package/dist/exceptions/utils.js +9 -0
  110. package/dist/functions/concat.d.ts +4 -0
  111. package/dist/functions/concat.js +248 -0
  112. package/dist/functions/index.d.ts +1 -0
  113. package/dist/functions/index.js +17 -0
  114. package/dist/index.d.ts +7 -0
  115. package/dist/index.js +1 -0
  116. package/dist/types.d.ts +47 -0
  117. package/dist/types.js +2 -0
  118. package/dist/utils/boolean.d.ts +1 -0
  119. package/dist/utils/boolean.js +18 -0
  120. package/dist/utils/date.d.ts +57 -0
  121. package/dist/utils/date.js +349 -0
  122. package/dist/utils/guards.d.ts +14 -0
  123. package/dist/utils/guards.js +143 -0
  124. package/dist/utils/index.d.ts +5 -0
  125. package/dist/utils/index.js +21 -0
  126. package/dist/utils/json.d.ts +2 -0
  127. package/dist/utils/json.js +33 -0
  128. package/dist/utils/list.d.ts +23 -0
  129. package/dist/utils/list.js +128 -0
  130. package/dist/utils/number.d.ts +86 -0
  131. package/dist/utils/number.js +223 -0
  132. package/dist/utils/string.d.ts +52 -0
  133. package/dist/utils/string.js +120 -0
  134. package/package.json +34 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Trent Morris
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,269 @@
1
+ # 🚀 DFScript
2
+
3
+ DFScript is a lightweight, high-performance, and **zero-dependency** data analysis library for TypeScript and JavaScript. Heavily inspired by modern dataframe libraries like **Polars** and **Pandas**, DFScript brings a robust, expression-based columnar data processing engine directly to the JavaScript ecosystem.
4
+
5
+ With optimized columnar storage under the hood, DFScript enables you to build clean, maintainable, and type-safe data pipelines using a declarative expression API.
6
+
7
+ ---
8
+
9
+ ## ✨ Key Features
10
+
11
+ - 📦 **Zero Dependencies** — Extremely lightweight with zero runtime overhead.
12
+ - ⚡ **Columnar Execution** — Operates on efficient columnar arrays, minimizing allocations and speed bottlenecks.
13
+ - 🔗 **Expression-Based API** — Compose complex calculations, mappings, and filters using fluent, Polars-like expressions.
14
+ - 📂 **Strict Namespaces** — Clear API organization for specific domains:
15
+ - `.str` for advanced string manipulations.
16
+ - `.dt` for microsecond-precision datetimes, timezones, and duration calculations.
17
+ - `.list` for robust array/list column operations.
18
+ - 🪟 **Analytical Window Functions** — Windowing (`over()`), cumulative aggregations (`cum_sum()`, `cum_max()`), and rolling metrics (`rolling_mean()`, `rolling_std()`).
19
+ - 🛠️ **Relational Operations** — Rich, high-speed joins, pivots, unpivots, vertical/horizontal concatenations, and group-by aggregations.
20
+ - 🛡️ **Defensive & Type-Safe** — Native type-coercion, robust null-safety, and strict schema validation.
21
+
22
+ ---
23
+
24
+ ## 📦 Installation
25
+
26
+ Install DFScript using your favorite package manager:
27
+
28
+ ```bash
29
+ npm install df-script
30
+ ```
31
+
32
+ Or with Yarn/PNPM:
33
+
34
+ ```bash
35
+ yarn add df-script
36
+ pnpm add df-script
37
+ ```
38
+
39
+ ---
40
+
41
+ ## 🚀 Quick Start
42
+
43
+ Here is a quick example showing how to load data, run expressions, perform aggregations, and compute rolling statistics.
44
+
45
+ ```typescript
46
+ import { $tbl } from "df-script";
47
+
48
+ // 1. Create a DataFrame with structured data and automatic schema inference
49
+ const df = $tbl.data([
50
+ { id: 1, name: "Alice", join_date: "2026-01-15", sales: 1200.50, tags: ["sales", "east"] },
51
+ { id: 2, name: "Bob", join_date: "2026-02-20", sales: 850.00, tags: ["support", "west"] },
52
+ { id: 3, name: "Charlie", join_date: "2026-03-05", sales: 2300.00, tags: ["sales", "north"] },
53
+ { id: 4, name: "David", join_date: "2026-03-12", sales: null, tags: ["marketing"] },
54
+ ]);
55
+
56
+ // 2. Select columns, transform strings, format dates, and fill missing values
57
+ const processedDf = df.select(
58
+ $tbl.col("id"),
59
+ $tbl.col("name").str.upper().alias("NAME_UPPER"),
60
+ $tbl.col("join_date").str.to_datetime().dt.year().alias("join_year"),
61
+ $tbl.col("sales").add(500).alias("sales_adjusted"),
62
+ $tbl.col("tags").list.lengths().alias("tag_count")
63
+ );
64
+
65
+ console.log(processedDf.to_dicts());
66
+ /* Output:
67
+ [
68
+ { id: 1, NAME_UPPER: 'ALICE', join_year: 2026, sales_adjusted: 1700.5, tag_count: 2 },
69
+ { id: 2, NAME_UPPER: 'BOB', join_year: 2026, sales_adjusted: 1350, tag_count: 2 },
70
+ { id: 3, NAME_UPPER: 'CHARLIE', join_year: 2026, sales_adjusted: 2800, tag_count: 2 },
71
+ { id: 4, NAME_UPPER: 'DAVID', join_year: 2026, sales_adjusted: null, tag_count: 1 }
72
+ ]
73
+ */
74
+ ```
75
+
76
+ ---
77
+
78
+ ## 📖 Core Concepts
79
+
80
+ ### The `$tbl` Entry Point
81
+
82
+ DFScript uses the `$tbl` namespace to bootstrap DataFrames, refer to columns, and access general types.
83
+
84
+ - `$tbl.data(dataRowsOrCols, schema?)`: Instantiates a new `DataFrame`.
85
+ - `$tbl.col(name)`: Creates a column reference expression.
86
+ - `$tbl.all()`: Selects all columns in the DataFrame.
87
+ - `$tbl.DataType`: Direct access to the `DataTypeRegistry` for schema specification.
88
+
89
+ ### DataFrames vs. Columns
90
+
91
+ - **`DataFrame`** holds data in a columnar-oriented object: `columns: Record<string, any[]>`.
92
+ - **`ColumnExpr`** represents an evaluation sequence over rows. Operations (arithmetic, strings, lists, date-time, comparisons) are chained to build a tree of computations evaluated lazily.
93
+
94
+ ---
95
+
96
+ ## 🛠️ DataFrame API Reference
97
+
98
+ ### 1. Transformations & Projection
99
+ - **`select(...exprs)`**: Projects columns. Supports strings, raw column names, `$tbl.col(...)` expressions, and `$tbl.all()`.
100
+ - **`with_columns(...exprs)`**: Adds or overrides columns. Accepts expressions, strings, or options objects mapping keys to values/expressions.
101
+ - **`drop(...names)`**: Drops one or more columns from the DataFrame.
102
+ - **`rename(mapping)`**: Renames columns using a `{ oldName: newName }` object.
103
+
104
+ ### 2. Filtering & Row Selection
105
+ - **`filter(...predicates)`**: Filters rows where all predicate expressions evaluate to `true` (or non-null truthy values).
106
+ - **`unique(columns?)`**: Returns unique rows. If a subset of columns is provided, deduplicates based on those columns.
107
+ - **`limit(n, options?)`**: Returns the first `n` rows. Options include `offset` and direction `from: "start" | "end"`.
108
+ - **`head(n)`** / **`tail(n)`**: Shortcuts for `limit` from the start or end of the DataFrame.
109
+ - **`slice(start, end?)`**: Extract a subset of rows using standard index slicing.
110
+
111
+ ### 3. Sorting
112
+ - **`sort({ by, descending?, nullsLast?, custom? })`**: Sorts rows. Supports single or multiple columns/expressions, custom descending configurations per column, custom null sorting rules, and custom comparator functions.
113
+
114
+ ### 4. Grouping & Aggregations
115
+ - **`groupby(keys)`**: Groups the data by one or more columns, returning a `GroupedData` object.
116
+ - **`GroupedData.agg(...exprs)`**: Run aggregations on grouped data (e.g. `$tbl.col("sales").sum()`).
117
+
118
+ ### 5. Reshaping & Joining
119
+ - **`join(other, on, how, suffixes?)`**: Merges two DataFrames on join keys. Supported join types: `"inner" | "left" | "right" | "outer"`.
120
+ - **`pivot(index, columns, values)`**: Pivots the table, converting unique values in `columns` into column headers.
121
+ - **`unpivot(idVars, valueVars, varName?, valueName?)`**: Melts/unpivots the table, converting wide columns into long format name-value pairs.
122
+ - **`concat(items, options?)`**: Concatenates multiple DataFrames. Supported concat strategies: `"vertical" | "horizontal" | "diagonal"`.
123
+
124
+ ---
125
+
126
+ ## 🧮 Expressions API Reference
127
+
128
+ All column expressions inherit from `ExprBase` and support standard operators.
129
+
130
+ ### ➕ Arithmetic Expressions
131
+ Chained mathematical functions execute cleanly with built-in null-safety (Kleene logic).
132
+ - `.add(val)`, `.sub(val)`, `.mul(val)`, `.div(val)`, `.floordiv(val)`, `.mod(val)`, `.pow(val)`
133
+ - `.abs()`, `.sqrt()`, `.cbrt()`, `.exp()`, `.expm1()`, `.log(base?)`, `.log1p()`
134
+ - `.ceil()`, `.floor()`, `.trunc()`, `.round(decimals)`, `.clip(lower, upper)`, `.sign()`, `.negate()`
135
+ - `.sin()`, `.cos()`, `.tan()`, `.sinh()`, `.cosh()`, `.tanh()`, `.asin()`, `.acos()`, `.atan()`, `.asinh()`, `.acosh()`, `.atanh()`, `.degrees()`, `.radians()`, `.hypot(val)`
136
+
137
+ ### 🔍 Comparison Expressions
138
+ - `.eq(val)`, `.ne(val)` — Strict value equivalence (null values return null).
139
+ - `.eq_missing(val)`, `.ne_missing(val)` — Equality checking that treats null/undefined values as equal.
140
+ - `.gt(val)`, `.ge(val)`, `.lt(val)`, `.le(val)`
141
+ - `.is_null()`, `.is_not_null()`
142
+ - `.is_finite()`, `.is_infinite()`, `.is_nan()`, `.is_not_nan()`
143
+ - `.is_in(arrayOrExpr)`, `.not_in(arrayOrExpr)`
144
+
145
+ ### ⚡ Aggregations
146
+ - `.sum()`, `.avg()` / `.mean()`, `.median()`, `.mode()`, `.std()`, `.min()`, `.max()`
147
+ - `.count(options?)` — Option `{ includeNulls: boolean }`.
148
+ - `.first()`, `.last()`
149
+ - `.any()`, `.all()`, `.any_null()`, `.all_null()`, `.n_unique()`
150
+
151
+ ---
152
+
153
+ ## 📂 Namespaces
154
+
155
+ To maintain a clean and uncluttered API namespace, specific data transforms are grouped under dedicated accessors.
156
+
157
+ ### 🔤 String Operations (`.str`)
158
+ Available on any expression via `.str`:
159
+ ```typescript
160
+ $tbl.col("name").str.lower()
161
+ $tbl.col("code").str.starts_with("A")
162
+ $tbl.col("description").str.replace(/foo/i, "bar")
163
+ ```
164
+ - **Methods**: `lower()`, `upper()`, `len()`, `len_bytes()`, `len_chars()`, `trim()`, `trim_start()`, `trim_end()`, `starts_with(prefix)`, `ends_with(suffix)`, `contains(pattern)`, `replace(pattern, repl)`, `replace_all(pattern, repl)`, `slice(offset, length?)`, `split(delimiter)`, `explode()`, `reverse()`, `lpad(w, f)`, `rpad(w, f)`, `zfill(w)`, `strip_chars(chars?)`, `strip_chars_start(chars?)`, `strip_chars_end(chars?)`, `strip_prefix(pfx)`, `strip_suffix(sfx)`, `to_titlecase()`, `strptime(format, strict?)`, `to_integer()`, `to_decimal(p, s)`, `to_date()`, `to_datetime()`, `to_time()`.
165
+
166
+ ### 📅 Temporal Operations (`.dt`)
167
+ Available on datetime or duration values via `.dt`:
168
+ ```typescript
169
+ $tbl.col("timestamp").dt.year()
170
+ $tbl.col("timestamp").dt.strftime("%Y-%m-%d %H:%M:%S")
171
+ $tbl.col("duration").dt.total_seconds()
172
+ ```
173
+ - **Datetime Methods**: `year()`, `month()`, `day()`, `hour()`, `minute()`, `second()`, `millisecond()`, `microsecond()`, `nanosecond()`, `weekday()`, `week()`, `quarter()`, `century()`, `millennium()`, `ordinal_day()`, `is_leap_year()`, `month_start()`, `month_end()`, `date()`, `time()`, `datetime()`, `epoch(unit)`, `timestamp(unit)`, `strftime(format, locale?)`.
174
+ - **Duration Methods**: `total_days()`, `total_hours()`, `total_minutes()`, `total_seconds()`, `total_milliseconds()`, `total_microseconds()`, `total_nanoseconds()`.
175
+
176
+ ### 📊 List Operations (`.list`)
177
+ Available on arrays or lists via `.list`:
178
+ ```typescript
179
+ $tbl.col("tags").list.contains("vip")
180
+ $tbl.col("matrix").list.get(2)
181
+ ```
182
+ - **Methods**: `lengths()`, `len()`, `get(idx, null_on_oob?)`, `first(null_on_oob?)`, `last(null_on_oob?)`, `gather(indices, null_on_oob?)`, `gather_every(n, offset?)`, `slice(offset, length?)`, `contains(item)`, `count_matches(item)`, `join(separator)`, `sort(descending?)`, `reverse()`, `unique()`, `sum()`, `mean()`, `median()`, `mode()`, `min()`, `max()`.
183
+
184
+ ---
185
+
186
+ ## 🪟 Window & Rolling Expressions
187
+
188
+ DFScript provides full support for analytic partition window operations using `.over()` and rolling filters.
189
+
190
+ ```typescript
191
+ // Calculate partition cumulative sums and row numbers
192
+ df.select(
193
+ $tbl.col("department"),
194
+ $tbl.col("sales"),
195
+ $tbl.col("sales").sum().over("department").alias("dept_total_sales"),
196
+ $tbl.col("sales").cum_sum().over("department").alias("dept_running_sales"),
197
+ $tbl.all().row_number().over("department").alias("dept_rank")
198
+ );
199
+ ```
200
+
201
+ ### 1. Cumulative Windows
202
+ - `.cum_sum(reverse?)`
203
+ - `.cum_prod(reverse?)`
204
+ - `.cum_min(reverse?)`
205
+ - `.cum_max(reverse?)`
206
+ - `.cum_count(reverse?)`
207
+
208
+ ### 2. Rolling Metrics (Moving Window)
209
+ Apply moving calculations over a fixed window size:
210
+ - `.rolling_sum(size)`
211
+ - `.rolling_mean(size)`
212
+ - `.rolling_median(size)`
213
+ - `.rolling_min(size)`
214
+ - `.rolling_max(size)`
215
+ - `.rolling_std(size)`
216
+ - `.rolling_rank(size)`
217
+ - `.rolling_quantile(quantile, size)`
218
+
219
+ ### 3. Positional & Rank Windows
220
+ - `.lead(offset, defaultVal?)`
221
+ - `.lag(offset, defaultVal?)`
222
+ - `.rank()`
223
+ - `.dense_rank()`
224
+ - `.row_number()`
225
+
226
+ ---
227
+
228
+ ## 🛡️ Typing and Schema Registry
229
+
230
+ You can optionally declare schemas to enforce precise data types and automatic type coercion during construction.
231
+
232
+ ```typescript
233
+ import { $tbl } from "df-script";
234
+
235
+ const schema = {
236
+ id: $tbl.DataType.Int32,
237
+ price: $tbl.DataType.Decimal(10, 2),
238
+ active: $tbl.DataType.Boolean,
239
+ created_at: $tbl.DataType.Datetime
240
+ };
241
+
242
+ const df = $tbl.data(rawData, schema);
243
+ ```
244
+
245
+ ### Supported Data Types
246
+ - **Integers**: `Int8`, `Int16`, `Int32`, `Int64`, `UInt8`, `UInt16`, `UInt32`, `UInt64`
247
+ - **Floats & Decimals**: `Float32`, `Float64`, `Decimal(precision?, scale?)`
248
+ - **General**: `Boolean`, `Utf8` (Strings), `Binary`, `Null`, `Object`
249
+ - **Temporal**: `Date`, `Datetime`, `Time`, `Duration`
250
+ - **Nested Structures**: `List` (Arrays), `Struct` (Objects)
251
+
252
+ ---
253
+
254
+ ## 🧑‍💻 Contributing & Development
255
+
256
+ We welcome contributions! Please make sure to review our [Developer Guidelines](DEVELOPER_GUIDELINES.md) when writing code.
257
+
258
+ ### Running Project Tests
259
+ DFScript has a comprehensive suite of unit tests. Run them using:
260
+
261
+ ```bash
262
+ npx tsx _tests/run_all_project_tests.ts
263
+ ```
264
+
265
+ ---
266
+
267
+ ## 📄 License
268
+
269
+ DFScript is open-source software licensed under the [MIT License](LICENSE).
package/dist/api.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ import { DataFrame } from "./dataframe";
2
+ import { ColumnExpr, lit, all, exclude, coalesce, when } from "./columnExpressions";
3
+ import { DataType } from "./datatypes";
4
+ import { concat } from "./functions";
5
+ import type { RowRecord } from "./types";
6
+ export declare const $tbl: {
7
+ data: <T extends RowRecord>(data: T[], schema?: Record<string, DataType>) => DataFrame<T>;
8
+ col: <T = any>(name: keyof T | string) => ColumnExpr<T>;
9
+ all: typeof all;
10
+ exclude: typeof exclude;
11
+ coalesce: typeof coalesce;
12
+ concat: typeof concat;
13
+ lit: typeof lit;
14
+ when: typeof when;
15
+ DataType: {
16
+ Int8: import("./datatypes").Int8Type;
17
+ Int16: import("./datatypes").Int16Type;
18
+ Int32: import("./datatypes").Int32Type;
19
+ Int64: import("./datatypes").Int64Type;
20
+ UInt8: import("./datatypes").UInt8Type;
21
+ UInt16: import("./datatypes").UInt16Type;
22
+ UInt32: import("./datatypes").UInt32Type;
23
+ UInt64: import("./datatypes").UInt64Type;
24
+ Float32: import("./datatypes").Float32Type;
25
+ Float64: import("./datatypes").Float64Type;
26
+ Decimal: (precision?: number, scale?: number) => import("./datatypes").DecimalType;
27
+ Boolean: import("./datatypes").BooleanType;
28
+ Utf8: import("./datatypes").Utf8Type;
29
+ Binary: import("./datatypes").BinaryType;
30
+ Date: import("./datatypes").DateType;
31
+ Datetime: import("./datatypes").DatetimeType;
32
+ Time: import("./datatypes").TimeType;
33
+ Duration: import("./datatypes").DurationType;
34
+ Object: import("./datatypes").ObjectType;
35
+ Null: import("./datatypes").NullType;
36
+ List: <TInner>(inner: DataType<TInner>) => import("./datatypes").ListType<TInner>;
37
+ Struct: <TFields extends RowRecord>(fields: { [K in keyof TFields]: DataType<TFields[K]>; }) => import("./datatypes").StructType<TFields>;
38
+ };
39
+ };
package/dist/api.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.$tbl = void 0;
4
+ const dataframe_1 = require("./dataframe");
5
+ const columnExpressions_1 = require("./columnExpressions");
6
+ const datatypes_1 = require("./datatypes");
7
+ const functions_1 = require("./functions");
8
+ exports.$tbl = {
9
+ data: (data, schema) => new dataframe_1.DataFrame(data, schema),
10
+ col: (name) => new columnExpressions_1.ColumnExpr(name),
11
+ all: columnExpressions_1.all,
12
+ exclude: columnExpressions_1.exclude,
13
+ coalesce: columnExpressions_1.coalesce,
14
+ concat: functions_1.concat,
15
+ lit: columnExpressions_1.lit,
16
+ when: columnExpressions_1.when,
17
+ DataType: datatypes_1.DataTypeRegistry
18
+ };
@@ -0,0 +1 @@
1
+ "use strict";var Vt=Object.defineProperty;var xn=Object.getOwnPropertyDescriptor;var bn=Object.getOwnPropertyNames;var wn=Object.prototype.hasOwnProperty;var _n=(s,t)=>{for(var e in t)Vt(s,e,{get:t[e],enumerable:!0})},Tn=(s,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of bn(t))!wn.call(s,r)&&r!==e&&Vt(s,r,{get:()=>t[r],enumerable:!(n=xn(t,r))||n.enumerable});return s};var Dn=s=>Tn(Vt({},"__esModule",{value:!0}),s);var Mn={};_n(Mn,{$tbl:()=>On,ALL_COLUMNS_MARKER:()=>j,AggregationExpr:()=>Ht,ArithmeticExpr:()=>Wt,ColumnExpr:()=>k,ColumnNotFoundError:()=>B,ComparisonExpr:()=>qt,ComputeError:()=>nt,DataFrame:()=>F,DataFrameError:()=>V,DataType:()=>K,DataTypeRegistry:()=>L,DateTimeExprNamespace:()=>Ut,ExprBase:()=>wt,FrameScriptError:()=>ut,GroupedData:()=>Tt,LITERAL_MARKER:()=>Pt,ListExpr:()=>Xt,ListExprNamespace:()=>vt,LogicalExpr:()=>Yt,SchemaError:()=>ct,StringExpr:()=>zt,StringExprNamespace:()=>Mt,TemporalExpr:()=>Zt,When:()=>Ft,WhenThen:()=>_t,WhenThenChain:()=>Rt,WindowExpr:()=>Gt,all:()=>Jt,coalesce:()=>te,columnsToRows:()=>Ae,concat:()=>Dt,derive:()=>g,exclude:()=>Qt,getRowFromColumns:()=>En,inferColumnType:()=>rt,kleeneBinary:()=>v,kleeneUnary:()=>_,lit:()=>it,normalizeToDataFrames:()=>dn,resolveColumnSelectors:()=>ft,resolveWindowExpr:()=>jt,rowsToColumns:()=>De,when:()=>ee});module.exports=Dn(Mn);var ke=/[,\s_]/g,An=/^[+-]?\d+(?:\.\d+)?$/;function ot(s){return typeof s=="number"&&!Number.isNaN(s)&&Number.isFinite(s)}function et(s){if(s==null||typeof s=="symbol")return null;if(ot(s))return s;if(typeof s=="boolean")return s?1:0;if(typeof s=="bigint"){let t=Number(s);return ot(t)?t:null}if(s instanceof Date){let t=s.getTime();return ot(t)?t:null}if(typeof s=="string"){let t=s.trim().replace(ke,"");if(t==="")return null;let e=Number(t);return ot(e)?e:null}return null}function yt(s){let{val:t,min:e,max:n}=s;return t<e?e:t>n?n:t}var Se=34028234663852886e22,vn={Float32:{min:-Se,max:Se},Float64:{min:-Number.MAX_VALUE,max:Number.MAX_VALUE}};function At(s,t="Float64"){let e=et(s);return e===null?null:t==="Float32"?Math.fround(e):e}var Ee={Int8:{min:-128,max:127},Int16:{min:-32768,max:32767},Int32:{min:-2147483648,max:2147483647},UInt8:{min:0,max:255},UInt16:{min:0,max:65535},UInt32:{min:0,max:4294967295}},In={Int64:{min:-9223372036854775808n,max:9223372036854775807n},UInt64:{min:0n,max:18446744073709551615n}};function Oe(s,t){if(!ot(s)||!Number.isInteger(s))return!1;if(!t)return!0;let e=typeof t=="string"?Ee[t]:t;return s>=e.min&&s<=e.max}function H(s,t="Int32",e={}){let n=et(s);if(n===null)return null;let r=n;switch(e.coerce||"truncate"){case"round":r=Math.round(r);break;case"floor":r=Math.floor(r);break;case"ceil":r=Math.ceil(r);break;case"truncate":r=Math.trunc(r);break}let i=typeof t=="string"?Ee[t]:t;return yt({val:r,min:i.min,max:i.max})}function It(s,t="Int64"){if(s==null||typeof s=="symbol")return null;let e=null;if(typeof s=="bigint")e=s;else if(typeof s=="boolean")e=s?1n:0n;else if(typeof s=="string"){let r=s.trim().replace(ke,"");if(r==="")return null;if(An.test(r))e=BigInt(r.split(".")[0]);else{let o=et(s);if(o===null)return null;e=BigInt(Math.trunc(o))}}else{let r=et(s);if(r===null)return null;e=BigInt(Math.trunc(r))}let n=typeof t=="string"?In[t]:t;return yt({val:e,min:n.min,max:n.max})}function Ct(s,t={}){let e=et(s);if(e===null)return null;let{precision:n,scale:r}=t,o=e;if(r!==void 0){let i=Math.pow(10,r);o=Math.round(o*i)/i}if(n!==void 0){let i=r||0,l=n-i;if(l>0){let a=Math.pow(10,l)-Math.pow(10,-i);o=yt({val:o,min:-a,max:a})}}return o}function Me(s){let t=s|0;return function(){let e=t=t+1831565813|0;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}}var St=/^\d{2}:\d{2}/,kt=/(?:Z|[+-]\d{2}(?::?\d{2})?)$/i;var Bt=1e3,ve=6e4,Re=36e5,dt=864e5,Et=1e3,Ot=1e6;function Fe(s,t="ms"){let e=s.getTime();switch(t){case"s":return Math.floor(e/Bt);case"ms":return e;case"us":return e*Et;case"ns":return e*Ot}}function Ne(s){let t=s.getUTCFullYear();return Math.floor((t-1)/100)+1}function Le(s){let t=new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth(),s.getUTCDate())),e=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-e);let n=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-n.getTime())/dt+1)/7)}function je(s){let t=s.getUTCFullYear();return Math.floor((t-1)/1e3)+1}function Kt(s,t,e=1){return new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth()+t,e,0,0,0,0))}function Ve(s){let t=new Date(Date.UTC(s.getUTCFullYear(),0,1)),e=s.getTime()-t.getTime();return Math.floor(e/dt)+1}function Be(s){return Math.floor(s.getUTCMonth()/3)+1}function Ke(s){let t=s instanceof Date?s.getUTCFullYear():s;return t%4===0&&t%100!==0||t%400===0}function z(s){return s instanceof Date&&!Number.isNaN(s.getTime())}function Ue(s){let t=Math.abs(s);return t>=1e12?s:t<=1e10?s*1e3:s}var Cn=["%ms","%f","%Y","%y","%m","%d","%e","%H","%I","%p","%M","%S","%A","%a","%B","%b","%h","%j","%u","%w","%Z","%z"];function $e(s,t,e){let n=t;n=n.replace(/%%/g,"\0"),n=n.replace(/%F/g,"%Y-%m-%d"),n=n.replace(/%T/g,"%H:%M:%S"),n=n.replace(/%R/g,"%H:%M"),n=n.replace(/%D/g,"%m/%d/%y");let r={get"%Y"(){return String(s.getUTCFullYear())},get"%y"(){return String(s.getUTCFullYear()%100).padStart(2,"0")},get"%m"(){return String(s.getUTCMonth()+1).padStart(2,"0")},get"%d"(){return String(s.getUTCDate()).padStart(2,"0")},get"%e"(){return String(s.getUTCDate()).padStart(2," ")},get"%H"(){return String(s.getUTCHours()).padStart(2,"0")},get"%I"(){return String(s.getUTCHours()%12||12).padStart(2,"0")},get"%p"(){return s.getUTCHours()>=12?"PM":"AM"},get"%M"(){return String(s.getUTCMinutes()).padStart(2,"0")},get"%S"(){return String(s.getUTCSeconds()).padStart(2,"0")},get"%A"(){return s.toLocaleDateString(e,{weekday:"long",timeZone:"UTC"})},get"%a"(){return s.toLocaleDateString(e,{weekday:"short",timeZone:"UTC"})},get"%B"(){return s.toLocaleDateString(e,{month:"long",timeZone:"UTC"})},get"%b"(){return s.toLocaleDateString(e,{month:"short",timeZone:"UTC"})},get"%h"(){return s.toLocaleDateString(e,{month:"short",timeZone:"UTC"})},get"%j"(){let o=new Date(Date.UTC(s.getUTCFullYear(),0,1)),i=s.getTime()-o.getTime(),l=Math.floor(i/dt)+1;return String(l).padStart(3,"0")},get"%u"(){return String(s.getUTCDay()||7)},get"%w"(){return String(s.getUTCDay())},get"%Z"(){return"UTC"},get"%z"(){return"+0000"},get"%ms"(){return String(s.getUTCMilliseconds()).padStart(3,"0")},get"%f"(){return String(s.getUTCMilliseconds()*1e3).padStart(6,"0")}};for(let o of Cn)n.includes(o)&&(n=n.replaceAll(o,r[o]));return n.replace(/\0/g,"%")}function Pe(s,t,e=!0){if(typeof s!="string"||typeof t!="string")return null;let n=[],r=1,o="",i=0;for(;i<t.length;){let b=t[i];if(b==="%")if(i+1<t.length){let w=t[i+1];if(w==="%")o+="%",i+=2;else if(t.slice(i,i+3)==="%ms")n.push({name:"ms",index:r++}),o+="(\\d{1,3})",i+=3;else{switch(w){case"Y":n.push({name:"year",index:r++}),o+="(\\d{4})";break;case"y":n.push({name:"year_short",index:r++}),o+="(\\d{2})";break;case"m":n.push({name:"month",index:r++}),o+="(\\d{1,2})";break;case"d":case"e":n.push({name:"day",index:r++}),o+="(\\d{1,2})";break;case"H":case"I":n.push({name:"hour",index:r++}),o+="(\\d{1,2})";break;case"M":n.push({name:"minute",index:r++}),o+="(\\d{1,2})";break;case"S":n.push({name:"second",index:r++}),o+="(\\d{1,2})";break;case"f":n.push({name:"fractional",index:r++}),o+="(\\d{1,6})";break;default:o+=b+w}i+=2}}else o+=b,i++;else"\\^$*+?.()|[]{}".indexOf(b)!==-1?o+="\\"+b:o+=b,i++}let l=new RegExp("^"+o+"$"),a=s.match(l);if(!a){if(e)return null;let b=new Date(s);return z(b)?b:null}let u=1970,c=1,f=1,h=0,p=0,m=0,y=0;for(let b of n){let w=a[b.index],A=parseInt(w,10);switch(b.name){case"year":u=A;break;case"year_short":u=A+(A>=69?1900:2e3);break;case"month":c=A;break;case"day":f=A;break;case"hour":h=A;break;case"minute":p=A;break;case"second":m=A;break;case"ms":y=parseInt(w.padEnd(3,"0").slice(0,3),10);break;case"fractional":y=parseInt(w.padEnd(6,"0").slice(0,3),10);break}}let d=new Date(Date.UTC(u,c-1,f,h,p,m,y));return z(d)?d:null}function Y(s){if(s instanceof Date)return z(s)?s:null;if(typeof s=="number"){let t=new Date(Ue(s));return z(t)?t:null}if(typeof s=="bigint"){let t=new Date(Ue(Number(s)));return z(t)?t:null}if(typeof s=="string"){let t=s.trim();if(t==="")return null;let e=new Date(t);return z(e)?e:null}return null}function P(s){return ArrayBuffer.isView(s)&&!(s instanceof DataView)}function C(s){return Array.isArray(s)||P(s)}function Z(s){return s!==null&&typeof s=="object"&&!Array.isArray(s)}function xt(s){if(!Z(s))return!1;let t=Object.getPrototypeOf(s);return t===null||t===Object.prototype}function We(s){return typeof s!="function"?!1:/^class\s/.test(Function.prototype.toString.call(s))||s.prototype!==void 0&&s.prototype.constructor===s&&Object.getOwnPropertyDescriptor(s,"prototype")?.writable===!1}function Sn(s){if(s==null)return!1;if(s instanceof Uint8Array||typeof s=="string")return!0;if(Array.isArray(s)){let t=s.length;for(let e=0;e<t;e++)if(!Oe(s[e],{min:-128,max:255}))return!1;return!0}return!!P(s)}function qe(s){return Sn(s)?s instanceof Uint8Array?s:typeof s=="string"?new TextEncoder().encode(s):ArrayBuffer.isView(s)?new Uint8Array(s.buffer,s.byteOffset,s.byteLength):new Uint8Array(s):null}function st(s){return s==null?[]:Array.isArray(s)?s:P(s)?Array.from(s):[s]}function lt(s,t,{mode:e="every",allowNulls:n=!1,allowEmpty:r=!0}={}){if(!C(s))return!1;let o=s.length;if(o===0)return r?e==="every":!1;let i=l=>l==null?n:typeof t=="function"?We(t)?l instanceof t:t(l):t==="date"?z(l):t==="object"?Z(l):t==="plainObject"?xt(l):t==="number"?ot(l):typeof l===t;if(e==="every"){for(let l=0;l<o;l++)if(!i(s[l]))return!1;return!0}else{for(let l=0;l<o;l++)if(i(s[l]))return!0;return!1}}function $t(s,t=!1){if(!C(s))return[];let e=Array.from(s);return e.sort((n,r)=>n==null&&r==null?0:n==null?1:r==null?-1:n<r?t?1:-1:n>r?t?-1:1:0),e}function bt(s){if(!C(s))return{sum:null,count:0,min:null,max:null};let t=s.length;if(t===0)return{sum:null,count:0,min:null,max:null};let e=0,n=0,r=null,o=null;for(let i=0;i<t;i++){let l=s[i];if(l==null)continue;(r==null||l<r)&&(r=l),(o==null||l>o)&&(o=l);let a=et(l);a!==null&&(e+=a,n++)}return{sum:n>0?e:null,count:n,min:r,max:o}}function He(s){if(!lt(s,"number",{allowNulls:!0}))return null;let t=s.length,e=[];for(let r=0;r<t;r++){let o=s[r];o!=null&&e.push(o)}if(e.length===0)return null;e.sort((r,o)=>r-o);let n=Math.floor(e.length/2);return e.length%2!==0?e[n]:(e[n-1]+e[n])/2}function Ge(s){if(!C(s))return null;let t=s.length,e=new Map,n=0;for(let o=0;o<t;o++){let i=s[o];if(i==null)continue;let l=(e.get(i)??0)+1;e.set(i,l),l>n&&(n=l)}if(n===0)return[];let r=[];for(let[o,i]of e.entries())i===n&&r.push(o);return $t(r)}function at(s,t=null,{mode:e="both",returnStringOnNull:n=!1,maxScanStart:r=1,maxScanEnd:o=1,maxMatchesStart:i=1,maxMatchesEnd:l=1,trimFirst:a=!1,stringOptions:{literal:u=!1,caseInsensitive:c=!1}={}}={}){if(s==null)return n?"":null;let f=(x,I="both")=>I==="start"?x.trimStart():I==="end"?x.trimEnd():x.trim(),h=s;if(a&&t!=null&&(h=f(s,e)),t==null){let x=f(h,e);return n||x!==""?x:null}let p=t instanceof RegExp?x=>t.test(x):(()=>{let x=new Set(c?t.toLowerCase():t);return I=>x.has(c?I.toLowerCase():I)})(),m=h.length,y=new Uint8Array(m),A=u&&typeof t=="string"?({isStart:x,limit:I,maxMatches:U})=>{if(m===0||U===0)return;let E=t.length;if(E===0)return;let N=c?h.toLowerCase():h,$=c?t.toLowerCase():t,T=x?0:m-1,D=0,O=0;for(;T>=0&&T<m&&!(U!==null&&U>=0&&D>=U);){let R=x?T:T-E+1;if(!x&&R<0)break;let M=x?N.indexOf($,R):N.lastIndexOf($,R);if(M===-1)break;let q=x?M-T:T-(M+E-1);if(O+=q,I!==null&&I>=0&&O>=I)break;for(let G=0;G<E;G++)y[M+G]=1;D++,T=x?M+E:M-1}}:({isStart:x,limit:I,maxMatches:U})=>{if(m===0||U===0)return;let E=x?0:m-1,N=x?m:-1,$=x?1:-1,T=!1,D=0,O=0;for(let R=E;R!==N;R+=$)if(p(h[R])){if(!T){if(I!==null&&I>=0&&O>=I||U!==null&&U>=0&&D>=U)break;T=!0,D++}y[R]=1}else T=!1,O++};(e==="both"||e==="start")&&A({isStart:!0,limit:r,maxMatches:i}),(e==="both"||e==="end")&&A({isStart:!1,limit:o,maxMatches:l});let S="";for(let x=0;x<m;x++)y[x]===0&&(S+=h[x]);return n||S!==""?S:null}var j="*",Pt="*literal*";var _=s=>t=>{let e=t.length,n=new Array(e);for(let r=0;r<e;r++){let o=t[r];n[r]=o==null?null:s(o)}return n},v=(s,t,e)=>(n,r)=>{let o=n.length,i=s._resolve(t,r,o),l=new Array(o);if(C(i))for(let a=0;a<o;a++){let u=n[a],c=i[a];l[a]=u==null||c==null?null:e(u,c)}else for(let a=0;a<o;a++){let u=n[a];l[a]=u==null||i==null?null:e(u,i)}return l},g=(s,t)=>{let e=s.constructor,n=new e(s.colName||"");return Object.assign(n,s),n.ops=t?[...s.ops,t]:[...s.ops],n},wt=class{ops=[];outputName="";aggFn=null;groupingOpsIndex;partitionOpsIndex;partitionBy=null;_resolve(t,e,n){return t&&typeof t=="object"&&"evaluate"in t?t.isLiteral&&t.ops.length===1?t.literalValue:t.evaluate(e,n):t}alias(t){let e=this.constructor,n=new e(this.colName||"");return Object.assign(n,this),n.outputName=t,n}cast(t){return g(this,e=>{let n=e.length,r=new Array(n);for(let o=0;o<n;o++)r[o]=t.coerce(e[o]);return r})}debug(t){return g(this,e=>(console.log(`[DEBUG] ${t?t+": ":""}`,e),e))}evaluate(t,e){let n=this.colName,r=n&&n!=="*"?t[n]||new Array(e).fill(null):new Array(e).fill(null),o=this.ops,i=o.length;for(let l=0;l<i;l++)r=o[l](r,t);return r}_evaluatePre(t,e,n){let r=this.colName,o=r&&r!=="*"?e[r]||new Array(n).fill(null):new Array(n).fill(null),i=this.ops,l=t!==void 0?t:i.length;for(let a=0;a<l;a++)o=i[a](o,e);return o}_evaluatePost(t,e,n){let r=this.ops,o=t!==void 0?t:r.length,i=e;for(let l=o;l<r.length;l++)i=r[l](i,n);return i}evaluatePrePartition(t,e){return this._evaluatePre(this.partitionOpsIndex,t,e)}evaluatePostPartition(t,e){return this._evaluatePost(this.partitionOpsIndex,t,e)}evaluatePreGrouping(t,e){return this._evaluatePre(this.groupingOpsIndex,t,e)}evaluatePostGrouping(t,e){return this._evaluatePost(this.groupingOpsIndex,t,e)}};var Wt=s=>class extends s{abs(){return g(this,_(t=>Math.abs(t)))}acos(){return g(this,_(t=>t<-1||t>1?null:Math.acos(t)))}acosh(){return g(this,_(t=>t<1?null:Math.acosh(t)))}add(t){return g(this,v(this,t,(e,n)=>e+n))}asin(){return g(this,_(t=>t<-1||t>1?null:Math.asin(t)))}asinh(){return g(this,_(Math.asinh))}atan(){return g(this,_(Math.atan))}atanh(){return g(this,_(t=>t<=-1||t>=1?null:Math.atanh(t)))}cbrt(){return g(this,_(Math.cbrt))}ceil(){return g(this,_(Math.ceil))}clip(t=null,e=null){return g(this,_(n=>t!==null&&e!==null?yt({val:n,min:t,max:e}):t!==null?Math.max(n,t):e!==null?Math.min(n,e):n))}cos(){return g(this,_(Math.cos))}cosh(){return g(this,_(Math.cosh))}degrees(){return g(this,_(t=>t*(180/Math.PI)))}div(t){return g(this,v(this,t,(e,n)=>n===0?null:e/n))}exp(){return g(this,_(Math.exp))}expm1(){return g(this,_(Math.expm1))}floor(){return g(this,_(Math.floor))}floordiv(t){return g(this,v(this,t,(e,n)=>n===0?null:Math.floor(e/n)))}hypot(t){return g(this,v(this,t,(e,n)=>Math.hypot(e,n)))}log(t=Math.E){return g(this,_(e=>e<=0?null:t===Math.E?Math.log(e):Math.log(e)/Math.log(t)))}log1p(){return g(this,_(t=>t<=-1?null:Math.log1p(t)))}mod(t){return g(this,v(this,t,(e,n)=>n===0?null:e%n))}mul(t){return g(this,v(this,t,(e,n)=>e*n))}negate(){return g(this,_(t=>-t))}pow(t){return g(this,v(this,t,(e,n)=>Math.pow(e,n)))}radians(){return g(this,_(t=>t*(Math.PI/180)))}rand(t,{min:e=0,max:n=1,integer:r=!1}={}){return g(this,o=>{let i=o.length,l=new Float64Array(i),a=t!==void 0?Me(t):Math.random,u=n-e;for(let c=0;c<i;c++){let f=a();l[c]=r?Math.floor(f*(u+1))+e:f*u+e}return l})}round(t=0){let e=Math.pow(10,t);return g(this,_(n=>Math.round(n*e)/e))}sign(){return g(this,_(Math.sign))}sin(){return g(this,_(Math.sin))}sinh(){return g(this,_(Math.sinh))}sqrt(){return g(this,_(t=>t<0?null:Math.sqrt(t)))}sub(t){return g(this,v(this,t,(e,n)=>e-n))}tan(){return g(this,_(Math.tan))}tanh(){return g(this,_(Math.tanh))}trunc(){return g(this,_(Math.trunc))}};function W(s){return s==null?s:s instanceof Date?`d:${s.getTime()}`:s instanceof Uint8Array?`u:${s.toString()}`:typeof s=="object"||typeof s=="function"?String(s):s}var qt=s=>class extends s{between(t,e,n="both"){return g(this,(r,o)=>{let i=r.length,l=this._resolve(t,o,i),a=this._resolve(e,o,i),u=new Array(i),c=C(l),f=C(a);for(let h=0;h<i;h++){let p=r[h],m=c?l[h]:l,y=f?a[h]:a;if(p==null||m==null||y==null)u[h]=null;else{let d=n==="both"||n==="left"?p>=m:p>m,b=n==="both"||n==="right"?p<=y:p<y;u[h]=d&&b}}return u})}eq(t){return g(this,v(this,t,(e,n)=>e===n))}eq_missing(t){return g(this,(e,n)=>{let r=e.length,o=this._resolve(t,n,r),i=new Array(r);if(C(o))for(let l=0;l<r;l++){let a=e[l],u=o[l];a==null&&u==null?i[l]=!0:a==null||u==null?i[l]=!1:i[l]=a===u}else for(let l=0;l<r;l++){let a=e[l];a==null&&o==null?i[l]=!0:a==null||o==null?i[l]=!1:i[l]=a===o}return i})}ge(t){return g(this,v(this,t,(e,n)=>e>=n))}gt(t){return g(this,v(this,t,(e,n)=>e>n))}has_nulls(){return this._deriveAgg(t=>{for(let e=0;e<t.length;e++)if(t[e]==null)return!0;return!1})}is_close(t,e={}){let{abs_tol:n=1e-8,rel_tol:r=1e-8,nans_equal:o=!1}=e;return g(this,(i,l)=>{let a=i.length,u=this._resolve(t,l,a),c=C(u),f=new Array(a);for(let h=0;h<a;h++){let p=i[h],m=c?u[h]:u;if(p==null||m==null)f[h]=null;else if(Number.isNaN(p)||Number.isNaN(m))o&&Number.isNaN(p)&&Number.isNaN(m)?f[h]=!0:f[h]=!1;else if(!Number.isFinite(p)||!Number.isFinite(m))f[h]=p===m;else{let y=Math.abs(p-m),d=Math.max(r*Math.max(Math.abs(p),Math.abs(m)),n);f[h]=y<=d}}return f})}is_duplicated(){return g(this,t=>{let e=t.length,n=new Map,r=new Array(e);for(let i=0;i<e;i++){let l=W(t[i]);r[i]=l,n.set(l,(n.get(l)||0)+1)}let o=new Array(e);for(let i=0;i<e;i++)o[i]=(n.get(r[i])||0)>1;return o})}is_empty(t={}){let{ignoreNulls:e=!1}=t;return g(this,_(n=>{if(typeof n=="string")return n.length===0;if(C(n)){if(e){let r=n.length,o=0;for(let i=0;i<r;i++)n[i]!=null&&o++;return o===0}return n.length===0}return null}))}is_finite(){return g(this,_(Number.isFinite))}is_first_distinct(){return g(this,t=>{let e=t.length,n=new Set,r=new Array(e);for(let o=0;o<e;o++){let i=W(t[o]);n.has(i)?r[o]=!1:(n.add(i),r[o]=!0)}return r})}is_in(t){return g(this,(e,n)=>{let r=e.length,o=new Array(r);if(t&&typeof t=="object"&&"evaluate"in t){let i=t.evaluate(n,r);for(let l=0;l<r;l++){let a=e[l];if(a==null)o[l]=null;else{let u=i[l],c=new Set;if(C(u)){let f=u.length;for(let h=0;h<f;h++)c.add(W(u[h]))}else c.add(W(u));o[l]=c.has(W(a))}}}else{let i=C(t)?t:[],l=new Set,a=i.length;for(let u=0;u<a;u++)l.add(W(i[u]));for(let u=0;u<r;u++){let c=e[u];o[u]=c==null?null:l.has(W(c))}}return o})}is_infinite(){return g(this,_(t=>t===1/0||t===-1/0))}is_last_distinct(){return g(this,t=>{let e=t.length,n=new Set,r=new Array(e);for(let o=e-1;o>=0;o--){let i=W(t[o]);n.has(i)?r[o]=!1:(n.add(i),r[o]=!0)}return r})}is_n_distinct(t){return this._deriveAgg(e=>{let n=new Set,r=e.length;for(let o=0;o<r;o++)n.add(W(e[o]));return n.size===t})}is_nan(){return g(this,_(Number.isNaN))}is_not_nan(){return g(this,_(t=>!Number.isNaN(t)))}is_not_null(){return g(this,t=>{let e=t.length,n=new Array(e);for(let r=0;r<e;r++)n[r]=t[r]!=null;return n})}is_null(){return g(this,t=>{let e=t.length,n=new Array(e);for(let r=0;r<e;r++)n[r]=t[r]==null;return n})}is_unique(){return g(this,t=>{let e=t.length,n=new Map,r=new Array(e);for(let i=0;i<e;i++){let l=W(t[i]);r[i]=l,n.set(l,(n.get(l)||0)+1)}let o=new Array(e);for(let i=0;i<e;i++)o[i]=n.get(r[i])===1;return o})}le(t){return g(this,v(this,t,(e,n)=>e<=n))}lt(t){return g(this,v(this,t,(e,n)=>e<n))}ne(t){return g(this,v(this,t,(e,n)=>e!==n))}ne_missing(t){return g(this,(e,n)=>{let r=e.length,o=this._resolve(t,n,r),i=new Array(r);if(C(o))for(let l=0;l<r;l++){let a=e[l],u=o[l];a==null&&u==null?i[l]=!1:a==null||u==null?i[l]=!0:i[l]=a!==u}else for(let l=0;l<r;l++){let a=e[l];a==null&&o==null?i[l]=!1:a==null||o==null?i[l]=!0:i[l]=a!==o}return i})}not_in(t){return g(this,(e,n)=>{let r=e.length,o=new Array(r);if(t&&typeof t=="object"&&"evaluate"in t){let i=t.evaluate(n,r);for(let l=0;l<r;l++){let a=e[l];if(a==null)o[l]=null;else{let u=i[l],c=new Set;if(C(u)){let f=u.length;for(let h=0;h<f;h++)c.add(W(u[h]))}else c.add(W(u));o[l]=!c.has(W(a))}}}else{let i=C(t)?t:[],l=new Set,a=i.length;for(let u=0;u<a;u++)l.add(W(i[u]));for(let u=0;u<r;u++){let c=e[u];o[u]=c==null?null:!l.has(W(c))}}return o})}};var ut=class extends Error{constructor(t){super(t),this.name=this.constructor.name,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},V=class extends ut{},B=class extends V{constructor(t,e){super(e||`Column "${t}" does not exist in the DataFrame.`)}},ct=class extends ut{},nt=class extends ut{};var Ht=s=>class extends s{aggFn=this.aggFn||null;_deriveAgg(t){let e=g(this);return e.aggFn=t,e.groupingOpsIndex=this.ops.length,e.partitionOpsIndex=this.ops.length,e}all(){return this._deriveAgg(t=>{for(let e=0;e<t.length;e++)if(!t[e])return!1;return!0})}all_null(){return this._deriveAgg(t=>{for(let e=0;e<t.length;e++)if(t[e]!=null)return!1;return!0})}any(){return this._deriveAgg(t=>{for(let e=0;e<t.length;e++)if(t[e])return!0;return!1})}any_null(){return this._deriveAgg(t=>{for(let e=0;e<t.length;e++)if(t[e]==null)return!0;return!1})}avg(){return this._deriveAgg(t=>{let e=0,n=0;for(let r=0;r<t.length;r++)t[r]!=null&&(e+=t[r],n++);return n?e/n:null})}count(t={}){return t.includeNulls?this._deriveAgg(e=>e.length):this._deriveAgg(e=>{let n=0;for(let r=0;r<e.length;r++)e[r]!=null&&n++;return n})}first(){return this._deriveAgg(t=>t[0]??null)}last(){return this._deriveAgg(t=>t[t.length-1]??null)}max(){return this._deriveAgg(t=>{let e=null;for(let n=0;n<t.length;n++)t[n]!=null&&(e===null||t[n]>e)&&(e=t[n]);return e})}mean(){return this.avg()}median(){return this._deriveAgg(t=>{let e=[];for(let o=0;o<t.length;o++)t[o]!=null&&e.push(t[o]);let n=e.length;if(!n)return null;e.sort((o,i)=>o-i);let r=Math.floor(n/2);return n%2!==0?e[r]:(e[r-1]+e[r])/2})}min(){return this._deriveAgg(t=>{let e=null;for(let n=0;n<t.length;n++)t[n]!=null&&(e===null||t[n]<e)&&(e=t[n]);return e})}mode(){return this._deriveAgg(t=>{let e=new Map,n=0,r=null;for(let o=0;o<t.length;o++){let i=t[o];if(i==null)continue;let l=(e.get(i)||0)+1;e.set(i,l),l>n&&(n=l,r=i)}return r})}n_unique(){return this._deriveAgg(t=>new Set(t).size)}quantile(t){if(t<0||t>1)throw new nt("Quantile q must be between 0 and 1");return this._deriveAgg(e=>{let n=[];for(let a=0;a<e.length;a++)e[a]!=null&&n.push(e[a]);let r=n.length;if(!r)return null;n.sort((a,u)=>a-u);let o=(r-1)*t,i=Math.floor(o),l=Math.ceil(o);return i===l?n[i]:n[i]+(o-i)*(n[l]-n[i])})}std(){return this._deriveAgg(t=>{let e=0,n=0;for(let i=0;i<t.length;i++)t[i]!=null&&(e+=t[i],n++);if(n<2)return 0;let r=e/n,o=0;for(let i=0;i<t.length;i++)t[i]!=null&&(o+=(t[i]-r)**2);return Math.sqrt(o/(n-1))})}sum(){return this._deriveAgg(t=>{let e=null;for(let n=0;n<t.length;n++)t[n]!=null&&(e=(e??0)+t[n]);return e})}};var Gt=s=>class extends s{partitionBy=this.partitionBy||null;_rolling(t,e){let n=g(this);return n.partitionOpsIndex=this.ops.length,n.groupingOpsIndex=this.ops.length,n.evaluateWindow=function(r,o,i){let l=Math.max(0,i-t+1),a=i+1,u=r.slice(l,a);return e(u)},n}get isWindow(){return this.partitionBy!==null||this.evaluateWindow!==void 0||this.aggFn!==null}cum_count(t=!1){let e=g(this);return e.partitionOpsIndex=this.ops.length,e.groupingOpsIndex=this.ops.length,e.evaluateWindow=function(n,r,o){let i=0,l=t?o:0,a=t?n.length-1:o;for(let u=l;u<=a;u++)n[u]!=null&&i++;return i},e}cum_max(t=!1){let e=g(this);return e.partitionOpsIndex=this.ops.length,e.groupingOpsIndex=this.ops.length,e.evaluateWindow=function(n,r,o){let i=null,l=t?o:0,a=t?n.length-1:o;for(let u=l;u<=a;u++){let c=n[u];c!=null&&(i===null||c>i)&&(i=c)}return i},e}cum_min(t=!1){let e=g(this);return e.partitionOpsIndex=this.ops.length,e.groupingOpsIndex=this.ops.length,e.evaluateWindow=function(n,r,o){let i=null,l=t?o:0,a=t?n.length-1:o;for(let u=l;u<=a;u++){let c=n[u];c!=null&&(i===null||c<i)&&(i=c)}return i},e}cum_prod(t=!1){let e=g(this);return e.partitionOpsIndex=this.ops.length,e.groupingOpsIndex=this.ops.length,e.evaluateWindow=function(n,r,o){let i=1,l=!1,a=t?o:0,u=t?n.length-1:o;for(let c=a;c<=u;c++){let f=n[c];f!=null&&(i*=f,l=!0)}return l?i:null},e}cum_sum(t=!1){let e=g(this);return e.partitionOpsIndex=this.ops.length,e.groupingOpsIndex=this.ops.length,e.evaluateWindow=function(n,r,o){let i=0,l=t?o:0,a=t?n.length-1:o;for(let u=l;u<=a;u++){let c=n[u];c!=null&&(i+=c)}return i},e}dense_rank(){let t=g(this);return t.partitionOpsIndex=this.ops.length,t.groupingOpsIndex=this.ops.length,t.evaluateWindow=function(e,n,r){let o=Array.from(new Set(e)).sort((a,u)=>a-u),i=new Map;for(let a=0;a<o.length;a++)i.set(o[a],a+1);let l=e[r];return i.get(l)??null},t}lag(t=1,e=null){let n=g(this);return n.partitionOpsIndex=this.ops.length,n.groupingOpsIndex=this.ops.length,n.evaluateWindow=function(r,o,i){let l=e;return i-t>=0&&(l=r[i-t]),l},n}lead(t=1,e=null){let n=g(this);return n.partitionOpsIndex=this.ops.length,n.groupingOpsIndex=this.ops.length,n.evaluateWindow=function(r,o,i){let l=e;return i+t<r.length&&(l=r[i+t]),l},n}over(t){let e=g(this),n=Array.isArray(t)?t:[t];return e.partitionBy=n,e}rank(){let t=g(this);return t.partitionOpsIndex=this.ops.length,t.groupingOpsIndex=this.ops.length,t.evaluateWindow=function(e,n,r){let o=[...e].sort((a,u)=>a-u),i=new Map;for(let a=0;a<o.length;a++){let u=o[a];i.has(u)||i.set(u,a+1)}let l=e[r];return i.get(l)??null},t}rolling_max(t){return this._rolling(t,e=>{let n=null;for(let r=0;r<e.length;r++)e[r]!=null&&(n===null||e[r]>n)&&(n=e[r]);return n})}rolling_mean(t){return this._rolling(t,e=>{let n=0,r=0;for(let o=0;o<e.length;o++)e[o]!=null&&(n+=e[o],r++);return r?n/r:null})}rolling_median(t){return this._rolling(t,e=>{let n=[];for(let o=0;o<e.length;o++)e[o]!=null&&n.push(e[o]);if(!n.length)return null;n.sort((o,i)=>o-i);let r=Math.floor(n.length/2);return n.length%2!==0?n[r]:(n[r-1]+n[r])/2})}rolling_min(t){return this._rolling(t,e=>{let n=null;for(let r=0;r<e.length;r++)e[r]!=null&&(n===null||e[r]<n)&&(n=e[r]);return n})}rolling_quantile(t,e){return this._rolling(e,n=>{let r=[];for(let u=0;u<n.length;u++)n[u]!=null&&r.push(n[u]);let o=r.length;if(o===0)return null;r.sort((u,c)=>u-c);let i=t*(o-1),l=Math.floor(i),a=Math.ceil(i);return l===a?r[l]:r[l]+(i-l)*(r[a]-r[l])})}rolling_rank(t){let e=g(this);return e.partitionOpsIndex=this.ops.length,e.groupingOpsIndex=this.ops.length,e.evaluateWindow=function(n,r,o){let i=Math.max(0,o-t+1),l=o+1,a=n.slice(i,l),u=n[o];if(u==null)return null;let c=[];for(let p=0;p<a.length;p++)a[p]!=null&&c.push(a[p]);if(c.length===0)return null;let f=[...c].sort((p,m)=>p-m),h=new Map;for(let p=0;p<f.length;p++){let m=f[p];h.has(m)||h.set(m,p+1)}return h.get(u)??null},e}rolling_std(t){return this._rolling(t,e=>{let n=0,r=0;for(let l=0;l<e.length;l++)e[l]!=null&&(n+=e[l],r++);if(r<2)return 0;let o=n/r,i=0;for(let l=0;l<e.length;l++)e[l]!=null&&(i+=(e[l]-o)**2);return Math.sqrt(i/(r-1))})}rolling_sum(t){return this._rolling(t,e=>{let n=null;for(let r=0;r<e.length;r++)e[r]!=null&&(n=(n??0)+e[r]);return n})}row_number(){let t=g(this);return t.partitionOpsIndex=this.ops.length,t.groupingOpsIndex=this.ops.length,t.evaluateWindow=function(e,n,r){return r+1},t.outputName="row_number",t}};var Mt=class{constructor(t){this.expr=t}expr;_deriveString(t){return g(this.expr,_(e=>t(String(e))))}concat(t){return g(this.expr,v(this.expr,t,(e,n)=>String(e)+String(n)))}contains(t){return t==null?g(this.expr,e=>new Array(e.length).fill(null)):this._deriveString(e=>t instanceof RegExp?t.test(e):e.includes(t))}count_matches(t){return t==null?g(this.expr,e=>new Array(e.length).fill(null)):this._deriveString(e=>{if(t instanceof RegExp){let n=t.global?t:new RegExp(t.source,t.flags+"g"),r=e.match(n);return r?r.length:0}else{let n=0,r=e.indexOf(t);for(;r!==-1;)n++,r=e.indexOf(t,r+t.length);return n}})}decode_uri_component(){return this._deriveString(t=>{try{return decodeURIComponent(t)}catch{return t}})}encode_uri_component(){return this._deriveString(t=>{try{return encodeURIComponent(t)}catch{return t}})}ends_with(t){return this._deriveString(e=>e.endsWith(t))}explode(){return this._deriveString(t=>t.split(""))}extract(t,e=0){return t==null?g(this.expr,n=>new Array(n.length).fill(null)):this._deriveString(n=>{let r=n.match(t);return r&&r[e]!==void 0?r[e]:null})}len(){return this.len_chars()}len_bytes(){return this._deriveString(t=>new TextEncoder().encode(t).length)}len_chars(){return this._deriveString(t=>t.length)}lower(){return this._deriveString(t=>t.toLowerCase())}lpad(t,e=" "){return this._deriveString(n=>n.padStart(t,e))}pad_end(t,e=" "){return this.rpad(t,e)}pad_start(t,e=" "){return this.lpad(t,e)}replace(t,e){return t==null?g(this.expr,n=>new Array(n.length).fill(null)):this._deriveString(n=>n.replace(t,e))}replace_all(t,e){return t==null?g(this.expr,n=>new Array(n.length).fill(null)):this._deriveString(n=>{if(t instanceof RegExp){let r=t.global?t:new RegExp(t.source,t.flags+"g");return n.replace(r,e)}return n.replaceAll(t,e)})}reverse(){return this._deriveString(t=>t.split("").reverse().join(""))}rpad(t,e=" "){return this._deriveString(n=>n.padEnd(t,e))}slice(t,e){return this._deriveString(n=>{let r=t<0?n.length+t:t,o=e!==void 0?r+e:void 0;return n.slice(r,o)})}slice_str(t,e){return this.slice(t,e)}split(t){return this._deriveString(e=>e.split(t))}starts_with(t){return this._deriveString(e=>e.startsWith(t))}strip_chars(t,e){return this._deriveString(n=>at(n,t,{mode:"both",...e}))}strip_chars_end(t,e){return this._deriveString(n=>at(n,t,{mode:"end",...e}))}strip_chars_start(t,e){return this._deriveString(n=>at(n,t,{mode:"start",...e}))}strip_prefix(t){return this._deriveString(e=>at(e,t,{mode:"start",maxScanStart:1,maxMatchesStart:1,returnStringOnNull:!0,stringOptions:{literal:!0}}))}strip_suffix(t){return this._deriveString(e=>at(e,t,{mode:"end",maxScanEnd:1,maxMatchesEnd:1,returnStringOnNull:!0,stringOptions:{literal:!0}}))}strptime(t,e=!0){return this._deriveString(n=>Pe(n,t,e))}to_date(){return this._deriveString(t=>{let e=Y(t);if(!e)return null;let n=new Date(e);return n.setUTCHours(0,0,0,0),n})}to_datetime(){return this._deriveString(Y)}to_decimal(t,e){return this._deriveString(n=>Ct(n,{precision:t,scale:e}))}to_integer(){return this._deriveString(t=>H(t))}to_lowercase(){return this.lower()}to_time(){return this._deriveString(t=>{let e=Y(t);if(e)return e.toISOString().split("T")[1].slice(0,12);let n=t.trim();if(St.test(n)){let r=new Date(`1970-01-01T${n}${kt.test(n)?"":"Z"}`);if(z(r))return r.toISOString().split("T")[1].slice(0,12)}return null})}to_titlecase(){return this._deriveString(t=>t.replace(/\b\w/g,e=>e.toUpperCase()))}to_uppercase(){return this.upper()}trim(){return this.strip_chars()}trim_end(){return this.strip_chars_end()}trim_start(){return this.strip_chars_start()}upper(){return this._deriveString(t=>t.toUpperCase())}zfill(t){return this._deriveString(e=>e.padStart(t,"0"))}},zt=s=>class extends s{get str(){return new Mt(this)}};var Yt=s=>class extends s{and(t){return g(this,(e,n)=>{let r=e.length,o=this._resolve(t,n,r),i=C(o),l=new Array(r);for(let a=0;a<r;a++){let u=e[a],c=i?o[a]:o;u===!1||c===!1?l[a]=!1:u==null||c==null?l[a]=null:l[a]=!0}return l})}not(){return g(this,_(t=>!t))}or(t){return g(this,(e,n)=>{let r=e.length,o=this._resolve(t,n,r),i=C(o),l=new Array(r);for(let a=0;a<r;a++){let u=e[a],c=i?o[a]:o;u===!0||c===!0?l[a]=!0:u==null||c==null?l[a]=null:l[a]=!1}return l})}xor(t){return g(this,v(this,t,(e,n)=>!!e!=!!n))}};var Ut=class{constructor(t){this.expr=t}expr;_deriveDate(t){return g(this.expr,_(e=>{let n=Y(e);return n?t(n):null}))}_deriveDuration(t){return g(this.expr,_(e=>typeof e=="number"?t(e):null))}century(){return this._deriveDate(Ne)}date(){return this._deriveDate(t=>new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate())))}datetime(){return this._deriveDate(t=>t)}day(){return this._deriveDate(t=>t.getUTCDate())}epoch(t="ms"){return this._deriveDate(e=>Fe(e,t))}hour(){return this._deriveDate(t=>t.getUTCHours())}is_leap_year(){return this._deriveDate(Ke)}microsecond(){return this._deriveDate(t=>t.getUTCMilliseconds()*Et)}millennium(){return this._deriveDate(je)}millisecond(){return this._deriveDate(t=>t.getUTCMilliseconds())}minute(){return this._deriveDate(t=>t.getUTCMinutes())}month(){return this._deriveDate(t=>t.getUTCMonth()+1)}month_end(){return this._deriveDate(t=>Kt(t,1,0))}month_start(){return this._deriveDate(t=>Kt(t,0,1))}nanosecond(){return this._deriveDate(t=>t.getUTCMilliseconds()*Ot)}ordinal_day(){return this._deriveDate(Ve)}quarter(){return this._deriveDate(Be)}second(){return this._deriveDate(t=>t.getUTCSeconds())}strftime(t,e){return this._deriveDate(n=>$e(n,t,e))}time(){return this._deriveDate(t=>t.toISOString().split("T")[1].slice(0,12))}timestamp(t="ms"){return this.epoch(t)}to_string(t,e){return this.strftime(t,e)}total_days(){return this._deriveDuration(t=>t/dt)}total_hours(){return this._deriveDuration(t=>t/Re)}total_microseconds(){return this._deriveDuration(t=>t*Et)}total_milliseconds(){return this._deriveDuration(t=>t)}total_minutes(){return this._deriveDuration(t=>t/ve)}total_nanoseconds(){return this._deriveDuration(t=>t*Ot)}total_seconds(){return this._deriveDuration(t=>t/Bt)}week(){return this._deriveDate(Le)}weekday(){return this._deriveDate(t=>t.getUTCDay()||7)}year(){return this._deriveDate(t=>t.getUTCFullYear())}},Zt=s=>class extends s{get dt(){return new Ut(this)}};var vt=class{constructor(t){this.expr=t}expr;_deriveList(t){return g(this.expr,_(e=>C(e)?t(e):null))}all(){return this._deriveList(t=>{let e=Array.from(t);for(let n=0;n<e.length;n++)if(!e[n])return!1;return!0})}any(){return this._deriveList(t=>{let e=Array.from(t);for(let n=0;n<e.length;n++)if(e[n])return!0;return!1})}contains(t){return this._deriveList(e=>Array.from(e).includes(t))}contains_all(t){return this._deriveList(e=>{let n=Array.from(e);for(let r=0;r<t.length;r++)if(!n.includes(t[r]))return!1;return!0})}contains_any(t){return this._deriveList(e=>{let n=Array.from(e);for(let r=0;r<t.length;r++)if(n.includes(t[r]))return!0;return!1})}count_matches(t){return this._deriveList(e=>{let n=Array.from(e),r=0;for(let o of n)o===t&&r++;return r})}drop_nulls(){return this._deriveList(t=>{let e=Array.from(t),n=[];for(let r=0;r<e.length;r++)e[r]!=null&&n.push(e[r]);return n})}first(t=!0){return this.get(0,t)}gather(t,e=!0){let n=Array.isArray(t)?t:[t];return this._deriveList(r=>{let o=r.length,i=new Array(n.length);for(let l=0;l<n.length;l++){let a=n[l],u=r.at(a);if(u===void 0&&!e)throw new nt(`Index ${a} is out of bounds for list of length ${o}`);i[l]=u??null}return i})}gather_every(t,e=0){if(t<=0)throw new nt("Step size n must be positive");return this._deriveList(n=>{let r=n.length,o=[];for(let i=e;i<r;i+=t)o.push(n[i]);return o})}get(t,e=!0){return this._deriveList(n=>{let r=n.at(t);if(r===void 0&&!e)throw new nt(`Index ${t} is out of bounds for list of length ${n.length}`);return r??null})}join(t,{ignoreNulls:e=!1}={}){return this._deriveList(n=>{let r=Array.from(n),o=[];for(let i=0;i<r.length;i++){let l=r[i];l!=null?o.push(String(l)):e||o.push("")}return o.join(t)})}last(t=!0){return this.get(-1,t)}len(){return this.lengths()}lengths(){return this._deriveList(t=>t.length)}max(){return this._deriveList(t=>bt(t).max)}mean(){return this._deriveList(t=>{let{sum:e,count:n}=bt(t);return e!==null&&n>0?e/n:null})}median(){return this._deriveList(He)}min(){return this._deriveList(t=>bt(t).min)}mode(){return this._deriveList(Ge)}n_unique(){return this._deriveList(t=>new Set(Array.from(t)).size)}reverse(){return this._deriveList(t=>Array.from(t).reverse())}slice(t,e){return this._deriveList(n=>{let r=Array.from(n),o=t<0?Math.max(0,r.length+t):t,i=e!==void 0?o+e:r.length;return r.slice(o,i)})}sort(t=!1){return this._deriveList(e=>$t(e,t))}sum(){return this._deriveList(t=>bt(t).sum)}unique(){return this._deriveList(t=>Array.from(new Set(Array.from(t))))}},Xt=s=>class extends s{get list(){return new vt(this)}};var ze=s=>class extends s{fill_null(t){return g(this,(e,n)=>{let r=e.length,o=this._resolve(t,n,r),i=new Array(r);if(C(o))for(let l=0;l<r;l++){let a=e[l];i[l]=a??o[l]}else for(let l=0;l<r;l++){let a=e[l];i[l]=a??o}return i})}reverse(){return g(this,t=>t.slice().reverse())}};var k=class extends Xt(Zt(Yt(zt(Gt(Ht(qt(Wt(ze(wt))))))))){colName;excludedCols=[];constructor(t){super(),this.colName=String(t),this.outputName=this.colName}};function it(s){let t=new k(Pt);return t.isLiteral=!0,t.literalValue=s,t.ops.push(e=>{let n=e.length,r=new Array(n);for(let o=0;o<n;o++)r[o]=s;return r}),t}function Jt(){return new k("*")}function Qt(s){let t=new k("*");return t.excludedCols=Array.isArray(s)?s:[s],t}function te(...s){let t=s.length===1&&Array.isArray(s[0])?s[0]:s,e=new k("*coalesce*");return e.ops.push((n,r)=>{let o=n.length,l=t.map(c=>typeof c=="string"?new k(c):c&&typeof c=="object"&&"evaluate"in c?c:it(c)).map(c=>c.evaluate(r,o)),a=new Array(o),u=l.length;for(let c=0;c<o;c++){let f=null;for(let h=0;h<u;h++){let p=l[h][c];if(p!=null){f=p;break}}a[c]=f}return a}),e}var Rt=class{predicates;values;constructor(t,e){this.predicates=t,this.values=e}then(t){return new _t(this.predicates,this.values.concat(t))}},Ft=class{predicates;constructor(t){this.predicates=[t]}then(t){return new _t(this.predicates,[t])}},_t=class s extends k{predicates;values;otherwiseValue;constructor(t,e,n=null){super(typeof t=="string"?t:"*when*"),this.predicates=Array.isArray(t)?t:[],this.values=e||[],this.otherwiseValue=n,this.ops.push((r,o)=>{let i=r.length,l=d=>typeof d=="string"?d in o?new k(d):it(d):d&&typeof d=="object"&&"evaluate"in d?d:it(d),a=this.predicates.map(l),u=this.values.map(l),c=l(this.otherwiseValue),f=a.map(d=>d.evaluate(o,i)),h=u.map(d=>d.evaluate(o,i)),p=c.evaluate(o,i),m=new Array(i),y=f.length;for(let d=0;d<i;d++){let b=!1;for(let w=0;w<y;w++)if(f[w][d]===!0){m[d]=h[w][d],b=!0;break}b||(m[d]=p[d])}return m})}when(t){return new Rt(this.predicates.concat(t),this.values)}otherwise(t){return new s(this.predicates,this.values,t)}};function ee(s){return new Ft(s)}function ft(s,t,e){let n=[],r=e?new Set(e):new Set;for(let o of s)if(typeof o=="string")n.push(new k(o));else if(o instanceof k&&o.colName==="*"){let i=new Set(o.excludedCols);for(let l of t)if(!r.has(l)&&!i.has(l)){let a=new k(l);a.ops=[...o.ops],a.aggFn=o.aggFn,a.partitionOpsIndex=o.partitionOpsIndex,a.groupingOpsIndex=o.groupingOpsIndex,a.partitionBy=o.partitionBy,o.evaluateWindow&&(a.evaluateWindow=o.evaluateWindow),o.outputName&&o.outputName!=="*"&&(a.outputName=o.outputName),n.push(a)}}else if(o&&typeof o=="object"&&"evaluate"in o&&!o.colName){for(let i of t)if(!r.has(i)){let l=new k(i);l.ops=[...o.ops],l.aggFn=o.aggFn,l.groupingOpsIndex=o.groupingOpsIndex,l.partitionOpsIndex=o.partitionOpsIndex,n.push(l)}}else n.push(o);return n}var K=class{get isNumeric(){return!1}get isInteger(){return!1}get isFloat(){return!1}get isSigned(){return!1}get isUnsigned(){return!1}get isTemporal(){return!1}get isNested(){return!1}get isBoolean(){return!1}get isString(){return!1}get isUtf8(){return!1}get isObject(){return!1}get isNull(){return!1}get isBinary(){return!1}},ht=class extends K{get isNumeric(){return!0}},Nt=class extends ht{get isInteger(){return!0}},X=class extends Nt{get isSigned(){return!0}},J=class extends Nt{get isUnsigned(){return!0}},mt=class extends ht{get isFloat(){return!0}},Q=class extends K{get isTemporal(){return!0}},pt=class extends K{get isNested(){return!0}};var ne=class extends X{name="Int8";coerce(t){return H(t,"Int8")}equals(t){return t.name==="Int8"}allocate(t){return new Int8Array(t)}},Ye=new ne;var re=class extends X{name="Int16";coerce(t){return H(t,"Int16")}equals(t){return t.name==="Int16"}allocate(t){return new Int16Array(t)}},Ze=new re;var oe=class extends X{name="Int32";coerce(t){return H(t)}equals(t){return t.name==="Int32"}allocate(t){return new Int32Array(t)}},Xe=new oe;var se=class extends X{name="Int64";coerce(t){return It(t)}equals(t){return t.name==="Int64"}allocate(t){return new BigInt64Array(t)}},Je=new se;var ie=class extends J{name="UInt8";coerce(t){return H(t,"UInt8")}equals(t){return t.name==="UInt8"}allocate(t){return new Uint8Array(t)}},Qe=new ie;var le=class extends J{name="UInt16";coerce(t){return H(t,"UInt16")}equals(t){return t.name==="UInt16"}allocate(t){return new Uint16Array(t)}},tn=new le;var ae=class extends J{name="UInt32";coerce(t){return H(t,"UInt32")}equals(t){return t.name==="UInt32"}allocate(t){return new Uint32Array(t)}},en=new ae;var ue=class extends J{name="UInt64";coerce(t){return It(t)}equals(t){return t.name==="UInt64"}allocate(t){return new BigUint64Array(t)}},nn=new ue;var ce=class extends mt{name="Float32";coerce(t){return At(t,"Float32")}equals(t){return t.name==="Float32"}allocate(t){return new Float32Array(t)}},rn=new ce;var fe=class extends mt{name="Float64";coerce(t){return At(t)}equals(t){return t.name==="Float64"}allocate(t){return new Float64Array(t)}},on=new fe;var Lt=class s extends ht{constructor(e,n){super();this.precision=e;this.scale=n;this.name=e!==void 0&&n!==void 0?`Decimal(${e}, ${n})`:"Decimal"}precision;scale;name;coerce(e){return Ct(e,{precision:this.precision,scale:this.scale})}equals(e){return e instanceof s&&this.precision===e.precision&&this.scale===e.scale}allocate(e){return new Array(e).fill(null)}};var he=class extends K{name="Boolean";get isBoolean(){return!0}coerce(t){return t==null?null:!!t}equals(t){return t.name==="Boolean"}allocate(t){return new Array(t).fill(null)}},sn=new he;var me=class extends K{name="Utf8";get isString(){return!0}get isUtf8(){return!0}coerce(t){return t==null?null:String(t)}equals(t){return t.name==="Utf8"}allocate(t){return new Array(t).fill(null)}},ln=new me;var pe=class extends K{name="Binary";get isBinary(){return!0}coerce(t){return qe(t)}equals(t){return t.name==="Binary"}allocate(t){return new Array(t).fill(null)}},an=new pe;var ge=class extends Q{name="Date";coerce(t){let e=Y(t);return e?(e.setUTCHours(0,0,0,0),e):null}equals(t){return t.name==="Date"}allocate(t){return new Array(t).fill(null)}},un=new ge;var ye=class extends Q{name="Datetime";coerce(t){return Y(t)}equals(t){return t.name==="Datetime"}allocate(t){return new Array(t).fill(null)}},cn=new ye;var de=class extends Q{name="Time";coerce(t){if(t==null)return null;if(typeof t=="string"){let n=t.trim();if(St.test(n)){let r=new Date(`1970-01-01T${n}${kt.test(n)?"":"Z"}`);if(z(r))return r.toISOString().split("T")[1].slice(0,12)}}let e=Y(t);return e?e.toISOString().split("T")[1].slice(0,12):null}equals(t){return t.name==="Time"}allocate(t){return new Array(t).fill(null)}},fn=new de;var xe=class extends Q{name="Duration";coerce(t){return et(t)}equals(t){return t.name==="Duration"}allocate(t){return new Array(t).fill(null)}},hn=new xe;var be=class extends K{name="Object";get isObject(){return!0}coerce(t){return t===void 0?null:t}equals(t){return t.name==="Object"}allocate(t){return new Array(t).fill(null)}},mn=new be;var we=class extends K{name="Null";get isNull(){return!0}coerce(t){return null}equals(t){return t.name==="Null"}allocate(t){return new Array(t).fill(null)}},pn=new we;var _e=class s extends pt{constructor(e){super();this.innerType=e}innerType;name="List";coerce(e){if(e==null)return null;let n=C(e)?Array.from(e):[e],r=n.length,o=new Array(r);for(let i=0;i<r;i++)o[i]=this.innerType.coerce(n[i]);return o}equals(e){return e instanceof s&&this.innerType.equals(e.innerType)}allocate(e){return new Array(e).fill(null)}},gn=s=>new _e(s);var Te=class s extends pt{constructor(e){super();this.fields=e}fields;name="Struct";coerce(e){if(!Z(e))return null;let n={};for(let[r,o]of Object.entries(this.fields))n[r]=o.coerce(e[r]);return n}equals(e){if(!(e instanceof s))return!1;let n=Object.keys(this.fields),r=Object.keys(e.fields);if(n.length!==r.length)return!1;for(let o of n)if(!e.fields[o]||!this.fields[o].equals(e.fields[o]))return!1;return!0}allocate(e){return new Array(e).fill(null)}},yn=s=>new Te(s);var L={Int8:Ye,Int16:Ze,Int32:Xe,Int64:Je,UInt8:Qe,UInt16:tn,UInt32:en,UInt64:nn,Float32:rn,Float64:on,Decimal:(s,t)=>new Lt(s,t),Boolean:sn,Utf8:ln,Binary:an,Date:un,Datetime:cn,Time:fn,Duration:hn,Object:mn,Null:pn,List:gn,Struct:yn};function kn(s,t,e){let n=new Map,r=e.length,o=new Array(r);for(let i=0;i<r;i++){let l=e[i];if(typeof l=="string"){if(!(l in s))throw new B(l,`Partition key "${l}" does not exist in the DataFrame.`);o[i]=s[l]}else o[i]=l.evaluate(s,t)}for(let i=0;i<t;i++){let l=new Array(o.length);for(let c=0;c<o.length;c++){let f=o[c][i];l[c]=f==null?"":String(f)}let a=l.join("\0"),u=n.get(a);u===void 0&&(u=[],n.set(a,u)),u.push(i)}return n}function jt(s,t,e){let n=new Array(e);if(e===0)return n;let r=s.partitionBy||[],o=kn(t,e,r),i=s.evaluatePrePartition(t,e);for(let l of o.values()){let a=l.length,u=new Array(a);for(let c=0;c<a;c++)u[c]=i[l[c]];if(s.evaluateWindow){for(let c=0;c<a;c++)n[l[c]]=s.evaluateWindow(u,l,c);continue}if(s.aggFn){let c=s.aggFn(u);for(let f=0;f<a;f++)n[l[f]]=c;continue}for(let c=0;c<a;c++)n[l[c]]=i[l[c]]}return s.evaluatePostPartition(n,t)}function De(s){if(!Array.isArray(s)||s.length===0)return{columns:{},height:0};let t=s.length,e=new Set;for(let o=0;o<t;o++){let i=s[o];if(Z(i)){let l=Object.keys(i);for(let a=0;a<l.length;a++)e.add(l[a])}}let n=Array.from(e),r={};for(let o=0;o<n.length;o++)r[n[o]]=new Array(t);for(let o=0;o<t;o++){let i=s[o]||{};for(let l=0;l<n.length;l++){let a=n[l],u=i[a];r[a][o]=u===void 0?null:u}}return{columns:r,height:t}}function Ae(s,t){let e=Object.keys(s),n=new Array(t);for(let r=0;r<t;r++){let o={};for(let i=0;i<e.length;i++){let l=e[i],a=s[l][r];o[l]=a===void 0?null:a}n[r]=o}return n}function En(s,t,e){let n={};for(let r=0;r<e.length;r++){let o=e[r],i=s[o][t];n[o]=i===void 0?null:i}return n}function rt(s){if(s.length===0)return L.Utf8;let t=!0,e=!0,n=!0,r=!0,o=!0,i=!0,l=!1,a=!1,u=[];for(let c=0;c<s.length;c++){let f=s[c];if(f!=null){if(a=!0,!Array.isArray(f))i=!1;else for(let h=0;h<f.length;h++)u.push(f[h]);f instanceof Date&&(l=!0),typeof f!="boolean"&&(t=!1),typeof f!="bigint"&&(r=!1),typeof f!="number"?(n=!1,e=!1):Number.isInteger(f)||(e=!1),!(f instanceof Date)&&(typeof f!="string"||isNaN(Date.parse(f)))&&(o=!1)}}if(!a)return L.Utf8;if(i){let c=rt(u);return L.List(c)}if(t)return L.Boolean;if(r)return L.Int64;if(n&&!e)return L.Float64;if(n&&e){let c=!0;for(let f=0;f<s.length;f++){let h=s[f];if(h!=null&&(h<-2147483648||h>2147483647)){c=!1;break}}return c?L.Int32:L.Float64}return o&&l?L.Datetime:L.Utf8}var Tt=class{groups;keys;allKeys;parentColumns;parentHeight;parentSchema;constructor(t,e,n,r,o,i){this.groups=t,this.keys=e,this.allKeys=n,this.parentColumns=r,this.parentHeight=o,this.parentSchema=i}to_dataframe(){let t=this.keys.length,e=new Array(t);for(let l=0;l<t;l++)e[l]=String(this.keys[l]);let n=this.groups.size,r={};for(let l=0;l<e.length;l++)r[e[l]]=new Array(n);let o=0;for(let l of this.groups.values()){if(l.length===0)continue;let a=l[0];for(let u=0;u<e.length;u++){let c=e[u],f=this.parentColumns[c][a];r[c][o]=f===void 0?null:f}o++}let i={};for(let l of e)i[l]=this.parentSchema[l];return new F(r,i,o)}agg(...t){let e=this.allKeys.length,n=new Array(e);for(let f=0;f<e;f++)n[f]=String(this.allKeys[f]);let r=this.keys.length,o=new Array(r);for(let f=0;f<r;f++)o[f]=String(this.keys[f]);let i=ft(t.flat(),n,o),l=this.groups.size,a={};for(let f=0;f<o.length;f++)a[o[f]]=new Array(l);let u=0;for(let f of this.groups.values()){if(f.length===0)continue;let h=f[0];for(let p=0;p<o.length;p++){let m=o[p],y=this.parentColumns[m][h];a[m][u]=y===void 0?null:y}u++}for(let f=0;f<i.length;f++){let h=i[f],p=h.outputName||h.colName||"*";if(!h.aggFn){a[p]=h.evaluate(a,l);continue}let m=h.evaluatePreGrouping(this.parentColumns,this.parentHeight),y=new Array(l),d=0;for(let b of this.groups.values()){if(b.length===0)continue;let w=new Array(b.length);for(let A=0;A<b.length;A++)w[A]=m[b[A]];y[d]=h.aggFn(w),d++}a[p]=h.evaluatePostGrouping(y,a)}let c={};for(let f of o)c[f]=this.parentSchema[f];for(let f of i){let h=f.outputName||f.colName||"*";c[h]=rt(a[h])}return new F(a,c,u)}};function dn(s,t,e){if(s==null)throw new V(`Invalid input to ${t} at index ${e}: item cannot be null or undefined.`);if(s instanceof F)return[s];if(xt(s))return[new F(s)];if(C(s)){if(lt(s,F,{mode:"every"}))return s;if(lt(s,"plainObject",{mode:"every"}))return[new F(s)];let n=lt(s,F,{mode:"some"});for(let r=0;r<s.length;r++)if(n?!(s[r]instanceof F):!xt(s[r]))throw new V(n?`Invalid input to ${t} at index ${e}, sub-index ${r}: nested array must contain only DataFrame instances.`:`Invalid input to ${t} at index ${e}, row ${r}: rows must be plain objects.`)}throw new V(`Invalid input to ${t} at index ${e}: expected DataFrame, row array, or column dictionary.`)}function Dt(s,t={}){if(s==null)throw new V("Invalid input to concat: rawItems cannot be null or undefined.");let e=Array.isArray(s)?s:[s],n=[];for(let i=0;i<e.length;i++)n.push(...dn(e[i],"concat",i));let{how:r="vertical"}=t,o=t.horizontal?.strict??!0;if(n.length===0)return new F({},{},0);if(n.length===1&&r!=="horizontal")return n[0];switch(r){case"vertical":{let i=[];for(let p=0;p<n.length;p++)n[p].height>0&&i.push(n[p]);if(i.length===0)return new F({},{},0);let l=i[0],a=Object.keys(l._columns);for(let p=0;p<n.length;p++){let m=n[p];if(m.height===0)continue;let y=Object.keys(m._columns);if(a.length!==y.length)throw new V(`[Strict Vertical] Column count mismatch at index ${p}.`);for(let d=0;d<a.length;d++){if(a[d]!==y[d])throw new V(`[Strict Vertical] Schema mismatch at position ${d} in DF ${p}. Expected column "${a[d]}", but found "${y[d]}".`);let b=l.schema[a[d]],w=m.schema[a[d]];if(b&&w&&!b.equals(w))throw new ct(`[Strict Type Check] Schema type mismatch for column "${a[d]}": expected ${b.name}, found ${w.name}.`)}}let u=0;for(let p of n)u+=p.height;let c=n.find(p=>p.height>0)?.schema||n[0]?.schema||{},f={};for(let p of a){let m=c[p],y=!1;for(let b of n){let w=b._columns[p];if(!w){y=!0;break}if(!P(w)){for(let A=0;A<w.length;A++)if(w[A]==null){y=!0;break}}if(y)break}let d=m&&m.allocate?m.allocate(u):new Array(u).fill(null);y&&P(d)&&(d=new Array(u).fill(null)),f[p]=d}let h=0;for(let p of n){let m=p.height;if(m!==0){for(let y of a){let d=p._columns[y]||new Array(m).fill(null),b=f[y];if(P(b)&&P(d))b.set(d,h);else{let w=b;for(let A=0;A<m;A++)w[h+A]=d[A]}}h+=m}}return new F(f,c,u)}case"horizontal":{let i=n[0].height;for(let c=1;c<n.length;c++)n[c].height>i&&(i=n[c].height);let l=new Set;for(let c=0;c<n.length;c++){let f=n[c];if(o&&f.height!==i)throw new V(`[Horizontal] Row count mismatch at index ${c}. Expected ${i}, got ${f.height}. Set strict=false to allow padding.`);for(let h of Object.keys(f._columns)){if(l.has(h))throw new V(`[Horizontal] Duplicate column name "${h}" detected. Horizontal concat requires unique names.`);l.add(h)}}let a={},u={};for(let c of n){let f=c.height;Object.assign(u,c.schema);for(let[h,p]of Object.entries(c._columns))if(f===i)a[h]=P(p)?Array.from(p):p;else{let m=new Array(i);for(let y=0;y<f;y++)m[y]=p[y];for(let y=f;y<i;y++)m[y]=null;a[h]=m}}return new F(a,u,i)}case"diagonal":{let i=new Set;for(let h of n)for(let p of Object.keys(h._columns))i.add(p);let l=Array.from(i),a=0;for(let h=0;h<n.length;h++)a+=n[h].height;let u={};for(let h of l){let p=null;for(let m of n){let y=m.schema[h];if(y){if(p===null)p=y;else if(!p.equals(y))throw new ct(`[Strict Type Check] Schema type mismatch for column "${h}": expected ${p.name}, found ${y.name}.`)}}u[h]=p||L.Utf8}let c={};for(let h=0;h<l.length;h++)c[l[h]]=new Array(a).fill(null);let f=0;for(let h=0;h<n.length;h++){let p=n[h],m=p.height;if(m!==0){for(let y=0;y<l.length;y++){let d=l[y],b=c[d],w=p._columns[d];if(w!==void 0)if(P(w)&&P(b))b.set(w,f);else{let A=b;for(let S=0;S<m;S++)A[f+S]=w[S]}else{let A=b;for(let S=0;S<m;S++)A[f+S]=null}}f+=m}}return new F(c,u,a)}}}var F=class s{_columns;_height;_schema={};constructor(t,e,n){if(Array.isArray(t)){let{columns:r,height:o}=De(t);this._columns=r,this._height=o,e?this.applySchema(e):this.inferSchema();return}if(Z(t)){let r=-1;for(let[o,i]of Object.entries(t)){let l=C(i)?i.length:0;if(r===-1)r=l;else if(l!==r)throw new V(`Column height mismatch: Column "${o}" has length ${l}, but previous columns have length ${r}`)}this._columns=t,this._height=n!==void 0?n:r===-1?0:r,e?this.applySchema(e):this.inferSchema();return}this._columns={},this._height=0,e?this.applySchema(e):this._schema={}}inferSchema(){let t={},e=Object.keys(this._columns);for(let n of e)t[n]=rt(this._columns[n]);this._schema=t}applySchema(t){this._schema=t;let e=Object.keys(t),n={};for(let r of e){let o=t[r],i=this._columns[r],l=o.allocate?o.allocate(this._height):new Array(this._height).fill(null);if(!i){this._height>0&&P(l)&&(l=new Array(this._height).fill(null)),n[r]=l;continue}let a=!1,u=new Array(this._height);for(let c=0;c<this._height;c++){let f=o.coerce(i[c]);u[c]=f,f==null&&(a=!0)}a&&P(l)&&(l=new Array(this._height));for(let c=0;c<this._height;c++)l[c]=u[c];n[r]=l}this._columns=n}getSchema(){return this._schema}to_dicts(){return Ae(this._columns,this._height)}to_dict(){return{...this._columns}}get columns(){return Object.keys(this._columns)}concat(t,e={}){let n=lt(t,s,{mode:"every",allowEmpty:!1})?t:[t];return Dt([this,...n],e)}drop(...t){let e=new Set(t.flat()),n={},r={};for(let o of Object.keys(this._columns))e.has(o)||(n[o]=this._columns[o],r[o]=this._schema[o]);return new s(n,r,this._height)}get dtypes(){let t=Object.keys(this._columns),e=t.length,n=new Array(e);for(let r=0;r<e;r++)n[r]=this._schema[t[r]];return n}filter(...t){if(this._height===0)return new s({},this._schema,0);let e=this._height,n=Object.keys(this._columns),r=n.length,o=[],i=[];for(let h of t)typeof h=="function"?i.push(h):o.push(h.evaluate(this._columns,e));let l=[],a=0,u=null;if(i.length>0){let h=this._columns;u={};for(let p=0;p<r;p++){let m=n[p],y=h[m];Object.defineProperty(u,m,{get(){let d=y[a];return d===void 0?null:d},enumerable:!0,configurable:!0})}}for(let h=0;h<e;h++){let p=!0;for(let m=0;m<o.length;m++)if(!o[m][h]){p=!1;break}if(p){if(u){a=h;for(let m=0;m<i.length;m++)if(!i[m](u)){p=!1;break}}p&&l.push(h)}}let c=l.length,f={};for(let h=0;h<r;h++){let p=n[h],m=this._columns[p],y=new Array(c);for(let d=0;d<c;d++)y[d]=m[l[d]];f[p]=y}return new s(f,this._schema,c)}groupby(t){let e=st(t),n=new Map,r=this._height,o=e.length,i=new Array(o);for(let c=0;c<o;c++)i[c]=String(e[c]);for(let c=0;c<i.length;c++)if(!(i[c]in this._columns))throw new B(i[c],`Grouping key "${i[c]}" does not exist`);let l=o===1?i[0]:null,a=l?this._columns[l]:null;for(let c=0;c<r;c++){let f;if(l){let p=a[c];f=p==null?"":String(p)}else{let p=new Array(o);for(let m=0;m<o;m++){let y=this._columns[i[m]][c];p[m]=y==null?"":String(y)}f=p.join("\0")}let h=n.get(f);h===void 0&&n.set(f,h=[]),h.push(c)}let u=Object.keys(this._columns);return new Tt(n,e,u,this._columns,this._height,this._schema)}head(t=10){return this.limit(t,{offset:0,from:"start"})}get height(){return this._height}hstack(t,e={}){return this.concat(t,{how:"horizontal",horizontal:e})}join(t){let{other:e,on:n,how:r="inner",suffixes:o=["","_right"]}=t,i=st(n);for(let T of i){let D=String(T);if(!(D in this._columns))throw new B(D,`Join key "${D}" does not exist in the left DataFrame.`);if(!(D in e._columns))throw new B(D,`Join key "${D}" does not exist in the right DataFrame.`)}let[l,a]=o,u=Object.keys(this._columns),c=Object.keys(e._columns),f=new Set(i),h=u.length,p=c.length,m=(T,D)=>{let O=i.length;if(O===1){let M=T[i[0]][D];return M==null?null:String(M)}let R=new Array(O);for(let M=0;M<O;M++){let q=T[i[M]][D];if(q==null)return null;R[M]=String(q)}return R.join("\0")},y=new Map,d=e._height,b=e._columns;for(let T=0;T<d;T++){let D=m(b,T);if(D===null)continue;let O=y.get(D);O===void 0&&(O=[],y.set(D,O)),O.push(T)}let w=this._height,A=this._columns,S=[],x=[],I=r==="outer"||r==="right",U=I?new Set:null;for(let T=0;T<w;T++){let D=m(A,T),O=D===null?void 0:y.get(D);if(O===void 0)(r==="left"||r==="outer")&&(S.push(T),x.push(null));else for(let R=0;R<O.length;R++){let M=O[R];I&&U.add(M),S.push(T),x.push(M)}}if(I)for(let T=0;T<d;T++)U.has(T)||(S.push(-1),x.push(T));let E=S.length,N={},$={};for(let T=0;T<h;T++){let D=u[T],O=D in e._columns&&!f.has(D)?`${D}${l}`:D,R=this._columns[D],M=f.has(D),q=new Array(E);if(M){let G=e._columns[D];for(let tt=0;tt<E;tt++){let Ie=S[tt];if(Ie!==-1)q[tt]=R[Ie];else{let Ce=x[tt];q[tt]=Ce!==null?G[Ce]:null}}}else for(let G=0;G<E;G++){let tt=S[G];q[G]=tt!==-1?R[tt]:null}N[O]=q,this._schema[D]&&($[O]=this._schema[D])}for(let T=0;T<p;T++){let D=c[T];if(!f.has(D)){let O=D in this._columns?`${D}${a}`:D,R=e._columns[D],M=new Array(E);for(let q=0;q<E;q++){let G=x[q];M[q]=G!==null?R[G]:null}N[O]=M,e._schema[D]&&($[O]=e._schema[D])}}return new s(N,$,E)}limit(t,e={}){let{offset:n=0,from:r="start"}=e,o=this._height,i=isNaN(t)?0:Math.max(Math.floor(t),0),l=isNaN(n)?0:Math.max(Math.floor(n),0);if(i===0||o===0||l>=o){let h={},p={};for(let m of Object.keys(this._columns))h[m]=[],p[m]=this._schema[m];return new s(h,p,0)}let a=0,u=0;r==="end"?(u=Math.max(o-l,0),a=Math.max(u-i,0)):(u=Math.min(l+i,o),a=l);let c=Math.max(u-a,0),f={};for(let h of Object.keys(this._columns))f[h]=this._columns[h].slice(a,u);return new s(f,this._schema,c)}pivot(t){if(this._height===0)return new s({},{},0);let{index:e,columns:n,values:r}=t,o=st(e),i=o.length,l=new Array(i);for(let x=0;x<i;x++)l[x]=String(o[x]);let a=String(n),u=String(r);for(let x of l)if(!(x in this._columns))throw new B(x,`Pivot index key "${x}" does not exist in the DataFrame.`);if(!(a in this._columns))throw new B(a,`Pivot column key "${a}" does not exist`);if(!(u in this._columns))throw new B(u,`Pivot values key "${u}" does not exist in the DataFrame.`);let c=new Map,f=new Set,h=this._height,p=this._columns[a],m=this._columns[u];for(let x=0;x<h;x++){let I=new Array(i);for(let $=0;$<i;$++){let T=this._columns[l[$]][x];I[$]=T==null?"":String(T)}let U=I.join("\0"),E=String(p[x]);f.add(E);let N=c.get(U);N===void 0&&(N={firstIdx:x,indices:[]},c.set(U,N)),N.indices.push(x)}let y=c.size,d={},b={};for(let x=0;x<i;x++){let I=l[x];d[I]=new Array(y),this._schema[I]&&(b[I]=this._schema[I])}let w=Array.from(f),A=this._schema[u]||L.Utf8;for(let x=0;x<w.length;x++){let I=w[x];d[I]=new Array(y).fill(null),b[I]=A}let S=0;for(let x of c.values()){let I=x.firstIdx;for(let E=0;E<i;E++){let N=l[E];d[N][S]=this._columns[N][I]}let U=x.indices;for(let E=0;E<U.length;E++){let N=U[E],$=String(p[N]);d[$][S]=m[N]}S++}return new s(d,b,y)}rename(t){let e=t||{},n={},r={},o=Object.keys(this._columns);for(let l of o){let a=e[l]||l;n[a]=this._columns[l],r[a]=this._schema[l]}if(Object.keys(n).length<o.length)throw new V("Rename collision: Multiple columns mapped to the same output name.");return new s(n,r,this._height)}reverse(){if(this._height===0)return this;let t={},e=Object.keys(this._columns),n=e.length;for(let r=0;r<n;r++){let o=e[r];t[o]=this._columns[o].slice().reverse()}return new s(t,this._schema,this._height)}get schema(){return this._schema}select(...t){let e=this._normalizeArgs(t),n=Object.keys(this._columns),r=ft(e,n),o={},i={};for(let l of r){let a=l.outputName||l.colName||"*";if(a in o)throw new V(`Duplicate column selection: "${a}" is selected multiple times.`);o[a]=l.isWindow?jt(l,this._columns,this._height):l.evaluate(this._columns,this._height);let u=l.colName||a,c=l instanceof k&&l.ops.length===0&&!l.isWindow&&!l.aggFn;i[a]=c&&this._schema[u]?this._schema[u]:rt(o[a])}return new s(o,i,this._height)}get shape(){return[this.height,this.width]}slice(t,e){let n=this._height,r=t<0?Math.max(n+t,0):Math.min(t,n),o=e===void 0?n:e<0?Math.max(n+e,0):Math.min(e,n),i=Math.max(o-r,0);return this.limit(i,{offset:r})}sort(t){if(!t||!t.by||this._height===0)return this;let{by:e,descending:n=!1,nullsLast:r=!0,custom:o}=t,i=st(e);for(let m=0;m<i.length;m++){let y=i[m];if(typeof y=="string"&&!(y in this._columns))throw new B(y,`Sort key "${y}" does not exist`)}let l=Array.isArray(n)?n:new Array(i.length).fill(n),a=i.length,u=new Array(a);for(let m=0;m<a;m++){let y=i[m],d=l[m]?-1:1,b=o&&typeof y=="string"?o[y]:null,w=y?.evaluate?y.evaluate(this._columns,this._height):this._columns[y]||new Array(this._height).fill(null);u[m]={values:w,isDesc:d,customComp:b}}let c=u.length,f=r?1:-1,h=new Array(this._height);for(let m=0;m<this._height;m++)h[m]=m;h.sort((m,y)=>{for(let d=0;d<c;d++){let{values:b,isDesc:w,customComp:A}=u[d],S=b[m],x=b[y];if(A){let U=A(S,x);if(U!==0)return U*w;continue}if(S==null||x==null){if(S===x)continue;return(S==null?1:-1)*f}if(S===x)continue;return(S<x?-1:1)*w}return 0});let p={};for(let m of Object.keys(this._columns)){let y=this._columns[m],d=new Array(this._height);for(let b=0;b<this._height;b++)d[b]=y[h[b]];p[m]=d}return new s(p,this._schema,this._height)}tail(t=10){return this.limit(t,{offset:0,from:"end"})}to_list(t){if(this._height===0)return[];let e=t&&typeof t!="string"&&"evaluate"in t,n;if(e)n=t.evaluate(this._columns,this._height);else{let r=t;if(r==null)return new Array(this._height).fill(null);let o=this._columns[r];if(!o)throw new B(r,`Column "${r}" does not exist`);n=o}return Array.isArray(n)?n:Array.from(n)}unique(t){if(this._height===0)return new s({},this._schema,0);let e=st(t),n=e.length===0?Object.keys(this._columns):e.map(String);for(let f of n)if(!(f in this._columns))throw new B(f,`Unique column key "${f}" does not exist`);let r=new Set,o=[],i=n.length,l=this._height,a=i===1?this._columns[n[0]]:null;for(let f=0;f<l;f++){let h;if(a){let p=a[f];h=p==null?"":String(p)}else{let p=new Array(i);for(let m=0;m<i;m++){let y=this._columns[n[m]][f];p[m]=y==null?"":String(y)}h=p.join("\0")}r.has(h)||(r.add(h),o.push(f))}let u=o.length,c={};for(let f of Object.keys(this._columns)){let h=this._columns[f],p=new Array(u);for(let m=0;m<u;m++)p[m]=h[o[m]];c[f]=p}return new s(c,this._schema,u)}unpivot(t){let{idVars:e,valueVars:n,varName:r="variable",valueName:o="value"}=t,i=st(e).map(String),l=st(n).map(String),a=i.length,u=l.length;for(let m of i)if(!(m in this._columns))throw new B(m,`Unpivot id variable key "${m}" does not exist`);for(let m of l)if(!(m in this._columns))throw new B(m,`Unpivot value variable key "${m}" does not exist`);let c=this._height*u,f={};for(let m=0;m<a;m++)f[i[m]]=new Array(c);f[r]=new Array(c),f[o]=new Array(c);let h=0;for(let m=0;m<this._height;m++)for(let y=0;y<u;y++){let d=l[y];for(let b=0;b<a;b++){let w=i[b];f[w][h]=this._columns[w][m]}f[r][h]=d,f[o][h]=this._columns[d][m],h++}let p={};for(let m of i)p[m]=this._schema[m];return p[r]=L.Utf8,p[o]=rt(f[o]),new s(f,p,c)}vstack(t){return this.concat(t,{how:"vertical"})}get width(){return Object.keys(this._columns).length}_normalizeArgs(t){let e=t.flat(),n=[];for(let r of e)if(typeof r=="string")n.push(new k(r));else if(Z(r)&&"evaluate"in r)n.push(r);else if(Z(r))for(let[o,i]of Object.entries(r))if(Z(i)&&"evaluate"in i)n.push(i.alias(o));else{let l=new k(o);l.evaluate=(a,u)=>new Array(u).fill(i),n.push(l)}return n}with_columns(...t){let e=this._normalizeArgs(t),n=Object.keys(this._columns),r=ft(e,n),o=r.length,i={...this._columns},l={...this._schema};for(let a=0;a<o;a++){let u=r[a],c=u.outputName||u.colName||"*";u.isWindow?i[c]=jt(u,this._columns,this._height):i[c]=u.evaluate(this._columns,this._height);let f=u.colName||c;u instanceof k&&u.ops.length===0&&!u.isWindow&&!u.aggFn&&this._schema[f]?l[c]=this._schema[f]:l[c]=rt(i[c])}return new s(i,l,this._height)}};var On={data:(s,t)=>new F(s,t),col:s=>new k(s),all:Jt,exclude:Qt,coalesce:te,concat:Dt,lit:it,when:ee,DataType:L};0&&(module.exports={$tbl,ALL_COLUMNS_MARKER,AggregationExpr,ArithmeticExpr,ColumnExpr,ColumnNotFoundError,ComparisonExpr,ComputeError,DataFrame,DataFrameError,DataType,DataTypeRegistry,DateTimeExprNamespace,ExprBase,FrameScriptError,GroupedData,LITERAL_MARKER,ListExpr,ListExprNamespace,LogicalExpr,SchemaError,StringExpr,StringExprNamespace,TemporalExpr,When,WhenThen,WhenThenChain,WindowExpr,all,coalesce,columnsToRows,concat,derive,exclude,getRowFromColumns,inferColumnType,kleeneBinary,kleeneUnary,lit,normalizeToDataFrames,resolveColumnSelectors,resolveWindowExpr,rowsToColumns,when});