WolframClientForPython | Nouvelle bibliothèque client Wolfram Language pour Python


Traduction originale dans mon blog

Obtenir un accès complet au Wolfram Language à partir de Python


Le langage Wolfram ( Wolfram Language ) offre aux programmeurs un langage unique avec une grande variété d'algorithmes complexes, ainsi que des connaissances intégrées sur le monde. Au fil des ans, les gens nous ont demandé comment accéder à toutes les fonctionnalités de notre technologie à partir d'autres environnements logiciels et langages de programmation. Des années ont passé et nous avons créé de nombreuses solutions telles que Wolfram CloudConnector pour Excel , WSTP ( Wolfram Symbol Transfer Protocol) pour les programmes C / C ++ et, bien sûr, J / Link , qui permet d'accéder à Wolfram Language directement à partir de Java.

Par conséquent, nous sommes aujourd'hui heureux de vous présenter officiellement la nouvelle solution tant attendue pour combiner les langues, qui vous permettra d'appeler directement et efficacement Wolfram Language depuis Python : Wolfram Client Library for Python . Et surtout, cette bibliothèque cliente a un code source entièrement ouvert hébergé sur le référentiel git WolframClientForPython sous la licence MIT, vous pouvez donc le copier autant que vous le souhaitez et l'utiliser comme vous le souhaitez.

C'est facile et simple.


La bibliothèque cliente de Wolfram facilite l'intégration d'une grande collection d' algorithmes Wolfram Language, ainsi que la base de connaissances Wolfram directement dans tout code Python existant, ce qui vous permet d'économiser considérablement votre temps et vos efforts lors du développement de nouveau code. Dans cet article, nous vous montrons d'abord comment configurer une connexion entre Python et Wolfram Language, examinons plusieurs méthodes et exemples qui peuvent être utilisés pour calculer dans Wolfram Language, puis appelez-le pour une utilisation à partir de Python. Pour des informations de référence plus complètes, consultez la page d'accueil de la documentation de Wolfram Client Library for Python .

Appréciez sur place ...


Commençons par un exemple simple qui calcule la moyenne et l'écart type d'un million de nombres pris à partir d'une distribution normale. Cet exemple montre comment appeler une fonction Wolfram à partir de Python et comparer les résultats de Python avec le même calcul Wolfram Language pour montrer qu'ils sont hautement convergents.

Analyse des données statistiques


Tout d'abord, pour vous connecter à Wolfram Language, vous devez créer une nouvelle session avec Wolfram Engine (moteur de langue Wolfram gratuit):

from wolframclient.evaluation import WolframLanguageSession session=WolframLanguageSession() 

Pour appeler les fonctions Wolfram Language, vous devez importer le moteur `wl`:

 from wolframclient.language import wl 

Vous pouvez maintenant exécuter n'importe quel code de langue Wolfram. Attribuez l' exemple de variable de Python à une valeur de liste d'un million de nombres aléatoires tirés de la distribution normale, avec une moyenne de 0 et un écart-type de 1:

 sample = session.evaluate(wl.RandomVariate(wl.NormalDistribution(0,1), 1e6)) 

Considérez les cinq premiers d'entre eux:

 sample[:5] [0.44767075774581, 0.9662810005828261, -1.327910570542906, -0.2383857558557122, 1.1826399551062043] 

Vous pouvez calculer la moyenne de cet échantillon à l' aide de Wolfram Language. Comme prévu, il sera proche de zéro:

 session.evaluate(wl.Mean(sample)) 0.0013371607703851515 

Vous pouvez également calculer directement la même chose en Python pour vous assurer d'obtenir un résultat similaire:

 from statistics import mean mean(sample) 0.0013371607703851474 

De même, vous pouvez calculer l'écart type d'un échantillon à l'aide du Wolfram Language:

 session.evaluate(wl.StandardDeviation(sample)) 1.0014296230797068 

Exécutez ensuite le code suivant en Python pour vous assurer d'obtenir un résultat similaire:

 stdev(sample) 1.0014296230797068 

Il ne peut que se réjouir que les résultats convergent. Vous savez maintenant comment appeler des fonctions Wolfram Language simples à partir de Python. Continuons avec un exemple plus intéressant.

Utilisation de la base de connaissances Wolfram


Examinons la fonction intégrée de Wolfram Language, qui n'est pas disponible en Python, WolframAlpha :

 moons = session.evaluate(wl.WolframAlpha('moons of Saturn', 'Result')) 

La fonction WolframAlpha est l'une des fonctions de haut niveau du langage Wolfram qui communique avec les serveurs Wolfram | Alpha via l' API Web . Vous pouvez utiliser cette API directement à partir de Python, ce qui rend l'appel de la fonction WolframAlpha beaucoup plus puissant et plus pratique, car vous avez accès à toutes les fonctions de traitement des données directement à partir du langage Wolfram. Voyons ce que contient la variable lune en Python:

 moons EntityClass['PlanetaryMoon', 'SaturnMoon'] 

Le résultat ici est une représentation en Python d'une expression du Wolfram Language, qui peut être utilisée dans tout calcul ultérieur. Par exemple, si vous souhaitez obtenir une liste des quatre premiers satellites de Saturne (par leur degré de proximité avec Saturne) pour cela, vous devez exécuter le code suivant:

 session.evaluate(wl.EntityList(moons))[:4] [Entity['PlanetaryMoon', 'S2009S1'], Entity['PlanetaryMoon', 'Pan'], Entity['PlanetaryMoon', 'Daphnis'], Entity['PlanetaryMoon', 'Atlas']] 

Ou vous pouvez afficher les quatre plus grands satellites de masse de Saturne avec ce code:

 bigmoons = session.evaluate(wl.EntityList(wl.SortedEntityClass(moons, wl.Rule("Mass","Descending"),4))) bigmoons [Entity['PlanetaryMoon', 'Titan'], Entity['PlanetaryMoon', 'Rhea'], Entity['PlanetaryMoon', 'Iapetus'], Entity['PlanetaryMoon', 'Dione']] 

Ou vous pouvez obtenir un tableau de chaînes avec les noms de ces satellites, par exemple:

 session.evaluate(wl.Map(wl.Function( wl.Slot()("Name")), bigmoons)) ['Titan', 'Rhea', 'Iapetus', 'Dione'] 

Tout cela est très impressionnant. Regardons un autre exemple en utilisant les fonctions de traitement d'image et d'apprentissage automatique intégrées au Wolfram Language.

Traitement d'image et apprentissage automatique


Commençons d'abord par un autre mode pour effectuer des évaluations directement dans le Wolfram Language. Jusqu'à présent, vous avez utilisé le moteur `wl` pour créer des expressions Wolfram Language en Python, mais vous pouvez également exécuter des lignes de code écrites en Python contenant du code Wolfram Language, et parfois il est encore plus facilement perçu:

 from wolframclient.language import wlexpr 


Par exemple, calculez 1 + 1 dans la langue Wolfram, en l'envoyant sous forme de chaîne:

 session.evaluate('1+1') 2 


En utilisant cette méthode, vous pouvez écrire un petit code Wolfram Language qui reçoit une image à l'entrée et utilise un algorithme de détection de visage intégré pour trouver l'emplacement d'un visage dans l'image. Ici, l'image que nous utilisons est le célèbre tableau « Fille avec une boucle d'oreille en perle » de l'artiste néerlandais Johannes Vermeer (il convient de noter, naturellement, que cet algorithme fonctionnera également sur presque toutes les images avec des objets dans lesquels les visages peuvent être reconnus). Étant donné que l'interface du terminal Python ne prend pas en charge la sortie d'image, nous devons utiliser le bloc-notes Jupyter avec le package Python Image Library (PIL) afin de pouvoir générer le résultat:

 from PIL import Image import io 

 session.evaluate(wlexpr(''' image = ImageResize[ Import["Girl_with_a_Pearl_Earring.jpg"], 300]; boxes = FindFaces[image]; face = ImageAssemble[{{image,HighlightImage[image, boxes, "Blur"]}}]; ''') ) 

 data = session.evaluate( wlexpr('ExportByteArray[ face, "PNG" ]') ) 

 Image.open(io.BytesIO) 



En conséquence, tout s'est avéré assez facile et puissant à la fois. Mais que faire si vous n'avez pas le moteur Wolfram installé localement sur votre ordinateur et que vous souhaitez utiliser la bibliothèque cliente Wolfram pour Python? Dans ce cas, vous pouvez toujours utiliser le Wolfram Language directement en l'appelant depuis le Wolfram Cloud (cloud).

Alors, allez dans le cloud


Wolfram Cloud permet d'accéder facilement à Wolfram Language sans préinstaller localement. Wolfram Cloud fournit une variété de services, y compris l'interface de programmation Web Wolfram Language, ainsi que la possibilité de déployer des API Web Wolfram Language personnalisées.

Dans l'exemple suivant, nous le ferons en déployant l'API Web Wolfram Language. Par exemple, l'API accepte les noms de deux pays (pays1 et pays2) à l'entrée, recherche la capitale de chaque pays, puis calcule la distance entre eux (en kilomètres):

 CloudDeploy[ APIFunction[{"country1"->"String","country2"->"String"}, QuantityMagnitude[ GeoDistance[ EntityValue[Entity["Country", #country1], "CapitalCity"], EntityValue[Entity["Country", #country2], "CapitalCity"] ], "Kilometers" ]&, "WXF" ], CloudObject["api/public/capital_distance"], Permissions->"Public"] 



Après avoir déployé cette API, vous pouvez démarrer une nouvelle session Wolfram Language, mais cette fois, vous vous connectez au Wolfram Cloud au lieu du moteur local:

 from wolframclient.evaluation WolframCloudSession cloud = WolframCloudSession() 

Pour appeler l'API, vous devez spécifier le nom d'utilisateur (utilisateur1) et le point de terminaison de l'API (api / public / capital_distance). En utilisant ces données, vous pouvez vous connecter au cloud ...

 api = ('user1', 'api/public/capital_distance') result = cloud.call(api, {'country1': 'Netherlands', 'country2': 'Spain'}) 

... puis obtenez le résultat souhaité:
 result.get() 1481.4538329484521 

Évaluez à nouveau à quel point c'est facile et simple.

Si vous souhaitez enregistrer l'API Wolfram Language déployée afin que vous seul puissiez l'utiliser, vous pouvez déployer l'API à l'aide de la commande Autorisations → «Privé» . Pour ce faire, dans l'API privée, vous pouvez générer (en Wolfram Language) une clé de sécurité d'authentification:

image
 key = GenerateSecuredAuthenticationKey["myapp"] 

Copiez les réponses de ces deux lignes de saisie:

 key["ConsumerKey"] key["ConsumerSecret"] 

Collez-les ensuite dans votre session Python:

 SecuredAuthenticationKey('<<paste-consumer-key-here>>', '<<paste-consumer-secret-here>>') 

Et puis démarrez une nouvelle session cloud avec authentification:

 cloud = WolframCloudSession(credentials=sak) cloud.start() cloud.authorized() True 

Maintenant, vous (et vous seul) pouvez utiliser n'importe quelle API Wolfram Language que vous avez déployée pour un usage privé.

Parlons un peu des concepts de base de la sérialisation


Afin de tout faire rapidement et efficacement, la bibliothèque cliente Wolfram pour Python utilise le format WXF ouvert pour échanger des expressions entre Python et Wolfram. WXF est un format binaire pour sérialiser avec précision les expressions Wolfram Language sous une forme adaptée au partage avec des programmes externes. La fonction de bibliothèque Export peut sérialiser des objets Python dans un formulaire d'entrée de chaîne et WXF, et prend également en charge un ensemble de classes intégrées Python telles que dict, list et strings:

 from wolframclient.serializers import export export({ 'list': [1,2,3], 'string': u'abc', 'etc': [0, None, -1.2] }) b'<|"list" -> {1, 2, 3}, "string" -> "abc", "etc" -> {0, None, -1.2}|>' 

WXF est un tableau numérique avec des données compressées, qui vous permet de prendre en charge efficacement les tableaux NumPy .

Par exemple, créez un tableau de 255 entiers positifs 8 bits:

 import numpy array=numpy.arange(255, dtype='uint8') 

Sérialisez-le en octets WXF et calculez le nombre d'octets:

 wxf=export(array, target_format='wxf') len(wxf) 262 

NumPy vous permet d'accéder à de nombreuses bibliothèques Python. Par conséquent, cette sérialisation efficace et compacte permet de connecter le système Python au Wolfram Language, dont la conséquence directe est la prise en charge dans NumPy que la sérialisation des images PIL est généralement très efficace. La plupart des modes de données de pixels sont affichés comme l'un des types de tableaux numériques spécifiés comme NumericArrayType .

Il convient également de noter que les pandas Series et DataFrame sont pris en charge ici initialement. La bibliothèque fournit également un mécanisme extensible pour sérialiser des classes arbitraires.

Qu'est-ce qui est disponible maintenant?


Installez la dernière bibliothèque client Wolfram pour Python à l'aide de la commande pip :

 $ pip install wolframclient 

Pour ce faire, vous avez besoin de Python 3.5.3 (ou d'une version plus récente) et de Wolfram Language 11.3 (ou d'une version plus récente). Consultez la documentation de la bibliothèque cliente Wolfram pour Python . Tout le code source est hébergé sur le référentiel WolframClientForPython sur Wolfram Research GitHub .

Si vous avez des suggestions pour l'améliorer et que vous pouvez et souhaitez nous aider à le faire, vous pouvez le faire en nous envoyant une demande de mise à jour des données dans ce référentiel.
Nous sommes très heureux que cette version ait finalement eu lieu et nous espérons qu'elle vous sera utile. Veuillez nous donner votre avis dans la section commentaires ou dans la communauté Wolfram , et nous ferons de notre mieux pour vous contacter personnellement.

À propos de la traduction
J'exprime ma profonde gratitude à Peter Tenishev et Galina Nikitina pour leur aide dans la traduction et la préparation de la publication.

Vous voulez apprendre à programmer en Wolfram Language?
Regardez des webinaires hebdomadaires.
Inscription aux nouveaux cours . Cours en ligne prêt.
Solution de commande chez Wolfram Language.

Source: https://habr.com/ru/post/fr471814/


All Articles