tranfi 0.0.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +177 -21
- package/NOTICE +8 -0
- package/README.md +627 -0
- package/app/assets/index-6quYZ5Ap.css +5 -0
- package/app/assets/index-BIAIKnrp.js +160 -0
- package/app/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
- package/app/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
- package/app/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
- package/app/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
- package/app/index.html +13 -0
- package/binding.gyp +121 -0
- package/csrc/arena.c +93 -0
- package/csrc/batch.c +976 -0
- package/csrc/buffer.c +154 -0
- package/csrc/cJSON.c +3386 -0
- package/csrc/cJSON.h +316 -0
- package/csrc/codec_csv.c +1951 -0
- package/csrc/codec_jsonl.c +1086 -0
- package/csrc/codec_table.c +248 -0
- package/csrc/codec_text.c +447 -0
- package/csrc/compiler.c +130 -0
- package/csrc/config.h +21 -0
- package/csrc/date_utils.h +94 -0
- package/csrc/dsl.c +5417 -0
- package/csrc/dsl.h +22 -0
- package/csrc/expr.c +1553 -0
- package/csrc/expr.h +58 -0
- package/csrc/internal.h +539 -0
- package/csrc/ir.c +166 -0
- package/csrc/ir.h +208 -0
- package/csrc/ir_schema.c +75 -0
- package/csrc/ir_serialize.c +166 -0
- package/csrc/ir_sql.c +1822 -0
- package/csrc/ir_validate.c +576 -0
- package/csrc/json_path.c +210 -0
- package/csrc/main.c +1241 -0
- package/csrc/memory_estimate.c +477 -0
- package/csrc/op_acf.c +283 -0
- package/csrc/op_across.c +477 -0
- package/csrc/op_anomaly.c +255 -0
- package/csrc/op_assert.c +761 -0
- package/csrc/op_bin.c +248 -0
- package/csrc/op_cast.c +523 -0
- package/csrc/op_clip.c +99 -0
- package/csrc/op_date_trunc.c +355 -0
- package/csrc/op_datetime.c +394 -0
- package/csrc/op_derive.c +216 -0
- package/csrc/op_diff.c +250 -0
- package/csrc/op_ewma.c +222 -0
- package/csrc/op_explode.c +206 -0
- package/csrc/op_fill_down.c +235 -0
- package/csrc/op_fill_null.c +268 -0
- package/csrc/op_filter.c +181 -0
- package/csrc/op_frequency.c +721 -0
- package/csrc/op_grep.c +181 -0
- package/csrc/op_group_agg.c +1956 -0
- package/csrc/op_hash.c +159 -0
- package/csrc/op_head.c +84 -0
- package/csrc/op_interpolate.c +445 -0
- package/csrc/op_join.c +2902 -0
- package/csrc/op_json_extract.c +227 -0
- package/csrc/op_json_filter.c +384 -0
- package/csrc/op_json_flatten.c +293 -0
- package/csrc/op_json_schema.c +503 -0
- package/csrc/op_label_encode.c +419 -0
- package/csrc/op_lag.c +181 -0
- package/csrc/op_lead.c +242 -0
- package/csrc/op_normalize.c +510 -0
- package/csrc/op_onehot.c +457 -0
- package/csrc/op_pivot.c +1754 -0
- package/csrc/op_quarantine.c +189 -0
- package/csrc/op_registry.c +3044 -0
- package/csrc/op_rename.c +129 -0
- package/csrc/op_replace.c +354 -0
- package/csrc/op_rleid.c +297 -0
- package/csrc/op_rowid.c +559 -0
- package/csrc/op_sample.c +158 -0
- package/csrc/op_schema.c +1341 -0
- package/csrc/op_schema_infer.c +252 -0
- package/csrc/op_select.c +340 -0
- package/csrc/op_set.c +3449 -0
- package/csrc/op_skip.c +95 -0
- package/csrc/op_sort.c +819 -0
- package/csrc/op_source_name.c +120 -0
- package/csrc/op_split.c +151 -0
- package/csrc/op_split_data.c +119 -0
- package/csrc/op_stack.c +271 -0
- package/csrc/op_stats.c +875 -0
- package/csrc/op_step.c +333 -0
- package/csrc/op_tail.c +105 -0
- package/csrc/op_tee.c +338 -0
- package/csrc/op_top.c +357 -0
- package/csrc/op_trim.c +138 -0
- package/csrc/op_unique.c +1343 -0
- package/csrc/op_unpivot.c +193 -0
- package/csrc/op_validate.c +648 -0
- package/csrc/op_window.c +591 -0
- package/csrc/path_policy.c +85 -0
- package/csrc/pipeline.c +1088 -0
- package/csrc/recipes.c +104 -0
- package/csrc/recipes.h +27 -0
- package/csrc/report.c +506 -0
- package/csrc/report.h +22 -0
- package/csrc/selector.c +1097 -0
- package/csrc/size_utils.c +348 -0
- package/csrc/spill.c +317 -0
- package/csrc/spill.h +21 -0
- package/csrc/tranfi.h +291 -0
- package/csrc/transform.h +209 -0
- package/csrc/transform_api.c +2237 -0
- package/csrc/transform_categorical.c +923 -0
- package/csrc/transform_internal.h +472 -0
- package/csrc/transform_json.c +3812 -0
- package/csrc/transform_numeric.c +1966 -0
- package/csrc/transform_sha256.c +154 -0
- package/csrc/transform_wasm.h +162 -0
- package/csrc/transform_wasm_api.c +1373 -0
- package/csrc/wasm_api.c +218 -0
- package/napi_api.c +534 -0
- package/napi_transform.c +1648 -0
- package/napi_transform.h +8 -0
- package/package.json +64 -59
- package/scripts/install-native.js +76 -0
- package/scripts/prepack.js +64 -0
- package/scripts/sync-csrc.js +23 -0
- package/src/cli.js +190 -0
- package/src/engines/duckdb.js +142 -0
- package/src/index.js +925 -0
- package/src/memory_policy.js +411 -0
- package/src/native.js +18 -0
- package/src/pipeline.js +709 -0
- package/src/recipe_json.js +80 -0
- package/src/server.js +279 -0
- package/src/transform.js +403 -0
- package/src/transform_error.js +10 -0
- package/src/wasm.js +21 -0
- package/wasm/index.js +732 -0
- package/wasm/package.json +1 -0
- package/wasm/tranfi_core.js +0 -0
- package/wasm/transform.js +1156 -0
- package/wasm/worker.js +786 -0
- package/dist/bundle.js +0 -1
- package/index.html +0 -18
- package/src/app.css +0 -169
- package/src/app.js +0 -203
- package/src/app.vue +0 -250
- package/src/bulma-input.vue +0 -110
- package/src/common-inputs.js +0 -28
- package/src/main.js +0 -20
- package/src/transforms.js +0 -166
- package/webpack.config.js +0 -108
package/csrc/op_acf.c
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* op_acf.c — Autocorrelation function.
|
|
3
|
+
* Aggregate op: buffers numeric values, computes ACF for lags 0..N.
|
|
4
|
+
* Output: 2-column table (lag, acf).
|
|
5
|
+
*
|
|
6
|
+
* Config: {"column": "price", "lags": 20}
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#include "internal.h"
|
|
10
|
+
#include "cJSON.h"
|
|
11
|
+
#include <stdlib.h>
|
|
12
|
+
#include <string.h>
|
|
13
|
+
#include <stdio.h>
|
|
14
|
+
#include <math.h>
|
|
15
|
+
#include <limits.h>
|
|
16
|
+
|
|
17
|
+
typedef enum {
|
|
18
|
+
ACF_MISSING_ERROR,
|
|
19
|
+
ACF_MISSING_NULL,
|
|
20
|
+
ACF_MISSING_IGNORE
|
|
21
|
+
} acf_missing_policy;
|
|
22
|
+
|
|
23
|
+
typedef enum {
|
|
24
|
+
ACF_TYPE_FAIL,
|
|
25
|
+
ACF_TYPE_NULL
|
|
26
|
+
} acf_type_policy;
|
|
27
|
+
|
|
28
|
+
typedef struct {
|
|
29
|
+
char *column;
|
|
30
|
+
int lags;
|
|
31
|
+
double *values;
|
|
32
|
+
size_t n_values;
|
|
33
|
+
size_t cap_values;
|
|
34
|
+
int checked_schema;
|
|
35
|
+
int col_idx;
|
|
36
|
+
int ignore;
|
|
37
|
+
int force_null;
|
|
38
|
+
acf_missing_policy missing;
|
|
39
|
+
acf_type_policy on_type_error;
|
|
40
|
+
} acf_state;
|
|
41
|
+
|
|
42
|
+
static int acf_is_numeric(tf_type type) {
|
|
43
|
+
return type == TF_TYPE_INT64 || type == TF_TYPE_FLOAT64;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static double get_numeric(const tf_batch *b, size_t r, int ci) {
|
|
47
|
+
if (b->col_types[ci] == TF_TYPE_INT64) return (double)tf_batch_get_int64(b, r, ci);
|
|
48
|
+
if (b->col_types[ci] == TF_TYPE_FLOAT64) return tf_batch_get_float64(b, r, ci);
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static int acf_parse_missing_policy(const cJSON *args, acf_missing_policy *out) {
|
|
53
|
+
*out = ACF_MISSING_ERROR;
|
|
54
|
+
const cJSON *j = cJSON_GetObjectItemCaseSensitive(args, "missing");
|
|
55
|
+
if (!j) return TF_OK;
|
|
56
|
+
if (!cJSON_IsString(j)) {
|
|
57
|
+
tf_set_last_error("acf: missing must be error, null, or ignore");
|
|
58
|
+
return TF_ERROR;
|
|
59
|
+
}
|
|
60
|
+
if (strcmp(j->valuestring, "error") == 0) *out = ACF_MISSING_ERROR;
|
|
61
|
+
else if (strcmp(j->valuestring, "null") == 0) *out = ACF_MISSING_NULL;
|
|
62
|
+
else if (strcmp(j->valuestring, "ignore") == 0) *out = ACF_MISSING_IGNORE;
|
|
63
|
+
else {
|
|
64
|
+
tf_set_last_error("acf: missing must be error, null, or ignore");
|
|
65
|
+
return TF_ERROR;
|
|
66
|
+
}
|
|
67
|
+
return TF_OK;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
static int acf_parse_type_policy(const cJSON *args, acf_type_policy *out) {
|
|
71
|
+
*out = ACF_TYPE_FAIL;
|
|
72
|
+
const cJSON *j = cJSON_GetObjectItemCaseSensitive(args, "on_type_error");
|
|
73
|
+
if (!j) return TF_OK;
|
|
74
|
+
if (!cJSON_IsString(j)) {
|
|
75
|
+
tf_set_last_error("acf: on_type_error must be fail or null");
|
|
76
|
+
return TF_ERROR;
|
|
77
|
+
}
|
|
78
|
+
if (strcmp(j->valuestring, "fail") == 0) *out = ACF_TYPE_FAIL;
|
|
79
|
+
else if (strcmp(j->valuestring, "null") == 0) *out = ACF_TYPE_NULL;
|
|
80
|
+
else {
|
|
81
|
+
tf_set_last_error("acf: on_type_error must be fail or null");
|
|
82
|
+
return TF_ERROR;
|
|
83
|
+
}
|
|
84
|
+
return TF_OK;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
static int acf_set_col_error(acf_state *st, const tf_batch *in) {
|
|
88
|
+
if (st->col_idx < 0) {
|
|
89
|
+
char msg[256];
|
|
90
|
+
snprintf(msg, sizeof(msg), "acf: column '%s' not found", st->column);
|
|
91
|
+
tf_set_last_error(msg);
|
|
92
|
+
return TF_ERROR;
|
|
93
|
+
}
|
|
94
|
+
if (!acf_is_numeric(in->col_types[st->col_idx])) {
|
|
95
|
+
char msg[256];
|
|
96
|
+
snprintf(msg, sizeof(msg), "acf: column '%s' must be numeric", st->column);
|
|
97
|
+
tf_set_last_error(msg);
|
|
98
|
+
return TF_ERROR;
|
|
99
|
+
}
|
|
100
|
+
return TF_OK;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static int acf_check_schema(acf_state *st, const tf_batch *in) {
|
|
104
|
+
if (st->checked_schema) return TF_OK;
|
|
105
|
+
st->checked_schema = 1;
|
|
106
|
+
st->col_idx = tf_batch_col_index(in, st->column);
|
|
107
|
+
if (st->col_idx < 0) {
|
|
108
|
+
if (st->missing == ACF_MISSING_ERROR) return acf_set_col_error(st, in);
|
|
109
|
+
if (st->missing == ACF_MISSING_IGNORE) st->ignore = 1;
|
|
110
|
+
else st->force_null = 1;
|
|
111
|
+
return TF_OK;
|
|
112
|
+
}
|
|
113
|
+
if (!acf_is_numeric(in->col_types[st->col_idx])) {
|
|
114
|
+
if (st->on_type_error == ACF_TYPE_FAIL) return acf_set_col_error(st, in);
|
|
115
|
+
st->force_null = 1;
|
|
116
|
+
}
|
|
117
|
+
return TF_OK;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
static int acf_process(tf_step *self, tf_batch *in, tf_batch **out,
|
|
121
|
+
tf_side_channels *side) {
|
|
122
|
+
(void)side;
|
|
123
|
+
acf_state *st = self->state;
|
|
124
|
+
*out = NULL;
|
|
125
|
+
|
|
126
|
+
if (acf_check_schema(st, in) != TF_OK) return TF_ERROR;
|
|
127
|
+
if (st->ignore || st->force_null || st->col_idx < 0) return TF_OK;
|
|
128
|
+
|
|
129
|
+
for (size_t r = 0; r < in->n_rows; r++) {
|
|
130
|
+
if (tf_batch_is_null(in, r, (size_t)st->col_idx)) continue;
|
|
131
|
+
double val = get_numeric(in, r, st->col_idx);
|
|
132
|
+
|
|
133
|
+
if (st->n_values >= st->cap_values) {
|
|
134
|
+
size_t min_cap = 0, newcap = 0;
|
|
135
|
+
if (tf_size_add(st->n_values, 1, &min_cap) != TF_OK ||
|
|
136
|
+
tf_size_grow_pow2(st->cap_values, min_cap, 256, &newcap) != TF_OK) {
|
|
137
|
+
return TF_ERROR;
|
|
138
|
+
}
|
|
139
|
+
double *tmp = tf_reallocarray_checked(st->values, newcap, sizeof(double));
|
|
140
|
+
if (!tmp) return TF_ERROR;
|
|
141
|
+
st->values = tmp;
|
|
142
|
+
st->cap_values = newcap;
|
|
143
|
+
}
|
|
144
|
+
st->values[st->n_values++] = val;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return TF_OK;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
static int acf_emit_nulls(acf_state *st, tf_batch **out) {
|
|
151
|
+
size_t out_rows = 0;
|
|
152
|
+
if (tf_size_add((size_t)st->lags, 1, &out_rows) != TF_OK) return TF_ERROR;
|
|
153
|
+
tf_batch *ob = tf_batch_create(2, out_rows);
|
|
154
|
+
if (!ob) return TF_ERROR;
|
|
155
|
+
if (tf_batch_set_schema(ob, 0, "lag", TF_TYPE_INT64) != TF_OK ||
|
|
156
|
+
tf_batch_set_schema(ob, 1, "acf", TF_TYPE_FLOAT64) != TF_OK) {
|
|
157
|
+
tf_batch_free(ob);
|
|
158
|
+
return TF_ERROR;
|
|
159
|
+
}
|
|
160
|
+
for (int k = 0; k <= st->lags; k++) {
|
|
161
|
+
if (tf_batch_set_int64(ob, (size_t)k, 0, k) != TF_OK) {
|
|
162
|
+
tf_batch_free(ob);
|
|
163
|
+
return TF_ERROR;
|
|
164
|
+
}
|
|
165
|
+
if (tf_batch_expose_row(ob, (size_t)k) != TF_OK) {
|
|
166
|
+
tf_batch_free(ob);
|
|
167
|
+
return TF_ERROR;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
*out = ob;
|
|
171
|
+
return TF_OK;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
static int acf_flush(tf_step *self, tf_batch **out, tf_side_channels *side) {
|
|
175
|
+
(void)side;
|
|
176
|
+
acf_state *st = self->state;
|
|
177
|
+
*out = NULL;
|
|
178
|
+
|
|
179
|
+
if (st->ignore) return TF_OK;
|
|
180
|
+
if (st->force_null) return acf_emit_nulls(st, out);
|
|
181
|
+
|
|
182
|
+
size_t n = st->n_values;
|
|
183
|
+
if (n < 2) return TF_OK;
|
|
184
|
+
|
|
185
|
+
int max_lag = st->lags;
|
|
186
|
+
if ((size_t)max_lag >= n) max_lag = (int)(n - 1);
|
|
187
|
+
|
|
188
|
+
double mean = 0;
|
|
189
|
+
for (size_t i = 0; i < n; i++) mean += st->values[i];
|
|
190
|
+
mean /= (double)n;
|
|
191
|
+
|
|
192
|
+
double var = 0;
|
|
193
|
+
for (size_t i = 0; i < n; i++) {
|
|
194
|
+
double d = st->values[i] - mean;
|
|
195
|
+
var += d * d;
|
|
196
|
+
}
|
|
197
|
+
if (var == 0) return TF_OK;
|
|
198
|
+
|
|
199
|
+
size_t out_rows = 0;
|
|
200
|
+
if (tf_size_add((size_t)max_lag, 1, &out_rows) != TF_OK) return TF_ERROR;
|
|
201
|
+
tf_batch *ob = tf_batch_create(2, out_rows);
|
|
202
|
+
if (!ob) return TF_ERROR;
|
|
203
|
+
if (tf_batch_set_schema(ob, 0, "lag", TF_TYPE_INT64) != TF_OK ||
|
|
204
|
+
tf_batch_set_schema(ob, 1, "acf", TF_TYPE_FLOAT64) != TF_OK) {
|
|
205
|
+
tf_batch_free(ob);
|
|
206
|
+
return TF_ERROR;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
for (int k = 0; k <= max_lag; k++) {
|
|
210
|
+
double cov = 0;
|
|
211
|
+
for (size_t i = 0; i < n - (size_t)k; i++) {
|
|
212
|
+
cov += (st->values[i] - mean) * (st->values[i + k] - mean);
|
|
213
|
+
}
|
|
214
|
+
double acf_val = cov / var;
|
|
215
|
+
|
|
216
|
+
if (tf_batch_set_int64(ob, (size_t)k, 0, k) != TF_OK ||
|
|
217
|
+
tf_batch_set_float64(ob, (size_t)k, 1, acf_val) != TF_OK) {
|
|
218
|
+
tf_batch_free(ob);
|
|
219
|
+
return TF_ERROR;
|
|
220
|
+
}
|
|
221
|
+
if (tf_batch_expose_row(ob, (size_t)k) != TF_OK) {
|
|
222
|
+
tf_batch_free(ob);
|
|
223
|
+
return TF_ERROR;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
*out = ob;
|
|
228
|
+
return TF_OK;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
static void acf_destroy(tf_step *self) {
|
|
232
|
+
acf_state *st = self ? self->state : NULL;
|
|
233
|
+
if (st) {
|
|
234
|
+
free(st->column);
|
|
235
|
+
free(st->values);
|
|
236
|
+
free(st);
|
|
237
|
+
}
|
|
238
|
+
free(self);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
static int parse_lags(const cJSON *lags_j, int *out) {
|
|
242
|
+
*out = 20;
|
|
243
|
+
if (!lags_j) return TF_OK;
|
|
244
|
+
size_t parsed_lags = 0;
|
|
245
|
+
if (tf_json_size_value(lags_j, "lags", 1, (size_t)INT_MAX,
|
|
246
|
+
&parsed_lags, "acf") < 0) {
|
|
247
|
+
return TF_ERROR;
|
|
248
|
+
}
|
|
249
|
+
*out = (int)parsed_lags;
|
|
250
|
+
return TF_OK;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
tf_step *tf_acf_create(const cJSON *args) {
|
|
254
|
+
if (!args) return NULL;
|
|
255
|
+
cJSON *col_j = cJSON_GetObjectItemCaseSensitive(args, "column");
|
|
256
|
+
if (!cJSON_IsString(col_j) || !col_j->valuestring[0]) {
|
|
257
|
+
tf_set_last_error("acf: column is required");
|
|
258
|
+
return NULL;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
acf_state *st = calloc(1, sizeof(acf_state));
|
|
262
|
+
if (!st) return NULL;
|
|
263
|
+
st->col_idx = -1;
|
|
264
|
+
st->column = strdup(col_j->valuestring);
|
|
265
|
+
if (!st->column) { free(st); return NULL; }
|
|
266
|
+
|
|
267
|
+
cJSON *lags_j = cJSON_GetObjectItemCaseSensitive(args, "lags");
|
|
268
|
+
if (parse_lags(lags_j, &st->lags) != TF_OK ||
|
|
269
|
+
acf_parse_missing_policy(args, &st->missing) != TF_OK ||
|
|
270
|
+
acf_parse_type_policy(args, &st->on_type_error) != TF_OK) {
|
|
271
|
+
free(st->column);
|
|
272
|
+
free(st);
|
|
273
|
+
return NULL;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
tf_step *step = calloc(1, sizeof(tf_step));
|
|
277
|
+
if (!step) { free(st->column); free(st); return NULL; }
|
|
278
|
+
step->process = acf_process;
|
|
279
|
+
step->flush = acf_flush;
|
|
280
|
+
step->destroy = acf_destroy;
|
|
281
|
+
step->state = st;
|
|
282
|
+
return step;
|
|
283
|
+
}
|