Executando verificação de segurança...
9

Usando Numpy e Pandas no Node.js

Se você usa exclusivamente um ambiente Node.js e, de repente, precisa daquela biblioteca Python que não possui equivalente para Node, eu tenho a solução.

Todos sabemos da grande capacidade do Python em ser útil para trabalhos de análise e processamento de dados. Sobretudo para computação científica e afins. Isso se deve principalmente ao seu grande leque de bibliotecas com essa finalidade, como Numpy, Pandas e etc. A diferença de performance que principalmente o numpy pode dar ao python é absurda, o que faz com que a linguagem seja a escolha perfeita para computação científica na maioria dos casos, pois é uma linguagem simples e com uma ótima legibilidade do código. Alie isso à performance do C e verá do porquê Python é uma das linguagens do momento.

É claro que isso é uma visão muito simplista do todo, existem muito mais variáveis que contribuem para essa ascensão do Python. Mas o fato de termos bibliotecas escritas em Fortran, C e C++ que utilizam o Python como um frontend é o que traz realmente o destaque para a linguagem, dentre vários outros fatores. Infelizmente nem todas as linguagens tem essa sorte, mas hoje em dia integração entre várias linguagens de programação não são um problema.

Não é mistério para ninguém que hoje a web e o mobile são duas áreas que têm um grande crescimento dia após dia na tecnologia. E surfando nessa onda nós temos o javascript, que tem praticamente um monopólio quando se trata de Frontend web. Mas nem só de Front vive o javascript, também temos o Node.js que faz com que a linguagem trabalhe também no backend. Não vou entrar no mérito de discutir se o Node é ou não é o melhor, todos sabemos que não é, assim como o próprio Python, mas é utilizado, então devemos pelo menos conhecer.

Com o advento do Node cada dia mais se fala de fullstack, pois a ferramenta facilita absurdamente que iniciantes tenham contato tanto com o Front quanto com o Back, sem o atrito de precisarem aprender mais de uma linguagem. Esse não é um assunto novo, mas está cada dia mais recorrente no nosso meio. O que precisamos entender é que o Javascript está intimamente ligado com a web e suas facetas, sobretudo com o Frontend. Isso nos dá inúmeras ferramentas para lidar com web, como Express, Fastfy, React, Svelte, Vue, Angular e por aí vai. Mas quando precisamos de algo tão robusto quanto para análise de dados, não temos praticamente nenhuma ferramenta.

Por isso foi criado o pymport, para integrar facilmente bibliotecas do Python com o Node.

Vamos direto ao ponto:

> npm install pymport
> npx pympip3 install numpy
// index.js

import { pymport } from 'pymport/profixied'

const np = pymport('numpy')

const a = np.arange(5)
console.log(a.toString())
// [ 0 1 2 3 4 ]

Bem simples!

Como a biblioteca funciona?

funcionamento do pymport

O pymport basicamente te permite usar bibliotecas Python de forma transparente no Node.js. Ele possui um interpretador Python completo e incorporado (mas é possível também configurar uma instalação existente do Python). Os dois interpretadores compartilham a mesma thread principal e mesmo espaço de memória, mas os objetos de Python e Node permanecem separados. O Node pode acessar os objetos Python que tem o tipo PyObject, enquanto o Python não pode acessar os objetos do Node.

Ao passar objetos entre os dois interpretadores:

  • A conversão de Javascript para Python é automática e por cópia
  • Objetos Python são passados por referência para o Javascript como um PyObject
  • Existe uma pequena equivalência de tipos entre Python e Javascript que permite transformar variáveis
  • Python inline também é suportado através da estrutura pyval

Funções também podem ser passadas livremente entre os interpretadores. Toda vez que uma função inter-linguagem é chamada ela é executada pelo seu interpretador correspondente. Seus argumentos também vão ser convertidos de acordo com as mesmas regras.

Importando módulos locais

O pymport é feito usando bibliotecas Python dentro do Node.js, então quando importamos bibliotecas Python, por padrão o pyimport irá pesquesar somente caminhos para bibliotecas.

Antes de importar um módulo do usuário do diretório atual, ou de qualquer outro diretório local, a variável de ambiente PYTHONPATH deve ser atribuída antes de inicializar o Python. Se você utiliza CommonJS isso pode facilmente ser feito antes do require:

process.env['PYTHONPATH'] = _dirname;
const { pymport } = require('pyimport');

Em Typescript ou com ES6 Modules, deve-se atribuir a variável através do ambiente (ou com o dotenv).

Caso tenha gostado dessa dica não deixe de acessar o repositório oficial do pymport e a sua documentação.

Carregando publicação patrocinada...
1
1

Caramba, genial!

Uma duvida, isso acaba tornando possível fazer o NodeJS se tornar, indiretamente, uma biblioteca back-end utilizada por pythonistas? Ou a separação de ambos os interpretadores é segmentada o suficiente para tornar inviável o caminho reverso da lógica programática?

1

Olha, provavelmente seria possível sim, mas não com esse mesmo pacote. Também não sei se seria tão útil, já que a maioria das libs do node não seriam tão úteis no Python.

1

Muitas bibliotecas para serem utilizadas com Python estão sendo criadas ou reescritas em Rust, vale a pena ler o artigo Rustification of Python nesse artigo.

Alguns exemplos mais famosos de bibliotecas Python escritas em Rust é o Pydantic, Ruff, Rye e o Polars.

O Polars é justamente o tema aqui, ele funciona da mesma forma que o Pandas e promete ser muito mais rápido e tem interface com Node.js.