跳转到主要内容

一个专为`pandas`设计的Python库,用于解决和执行函数图

项目描述

PyPI上的最新版本 GitHub上的最新发布版本 (构建版本:x.x.x,构建日期:2023-04-25T21:27:33.616654) PyPI上最新版本的支持的Python版本 开发状态 GitHub Actions CI测试是否正常?(Linux) ReadTheDocs是否正常? 覆盖率状态 代码风格 Apache License, version 2.0

Github watchers Github stargazers Github forks Issues count

从头到尾都是DAG!

sample graphtik plot

Python和Pandas的计算图

Graphtik 是一个库,用于组合、解决、执行和绘制 Python函数图(即管道),这些函数消耗和填充命名数据(即依赖项),这些依赖项的名称可能是嵌套的(例如,pandas 数据框列),基于这些依赖项的值是否存在于输入中或之前已计算。

用数学术语来说,给定

  • 一个部分填充的数据树,以及

  • 一组操作数据树分支(消耗/产生)的函数,

graphtik 收集图中的函数子集,在执行时尽可能在数据树中消耗和产生尽可能多的值。

Usage overview of graphtik library

  • 其主要用途是构建数据科学/机器学习项目的灵活算法。

  • 它可以扩展以实现以下功能

    • IoC依赖解析器(例如,Java Spring,Google Guice);

    • 基于文件的互依任务执行器(例如,GNU Make);

    • 自定义ETL引擎;

    • 电子表格计算引擎。

Graphtik 是从 Graphkit(2019年夏季,v1.2.2)开始的,为了实验Python 3.6+功能,但自那时起已经发生了显著的变化。

功能

  • 确定性预决定的 执行计划(除非定义了 partial-outputsendured operations,见下文)。

  • 可以将现有的函数不进行修改地组装成 管道

  • 依赖项 解析可以跳过基于给定和请求的数据的循环。

  • 支持具有 可选 <optionals> 输入参数和/或 varargs <varargish> 的函数。

  • 支持具有 部分输出 的函数;即使在某些 endured 操作失败的情况下也能继续工作。

  • 便于进行简单的 输送操作别名提供 上。

  • 通过注释重复更新 依赖项 值作为 副作用 支持循环(例如,向 pandas.DataFrame 中添加列)。

  • 层次依赖 <subdoc> 可以通过 json指针路径 表达式访问 解决方案 中深层的数据值。

  • 被标注为 隐式 的层次依赖表示函数在父文档中读取或写入的子文档依赖。

  • 合并 <操作合并> 或 嵌套 <操作嵌套> 子管道。

  • 早期从 解决方案 中移除中间结果,以优化内存占用。

  • 解决方案跟踪同一依赖的所有中间 覆盖 值。

  • 使用可配置的 绘图主题 进行详尽的 Graphviz 绘图。

  • 使用新的 graphtik 指令与 Sphinx 站点集成。

  • 考虑到 调试 而编写。

  • 并行执行(但未充分开发且已弃用)。

反功能特性

  • 它不是为了根据 依赖 值遵循复杂的条件逻辑而设计的(尽管它在一定程度上支持这一点,即 部分输出)。

  • 它既不是长运行任务的协调器,也不是日历调度器 - Apache AirflowDagsterLuigi 可能有助于此。

  • 它既不是并行化优化器,也不是 map-reduce 框架 - 请另参考 DaskIpyParallelCelery、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

sample graphtik plot

graphtik legend

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。

源分布

graphtik-10.5.0.tar.gz (188.3 kB 查看哈希)

上传时间

构建分布

graphtik-10.5.0-py2.py3-none-any.whl (122.3 kB 查看哈希)

上传时间 Python 2 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面