{"id":41221,"date":"2020-02-06T20:42:46","date_gmt":"2020-02-06T17:42:46","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/python-gateway-v-intersystems-iris"},"modified":"2020-02-06T20:42:46","modified_gmt":"2020-02-06T17:42:46","slug":"python-gateway-v-intersystems-iris","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/python-gateway-v-intersystems-iris","title":{"rendered":"Python Gateway in InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Questo articolo \u00e8 dedicato a Python Gateway \u2014 un progetto comunitario open source per la piattaforma di dati InterSystems IRIS. Questo progetto consente di orchestrare qualsiasi algoritmo di machine learning creato in Python (l'ambiente principale per molti Data Scientist), utilizzando numerose librerie pronte per la creazione rapida di soluzioni analitiche adattive e robotizzate AI\/ML sulla piattaforma InterSystems IRIS. In questo articolo mostrer\u00f2 come InterSystems IRIS pu\u00f2 orchestrare processi in Python, effettuare una trasmissione bidirezionale dei dati e creare processi aziendali intelligenti.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"plan\">Piano<\/h1>\n<p><\/p>\n<ol>\n<li>Introduzione.<\/li>\n<li>Strumenti.<\/li>\n<li>Installazione.<\/li>\n<li>API.<\/li>\n<li>Interoperabilit\u00e0.<\/li>\n<li>Jupyter Notebook.<\/li>\n<li>Conclusioni.<\/li>\n<li>Link.<\/li>\n<li>MLToolkit.<\/li>\n<\/ol>\n<p><\/p>\n<h1 id=\"vvedenie\">Introduzione<\/h1>\n<p><\/p>\n<p>Python \u00e8 un linguaggio di programmazione ad alto livello, orientato a migliorare la produttivit\u00e0 dello sviluppatore e la leggibilit\u00e0 del codice. In questa serie di articoli parler\u00f2 delle possibilit\u00e0 di utilizzo del linguaggio Python sulla piattaforma InterSystems IRIS, con particolare focus sull'uso di Python come linguaggio per la creazione e applicazione di modelli di machine learning.<\/p>\n<p><\/p>\n<p>Il machine learning (ML) \u00e8 una classe di metodi di intelligenza artificiale caratterizzati dall'apprendimento durante la risoluzione di una serie di compiti simili, piuttosto che dal fornire una soluzione diretta al problema. <\/p>\n<p><\/p>\n<p>Gli algoritmi e i modelli di machine learning stanno diventando sempre pi\u00f9 comuni. Le ragioni sono molteplici, ma sono tutte riconducibili all'accessibilit\u00e0, alla semplicit\u00e0 e ai risultati pratici ottenuti. \u00c8 la clustering o anche la modellazione basata su reti neurali una tecnologia nuova? <\/p>\n<p><\/p>\n<p>Assolutamente no, ma oggi non \u00e8 pi\u00f9 necessario scrivere centinaia di migliaia di righe di codice per avviare un modello, e i costi per la creazione e l'applicazione dei modelli stanno diminuendo sempre di pi\u00f9.<\/p>\n<p><\/p>\n<p>Gli strumenti stanno evolvendo: mentre non abbiamo ancora strumenti AI\/ML completamente orientati alla GUI, il progresso che abbiamo osservato in molte altre classi di sistemi informativi, come il BI (da scrivere codice a utilizzare framework e soluzioni configurabili orientate alla GUI), si sta verificando anche negli strumenti per la creazione di AI\/ML. Abbiamo gi\u00e0 superato la fase di scrittura del codice e oggi utilizziamo framework per costruire e addestrare modelli.<\/p>\n<p><\/p>\n<p>Altri miglioramenti, come la possibilit\u00e0 di distribuire modelli preaddestrati, in cui l'utente finale deve semplicemente completare l'addestramento del modello sui propri dati specifici, semplificano l'inizio dell'applicazione dell'apprendimento automatico. Questi progressi rendono significativamente pi\u00f9 accessibile l'apprendimento dell'intelligenza artificiale sia per i professionisti che per le aziende nel loro complesso.<\/p>\n<p><\/p>\n<p>D'altra parte, stiamo raccogliendo sempre pi\u00f9 dati. Grazie a una piattaforma dati unificata come InterSystems IRIS, tutte queste informazioni possono essere immediatamente preparate e utilizzate come dati di origine per i modelli di apprendimento automatico.<\/p>\n<p><\/p>\n<p>Con il passaggio al cloud, l'avvio di progetti AI\/ML diventa pi\u00f9 semplice che mai. Possiamo utilizzare solo le risorse di cui abbiamo bisogno. Inoltre, grazie alla parallelizzazione offerta dalle piattaforme cloud, possiamo risparmiare tempo.<\/p>\n<p><\/p>\n<p>Ma che dire dei risultati? Qui le cose si complicano. Esistono molti strumenti per costruire modelli, di cui parler\u00f2 in seguito. Creare un buon modello non \u00e8 semplice, ma cosa viene dopo? Realizzare profitti dall'uso di un modello da parte delle imprese \u00e8 anche un compito non banale. La radice del problema risiede nella separazione dei carichi analitici e transazionali, e dei modelli di dati. Quando alleniamo un modello, di solito lo facciamo su dati storici. Ma il posto di un modello costruito \u00e8 nell'elaborazione transazionale dei dati. Qual \u00e8 l'utile di un migliore modello di rilevamento delle transazioni fraudolente, se lo eseguiamo una volta al giorno? I truffatori sono gi\u00e0 scappati con i soldi. Dobbiamo addestrare il modello su dati storici, ma dobbiamo anche applicarlo in tempo reale su nuovi dati in arrivo, affinch\u00e9 i nostri processi aziendali possano agire in base alle previsioni fatte dal modello.<\/p>\n<p><\/p>\n<p>ML Toolkit \u2014 una suite di strumenti il cui obiettivo \u00e8 proprio questo: unire modelli e ambienti transazionali, affinch\u00e9 i modelli sviluppati possano essere facilmente utilizzati direttamente nei vostri processi aziendali. Python Gateway \u00e8 parte di ML Toolkit e garantisce l'integrazione con il linguaggio Python (analogamente a R Gateway, che essendo parte di ML Toolkit, offre integrazione con il linguaggio R).<\/p>\n<p><\/p>\n<h1 id=\"instrumentariy\">Strumenti<\/h1>\n<p><\/p>\n<p>Prima di continuare, vorrei descrivere alcuni strumenti e librerie per Python che utilizzeremo pi\u00f9 avanti.<\/p>\n<p><\/p>\n<h2 id=\"tehnologii\">Tecnologie<\/h2>\n<p><\/p>\n<ul>\n<li>Python \u00e8 un linguaggio di programmazione interpretato e di alto livello, di uso generale. Il principale vantaggio del linguaggio \u00e8 la vasta libreria di funzioni matematiche, ML e AI. Come ObjectScript, \u00e8 un linguaggio orientato agli oggetti, ma tutto \u00e8 definito dinamicamente, non staticamente. Inoltre, tutto \u00e8 un oggetto. Gli articoli successivi presuppongono una conoscenza superficiale del linguaggio. Se desiderate iniziare l'apprendimento, consiglio di cominciare con <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">documentazione<\/a><\/noindex>.<\/li>\n<li>Per i nostri esercizi successivi, installa <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python 3.6.7 64 bit<\/a><\/noindex>.<\/li>\n<li>IDE: Io utilizzo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a><\/noindex>, ma in generale ci sono <noindex><a rel=\"nofollow\" href=\"https:\/\/realpython.com\/python-ides-code-editors-guide\/\">tanti<\/a><\/noindex>. Se utilizzi Atelier, esiste un plug-in Eclipse per gli sviluppatori Python. Se utilizzi VS Code, c'\u00e8 un'estensione per Python. <\/li>\n<li>Notebook: invece di un IDE, puoi scrivere e condividere i tuoi script in notebook online. Il pi\u00f9 popolare di questi \u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"biblioteki\">Librerie<\/h2>\n<p><\/p>\n<p>Ecco un elenco (non completo) di librerie per l'apprendimento automatico:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.numpy.org\/\">Numpy<\/a><\/noindex> \u2014 un pacchetto fondamentale per i calcoli scientifici.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pandas.pydata.org\/\">Pandas<\/a><\/noindex> \u2014 strutture dati ad alte prestazioni e strumenti per l'analisi dei dati.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a><\/noindex> \u2014 creazione di grafici.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a><\/noindex> \u2014 visualizzazione dei dati basata su matplotlib.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/scikit-learn.org\/stable\/\">Sklearn<\/a><\/noindex> \u2014 metodi di apprendimento automatico.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/index.html\">XGBoost<\/a><\/noindex> \u2014 algoritmi di apprendimento automatico nell'ambito della metodologia del gradient boosting (Gradient Boosting).<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/radimrehurek.com\/gensim\/\">Gensim<\/a><\/noindex> \u2014 NLP.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/keras.io\/\">Keras<\/a><\/noindex> \u2014 reti neurali.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a><\/noindex> \u2014 piattaforma per la creazione di modelli di apprendimento automatico.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">PyTorch<\/a><\/noindex> \u2014 piattaforma per la creazione di modelli di apprendimento automatico, focalizzata su Python.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nyoka-pmml\/nyoka\">Nyoka<\/a><\/noindex> \u2014 PMML da diversi modelli.<\/li>\n<\/ul>\n<p><\/p>\n<p>Le tecnologie AI\/ML possono rendere le aziende pi\u00f9 efficienti e adattabili. Inoltre, oggi queste tecnologie stanno diventando pi\u00f9 semplici da sviluppare e implementare. Inizia a esplorare le tecnologie AI\/ML e come possono aiutare la tua organizzazione a crescere.<\/p>\n<p><\/p>\n<h1 id=\"ustanovka\">Installazione<\/h1>\n<p><\/p>\n<p>Ci sono diversi modi per installare e utilizzare Python Gateway:<\/p>\n<p><\/p>\n<ul>\n<li>il sistema operativo\n<ul>\n<li>Windows<\/li>\n<li>Linux<\/li>\n<li>Mac<\/li>\n<\/ul>\n<\/li>\n<li>Docker\n<ul>\n<li>Utilizza un'immagine da DockerHub<\/li>\n<li>Crea la tua immagine personalizzata<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Indipendentemente dal metodo di installazione, avrai bisogno del codice sorgente. L'unico posto per scaricare il codice \u00e8 la <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">pagina delle release<\/a><\/noindex>. Questa contiene le release stabili testate, basta prendere l'ultima. Attualmente \u00e8 la 0.8, ma ci saranno aggiornamenti nel tempo. Non clonare\/caricare il repository, scarica l'ultima release.<\/p>\n<p><\/p>\n<h2 id=\"os\">il sistema operativo<\/h2>\n<p><\/p>\n<p>Se stai installando Python Gateway su un sistema operativo, dovrai prima (indipendentemente dal sistema operativo) installare Python. Per fare ci\u00f2:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Installa Python 3.6.7 64 bit<\/a><\/noindex>. Si consiglia di installare Python nella directory predefinita.<\/li>\n<li>Installa il modulo <code>dill<\/code>: <code>pip install dill<\/code>.<\/li>\n<li>Carica il codice ObjectScript (cio\u00e8, <code>do $system.OBJ.ImportDir(&quot;C:InterSystemsReposPythoniscpy&quot;, &quot;*.cls&quot;, &quot;c&quot;,,1)<\/code>) in qualsiasi namespace con prodotti. Se desideri che un namespace esistente supporti i prodotti, esegui: <code>write ##class(%EnsembleMgr).EnableNamespace($Namespace, 1)<\/code>.<\/li>\n<li>Posiziona <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">callout DLL\/SO\/DYLIB<\/a><\/noindex> nella cartella <code>bin<\/code> della tua istanza InterSystems IRIS. Il file della libreria deve essere accessibile nel percorso restituito da <code>write ##class(isc.py.Callout).GetLib()<\/code>. <\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"windows\">Windows<\/h3>\n<p><\/p>\n<ol>\n<li>Assicurati che la variabile d'ambiente <code>PYTHONHOME<\/code> indichi Python 3.6.7.<\/li>\n<li>Verifica che la variabile d'ambiente di sistema <code>PATH<\/code> includa la variabile <code>PYTHONHOME<\/code> (o la directory a cui si riferisce).<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"linux-debianubuntu\">Linux (Debian\/Ubuntu)<\/h3>\n<p><\/p>\n<ol>\n<li>Controlla che la variabile d'ambiente <code>PATH<\/code> contiene <code>\/usr\/lib<\/code> e <code>\/usr\/lib\/x86_64-linux-gnu<\/code>. Usa il file <code>\/etc\/environment<\/code> per impostare le variabili d'ambiente.<\/li>\n<li>In caso di errori <code>undefined symbol: _Py_TrueStruct<\/code> configura l'impostazione <code>PythonLib<\/code>. Inoltre nel <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme<\/a><\/noindex> \u00e8 presente una sezione di Risoluzione dei problemi.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"mac\">Mac<\/h3>\n<p><\/p>\n<ol>\n<li>Attualmente \u00e8 supportato solo Python 3.6.7 da <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python.org<\/a><\/noindex>. Controlla la variabile <code>PATH<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Se hai modificato le variabili d'ambiente, riavvia il tuo prodotto InterSystems.<\/p>\n<p><\/p>\n<h2 id=\"docker\">Docker<\/h2>\n<p><\/p>\n<p>L'utilizzo dei container offre diversi vantaggi: <\/p>\n<p><\/p>\n<ul>\n<li>Portabilit\u00e0<\/li>\n<li>Efficienza<\/li>\n<li>Isolamento<\/li>\n<li>Leggerezza<\/li>\n<li>Immutabilit\u00e0<\/li>\n<\/ul>\n<p><\/p>\n<p>Consulta questa <noindex><a rel=\"nofollow\" href=\"https:\/\/community.intersystems.com\/post\/continuous-delivery-your-intersystems-solution-using-gitlab-part-v-why-containers\">serie di articoli<\/a><\/noindex> per ulteriori informazioni sull'uso di Docker con i prodotti InterSystems. <\/p>\n<p><\/p>\n<p>Tutte le build di Python Gateway sono attualmente basate su container <code>2019.4<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"gotovyy-obraz\">Immagine pronta<\/h3>\n<p><\/p>\n<p>Esegui: <code>docker run -d -p 52773:52773 --name irispy intersystemscommunity\/irispy-community:latest<\/code>, per scaricare e avviare Python Gateway con InterSystems IRIS Community Edition. Questo \u00e8 tutto.<\/p>\n<p><\/p>\n<h3 id=\"sozdayte-svoy-sobstvennyy-obraz\">Crea la tua immagine personalizzata<\/h3>\n<p><\/p>\n<p>Per costruire l'immagine docker, esegui nella radice del repository: <code>docker build --force-rm --tag intersystemscommunity\/irispy:latest .<\/code>.<br \/>\nPer impostazione predefinita, l'immagine viene costruita su base dell'immagine <code>store\/intersystems\/iris-community:2019.4.0.383.0<\/code>, tuttavia puoi modificarlo impostando la variabile <code>IMAGE<\/code>.<br \/>\n\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438\u0437 InterSystems IRIS \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435: `docker build &#8212;build-arg IMAGE=store\/intersystems\/iris:2019.4.0.383.0 &#8212;force-rm &#8212;tag intersystemscommunity\/irispy:latest &#171;.<\/p>\n<p><\/p>\n<p>Dopo di ci\u00f2, puoi avviare l'immagine Docker:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">docker run -d \n  -p 52773:52773 \n  -v \/\/:\/mount \n  --name irispy \n  intersystemscommunity\/irispy:latest \n  --key \/mount\/iris.key<\/code><\/pre>\n<p><\/p>\n<p>Se stai usando un'immagine basata su InterSystems IRIS Community Edition, non \u00e8 necessario specificare la chiave.<\/p>\n<p><\/p>\n<h3 id=\"kommentarii\">Commenti<\/h3>\n<p><\/p>\n<ul>\n<li>Processo di test <code>isc.py.test.Process<\/code> salva una serie di immagini in una directory temporanea. Potresti voler modificare questo percorso in una directory montata. Per farlo, modifica l'impostazione <code>WorkingDir<\/code> specificando la directory montata.<\/li>\n<li>Per accedere al terminale, esegui: <code>docker exec -it irispy sh<\/code>.<\/li>\n<li>Accesso al Portale di Gestione del Sistema con login <code>SuperUser<\/code>\/<code>SYS<\/code>.<\/li>\n<li>Per fermare il container, esegui: <code>docker stop irispy &amp;&amp; docker rm --force irispy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"proverka-ustanovki\">Verifica dell'installazione<\/h2>\n<p><\/p>\n<p>Dopo aver installato Python Gateway, \u00e8 opportuno verificare che funzioni. Esegui questo codice nel terminale di InterSystems IRIS:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Callout).Setup() \nset sc = ##class(isc.py.Main).SimpleString(&quot;x='HELLO'&quot;, &quot;x&quot;, , .var).\nwrite var<\/code><\/pre>\n<p><\/p>\n<p>Il risultato dovrebbe essere stampato <code>HELLO<\/code> \u2014 il valore della variabile Python <code>x<\/code>. Se lo stato restituito <code>sc<\/code> \u00e8 un errore o <code>var<\/code> \u00e8 vuoto, controlla <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme \u2014 sezione di risoluzione dei problemi<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"api\">API<\/h1>\n<p><\/p>\n<p>Python Gateway \u00e8 installato e hai verificato che funzioni. \u00c8 ora di iniziare a usarlo!<br \/>\nL'interfaccia principale per Python \u00e8 <code>isc.py.Main<\/code>. Offre i seguenti gruppi di metodi (tutti restituiscono <code>%Status<\/code>):<\/p>\n<p><\/p>\n<ul>\n<li>Esecuzione del codice<\/li>\n<li>Trasmissione dati<\/li>\n<li>Ausiliari<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"ispolnenie-koda\">Esecuzione del codice<\/h2>\n<p><\/p>\n<p>Questi metodi consentono di eseguire codice Python arbitrario.<\/p>\n<p><\/p>\n<h3 id=\"simplestring\">SimpleString<\/h3>\n<p><\/p>\n<p><code>SimpleString<\/code> \u2014 \u00e8 il metodo principale. Accetta 4 argomenti opzionali:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 stringa di codice da eseguire. Simbolo di nuova riga: <code>$c(10)<\/code>.<\/li>\n<li><code>returnVariable<\/code> \u2014 nome della variabile da restituire.<\/li>\n<li><code>serialization<\/code> \u2014 come serializzare <code>returnVariable<\/code>. 0 \u2014 string (predefinito), 1 \u2014 repr.<\/li>\n<li><code>result<\/code> \u2014 ByRef riferimento alla variabile in cui viene scritto il valore <code>returnVariable<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Abbiamo eseguito:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).SimpleString(&quot;x='HELLO'&quot;, &quot;x&quot;, , .var).<\/code><\/pre>\n<p><\/p>\n<p>In questo esempio stiamo assegnando alla variabile Python <code>x<\/code> valore <code>Hello<\/code> e vogliamo restituire il valore della variabile Python <code>x<\/code> nella variabile ObjectScript <code>var<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"executecode\">ExecuteCode<\/h3>\n<p><\/p>\n<p>ExecuteCode \u00e8 un'alternativa pi\u00f9 sicura e meno restrittiva <code>SimpleString<\/code>.<br \/>\nLe stringhe nella piattaforma InterSystems IRIS sono limitate a 3.641.144 caratteri, e se desideri eseguire un pezzo di codice pi\u00f9 lungo, devi utilizzare i flussi.<br \/>\nSi accettano due argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 una stringa o un flusso di codice Python da eseguire.<\/li>\n<li><code>variable<\/code> \u2014 (opzionale) assegna il risultato dell'esecuzione a <code>code<\/code> questa variabile Python.<\/li>\n<\/ul>\n<p><\/p>\n<p>Esempio d'uso:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).ExecuteCode(&quot;2*3&quot;, &quot;y&quot;).<\/code><\/pre>\n<p><\/p>\n<p>In questo esempio moltiplichiamo 2 per 3 e registriamo il risultato in una variabile Python. <code>y<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"peredacha-dannyh\">Trasmissione dati<\/h2>\n<p><\/p>\n<p>Passa dati a Python e indietro.<\/p>\n<p><\/p>\n<h3 id=\"python---intersystems-iris\">Python -&gt; InterSystems IRIS<\/h3>\n<p><\/p>\n<p>Ci sono 4 modi per ottenere il valore di una variabile Python in InterSystems IRIS, a seconda della serializzazione di cui hai bisogno:<\/p>\n<p><\/p>\n<ul>\n<li><code>Stringa<\/code> per tipi di dati semplici e debug.<\/li>\n<li><code>Repr<\/code> per memorizzare oggetti semplici e debug.<\/li>\n<li><code>JSON<\/code> per una facile manipolazione dei dati sul lato InterSystems IRIS.<\/li>\n<li><code>Pickle<\/code> per la conservazione di oggetti.<\/li>\n<\/ul>\n<p><\/p>\n<p>Questi metodi consentono di ottenere variabili da Python come stringhe o flussi.<\/p>\n<p><\/p>\n<ul>\n<li><code>GetVariable(variable, serialization, .stream, useString)<\/code> \u2014 ottenere <code>serialization<\/code> la variabile <code>variable<\/code> in <code>stream<\/code>. Se <code>useString<\/code> \u00e8 uguale a 1 e la serializzazione \u00e8 memorizzata in una stringa, allora viene restituita una stringa e non un flusso.<\/li>\n<li><code>GetVariableJson(variable, .stream, useString)<\/code> \u2014 ottenere la serializzazione JSON della variabile.<\/li>\n<li><code>GetVariablePickle(variable, .stream, useString, useDill)<\/code> -ottenere la serializzazione Pickle (o Dill) di una variabile.<\/li>\n<\/ul>\n<p><\/p>\n<p>Proviamo a ottenere la nostra variabile <code>y<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).GetVariable(&quot;y&quot;, , .val, 1)\nwrite val\n&gt;6<\/code><\/pre>\n<p><\/p>\n<h3 id=\"intersystems-iris---python\">InterSystems IRIS -&gt; Python<\/h3>\n<p><\/p>\n<p>Carichiamo i dati da InterSystems IRIS in Python.<\/p>\n<p><\/p>\n<ul>\n<li><code>ExecuteQuery(query, variabile, tipo, namespace)<\/code> \u2014 crea un set di dati (pandas <code>dataframe<\/code> o <code>list<\/code>) da una query sql e lo imposta in una variabile Python <code>variable<\/code>. Il pacchetto <code>isc.py<\/code> deve essere accessibile nell'area <code>namespace<\/code> \u2014 l\u00ec verr\u00e0 eseguita la query.<\/li>\n<li><code>ExecuteGlobal(global, variabile, tipo, start, end, mask, labels, namespace)<\/code> \u2014 carica i dati di un globale <code>global<\/code> da un sottoscrittore <code>start<\/code> fino a <code>end<\/code> in Python come variabile di tipo <code>type<\/code>: <code>list<\/code>, oppure pandas <code>dataframe<\/code>. La descrizione degli argomenti opzionali <code>mask<\/code> and <code>etichette<\/code> \u00e8 disponibile nella documentazione della classe e nel repository <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Documentazione sul trasferimento dati<\/a><\/noindex>.<\/li>\n<li><code>ExecuteClass(class, variabile, tipo, start, end, properties, namespace)<\/code> \u2014 carica i dati di una classe <code>class<\/code> da id <code>start<\/code> fino a <code>end<\/code> in Python come variabile di tipo <code>type<\/code>: <code>list<\/code>, oppure pandas <code>dataframe<\/code>. <code>properties<\/code> \u2014 elenco (separatore \u2014 virgola) delle propriet\u00e0 della classe da caricare nel set di dati. Sono supportate le maschere <code>*<\/code> e <code>?<\/code>. Di default \u2014 <code>*<\/code> (tutte le propriet\u00e0). La propriet\u00e0 <code>%%CLASSNAME<\/code> viene ignorata.<\/li>\n<li><code>ExecuteTable(table, variabile, tipo, start, end, properties, namespace)<\/code> \u2014 carica i dati di una tabella <code>table<\/code> da id <code>start<\/code> fino a <code>end<\/code> in Python.<\/li>\n<\/ul>\n<p><\/p>\n<p><code>ExecuteQuery<\/code> \u2014 \u00e8 universale (qualsiasi query SQL corretta sar\u00e0 passata a Python). Tuttavia, <code>ExecuteGlobal<\/code> e le sue wrapper <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> lavorano con alcune limitazioni. Sono notevolmente pi\u00f9 veloci (da 3 a 5 volte pi\u00f9 veloci dei driver ODBC e 20 volte pi\u00f9 veloci <code>ExecuteQuery<\/code>). Maggiori informazioni su <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Documentazione sul trasferimento dati<\/a><\/noindex>.<br \/>\nTutti questi metodi supportano il trasferimento di dati da qualsiasi area. Il pacchetto <code>isc.py<\/code> deve essere accessibile nell'area target.<\/p>\n<p><\/p>\n<h3 id=\"executequery\">ExecuteQuery<\/h3>\n<p><\/p>\n<p><code>ExecuteQuery(request, variable, type, namespace)<\/code> \u2014 trasferimento dei risultati di qualsiasi query SQL valida in Python. Questo \u00e8 il metodo pi\u00f9 lento per il trasferimento dei dati. Utilizzalo se <code>ExecuteGlobal<\/code> e i suoi wrapper non sono disponibili.<\/p>\n<p><\/p>\n<p>Argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>query<\/code> \u2014 query SQL.<\/li>\n<li><code>variable<\/code> \u2014 nome della variabile Python in cui verranno registrati i dati.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> o Pandas <code>dataframe<\/code>.<\/li>\n<li><code>namespace<\/code> \u2014 area in cui verr\u00e0 eseguita la query.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeglobal\">ExecuteGlobal<\/h3>\n<p><\/p>\n<p><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 trasferimento di un globale in Python.<\/p>\n<p><\/p>\n<p>Argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>global<\/code> \u2014 nome del globale senza <code>^<\/code><\/li>\n<li><code>variable<\/code> \u2014 nome della variabile Python in cui verranno registrati i dati.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> o Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 primo sottoscrittore del globale. Obbligatorio <code>%Integer<\/code>.<\/li>\n<li><code>end<\/code> \u2014 ultimo sottoscrittore del globale. Obbligatorio <code>%Integer<\/code>.<\/li>\n<li><code>mask<\/code> \u2014 maschera dei valori del globale. La maschera pu\u00f2 essere pi\u00f9 corta del numero di campi nel globale (in questo caso i campi finali verranno saltati). Come formattare la maschera:\n<ul>\n<li><code>+<\/code> trasmettere il valore cos\u00ec com'\u00e8.<\/li>\n<li><code>-<\/code> saltare il valore.<\/li>\n<li><code>b<\/code> \u2014 Tipo logico (<code>0<\/code> \u2014 <code>Falso<\/code>, tutto il resto \u2014 <code>True<\/code>).<\/li>\n<li><code>d<\/code> \u2014 Data (da $horolog, su Windows dal 1970, su Linux dal 1900).<\/li>\n<li><code>t<\/code> \u2014 Orario ($horolog, secondi dopo la mezzanotte).<\/li>\n<li><code>m<\/code> \u2014 Timestamp (formato YEAR-MONTH-DAY HOUR:MINUTE:SECOND).<\/li>\n<\/ul>\n<\/li>\n<li><code>etichette<\/code> \u2014 %List dei nomi delle colonne. Il primo elemento \u00e8 il nome del sottoscrittore.<\/li>\n<li><code>namespace<\/code> \u2014 area in cui verr\u00e0 eseguita la query.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeclass\">ExecuteClass<\/h3>\n<p><\/p>\n<p>Wrapper sopra <code>ExecuteGlobal<\/code>. Sulla base della definizione della classe prepara la chiamata <code>ExecuteGlobal<\/code> e la esegue.<\/p>\n<p><\/p>\n<p><code>ExecuteClass(class, variabile, tipo, start, end, properties, namespace)<\/code> \u2014 passaggio dei dati della classe in Python.<\/p>\n<p><\/p>\n<p>Argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>class<\/code> \u2014 nome della classe<\/li>\n<li><code>variable<\/code> \u2014 nome della variabile Python in cui verranno registrati i dati.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> o Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 Id iniziale.<\/li>\n<li><code>end<\/code> \u2014 Id finale<\/li>\n<li><code>properties<\/code> \u2014 elenco (separatore \u2014 virgola) delle propriet\u00e0 della classe da caricare nel set di dati. Sono supportate le maschere <code>*<\/code> e <code>?<\/code>. Di default \u2014 <code>*<\/code> (tutte le propriet\u00e0). La propriet\u00e0 <code>%%CLASSNAME<\/code> viene ignorata.<\/li>\n<li><code>namespace<\/code> \u2014 area in cui verr\u00e0 eseguita la query.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tutte le propriet\u00e0 vengono passate cos\u00ec come sono, tranne le propriet\u00e0 di tipo <code>%Date<\/code>, <code>%Ora<\/code>, <code>%Booleano<\/code> e <code>%Timestamp<\/code> \u2014 vengono convertiti nei corrispondenti tipi Python.<\/p>\n<p><\/p>\n<h3 id=\"executetable\">ExecuteTable<\/h3>\n<p><\/p>\n<p>Wrapper sopra <code>ExecuteClass<\/code>. Trasmette il nome della tabella nel nome della classe e la chiama <code>ExecuteClass<\/code>. Firma:<\/p>\n<p><\/p>\n<p><code>ExecuteTable(table, variabile, tipo, start, end, properties, namespace)<\/code> \u2014 passaggio dei dati della tabella in Python.<\/p>\n<p><\/p>\n<p>Argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>table<\/code> \u2014 nome della tabella.<br \/>\nTutti gli altri argomenti vengono passati cos\u00ec come sono a <code>ExecuteClass<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zametki\">Note<\/h3>\n<p><\/p>\n<ul>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> funzionano altrettanto velocemente.<\/li>\n<li><code>ExecuteGlobal<\/code> 20 volte pi\u00f9 veloce di <code>ExecuteQuery<\/code> su grandi set di dati (tempo di trasmissione superiore a &gt;0.01 secondi).<\/li>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> funzionano su globali con questa struttura: <code>^global(key) = $lb(prop1, prop2, ..., propN)<\/code> dove <code>key<\/code> \u2014 numero intero.<\/li>\n<li>Per <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> intervallo di valori supportato <code>%Date<\/code> corrisponde all'intervallo <code>mktime<\/code> e dipende dal sistema operativo (<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/cpp\/c-runtime-library\/reference\/mktime-mktime32-mktime64?view=vs-2019\">windows<\/a><\/noindex>: 1970-01-01, <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/3\/mktime\">linux<\/a><\/noindex> 1900-01-01, <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.apple.com\/library\/archive\/documentation\/System\/Conceptual\/ManPages_iPhoneOS\/man3\/mktime.3.html\">mac<\/a><\/noindex>). Utilizzare <code>%Timestamp<\/code>per passare dati al di fuori di questo intervallo o utilizzare un pandas dataframe poich\u00e9 questa restrizione \u00e8 valida solo per la lista.<\/li>\n<li>Per <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> e <code>ExecuteTable<\/code> tutti gli argomenti tranne la fonte dei dati (globale, classe o tabella) e la variabile sono facoltativi.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"primery\">Esempi<\/h2>\n<p><\/p>\n<p>Classe di test <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/isc\/py\/test\/Person.cls\">isc.py.test.Person<\/a><\/noindex> contiene un metodo che dimostra tutte le modalit\u00e0 di trasferimento dei dati:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set global = &quot;isc.py.test.PersonD&quot;\nset class = &quot;isc.py.test.Person&quot;\nset table = &quot;isc_py_test.Person&quot;\nset query = &quot;SELECT * FROM isc_py_test.Person&quot;\n\n\/\/ \u041e\u0431\u0449\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b\nset variable = &quot;df&quot;\nset type = &quot;dataframe&quot;\nset start = 1\nset end = $g(^isc.py.test.PersonD, start)\n\n\/\/ \u0421\u043f\u043e\u0441\u043e\u0431 0: ExecuteGlobal \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)\n\n\/\/ \u0421\u043f\u043e\u0441\u043e\u0431 1: ExecuteGlobal \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438    \n\/\/ \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e\n\/\/ globalKey - \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0430\u0431\u0441\u0442\u043a\u0440\u0438\u043f\u0442\u0430 \nset labels = $lb(&quot;globalKey&quot;, &quot;Name&quot;, &quot;DOB&quot;, &quot;TS&quot;, &quot;RandomTime&quot;, &quot;AgeYears&quot;, &quot;AgeDecimal&quot;, &quot;AgeDouble&quot;, &quot;Bool&quot;)\n\n\/\/ mask \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430 1 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c labels \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e &quot;globalKey&quot; - \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0430\u0431\u0441\u043a\u0438\u043f\u0442\u0430\n\/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c %%CLASSNAME\nset mask = &quot;-+dmt+++b&quot;\n\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 1, type, start, end, mask, labels)\n\n\/\/ \u0421\u043f\u043e\u0441\u043e\u0431 2: ExecuteClass\nset sc = ##class(isc.py.Main).ExecuteClass(class, variable _ 2, type, start, end)\n\n\/\/ \u0421\u043f\u043e\u0441\u043e\u0431 3: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteTable(table, variable _ 3, type, start, end)\n\n\/\/ \u0421\u043f\u043e\u0441\u043e\u0431 4: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteQuery(query, variable _ 4, type)<\/code><\/pre>\n<p><\/p>\n<p>Chiama il metodo <code>do ##class(isc.py.test.Person).Test()<\/code> per vedere come funzionano tutti i metodi di trasferimento dei dati.<\/p>\n<p><\/p>\n<h2 id=\"vspomogatelnye-metody\">Metodi ausiliari<\/h2>\n<p><\/p>\n<ul>\n<li><code>GetVariableInfo(variable, serialization, .defined, .type, .length)<\/code> \u2014 ottenere informazioni sulla variabile: se \u00e8 definita, classe e lunghezza della serializzazione.<\/li>\n<li><code>GetVariableDefined(variable, .defined)<\/code> \u2014 \u00e8 stata definita la variabile.<\/li>\n<li><code>GetVariableType(variable, .type)<\/code> \u2014 ottenere la classe della variabile.<\/li>\n<li><code>GetStatus()<\/code> \u2014 ottenere e rimuovere l'ultima eccezione dal lato Python.<\/li>\n<li><code>GetModuleInfo(module, .imported, .alias)<\/code> \u2014 ottenere la variabile del modulo e lo stato di importazione.<\/li>\n<li><code>GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)<\/code> \u2014 ottenere informazioni sulla funzione.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"interoperabelnost\">Interoperabilit\u00e0<\/h1>\n<p><\/p>\n<p>Hai imparato a chiamare il Python Gateway dal terminale, ora iniziamo a utilizzarlo nella produzione. La base dell'interazione con Python in questo modo \u00e8 <code>isc.py.ens.Operation<\/code>. Ci permette di:<\/p>\n<p><\/p>\n<ul>\n<li>Eseguire codice Python<\/li>\n<li>Salvare\/Ripristinare il contesto Python<\/li>\n<li>Caricare e ottenere dati da Python<\/li>\n<\/ul>\n<p><\/p>\n<p>Fondamentalmente, un'operazione Python \u00e8 una wrapper su <code>isc.py.Main<\/code>. L'operazione <code>isc.py.ens.Operation<\/code> consente l'interazione con il processo Python dalle produzioni di InterSystems IRIS. Sono supportate cinque richieste:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.ExecutionRequest<\/code> per eseguire codice Python. Restituisce <code>isc.py.msg.ExecutionResponse<\/code> con il risultato dell'esecuzione e i valori delle variabili richieste.<\/li>\n<li><code>isc.py.msg.StreamExecutionRequest<\/code> per eseguire codice Python. Restituisce <code>isc.py.msg.StreamExecutionResponse<\/code> risultato dell'esecuzione e i valori delle variabili richieste. Simile <code>isc.py.msg.ExecutionRequest<\/code>, ma accetta e restituisce flussi anzich\u00e9 stringhe.<\/li>\n<li><code>isc.py.msg.QueryRequest<\/code> per restituire il risultato dell'esecuzione di una query SQL. Restituisce <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code>\/<code>isc.py.msg.ClassRequest<\/code>\/<code>isc.py.msg.TableRequest<\/code> per la trasmissione dei dati globali\/di classe\/di tabella. Restituisce <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.SaveRequest<\/code> per salvare il contesto Python. Restituisce <code>Ens.StringResponse<\/code> con l'identificativo del contesto.<\/li>\n<li>\n<p><code>isc.py.msg.RestoreRequest<\/code> per ripristinare il contesto Python.<\/p>\n<p><\/p>\n<p>Inoltre, <code>isc.py.ens.Operation<\/code> ha due impostazioni:<\/p>\n<p><\/p>\n<ul>\n<li><code>Inizializzatore<\/code> \u2014 selezione della classe che implementa l'interfaccia <code>isc.py.init.Abstract<\/code>. Pu\u00f2 essere utilizzato per caricare funzioni, moduli, classi, ecc. Viene eseguito una sola volta all'avvio del processo.<\/li>\n<li><code>PythonLib<\/code> \u2014 (solo per Linux) se vedere errori durante il caricamento, impostare il suo valore a <code>libpython3.6m.so<\/code> o anche al percorso completo della libreria Python. <\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sozdanie-biznes-processov\">Creazione di processi aziendali<\/h2>\n<p><\/p>\n<p>Sono disponibili due classi che semplificano lo sviluppo di processi aziendali:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.ens.ProcessUtils<\/code> permette di estrarre annotazioni dalle attivit\u00e0 con sostituzione di variabili.<\/li>\n<li><code>isc.py.util.BPEmulator<\/code> consente di testare facilmente i processi aziendali con Python. Pu\u00f2 eseguire un processo aziendale (parti in linguaggio Python) nel processo corrente.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"podstanovka-peremennyh\">Sostituzione di variabili<\/h2>\n<p><\/p>\n<p>Tutti i processi aziendali ereditati da <code>isc.py.ens.ProcessUtils<\/code>, possono utilizzare il metodo <code>GetAnnotation(name)<\/code> per ottenere il valore dell'annotazione dell'attivit\u00e0 in base al suo nome. L'annotazione dell'attivit\u00e0 pu\u00f2 contenere variabili che saranno calcolate sul lato di InterSystems IRIS prima di essere passate a Python. Ecco la sintassi per la sostituzione delle variabili:<\/p>\n<p><\/p>\n<ul>\n<li><code>${class:method:arg1:...:argN}<\/code> \u2014 chiamata del metodo<\/li>\n<li><code>#{expr}<\/code> \u2014 eseguire codice in ObjectScript.<\/li>\n<\/ul>\n<p><\/p>\n<p>Un esempio \u00e8 disponibile nel processo aziendale di test <code>isc.py.test.Process<\/code>, ad esempio, nell'attivit\u00e0 <code>Matrice di Correlazione: Grafico<\/code>: <code>f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')<\/code>. In questo esempio:<\/p>\n<p><\/p>\n<ul>\n<li><code>#{process.WorkDirectory}<\/code> restituisce la propriet\u00e0 WorkDirectory dell'oggetto <code>process<\/code>cio\u00e8, il processo aziendale corrente. <code>isc.py.test.Process<\/code> ${%PopulateUtils:Integer:1:100}<\/li>\n<li><code>${%PopulateUtils:Integer:1:100}<\/code> invoca il metodo <code>Intero<\/code> classe <code>%PopulateUtils<\/code>, passando gli argomenti <code>1<\/code> e <code>100<\/code>, restituendo un numero intero casuale nell'intervallo <code>1...100<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"testovyy-biznes-process\">Processo aziendale di test<\/h2>\n<p><\/p>\n<p>I dati di test e il processo aziendale di test sono disponibili di default come parte del gateway Python Gateway. Per utilizzarli:<\/p>\n<p><\/p>\n<ol>\n<li>Esegui nel terminale OS: <code>pip install pandas matplotlib seaborn<\/code>. <\/li>\n<li>Esegui nel terminale InterSystems IRIS: <code>do ##class(isc.py.test.CannibalizationData).Import()<\/code> per riempire i dati di test.<\/li>\n<li>Avvia la produzione <code>isc.py.test.Production<\/code>.<\/li>\n<li>Invia una richiesta di tipo <code>Ens.Request<\/code> in <code>isc.py.test.Process<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Vediamo come funziona tutto insieme. Apri <code>isc.py.test.Process<\/code> nell'editor BPL:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/6f83b22e0167e2699d285f3e32bfe373.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"ispolnenie-koda-1\">Esecuzione del codice<\/h3>\n<p><\/p>\n<p>La chiamata pi\u00f9 importante \u00e8 l'esecuzione del codice Python:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/dafa6b8c878ae937b194ff577b86dc89.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Richiesta utilizzata <code>isc.py.msg.ExecutionRequest<\/code>, ecco le sue propriet\u00e0:<\/p>\n<p><\/p>\n<ul>\n<li><code>Code<\/code> \u2014 codice Python.<\/li>\n<li><code>SeparateLines<\/code> \u2014 suddividere il codice in righe per l'esecuzione. <code>$c(10)<\/code> (<code>n<\/code>) viene utilizzato per separare le righe. Si prega di notare che NON \u00e8 consigliabile elaborare l'intero messaggio contemporaneamente, questa funzione \u00e8 destinata esclusivamente all'elaborazione <code>def<\/code> e simili espressioni multilinea. Per impostazione predefinita <code>0<\/code>.<\/li>\n<li><code>Variabili<\/code> \u2014 elenco di variabili separate da virgole che verranno incluse nella risposta.<\/li>\n<li><code>Serializzazione<\/code> \u2014 come serializzare le variabili che desideriamo restituire. Opzioni: <code>Str<\/code>, <code>Repr<\/code>, <code>JSON<\/code>, <code>Pickle<\/code> e <code>Dill<\/code>, per impostazione predefinita <code>Str<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nel nostro caso, impostiamo solo la propriet\u00e0 <code>Code<\/code>, in modo che tutte le altre propriet\u00e0 utilizzino i valori predefiniti. Lo impostiamo chiamando <code>process.GetAnnotation(&quot;Import pandas&quot;)<\/code>, che durante l'esecuzione restituisce l'annotazione dopo aver effettuato la sostituzione delle variabili. Infine, il codice <code>import pandas as pd<\/code> verr\u00e0 passato a Python. <code>GetAnnotation<\/code> pu\u00f2 essere utile per ottenere script Python multilinea, ma non ci sono restrizioni su questo modo di ottenere il codice. Puoi impostare la propriet\u00e0 <code>Code<\/code> in qualsiasi modo ti sia comodo.<\/p>\n<p><\/p>\n<h3 id=\"poluchenie-peremennyh\">Ottenere variabili<\/h3>\n<p><\/p>\n<p>Un'altra sfida interessante utilizzando <code>isc.py.msg.ExecutionRequest<\/code> \u2014 <code>Matrice di Correlazione: Tabellare<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/8824e49ecaa448551c830e9a90eb5781.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Calcola la Matrice di Correlazione sul lato Python ed estrae la variabile <code>corrmat<\/code> di nuovo in InterSystems IRIS in formato JSON, impostando le propriet\u00e0 della richiesta:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabili<\/code>: <code>&quot;corrmat&quot;<\/code><\/li>\n<li><code>Serializzazione<\/code>: <code>&quot;JSON&quot;<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Possiamo visualizzare i risultati in Visual Trace:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/713bcade8cb1018f2974cba2cab712b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se avessimo bisogno di questo valore nel BP, possiamo ottenerlo in questo modo: <code>callresponse.Variables.GetAt(&quot;corrmat&quot;)<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh-1\">Trasmissione dati<\/h3>\n<p><\/p>\n<p>Ora parliamo del trasferimento dei dati da InterSystems IRIS a Python; tutte le richieste di trasferimento dati implementano l'interfaccia <code>isc.py.msg.DataRequest<\/code>, che fornisce le seguenti propriet\u00e0:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabile<\/code> \u2014 variabile Python in cui vengono scritti i dati.<\/li>\n<li><code>Tipo<\/code> \u2014 tipo di variabile: <code>dataframe<\/code> (dataframe pandas) o <code>list<\/code>.<\/li>\n<li><code>Namespace<\/code> \u2014 ambito da cui otteniamo i dati. Il pacchetto <code>isc.py<\/code> deve essere accessibile in questo ambito. Questo pu\u00f2 essere un ambito senza supporto per le produzioni.<\/li>\n<\/ul>\n<p><\/p>\n<p>In base a questa interfaccia sono stati implementati 4 classi di richieste:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.QueryRequest<\/code> \u2014 impostare la propriet\u00e0 <code>Query<\/code> per trasmettere la query SQL.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code> \u2014 impostare la propriet\u00e0 <code>Classe<\/code> per trasmettere i dati della classe.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2014 impostare la propriet\u00e0 <code>Tabella<\/code> per trasmettere i dati della tabella.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code> \u2014 impostare la propriet\u00e0 <code>Globale<\/code> per trasmettere i dati globali.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nel processo di testing guarda l'attivit\u00e0 <code>RAW<\/code>, dove <code>isc.py.msg.QueryRequest<\/code> mostrato in azione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/f6a2a520594341b9d37110bcd24b1015.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"sohranenievosstanovlenie-python-konteksta\">Salvataggio\/ripristino del contesto Python<\/h3>\n<p><\/p>\n<p>Infine, possiamo salvare il contesto Python in InterSystems IRIS, per farlo invieremo <code>isc.py.msg.SaveRequest<\/code> con argomenti:<\/p>\n<p><\/p>\n<ul>\n<li><code>Mask<\/code> \u2014 Vengono salvate solo le variabili che soddisfano la maschera. Supportati <code>*<\/code> e <code>?<\/code>. Esempio: <code>&quot;Data*, Figure?&quot;<\/code>. Per impostazione predefinita <code>*<\/code>.<\/li>\n<li><code>MaxLength<\/code> \u2014 Lunghezza massima della variabile memorizzata. Se la serializzazione della variabile \u00e8 pi\u00f9 lunga, verr\u00e0 ignorata. Imposta 0 per ottenere variabili di qualsiasi lunghezza. Per impostazione predefinita <code>$$$MaxStringLength<\/code>.<\/li>\n<li><code>Name<\/code> \u2014 Nome del contesto (opzionale).<\/li>\n<li><code>Descrizione<\/code> \u2014 Descrizione del contesto (opzionale).<\/li>\n<\/ul>\n<p><\/p>\n<p>Restituisce <code>Ens.StringResponse<\/code> con <code>Id<\/code> del contesto salvato. Nel processo di test, controlla l'attivit\u00e0 <code>Salva contesto<\/code>.<\/p>\n<p><\/p>\n<p>Richiesta corrispondente <code>isc.py.msg.RestoreRequest<\/code> carica il contesto da InterSystems IRIS a Python:<\/p>\n<p><\/p>\n<ul>\n<li><code>ContextId<\/code> \u2014 identificatore del contesto.<\/li>\n<li><code>Pulisci<\/code> \u2014 pulire il contesto prima del ripristino.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"jupyter-notebook\">Jupyter Notebook<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter Notebook<\/a><\/noindex> \u2014 \u00e8 un'applicazione web open source che consente di creare notebook contenenti codice, visualizzazioni e testo e pubblicarli. Python Gateway consente di visualizzare e modificare i processi BPL come Jupyter Notebook. Si noti che attualmente viene utilizzato l'esecutore Python 3 standard.<\/p>\n<p><\/p>\n<p>Questa estensione presuppone che le annotazioni contengano codice Python e utilizzino i nomi delle attivit\u00e0 come intestazioni precedenti. Ora \u00e8 possibile sviluppare processi aziendali PythonGateway in Jupyter Notebook. Ecco cosa \u00e8 possibile: <\/p>\n<p><\/p>\n<ul>\n<li>Creare nuovi processi aziendali<\/li>\n<li>Eliminare processi aziendali<\/li>\n<li>Creare nuove attivit\u00e0<\/li>\n<li>Modificare attivit\u00e0<\/li>\n<li>Eliminare attivit\u00e0<\/li>\n<\/ul>\n<p><\/p>\n<p>Ecco <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/mZizgVtZ014\">video dimostrativo<\/a><\/noindex>. E alcuni screenshot:<\/p>\n<p><\/p>\n<h2 id=\"provodnik-processov\">Esplora processi<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/6da1aa0a026c34238c57f96e82742bb9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"redaktor-processa\">Editor di processi<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway in InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/651031fe9792cc1c5926aa386f4e37fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"ustanovka-1\">Installazione<\/h2>\n<p><\/p>\n<ol>\n<li>Avrai bisogno di InterSystems IRIS 2019.2+.<\/li>\n<li>Installa PythonGateway v0.8+ (richiesto solo <code>isc.py.util.Jupyter<\/code>, <code>isc.py.util.JupyterCheckpoints<\/code> e <code>isc.py.ens.ProcessUtils<\/code>).<\/li>\n<li>Aggiorna il codice ObjectScript dal repository.<\/li>\n<li>Esegui <code>do ##class(isc.py.util.Jupyter).Install()<\/code> e segui le istruzioni.<\/li>\n<\/ol>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/tree\/master\/jupyter\">Documentazione<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"vyvody\">Conclusioni<\/h1>\n<p><\/p>\n<p>MLToolkit \u00e8 un insieme di strumenti con l'obiettivo di integrare modelli e ambienti transazionali, consentendo di utilizzare facilmente i modelli costruiti direttamente nei tuoi processi aziendali. Python Gateway \u00e8 parte di MLToolkit e fornisce integrazione con il linguaggio Python, permettendo di orchestrare qualsiasi algoritmo di machine learning creato in Python (l'ambiente principale per molti Data Scientists) e di utilizzare numerose librerie pronte per la creazione rapida di soluzioni analitiche AI\/ML adattative e robotizzate sulla piattaforma InterSystems IRIS.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Link<\/h1>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/473452\/\">Articolo precedente<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/openexchange.intersystems.com\/package\/PythonGateway\">Python Gateway<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/openexchange.intersystems.com\/package\/Python-Gateway-Samples\">Esempi di Python Gateway<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/Convergent-Analytics\">Convergent-Analytics<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python 3.6.7 64 bit<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">Documentazione e corsi su Python<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"mltoolkit\">MLToolkit<\/h1>\n<p><\/p>\n<p>Il gruppo utenti MLToolkit \u00e8 un repository GitHub privato, creato come parte dell'organizzazione aziendale GitHub di InterSystems. \u00c8 rivolto a utenti esterni che installano, esplorano o utilizzano gi\u00e0 i componenti di MLToolkit, inclusa la Python Gateway. Nel gruppo sono disponibili diversi casi realizzati (con codice sorgente e dati di test) in ambiti come marketing, produzione, medicina e molti altri settori. Per unirti al gruppo utenti ML Toolkit, ti preghiamo di inviare un breve messaggio via email al seguente indirizzo: <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com?subject=MLToolkit%20user%20group&amp;body=Hello.%0A%0APlease%20add%20me%20to%20ML%20Toolkit%20user%20group%3A%0A%0A-%20GitHub%20username%3A%20%0A%0A-%20Name%3A%20%0A%0A-%20Company%3A%20%0A%0A-%20Position%3A%0A-%20Country%3A%20%0A%0A\">MLToolkit@intersystems.com<\/a><\/noindex> e indica nella tua email le seguenti informazioni:<\/p>\n<p><\/p>\n<ul>\n<li>Nome utente GitHub<\/li>\n<li>Organizzazione (dove lavori o studi)<\/li>\n<li>\u0414\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u044c (\u0432\u0430\u0448\u0430 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u0432\u0430\u0448\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0438\u043b\u0438 &quot;\u0421\u0442\u0443\u0434\u0435\u043d\u0442&quot;, \u0438\u043b\u0438 &quot;\u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439&quot;).<\/li>\n<li>Paese<\/li>\n<\/ul>\n<p><\/p>\n<p>A chi ha letto l'articolo e \u00e8 interessato alle potenzialit\u00e0 di InterSystems IRIS come piattaforma per lo sviluppo o l'hosting di meccanismi di intelligenza artificiale e apprendimento automatico, offriamo l'opportunit\u00e0 di discutere scenari potenzialmente rilevanti per la vostra azienda. Siamo pronti ad analizzare le esigenze della vostra azienda e a definire insieme un piano d'azione; l'indirizzo email del nostro gruppo di esperti AI\/ML \u00e8 <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com\">MLToolkit@intersystems.com<\/a><\/noindex>.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/486984\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Python (\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 Data Scientists), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0445, \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 AI\/ML-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 InterSystems IRIS. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":41222,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-41221","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Python (\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 Data Scientists), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0445, \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 AI\/ML-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 InterSystems IRIS. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Python Gateway \u0432 InterSystems IRIS | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Python (\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 Data Scientists), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0445, \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 AI\/ML-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 InterSystems IRIS. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-06T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-06T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Python Gateway in InterSystems IRIS | ProHoster","description":"Questo articolo \u00e8 dedicato a Python Gateway \u2014 un progetto della comunit\u00e0 open source per la piattaforma dati InterSystems IRIS. Questo progetto consente di orchestrare qualsiasi algoritmo di machine learning sviluppato in Python (l'ambiente principale per molti Data Scientists), sfruttando numerose librerie pronte all'uso per creare rapidamente soluzioni analitiche AI\/ML adattive e robotizzate sulla piattaforma InterSystems IRIS. In questo articolo mostrer\u00f2 come","canonical_url":"https:\/\/prohoster.info\/it\/blog\/python-gateway-v-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Python Gateway \u0432 InterSystems IRIS | ProHoster","og:description":"\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 Python Gateway \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Python (\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 Data Scientists), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0445, \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 AI\/ML-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 InterSystems IRIS. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a","og:url":"https:\/\/prohoster.info\/it\/blog\/python-gateway-v-intersystems-iris","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-06T17:42:46+00:00","article:modified_time":"2020-02-06T17:42:46+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"41221","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 00:21:33","updated":"2022-09-30 00:32:37"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/41221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=41221"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/41221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/41222"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=41221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=41221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=41221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}