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.
Files changed (42) hide show
  1. {codestr-0.2.0 → codestr-0.2.1}/PKG-INFO +8 -1
  2. {codestr-0.2.0 → codestr-0.2.1}/README.md +7 -0
  3. {codestr-0.2.0 → codestr-0.2.1}/docs/operators.md +17 -15
  4. codestr-0.2.1/docs/superpowers/plans/2026-07-17-min-samples.md +636 -0
  5. codestr-0.2.1/docs/superpowers/specs/2026-07-17-min-samples-design.md +200 -0
  6. {codestr-0.2.0 → codestr-0.2.1}/pyproject.toml +1 -1
  7. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/syntax.py +2 -2
  8. codestr-0.2.1/src/codestr/udf/ts_udf.py +238 -0
  9. {codestr-0.2.0 → codestr-0.2.1}/tests/test_engine.py +22 -0
  10. {codestr-0.2.0 → codestr-0.2.1}/tests/test_syntax.py +5 -2
  11. {codestr-0.2.0 → codestr-0.2.1}/tests/test_ts_udf.py +126 -0
  12. {codestr-0.2.0 → codestr-0.2.1}/uv.lock +1 -1
  13. codestr-0.2.0/src/codestr/udf/ts_udf.py +0 -110
  14. {codestr-0.2.0 → codestr-0.2.1}/.github/workflows/ci.yml +0 -0
  15. {codestr-0.2.0 → codestr-0.2.1}/.github/workflows/release.yml +0 -0
  16. {codestr-0.2.0 → codestr-0.2.1}/.gitignore +0 -0
  17. {codestr-0.2.0 → codestr-0.2.1}/.python-version +0 -0
  18. {codestr-0.2.0 → codestr-0.2.1}/CHANGELOG.md +0 -0
  19. {codestr-0.2.0 → codestr-0.2.1}/CLAUDE.md +0 -0
  20. {codestr-0.2.0 → codestr-0.2.1}/CONTRIBUTING.md +0 -0
  21. {codestr-0.2.0 → codestr-0.2.1}/LICENSE +0 -0
  22. {codestr-0.2.0 → codestr-0.2.1}/docs/superpowers/plans/2026-07-16-ts-ema-keyword-arguments.md +0 -0
  23. {codestr-0.2.0 → codestr-0.2.1}/docs/superpowers/specs/2026-07-16-polars-minimum-version-design.md +0 -0
  24. {codestr-0.2.0 → codestr-0.2.1}/docs/superpowers/specs/2026-07-16-ts-ema-keyword-arguments-design.md +0 -0
  25. {codestr-0.2.0 → codestr-0.2.1}/review.md +0 -0
  26. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/__init__.py +0 -0
  27. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/compiler.py +0 -0
  28. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/engine.py +0 -0
  29. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/errors.py +0 -0
  30. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/parser.py +0 -0
  31. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/tokens.py +0 -0
  32. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/udf/__init__.py +0 -0
  33. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/udf/base_udf.py +0 -0
  34. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/udf/cs_udf.py +0 -0
  35. {codestr-0.2.0 → codestr-0.2.1}/src/codestr/udf/registry.py +0 -0
  36. {codestr-0.2.0 → codestr-0.2.1}/tests/__init__.py +0 -0
  37. {codestr-0.2.0 → codestr-0.2.1}/tests/conftest.py +0 -0
  38. {codestr-0.2.0 → codestr-0.2.1}/tests/test_base_udf.py +0 -0
  39. {codestr-0.2.0 → codestr-0.2.1}/tests/test_compiler.py +0 -0
  40. {codestr-0.2.0 → codestr-0.2.1}/tests/test_cs_udf.py +0 -0
  41. {codestr-0.2.0 → codestr-0.2.1}/tests/test_parser.py +0 -0
  42. {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.0
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
- 滚动、滞后与差分算子的通用签名为 `(expr, windows)`,其中 `windows` 是整数,表示回溯窗口大小。`ts_ema` 的签名为 `(expr, span)`,`span` 必须是正整数。
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=1)` |
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 | `median(|x - rolling_median(x)|) × 1.4826` |
294
-
295
- > `ts_mad` 乘以常数 1.4826 使其在正态分布下与标准差一致(一致性缩放因子)。
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
  ### 滞后与差分