2017-04-24 1 views
1

d'un fil datant quelques années j'ai trouvé quelques options pour intégrer python et KDB, à savoirPython + Q (KDB) - quels outils sont faciles à utiliser et bien entretenu

  • TPQ
  • outils de Dan
  • PYQ
  • qPython

les deux derniers semblent être les seuls activement mises à jour pour le moment. Ma question s'adresse aux gens qui utilisent réellement (et idéalement essayé plusieurs) de ces outils. D'après votre expérience, laquelle des deux dernières me convient le mieux? Les critères de sélection seraient (dans cet ordre)

  • facilité d'utilisation (je suis nouveau à q, idéalement, je voudrais faire plus de travail en python que dans q)
  • documentation (semble être généralement pas très bien sur quoi que ce soit KDB)
  • de support 3.x python
  • vitesse

Si j'ai complètement raté un outil qui correspond à mes besoins, s'il vous plaît laissez-moi savoir. Je suis conscient des discussions qui soulèvent des questions similaires, mais je suis à la recherche d'une réponse 2017, pas 2015.

Répondre

0

Ce guide a été mis à jour kdb/python 2017:

Pour toute autre personne qui a besoin d'une bibliothèque Python, je suis recommander fortement la bibliothèque qpython de exxeleron (bien qu'il nécessite numpy, qui nécessite 2.6 au minimum, je crois, ce qui peut être une limitation)

+0

Votre "guide kdb/python" est incorrect par rapport aux versions Python supportées par [PyQ] (https://pyq.enlnt.com). PyQ a soutenu la série 3.x de Python depuis sa [version 3.0.1] (https://pyq.enlnt.com/whatsnew/changelog.html#pyq-3-0-1) qui a été libérée en 2012. –

1

J'ai utilisé la bibliothèque qpython de exxeleron assez largement, et ont trouvé que ce soit un joli paquet pour Pyth sur < -> kdb + IPC. Enfin je me souviens, il a des problèmes avec sérialiser les caractères multi-octets (au moins en Python 2.7) lors de l'envoi à kdb +, donc une solution de contournement je convertis les chaînes/symboles en bytecode et faire `$ ou `char$ sur le côté kdb +. Ce n'est pas la chose la plus rapide au monde - sa de/sérialisation se sent un peu moins rapide qu'elle ne pourrait l'être (au moins dans 2.7 - je n'ai pas testé en Python 3) - mais c'est une interface conviviale pour kdb + IPC de Python. Il a de bons hooks pour le modèle sub/pub (en utilisant .receive sur l'objet connection), et est relativement bien documenté pour quelque chose lié à kdb + (il y a même de jolis exemples de clients pour le pub/sub-processing!).

Je n'ai pas testé avec pyQ, ce qui devrait théoriquement être meilleur pour effectuer un travail de calcul lourd autant que possible dans kdb + plutôt que dans Python, mais pour les moments où vous pouvez décharger la plus grande partie de votre travail un processus kdb + et veulent par exemple analyser les résultats ou utiliser des paquets spécifiques à Python (par exemple pour NLP/ML etc.) qpython fonctionne assez bien.

+0

Merci . La facilité d'utilisation est définitivement plus importante pour moi que la vitesse. Je suis en train de jouer avec qpython en ce moment et je l'aime bien – chrise

2

Exxeleron's qPython "est une bibliothèque Python prenant en charge la communication interprocessus entre les processus Python et kdb +." Alors que la même fonctionnalité est disponible à partir de PyQ, PyQ offre beaucoup plus que simplement IPC.

PyQ est un interpréteur Python complet fonctionnant à l'intérieur d'une instance kdb +.Pour un programmeur Python, PyQ donne un accès direct aux données kdb + sans avoir besoin de programmer en q. Pour un programmeur q, PyQ offre un accès facile à un riche ensemble de bibliothèques de calcul et de visualisation pour lesquelles Python est célèbre.

Pour donner un exemple, voici une fonction d'interpolation linéaire inp écrit en q:

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

Il prend trois arguments: x et y sont coordonnées des points de données connus et z est x coordonnées du valeurs interpolées. Il renvoie les coordonnées y des valeurs interpolées. La même fonction peut être écrit en PYQ en utilisant la syntaxe pure Python:

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

Si vous préparez les données q

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

et appelez soit mise en œuvre Python ou q, vous obtiendrez le même résultat. À l'invite Python du PYQ ceci peut être vérifié comme suit:

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

Bien sûr, un programmeur Python expérimenté aurait pas besoin d'écrire une telle fonction à partir de zéro, car NumPy a déjà numpy.interp qui fait la même chose et plus encore. Si, en tant que programmeur q, vous voulez utiliser numpy.interp depuis q, tout ce dont vous avez besoin est un simple wrapper qui convertit le résultat en objet K avant de le renvoyer. Voici comment cela peut se faire à l'q) invite

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 

Et maintenant, inp2 est prêt à l'emploi:

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

Depuis PYQ fonctionne à l'intérieur KDB +, il obtient sa mise en œuvre IPC gratuitement. Par exemple, je peux ouvrir une connexion au serveur distant au port 8888 et demander son heure locale dans deux lignes de code:

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

Cependant, la plupart des tâches peuvent être accomplies dans PYQ sans IPC (ou même copie) du tout parce que toutes vos données kdb + sont déjà dans le même processus que votre code Python. Pour couvrir les rubriques de l'OP, sur la facilité d'utilisation, qPython étant une pure bibliothèque Python peut être plus facile à installer, mais la programmation PyQ est souvent plus facile car elle ne nécessite pas de serveur kdb + séparé. PyQ documentation est de qualité comparable à celle de qPython. PyQ a offert le support de python 3.x depuis sa version 3.0.1 et Python 3.1. Actuellement (2017) il est activement testé avec Python 2.7, 3.5 et 3.6. La comparaison de vitesse ne serait pas juste parce que PyQ a un accès direct aux données kdb + et ne nécessite pas d'IPC, de sorte qu'il peut accomplir de nombreuses tâches 100 fois plus vite que qPython.

Avis de non-responsabilité: Je suis l'auteur de PyQ.

+0

vous pouvez demander la version prise en charge pour PyQ à mettre à jour ici car il montre seulement 2.7 ici. http: //www.timestored.com/kdb-guides/python-api Aussi le lien d'installation ne semble pas mis à jour – chrise

+0

Je ne suis pas sûr de savoir qui je devrais contacter pour cela. J'ai laissé un commentaire sous la réponse de Ryan Hamilton ci-dessus, mais il n'a pas répondu. Je vais essayer le formulaire "Contactez-nous" sur le site Web TimeStored. –

+0

Cher Alexander, J'utilise qPython depuis quelques semaines et c'est la première fois que j'entends parler de PyQ. Puisque la vitesse est un must, j'aimerais passer à PyQ. Mais j'ai quelques questions. Dans les docs, je n'arrive pas à trouver quoi que ce soit sur le mécanisme sub/pub. Comme j'ai quelques fonctions de rappel qui sont déclenchées par un abonnement, j'aimerais savoir: est-ce possible en utilisant PyQ? Deuxièmement: je travaille avec une instance kdb + dans un conteneur docker. Cela sera-t-il encore possible lors du passage à PyQ? Merci d'avance, PyQ semble délicieux;) –