WolframClientForPython | Nova biblioteca cliente da linguagem Wolfram para Python


Tradução original no meu blog

Obtendo acesso total à Wolfram Language a partir de Python


A linguagem Wolfram ( Wolfram Language ) fornece aos programadores uma linguagem única, com uma enorme variedade de algoritmos complexos, além de conhecimento interno sobre o mundo. Ao longo dos anos, as pessoas nos perguntaram como acessar todos os recursos de nossa tecnologia a partir de outros ambientes de software e linguagens de programação. Os anos se passaram e criamos muitas soluções como Wolfram CloudConnector for Excel , WSTP ( Wolfram Symbol Transfer Protocol) para programas C / C ++ e, é claro, J / Link , que fornece acesso à Wolfram Language diretamente do Java.

Portanto, hoje temos o prazer de apresentar oficialmente a tão esperada nova solução para combinar idiomas, que permitirá que você chame direta e eficientemente a Wolfram Language do Python : Wolfram Client Library for Python . E o mais importante, essa biblioteca-cliente possui código-fonte totalmente aberto hospedado no repositório git WolframClientForPython sob a licença MIT, para que você possa copiá-lo quanto quiser e usá-lo como quiser.

É fácil e simples.


A biblioteca cliente Wolfram facilita a integração de uma grande coleção de algoritmos da Wolfram Language, bem como a base de conhecimento da Wolfram diretamente em qualquer código Python existente, o que economiza significativamente seu tempo e esforço ao desenvolver um novo código. Neste artigo, primeiro mostramos como configurar uma conexão entre Python e a Wolfram Language, examinamos vários métodos e exemplos que podem ser usados ​​para computar na Wolfram Language e depois a chamamos para uso no Python. Para obter informações de referência mais completas, acesse: página inicial da documentação da Wolfram Client Library for Python .

Aprecie no local ...


Vamos começar com um exemplo simples que calcula a média e o desvio padrão de um milhão de números extraídos de uma distribuição normal. Este exemplo mostra como chamar uma função Wolfram do Python e comparar os resultados do Python com o mesmo cálculo da Wolfram Language para mostrar que eles são altamente convergentes.

Análise Estatística de Dados


Em primeiro lugar, para se conectar ao Wolfram Language, você precisa criar uma nova sessão com o Wolfram Engine (mecanismo de idioma Wolfram gratuito):

from wolframclient.evaluation import WolframLanguageSession session=WolframLanguageSession() 

Para chamar as funções da Wolfram Language, você precisa importar o mecanismo `wl`:

 from wolframclient.language import wl 

Agora você pode executar qualquer código de idioma Wolfram. Atribua a variável de amostra do Python a um valor de lista de um milhão de números aleatórios retirados da distribuição normal, com uma média de 0 e um desvio padrão de 1:

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

Considere os cinco primeiros:

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

Você pode calcular a média desta amostra usando o Wolfram Language. Como esperado, será próximo de zero:

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

Você também pode calcular diretamente o mesmo no Python para garantir um resultado semelhante:

 from statistics import mean mean(sample) 0.0013371607703851474 

Da mesma forma, você pode calcular o desvio padrão de uma amostra usando o Wolfram Language:

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

Em seguida, execute o seguinte código no Python para garantir um resultado semelhante:

 stdev(sample) 1.0014296230797068 

Não pode deixar de se alegrar com a convergência dos resultados. Agora você sabe como chamar funções simples da Wolfram Language a partir do Python. Vamos continuar com um exemplo mais interessante.

Usando a Base de Conhecimento Wolfram


Vejamos a função interna Wolfram Language, que não está disponível no Python, WolframAlpha :

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

A função WolframAlpha é uma das funções de alto nível na Wolfram Language que se comunica com os servidores Wolfram | Alpha por meio da API da web . Você pode usar essa API diretamente do Python, o que torna a chamada da função WolframAlpha muito mais poderosa e mais conveniente, pois você obtém acesso a todas as funções de processamento de dados diretamente da Wolfram Language. Vejamos o que a variável moon no Python contém:

 moons EntityClass['PlanetaryMoon', 'SaturnMoon'] 

A saída aqui é uma representação em Python de uma expressão da Wolfram Language, que pode ser usada em qualquer cálculo subsequente. Por exemplo, se você deseja obter uma lista dos quatro primeiros satélites de Saturno (pelo grau de proximidade com Saturno) para isso, execute o seguinte código:

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

Ou você pode exibir os quatro maiores satélites de massa de Saturno com este código:

 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 você pode obter uma série de strings com os nomes desses satélites, por exemplo:

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

Tudo isso é muito impressionante. Vejamos outro exemplo usando as funções de processamento de imagem e aprendizado de máquina integradas na Wolfram Language.

Processamento de imagem e aprendizado de máquina


Primeiro, vamos mudar para outro modo para realizar avaliações diretamente no Wolfram Language. Até agora, você usou o mecanismo `wl` para criar expressões da Wolfram Language no Python, mas também pode executar linhas de código escritas em Python contendo o código da Wolfram Language, e às vezes é percebido com mais facilidade:

 from wolframclient.language import wlexpr 


Por exemplo, calcule 1 + 1 no Wolfram Language, enviando-o como uma sequência:

 session.evaluate('1+1') 2 


Usando esse método, você pode escrever um código pequeno na Wolfram Language, que recebe a imagem na entrada e usa o algoritmo de detecção de rosto embutido para encontrar o local da face na imagem. Aqui, a imagem que usamos é a famosa pintura “ Garota com um brinco de pérola ”, do artista holandês Johannes Vermeer (note-se, naturalmente, esse algoritmo também funcionará em quase qualquer imagem com objetos nos quais os rostos possam ser reconhecidos). Como a interface do terminal Python não suporta saída de imagem, precisamos usar o Jupyter Notebook junto com o pacote Python Image Library (PIL) para poder gerar o resultado:

 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) 



Como resultado, tudo ficou muito fácil e poderoso ao mesmo tempo. Mas o que fazer se você não tiver o Wolfram Engine instalado localmente no seu computador e quiser usar a biblioteca-cliente Wolfram para Python? Nesse caso, você sempre pode usar o Wolfram Language diretamente, chamando-o da Wolfram Cloud (nuvem).

Então, vá para a nuvem


O Wolfram Cloud fornece acesso fácil ao Wolfram Language sem pré-instalação local. A Wolfram Cloud fornece uma variedade de serviços, incluindo a interface de programação da Web Wolfram Language, bem como a capacidade de implantar APIs da Web personalizadas da Wolfram Language.

No exemplo a seguir, faremos isso implantando a API da Web da Wolfram Language. Por exemplo, a API aceita os nomes de dois países (país1 e país2) na entrada, localiza a capital de cada país e calcula a distância entre eles (em quilômetros):

 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"] 



Após implantar essa API, você pode iniciar uma nova sessão do Wolfram Language, mas desta vez você está se conectando à Wolfram Cloud em vez do mecanismo local:

 from wolframclient.evaluation WolframCloudSession cloud = WolframCloudSession() 

Para chamar a API, você deve especificar o nome de usuário (usuário1) e o terminal da API (api / public / capital_distance). Usando esses dados, você pode se conectar à nuvem ...

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

... e, em seguida, obtenha o resultado desejado:
 result.get() 1481.4538329484521 

Avalie mais uma vez como é fácil e simples.

Se você deseja salvar a API Wolfram Language implantada para que apenas você possa usá-la, é possível implantar a API usando o comando Permissões → "Privado" . Para fazer isso, na API privada, você pode gerar (em Wolfram Language) uma chave de segurança de autenticação:

imagem
 key = GenerateSecuredAuthenticationKey["myapp"] 

Copie as respostas dessas duas linhas de entrada:

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

Em seguida, cole-os na sua sessão Python:

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

E, em seguida, inicie uma nova sessão na nuvem com autenticação:

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

Agora você (e somente você) pode usar qualquer API da Wolfram Language que você implantou para uso privado.

Vamos falar um pouco sobre os conceitos básicos de serialização


Para fazer tudo com rapidez e eficiência, a biblioteca-cliente Wolfram para Python usa o formato WXF aberto para trocar expressões entre Python e Wolfram. O WXF é um formato binário para serializar com precisão as expressões da Wolfram Language em um formato adequado para compartilhar com programas externos. A função de biblioteca Export pode serializar objetos Python para um formulário de entrada de string e WXF, e também suporta um conjunto de classes internas do Python, como dict, list e 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}|>' 

O WXF é um array numérico com dados compactados, que permite suportar efetivamente matrizes NumPy .

Por exemplo, crie uma matriz de 255 números inteiros positivos de 8 bits:

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

Serialize-o em bytes WXF e calcule o número de bytes:

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

O NumPy permite acessar muitas bibliotecas Python. Consequentemente, essa serialização eficiente e compacta ajuda a conectar o sistema Python à Wolfram Language, cuja conseqüência direta é o suporte ao NumPy de que a serialização de imagens PIL em geral é muito eficiente. A maioria dos modos de dados de pixel é exibida como um dos tipos de matrizes numéricas especificadas como NumericArrayType .

Também é importante notar que os pandas Series e DataFrame são suportados aqui inicialmente. A biblioteca também fornece um mecanismo extensível para serializar classes arbitrárias.

O que está disponível agora?


Instale a biblioteca cliente mais recente do Wolfram para Python usando o comando pip :

 $ pip install wolframclient 

Para fazer isso, você precisa do Python 3.5.3 (ou uma versão mais recente) e do Wolfram Language 11.3 (ou uma versão mais recente). Confira a documentação da biblioteca-cliente Wolfram para Python . Todo o código-fonte está hospedado no repositório WolframClientForPython no Wolfram Research GitHub .

Se você tiver sugestões para aprimorá-lo e puder e quiser nos ajudar a fazer isso, envie-nos uma solicitação para atualizar os dados neste repositório.
Estamos muito satisfeitos que este lançamento finalmente tenha ocorrido e esperamos que seja útil para você. Diga-nos sua opinião na seção de comentários ou na comunidade Wolfram , e faremos o possível para contatá-lo pessoalmente.

Sobre tradução
Expresso minha profunda gratidão a Peter Tenishev e Galina Nikitina por sua ajuda na tradução e preparação da publicação.

Deseja aprender a programar no Wolfram Language?
Assista a seminários on- line semanais.
Inscrição para novos cursos . Curso online pronto.
Peça a solução na Wolfram Language.

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


All Articles