{"repo":"wukan1986/expr_codegen","free":true,"listed":false,"github":"https://github.com/wukan1986/expr_codegen","clone":"git clone https://github.com/wukan1986/expr_codegen.git","description":"codegen from expression to others, such as polars, pandas","language":"Python","stars":149,"topics":["codegen","expression","pandas","polars","sympy","common-subexpression-elimination","genetic-algorithm"],"license":"BSD-3-Clause","category":"dev-tools","readme_excerpt":"expr codegen 表达式转译器 项目背景 在本人新推出polars ta这个库后，再回头反思 expr codegen 是什么。 expr codegen 本质是 DSL ，领域特定语⾔(Domain Specific Language)。但它没有定义新的语法 它解决了两个问题: 1. polars ta 已经能很方便的写出特征计算表达式，但遇到 混用时序与截面 的表达式，利用 expr codegen 能自动分组大大节省工作 2. expr codegen 利用了 Common Subexpression Elimination 公共子表达式消除，大量减少重复计算，提高效率 就算在量化领域，初级研究员局限于时序指标，仅用 polars ta 即可，中高级研究员使用截面指标，推荐用 expr codegen 虽然现在此项目与 polars ta 依赖非常紧密，但也是支持翻译成其它库,如 pandas / cudf.pandas ，只是目前缺乏一个比较简易的库 在线演示 https://exprcodegen.streamlit.app 初级用户可以直接访问此链接进行表达式转译，不需要另外安装软件。(此工具免费部署在国外，打开可能有些慢) 更完整示例访问alpha examples 使用示例 目录结构 工作原理 本项目依赖于 sympy 项目。所用到的主要函数如下： 1. simplify : 对复杂表达式进行化简 2. cse : Common Subexpression Elimination 公共子表达式消除 3. StrPrinter : 根据不同的函数输出不同字符串。定制此代码可以支持其它语种或库 因为 groupby , sort 都比较占用时间。如果提前将公式分类，不同的类别使用不同的 groupby ，可以减少计算时间。 1. ts xxx(ts xxx) : 可在同一 groupby 中进行计算 2. cs xxx(cs xxx) : 可在同一 groupby 中进行计算 3. ts xxx(cs xxx) : 需在不同 groupby 中进行计算 4. cs xxx(ts xxx(cs xxx)) : 需三不同 groupby 中进行计算 5. gp xxx(aa, )+gp xxx(bb, ) : 因 aa , bb 不同，需在两不同 groupby 中进行计算 所以 1. 需要有一个函数能获取当前表达式的类别( get current )和子表达式的类别( get children ) 2. 如果当前类别与子类别不同就可以提取出短公式( extract )。不同层的同类别表达式有先后关系，不能放同一 groupby 3. 利用 cse 的特点，将长表达式替换成前期提取出来的短表达式。然后输入到有向无环图( DAG ) 4. 利用有向无环图的流转，进行分层。同一层的 ts , cs , gp 不区分先后 5. 同一层对 ts , cs , gp 分组，然后生成代码( codegen )即可 隐含信息 1. ts : sort(by=[ASSET, DATE]).groupby(by=[ASSET], maintain order=True) 2. cs : sort(by=[DATE]).groupby(by=[DATE], maintain order=False) 3. gp : sort(by=[DATE, GROUP]).groupby(by=[DATE, GROUP], maintain order=Fals","default_branch":null,"files":null,"tree":[],"storefront":"/r/wukan1986","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/wukan1986/expr_codegen/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}