一个专为`pandas`设计的Python库,用于解决和执行函数图
项目描述
(构建版本:x.x.x,构建日期:2023-04-25T21:27:33.616654)
从头到尾都是DAG!
Python和Pandas的计算图
Graphtik 是一个库,用于组合、解决、执行和绘制 Python函数图(即管道),这些函数消耗和填充命名数据(即依赖项),这些依赖项的名称可能是嵌套的(例如,pandas 数据框列),基于这些依赖项的值是否存在于输入中或之前已计算。
用数学术语来说,给定
一个部分填充的数据树,以及
一组操作数据树分支(消耗/产生)的函数,
graphtik 收集图中的函数子集,在执行时尽可能在数据树中消耗和产生尽可能多的值。
其主要用途是构建数据科学/机器学习项目的灵活算法。
它可以扩展以实现以下功能
IoC依赖解析器(例如,Java Spring,Google Guice);
基于文件的互依任务执行器(例如,GNU Make);
自定义ETL引擎;
电子表格计算引擎。
Graphtik 是从 Graphkit(2019年夏季,v1.2.2)开始的,为了实验Python 3.6+功能,但自那时起已经发生了显著的变化。
功能
确定性预决定的 执行计划(除非定义了 partial-outputs 或 endured operations,见下文)。
可以将现有的函数不进行修改地组装成 管道。
依赖项 解析可以跳过基于给定和请求的数据的循环。
支持具有 可选 <optionals> 输入参数和/或 varargs <varargish> 的函数。
支持具有 部分输出 的函数;即使在某些 endured 操作失败的情况下也能继续工作。
便于进行简单的 输送操作 和 别名 在 提供 上。
通过注释重复更新 依赖项 值作为 副作用 支持循环(例如,向 pandas.DataFrame 中添加列)。
层次依赖 <subdoc> 可以通过 json指针路径 表达式访问 解决方案 中深层的数据值。
被标注为 隐式 的层次依赖表示函数在父文档中读取或写入的子文档依赖。
合并 <操作合并> 或 嵌套 <操作嵌套> 子管道。
早期从 解决方案 中移除中间结果,以优化内存占用。
解决方案跟踪同一依赖的所有中间 覆盖 值。
使用可配置的 绘图主题 进行详尽的 Graphviz 绘图。
使用新的 graphtik 指令与 Sphinx 站点集成。
考虑到 调试 而编写。
并行执行(但未充分开发且已弃用)。
反功能特性
它不是为了根据 依赖 值遵循复杂的条件逻辑而设计的(尽管它在一定程度上支持这一点,即 部分输出)。
它既不是长运行任务的协调器,也不是日历调度器 - Apache Airflow、Dagster 或 Luigi 可能有助于此。
它既不是并行化优化器,也不是 map-reduce 框架 - 请另参考 Dask、IpyParallel、Celery、Hive、Pig、Hadoop 等。
它不是一个像 Spark、Storm、Fink、Kinesis 这样的流/批处理程序,因为它涉及到函数调用语义,只对每个函数调用一次以处理数据项。
与 schedula 的差异
schedula 是一个强大的库,大约是为了相同的目的而编写的,并在这些方面有所不同(即以下功能指的是 schedula)
术语(graphtik := schedula)
管道 := 分发器
计划 := 工作流
解决方案 := 解决方案
Dijkstra 计划在调用操作时运行
强大且灵活(即所有操作都是动态的,领域 是可能的等)。
支持 权重。
无法预先计算并缓存执行计划(慢)。
计算值存储在图中(模拟函数的结构)。
需要图形可视化来检查和调试其解决方案。
- 图意味着复杂的预处理/后处理和遍历算法
(与构建/遍历数据树相比)。
反应式绘制的图,后台运行 Web 服务器。
操作图可堆叠。
绘制的嵌套图支持钻取。
graphtik 使用数据/操作名称(即 操作嵌套)来模拟,但始终一次性解决统一的图,因为将 嵌套-funcs 装扮成 python-funcs 并预先解决计划(schedula 不预先解决计划,Dijkstra 总是运行)是不可能的。请参阅 TODO 关于绘图此类嵌套图。
Schedula 不计算所有可能值(即没有 覆盖)。
Schedula 根据权重和函数名称的字典顺序计算优先级。
重新插入操作不会覆盖其当前函数 - 必须先删除它。
graphtik 在 组合 期间基于插入顺序进行优先级。
需要虚拟的 开始 和 结束 数据节点,以便 Dijkstra 解决有向无环图(DAG)。
没有领域(执行时条件决定函数是否必须运行)。
在 graphtik 中,重新计算 可能更直接。
TODO:与 schedula 存在更多差异。
快速入门
以下是安装方法
pip install graphtik
或者,使用各种“额外”依赖项,例如,用于绘图
pip install graphtik[plot]
- 提示:
支持额外项
- plot
用于使用 Graphviz 绘图
- matplot
用于在 matplotlib 窗口中绘图
- sphinx
用于在 sphinx 生成的站点中嵌入绘图
- test
用于运行 pytest
- dill
可能有助于选择并行任务 - 请参阅编队术语和set_marshal_tasks()配置。
- 所有
所有上述内容,加上开发库,例如black格式化程序。
- 开发
类似于所有
让我们构建一个graphtik计算图,该图从2个输入α和β生成3个输出
α x β
α - αxβ
|α - αxβ| ^ 3
>>> from graphtik import compose, operation >>> from operator import mul, sub
>>> @operation(name="abs qubed", ... needs=["α-α×β"], ... provides=["|α-α×β|³"]) ... def abs_qubed(a): ... return abs(a) ** 3
将abs_qubed函数沿mul & sub内置函数组合到计算图中
>>> graphop = compose("graphop", ... operation(needs=["α", "β"], provides=["α×β"])(mul), ... operation(needs=["α", "α×β"], provides=["α-α×β"])(sub), ... abs_qubed, ... ) >>> graphop Pipeline('graphop', needs=['α', 'β', 'α×β', 'α-α×β'], provides=['α×β', 'α-α×β', '|α-α×β|³'], x3 ops: mul, sub, abs qubed)
运行图并请求所有输出(注意,Unicode字符也可以作为Python标识符使用)
>>> graphop(α=2, β=5) {'α': 2, 'β': 5, 'α×β': 10, 'α-α×β': -8, '|α-α×β|³': 512}
… 或请求输出子集
>>> solution = graphop.compute({'α': 2, 'β': 5}, outputs=["α-α×β"]) >>> solution {'α-α×β': -8}
… 并绘制结果(如果是在jupyter中,无需创建文件)
>>> solution.plot('executed_3ops.svg') # doctest: +SKIP
项目详情
下载文件
下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。