Python + Q (KDB) - 哪些工具易于使用且维护良好

标签 python kdb

从几年前的一个线程中,我找到了一些集成 python 和 kdb 的选项,即

  • qpt
  • 丹的工具
  • PyQ
  • qPython

最后两个似乎是目前唯一积极更新的。我的问题是问那些实际使用这些工具中的任何一个(最好尝试过几种)的人。根据您的经验,后两种哪个更适合我。选择标准将是(按此顺序)

  • 易于使用(我是 q 的新手,理想情况下我会在 python 中比在 q 中做更多的工作)
  • 文档(似乎在任何 kdb 上都不是很好)
  • python 3.x 支持
  • 速度

如果我完全错过了适合我要求的工具,请告诉我。我知道提出类似问题的线程,但我正在寻找 2017 年的答案,而不是 2015 年的答案。

最佳答案

Exxeleron 的 qPython “是一个 Python 库,为 Python 和 kdb+ 进程之间的进程间通信提供支持。”虽然相同的功能可从 PyQ 获得, PyQ 提供的不仅仅是 IPC。

PyQ 是一个在 kdb+ 实例中运行的全功能 Python 解释器。对于 Python 程序员,PyQ 提供了对 kdb+ 数据的直接访问,无需在 q 中进行任何编程。对于 q 程序员,PyQ 提供了访问 Python 著名的一组丰富的计算和可视化库的途径。

举个例子,这里有一个用q写的线性插值函数inp:

inp:{y[i]+(z-x i)*(deltas[y]%deltas x)1+i:x bin z} 

它需要三个参数:xy 是已知数据点的坐标,z 是插值的 x 坐标。它返回插值的 y 坐标。可以使用纯 Python 语法在 PyQ 中编写相同的函数:

def inp(x, y, z):
    slope = y.deltas / x.deltas
    i = x.bin(z) 
    return y[i] + (z - x[i]) * slope[i+1]

如果准备q中的数据

x:0.1*til 10
y:x - x * x
z:5?1f

并调用 Python 或 q 实现,您将得到相同的结果。在 PyQ 的 Python 提示符下,可以按如下方式验证:

>>> inp(q.x, q.y, q.z) == q.inp(q.x, q.y, q.z)
True

当然,有经验的 Python 程序员不需要从头开始编写这样的函数,因为 NumPy 已经有了 numpy.interp。它的作用相同且更多。如果,作为一个 q 程序员,你想使用 q 中的 numpy.interp,你所需要的只是一个简单的包装器,在返回之前将结果转换为 K 对象。这是如何在 q) 提示符下完成的

q)p)import numpy; from pyq import q, K
q)p)def inp2(x, y, z): return K(numpy.interp(z, x, y))
q)p)q.inp2 = inp2

现在,inp2 可以使用了:

q)inp[x;y;z] ~ inp2(x;y;z)
1b

由于 PyQ 在 kdb+ 中运行,它可以免费获得其 IPC 实现。例如,我可以在端口 8888 上打开一个到远程服务器的连接,并用两行代码请求它的本地时间:

>>> h = q.hopen('::8888')
>>> h('.z.P')
k('2017.07.07D17:15:19.261285000') 

但是,大多数任务都可以在 PyQ 中完成,根本不需要任何 IPC(甚至复制),因为您的所有 kdb+ 数据已经与您的 Python 代码处于同一进程中。

为了涵盖 OP 的规则,在易用性方面,qPython 作为纯 Python 库可能更容易安装,但 PyQ 编程通常更容易,因为它不需要单独的 kdb+ 服务器。 PyQ documentationqPython 的质量相当. PyQ 从其版本 3.0.1 和 Python 3.1 开始提供对 python 3.x 的支持。目前(2017 年)它正在使用 Python 2.7、3.5 和 3.6 进行积极测试。速度比较是不公平的,因为 PyQ 可以直接访问 kdb+ 数据并且不需要 IPC,因此它可以比 qPython 快 100 倍地完成许多任务。

免责声明:我是 PyQ 的作者。

关于Python + Q (KDB) - 哪些工具易于使用且维护良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43580312/

相关文章:

kdb - KDB/Q 中行之间的差异

python - 在 nginx 上使用 Fabric 的 Python Flask Web 应用程序中出现上游超时错误

python - 重命名 pandas.concat 的 DataFrame 输出上的列

python - 打破python中列表理解的循环

select - KDB 字符串连接与动态查询的符号列表

python - 使用带有 EC2 的 boto 在服务器上处理并取回结果的最有效方法是什么?

python - 如何正确矢量化而不是迭代?

mysql - 扩展元数据

KDB + 查询 - 实现不喜欢