codestr 0.2.0__tar.gz → 0.2.1__tar.gz
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.
- {codestr-0.2.0 → codestr-0.2.1}/PKG-INFO +8 -1
- {codestr-0.2.0 → codestr-0.2.1}/README.md +7 -0
- {codestr-0.2.0 → codestr-0.2.1}/docs/operators.md +17 -15
- codestr-0.2.1/docs/superpowers/plans/2026-07-17-min-samples.md +636 -0
- codestr-0.2.1/docs/superpowers/specs/2026-07-17-min-samples-design.md +200 -0
- {codestr-0.2.0 → codestr-0.2.1}/pyproject.toml +1 -1
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/syntax.py +2 -2
- codestr-0.2.1/src/codestr/udf/ts_udf.py +238 -0
- {codestr-0.2.0 → codestr-0.2.1}/tests/test_engine.py +22 -0
- {codestr-0.2.0 → codestr-0.2.1}/tests/test_syntax.py +5 -2
- {codestr-0.2.0 → codestr-0.2.1}/tests/test_ts_udf.py +126 -0
- {codestr-0.2.0 → codestr-0.2.1}/uv.lock +1 -1
- codestr-0.2.0/src/codestr/udf/ts_udf.py +0 -110
- {codestr-0.2.0 → codestr-0.2.1}/.github/workflows/ci.yml +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/.github/workflows/release.yml +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/.gitignore +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/.python-version +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/CHANGELOG.md +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/CLAUDE.md +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/CONTRIBUTING.md +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/LICENSE +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/docs/superpowers/plans/2026-07-16-ts-ema-keyword-arguments.md +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/docs/superpowers/specs/2026-07-16-polars-minimum-version-design.md +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/docs/superpowers/specs/2026-07-16-ts-ema-keyword-arguments-design.md +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/review.md +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/__init__.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/compiler.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/engine.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/errors.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/parser.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/tokens.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/udf/__init__.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/udf/base_udf.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/udf/cs_udf.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/src/codestr/udf/registry.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/tests/__init__.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/tests/conftest.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/tests/test_base_udf.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/tests/test_compiler.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/tests/test_cs_udf.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/tests/test_parser.py +0 -0
- {codestr-0.2.0 → codestr-0.2.1}/tests/test_registry.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codestr
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: DSL → Polars Expr compile engine for quantitative factor mining
|
|
5
5
|
Project-URL: Repository, https://github.com/huangbogeng/codestr
|
|
6
6
|
Author: huangbogeng
|
|
@@ -139,6 +139,13 @@ cs.sql("ts_ewm(close, 10) as ewm10")
|
|
|
139
139
|
|
|
140
140
|
**时序算子** (`ts_udf`):`ts_mean`, `ts_ema`, `ts_sum`, `ts_std`, `ts_var`, `ts_skew`, `ts_kurt`, `ts_max`, `ts_min`, `ts_mid`, `ts_delay`, `ts_delta`, `ts_mad` 等
|
|
141
141
|
|
|
142
|
+
滚动统计与 `ts_ema` 支持关键字参数 `min_samples`。滚动统计省略该参数时沿用 Polars 默认值 `None`(需要完整窗口),`ts_ema` 则沿用 Polars 默认值 `1`:
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
cs.sql("ts_mean(close, 20, min_samples=5) as ma20")
|
|
146
|
+
cs.sql("ts_ema(close, 10, min_samples=3) as ema10")
|
|
147
|
+
```
|
|
148
|
+
|
|
142
149
|
## 项目结构
|
|
143
150
|
|
|
144
151
|
```
|
|
@@ -108,6 +108,13 @@ cs.sql("ts_ewm(close, 10) as ewm10")
|
|
|
108
108
|
|
|
109
109
|
**时序算子** (`ts_udf`):`ts_mean`, `ts_ema`, `ts_sum`, `ts_std`, `ts_var`, `ts_skew`, `ts_kurt`, `ts_max`, `ts_min`, `ts_mid`, `ts_delay`, `ts_delta`, `ts_mad` 等
|
|
110
110
|
|
|
111
|
+
滚动统计与 `ts_ema` 支持关键字参数 `min_samples`。滚动统计省略该参数时沿用 Polars 默认值 `None`(需要完整窗口),`ts_ema` 则沿用 Polars 默认值 `1`:
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
cs.sql("ts_mean(close, 20, min_samples=5) as ma20")
|
|
115
|
+
cs.sql("ts_ema(close, 10, min_samples=3) as ema10")
|
|
116
|
+
```
|
|
117
|
+
|
|
111
118
|
## 项目结构
|
|
112
119
|
|
|
113
120
|
```
|
|
@@ -274,33 +274,35 @@ cs.sql("cs_midby(factor, sector, cap_group) as group_median")
|
|
|
274
274
|
|
|
275
275
|
> 编译器自动注入窗口配置:`over(partition_by=asset_cols, order_by=datetime_cols)`
|
|
276
276
|
|
|
277
|
-
|
|
277
|
+
滚动统计的通用签名为 `(expr, windows, *, min_samples=None)`,其中 `windows` 是整数,表示回溯窗口大小;`min_samples` 是仅限关键字的正整数参数,省略时沿用 Polars 默认值 `None`(需要完整窗口)。`ts_ema` 的签名为 `(expr, span, *, min_samples=1)`,`span` 和 `min_samples` 都必须是正整数。滞后与差分算子仍使用 `(expr, windows)`,不接收 `min_samples`。
|
|
278
278
|
|
|
279
279
|
### 滚动统计
|
|
280
280
|
|
|
281
281
|
| 算子 | 说明 | 底层实现 |
|
|
282
282
|
|------|------|------|
|
|
283
|
-
| `ts_mean` | 滚动均值 | `rolling_mean(windows)` |
|
|
284
|
-
| `ts_ema` | 递归指数移动平均 | `ewm_mean(span=span, adjust=False, min_samples=
|
|
285
|
-
| `ts_sum` | 滚动求和 | `rolling_sum(windows)` |
|
|
286
|
-
| `ts_std` | 滚动标准差 | `rolling_std(windows)` |
|
|
287
|
-
| `ts_var` | 滚动方差 | `rolling_var(windows)` |
|
|
288
|
-
| `ts_skew` | 滚动偏度 | `rolling_skew(windows)` |
|
|
289
|
-
| `ts_kurt` | 滚动峰度 | `rolling_kurtosis(windows)` |
|
|
290
|
-
| `ts_max` | 滚动最大值 | `rolling_max(windows)` |
|
|
291
|
-
| `ts_min` | 滚动最小值 | `rolling_min(windows)` |
|
|
292
|
-
| `ts_mid` | 滚动中位数 | `rolling_median(windows)` |
|
|
293
|
-
| `ts_mad` | 滚动 MAD | `
|
|
294
|
-
|
|
295
|
-
> `ts_mad`
|
|
283
|
+
| `ts_mean` | 滚动均值 | `rolling_mean(windows, min_samples=min_samples)` |
|
|
284
|
+
| `ts_ema` | 递归指数移动平均 | `ewm_mean(span=span, adjust=False, min_samples=min_samples)` |
|
|
285
|
+
| `ts_sum` | 滚动求和 | `rolling_sum(windows, min_samples=min_samples)` |
|
|
286
|
+
| `ts_std` | 滚动标准差 | `rolling_std(windows, min_samples=min_samples)` |
|
|
287
|
+
| `ts_var` | 滚动方差 | `rolling_var(windows, min_samples=min_samples)` |
|
|
288
|
+
| `ts_skew` | 滚动偏度 | `rolling_skew(windows, min_samples=min_samples)` |
|
|
289
|
+
| `ts_kurt` | 滚动峰度 | `rolling_kurtosis(windows, min_samples=min_samples)` |
|
|
290
|
+
| `ts_max` | 滚动最大值 | `rolling_max(windows, min_samples=min_samples)` |
|
|
291
|
+
| `ts_min` | 滚动最小值 | `rolling_min(windows, min_samples=min_samples)` |
|
|
292
|
+
| `ts_mid` | 滚动中位数 | `rolling_median(windows, min_samples=min_samples)` |
|
|
293
|
+
| `ts_mad` | 滚动 MAD | 内外两层 `rolling_median` 使用相同的 `min_samples` |
|
|
294
|
+
|
|
295
|
+
> `ts_mad` 计算 `median(|x - rolling_median(x)|) × 1.4826`。常数 1.4826 使其在正态分布下与标准差一致,内外两层滚动中位数共享同一个 `min_samples`。
|
|
296
296
|
|
|
297
297
|
示例:
|
|
298
298
|
```python
|
|
299
299
|
cs.sql("ts_mean(close, 5) as ma5")
|
|
300
|
+
cs.sql("ts_mean(close, 20, min_samples=5) as ma20_partial")
|
|
300
301
|
cs.sql("ts_ema(close, 10) as ema10")
|
|
302
|
+
cs.sql("ts_ema(close, 10, min_samples=3) as ema10_warmup")
|
|
301
303
|
cs.sql("ts_std(close, 20) as vol20")
|
|
302
304
|
cs.sql("ts_max(high, 20) as hh20")
|
|
303
|
-
cs.sql("ts_mad(close, 20) as mad20")
|
|
305
|
+
cs.sql("ts_mad(close, 20, min_samples=5) as mad20")
|
|
304
306
|
```
|
|
305
307
|
|
|
306
308
|
### 滞后与差分
|