Tradução original no meu blogObtendo 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:

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.
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.