{"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\/ro\/blog\/python-gateway-v-intersystems-iris","title":{"rendered":"Python Gateway \u00een InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Acest articol este dedicat Python Gateway \u2014 un proiect comunitar cu surs\u0103 deschis\u0103 pentru platforma de date InterSystems IRIS. Acest proiect permite orchestrarea oric\u0103ror algoritmi de \u00eenv\u0103\u021bare automat\u0103, crea\u021bi \u00een limbajul Python (mediul principal pentru mul\u021bi Data Scientists), folosind numeroase biblioteci gata f\u0103cute pentru a crea rapid solu\u021bii analitice AI\/ML adaptabile \u0219i roboticizate pe platforma InterSystems IRIS. \u00cen acest articol, voi ar\u0103ta cum InterSystems IRIS poate orchestra procese \u00een limbajul Python, realiz\u00e2nd eficient transferul bidirec\u021bional de date \u0219i cre\u00e2nd procese de afaceri inteligente.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"plan\">Plan<\/h1>\n<p><\/p>\n<ol>\n<li>Introducere.<\/li>\n<li>Unelte.<\/li>\n<li>Instalare.<\/li>\n<li>API.<\/li>\n<li>Interoperabilitate.<\/li>\n<li>Jupyter Notebook.<\/li>\n<li>Concluzii.<\/li>\n<li>Linkuri.<\/li>\n<li>MLToolkit.<\/li>\n<\/ol>\n<p><\/p>\n<h1 id=\"vvedenie\">Introducere<\/h1>\n<p><\/p>\n<p>Python este un limbaj de programare de nivel \u00eenalt, de uz general, concentrat pe cre\u0219terea productivit\u0103\u021bii dezvoltatorului \u0219i a lizibilit\u0103\u021bii codului. \u00cen aceast\u0103 serie de articole, voi discuta despre posibilit\u0103\u021bile de aplicare a limbajului Python pe platforma InterSystems IRIS, concentr\u00e2ndu-m\u0103 \u00een mod special pe utilizarea Python ca limbaj pentru crearea \u0219i aplicarea modelelor de \u00eenv\u0103\u021bare automat\u0103.<\/p>\n<p><\/p>\n<p>\u00cenv\u0103\u021barea automat\u0103 (ML) reprezint\u0103 o clas\u0103 de metode de inteligen\u021b\u0103 artificial\u0103, caracterizat\u0103 prin faptul c\u0103 nu rezolv\u0103 direct o problem\u0103, ci \u00eenva\u021b\u0103 \u00een procesul de rezolvare a unui num\u0103r mare de probleme similare. <\/p>\n<p><\/p>\n<p>Algoritmii \u0219i modelele de \u00eenv\u0103\u021bare automat\u0103 devin din ce \u00een ce mai r\u0103sp\u00e2ndi\u021bi. Exist\u0103 multe motive pentru aceasta, dar totul se rezum\u0103 la disponibilitate, simplificare \u0219i realizarea de rezultate practice. Este clusterizarea sau chiar modelarea prin re\u021bele neuronale o nou\u0103 tehnologie? <\/p>\n<p><\/p>\n<p>Desigur c\u0103 nu, dar \u00een prezent nu mai este necesar s\u0103 scrii sute de mii de linii de cod pentru a rula un model, iar costurile de creare \u0219i aplicare a modelelor devin din ce \u00een ce mai mici.<\/p>\n<p><\/p>\n<p>Instrumentele evolueaz\u0103 \u2014 \u00een timp ce nu avem instrumente AI\/ML complet orientate pe GUI, progresul pe care l-am observat \u00een multe alte clase de sisteme informa\u021bionale, de exemplu, BI (de la scrierea codului p\u00e2n\u0103 la utilizarea de cadre \u0219i solu\u021bii configurabile orientate pe GUI), se observ\u0103 \u0219i \u00een instrumentele pentru crearea AI\/ML. Am dep\u0103\u0219it deja etapa de scriere a codului \u0219i ast\u0103zi folosim cadre pentru construc\u021bia \u0219i instruirea modelelor.<\/p>\n<p><\/p>\n<p>Alte \u00eembun\u0103t\u0103\u021biri, cum ar fi posibilitatea de a distribui un model pre-antrenat, astfel \u00eenc\u00e2t utilizatorul final s\u0103 trebuiasc\u0103 doar s\u0103 finalizeze antrenarea modelului pe datele sale specifice, faciliteaz\u0103 de asemenea \u00eenceperea aplic\u0103rii \u00eenv\u0103\u021b\u0103rii automate. Aceste progrese simplific\u0103 considerabil \u00eenv\u0103\u021barea \u00eenv\u0103\u021b\u0103rii automate at\u00e2t pentru speciali\u0219ti, c\u00e2t \u0219i pentru companii \u00een ansamblu.<\/p>\n<p><\/p>\n<p>Pe de alt\u0103 parte, colect\u0103m din ce \u00een ce mai multe date. Datorit\u0103 unei platforme de date unificate, cum ar fi InterSystems IRIS, toate aceste informa\u021bii pot fi preg\u0103tite imediat \u0219i utilizate ca date de baz\u0103 pentru modelele de \u00eenv\u0103\u021bare automat\u0103.<\/p>\n<p><\/p>\n<p>Odat\u0103 cu trecerea c\u0103tre cloud, lansarea proiectelor AI\/ML devine mai u\u0219oar\u0103 ca niciodat\u0103. Putem consuma doar resursele de care avem nevoie. Mai mult, datorit\u0103 paraleliz\u0103rii oferite de platformele cloud, putem economisi timpul consumat.<\/p>\n<p><\/p>\n<p>Dar ce zici de rezultate? Aici lucrurile devin mai complicate. Exist\u0103 o mul\u021bime de instrumente pentru construirea modelelor, despre care voi vorbi mai departe. A construi un model bun nu este u\u0219or, dar ce urmeaz\u0103? Ob\u021binerea de profit din utilizarea modelului de c\u0103tre afacere este, de asemenea, o sarcin\u0103 complicat\u0103. R\u0103d\u0103cina problemei const\u0103 \u00een separarea \u00eenc\u0103rc\u0103rilor analitice \u0219i tranzac\u021bionale, precum \u0219i a modelelor de date. Atunci c\u00e2nd antren\u0103m un model, de obicei o facem pe date istorice. Dar locul pentru modelul construit este \u00een procesarea tranzac\u021bional\u0103 a datelor. Ce folos are cel mai bun model de detectare a tranzac\u021biilor frauduloase, dac\u0103 \u00eel execut\u0103m o dat\u0103 pe zi? Fraudatorii au plecat demult cu banii. Trebuie s\u0103 antren\u0103m modelul pe datele istorice, dar trebuie de asemenea s\u0103 \u00eel aplic\u0103m \u00een timp real pe datele noi care sosesc, astfel \u00eenc\u00e2t procesele noastre de afaceri s\u0103 poat\u0103 ac\u021biona \u00een conformitate cu prognozele f\u0103cute de model.<\/p>\n<p><\/p>\n<p>ML Toolkit este un set de instrumente, al c\u0103rui scop este chiar acesta: integreaz\u0103 modelele \u0219i mediul tranzac\u021bional, astfel \u00eenc\u00e2t modelele construite s\u0103 poat\u0103 fi utilizate cu u\u0219urin\u021b\u0103 direct \u00een procesele dumneavoastr\u0103 de afaceri. Python Gateway este parte a ML Toolkit \u0219i asigur\u0103 integrarea cu limbajul Python (similar cum R Gateway, fiind parte a ML Toolkit, asigur\u0103 integrarea cu limbajul R).<\/p>\n<p><\/p>\n<h1 id=\"instrumentariy\">Instrumentar<\/h1>\n<p><\/p>\n<p>\u00cenainte de a continua, a\u0219 dori s\u0103 descriu c\u00e2teva instrumente \u0219i biblioteci pentru Python pe care le vom folosi mai t\u00e2rziu.<\/p>\n<p><\/p>\n<h2 id=\"tehnologii\">Tehnologii<\/h2>\n<p><\/p>\n<ul>\n<li>Python este un limbaj de programare interpretat, de \u00eenalt nivel, general. Principalul avantaj al limbajului este biblioteca sa vast\u0103 de biblioteci matematice, de \u00eenv\u0103\u021bare automat\u0103 \u0219i inteligen\u021b\u0103 artificial\u0103. La fel ca ObjectScript, este un limbaj orientat pe obiect, dar totul este definit dinamic, nu static. De asemenea, totul este un obiect. Articolele ulterioare presupun o familiarizare superficial\u0103 cu limbajul. Dac\u0103 dori\u021bi s\u0103 \u00eencepe\u021bi s\u0103 \u00eenv\u0103\u021ba\u021bi, v\u0103 recomand s\u0103 \u00eencepe\u021bi cu <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">documentation<\/a><\/noindex>.<\/li>\n<li>Pentru exerci\u021biile noastre viitoare, instala\u021bi <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: Eu folosesc <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a><\/noindex>, dar \u00een general exist\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/realpython.com\/python-ides-code-editors-guide\/\">multe<\/a><\/noindex>. Dac\u0103 folosi\u021bi Atelier, exist\u0103 un plugin Eclipse pentru dezvoltatorii Python. Dac\u0103 folosi\u021bi VS Code, exist\u0103 o extensie pentru Python. <\/li>\n<li>Notebook: \u00een loc de IDE, pute\u021bi scrie \u0219i \u00eemp\u0103rt\u0103\u0219i scripturile dvs. \u00een notebook-uri online. Cel mai popular dintre acestea este <noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"biblioteki\">Biblioteci<\/h2>\n<p><\/p>\n<p>Iat\u0103 o list\u0103 (incomplet\u0103) de biblioteci pentru \u00eenv\u0103\u021barea automat\u0103:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.numpy.org\/\">Numpy<\/a><\/noindex> \u2014 pachet fundamental pentru calcule precise.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pandas.pydata.org\/\">Pandas<\/a><\/noindex> \u2014 structuri de date foarte performante \u0219i instrumente de analiz\u0103 a datelor.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a><\/noindex> \u2014 pentru crearea de grafice.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a><\/noindex> \u2014 vizualizarea datelor, bazat\u0103 pe matplotlib.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/scikit-learn.org\/stable\/\">Sklearn<\/a><\/noindex> \u2014 metode de \u00eenv\u0103\u021bare automat\u0103.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/index.html\">XGBoost<\/a><\/noindex> \u2014 algoritmi de \u00eenv\u0103\u021bare automat\u0103 \u00een cadrul metodologiei de \u00eembun\u0103t\u0103\u021bire gradientic\u0103 (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 re\u021bele neuronale.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a><\/noindex> \u2014 platform\u0103 pentru crearea de modele de \u00eenv\u0103\u021bare automat\u0103.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">PyTorch<\/a><\/noindex> \u2014 platform\u0103 pentru crearea de modele de \u00eenv\u0103\u021bare automat\u0103, orientat\u0103 pe Python.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nyoka-pmml\/nyoka\">Nyoka<\/a><\/noindex> \u2014 PMML din diferite modele.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tehnologiile AI\/ML permit \u00eembun\u0103t\u0103\u021birea eficien\u021bei \u0219i adaptabilit\u0103\u021bii afacerilor. Mai mult, aceste tehnologii devin mai u\u0219or de dezvoltat \u0219i implementat. \u00cencepe\u021bi s\u0103 explora\u021bi tehnologiile AI\/ML \u0219i modul \u00een care pot ajuta organiza\u021bia dvs. s\u0103 creasc\u0103.<\/p>\n<p><\/p>\n<h1 id=\"ustanovka\">Instalare<\/h1>\n<p><\/p>\n<p>Exist\u0103 mai multe modalit\u0103\u021bi de a instala \u0219i utiliza Python Gateway:<\/p>\n<p><\/p>\n<ul>\n<li>sistemul de operare\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>Folosi\u021bi o imagine din DockerHub<\/li>\n<li>Creeaz\u0103-\u021bi propria imagine<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Indiferent de metoda de instalare, ve\u021bi avea nevoie de codul surs\u0103. Singurul loc de unde pute\u021bi desc\u0103rca codul este <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">pagina de lansare<\/a><\/noindex>. Aceasta con\u021bine lans\u0103ri stabile testate, doar lua\u021bi ultima. \u00cen prezent, aceasta este 0.8, dar \u00een timp vor ap\u0103rea altele noi. Nu clona\u021bi\/desc\u0103rca\u021bi repository-ul, desc\u0103rca\u021bi ultima versiune.<\/p>\n<p><\/p>\n<h2 id=\"os\">sistemul de operare<\/h2>\n<p><\/p>\n<p>Dac\u0103 instala\u021bi Python Gateway \u00een sistemul de operare, mai \u00eent\u00e2i (indiferent de sistemul de operare) trebuie s\u0103 instala\u021bi Python. Pentru aceasta:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Instala\u021bi Python 3.6.7 64 bit<\/a><\/noindex>. Se recomand\u0103 instalarea Python \u00een directorul implicit.<\/li>\n<li>Instala\u021bi modulul <code>dill<\/code>: <code>pip install dill<\/code>.<\/li>\n<li>Desc\u0103rca\u021bi codul ObjectScript (adic\u0103. <code>do $system.OBJ.ImportDir(\"C:InterSystemsReposPythoniscpy\", \"*.cls\", \"c\", , 1)<\/code>) \u00een orice spa\u021biu cu produse. \u00cen cazul \u00een care dori\u021bi ca un spa\u021biu existent s\u0103 sus\u021bin\u0103 produsele, executa\u021bi: <code>write ##class(%EnsembleMgr).EnableNamespace($Namespace, 1)<\/code>.<\/li>\n<li>Plasa\u021bi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">callout DLL\/SO\/DYLIB<\/a><\/noindex> \u00een folderul <code>bin<\/code> al instan\u021bei dumneavoastr\u0103 InterSystems IRIS. Fi\u0219ierul bibliotecii trebuie s\u0103 fie accesibil pe calea returnat\u0103 de <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>Asigura\u021bi-v\u0103 c\u0103 variabila de mediu <code>PYTHONHOME<\/code> indicat\u0103 c\u0103tre Python 3.6.7.<\/li>\n<li>Asigura\u021bi-v\u0103 c\u0103 variabila de mediu a sistemului <code>PATH<\/code> con\u021bine variabila <code>PYTHONHOME<\/code> (sau directorul la care se refer\u0103).<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"linux-debianubuntu\">Linux (Debian\/Ubuntu)<\/h3>\n<p><\/p>\n<ol>\n<li>Verifica\u021bi c\u0103 variabila de mediu <code>PATH<\/code> con\u021bine <code>\/usr\/lib<\/code> \u0219i <code>\/usr\/lib\/x86_64-linux-gnu<\/code>. Folosi\u021bi fi\u0219ierul <code>\/etc\/environment<\/code> pentru a seta variabilele de mediu.<\/li>\n<li>\u00cen cazul erorilor <code>undefined symbol: _Py_TrueStruct<\/code> seta\u021bi configura\u021bia <code>PythonLib<\/code>. De asemenea, \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme<\/a><\/noindex> exist\u0103 o sec\u021biune de depanare.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"mac\">Mac<\/h3>\n<p><\/p>\n<ol>\n<li>\u00cen prezent, este acceptat doar Python 3.6.7 de la <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python.org<\/a><\/noindex>. Verifica\u021bi variabila <code>PATH<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Dac\u0103 a\u021bi modificat variabilele de mediu, reporni\u021bi produsul dumneavoastr\u0103 InterSystems.<\/p>\n<p><\/p>\n<h2 id=\"docker\">Docker<\/h2>\n<p><\/p>\n<p>Utilizarea containerelor are mai multe avantaje: <\/p>\n<p><\/p>\n<ul>\n<li>Portabilitate<\/li>\n<li>Eficien\u021b\u0103<\/li>\n<li>Izolare<\/li>\n<li>U\u0219urin\u021b\u0103<\/li>\n<li>Imutabilitate<\/li>\n<\/ul>\n<p><\/p>\n<p>Consulta\u021bi aceast\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/community.intersystems.com\/post\/continuous-delivery-your-intersystems-solution-using-gitlab-part-v-why-containers\">serie de articole<\/a><\/noindex> pentru informa\u021bii mai detaliate despre utilizarea Docker cu produsele InterSystems. <\/p>\n<p><\/p>\n<p>Toate versiunile Python Gateway sunt \u00een prezent bazate pe containere <code>2019.4<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"gotovyy-obraz\">Imaginea gata<\/h3>\n<p><\/p>\n<p>Executa\u021bi: <code>docker run -d -p 52773:52773 --name irispy intersystemscommunity\/irispy-community:latest<\/code>, pentru a desc\u0103rca \u0219i rula Python Gateway cu InterSystems IRIS Community Edition. Acesta este tot.<\/p>\n<p><\/p>\n<h3 id=\"sozdayte-svoy-sobstvennyy-obraz\">Creeaz\u0103-\u021bi propria imagine<\/h3>\n<p><\/p>\n<p>Pentru a construi imaginea Docker, executa\u021bi \u00een r\u0103d\u0103cina repozitorului: <code>docker build --force-rm --tag intersystemscommunity\/irispy:latest .<\/code>.<br \/>\n\u00cen mod implicit, imaginea este construit\u0103 pe baza imaginii <code>store\/intersystems\/iris-community:2019.4.0.383.0<\/code>, totu\u0219i, pute\u021bi modifica asta, set\u00e2nd variabila <code>IMAGE<\/code>.<br \/>\nPentru a construi din InterSystems IRIS, executa\u021bi: `docker build --build-arg IMAGE=store\/intersystems\/iris:2019.4.0.383.0 --force-rm --tag intersystemscommunity\/irispy:latest &lt;.<\/p>\n<p><\/p>\n<p>Dup\u0103 aceea, pute\u021bi rula imaginea 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>Dac\u0103 utiliza\u021bi o imagine bazat\u0103 pe InterSystems IRIS Community Edition, nu trebuie s\u0103 specifica\u021bi cheia.<\/p>\n<p><\/p>\n<h3 id=\"kommentarii\">Comentarii<\/h3>\n<p><\/p>\n<ul>\n<li>Procesul de testare <code>isc.py.test.Process<\/code> salveaz\u0103 o serie de imagini \u00eentr-un director temporar. Este posibil s\u0103 dori\u021bi s\u0103 schimba\u021bi acest drum la un director montat. Pentru aceasta, edita\u021bi setarea <code>WorkingDir<\/code> specific\u00e2nd directorul montat.<\/li>\n<li>Pentru a accesa terminalul, executa\u021bi: <code>docker exec -it irispy sh<\/code>.<\/li>\n<li>Accesa\u021bi Portalul de Administrare a Sistemului cu loginul <code>SuperUser<\/code>\/<code>SYS<\/code>.<\/li>\n<li>Pentru a opri containerul, executa\u021bi: <code>docker stop irispy &amp;&amp; docker rm --force irispy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"proverka-ustanovki\">Verificarea instal\u0103rii<\/h2>\n<p><\/p>\n<p>Dup\u0103 ce a\u021bi instalat Python Gateway, este bine s\u0103 verifica\u021bi c\u0103 func\u021bioneaz\u0103. Executa\u021bi acest cod \u00een terminalul 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(\"x='HELLO'\", \"x\", , .var).\nwrite var<\/code><\/pre>\n<p><\/p>\n<p>Ca rezultat ar trebui s\u0103 fie afi\u0219at <code>HELLO<\/code> \u2014 valoarea variabilei Python <code>x<\/code>. Dac\u0103 statusul returnat <code>sc<\/code> este o eroare sau <code>var<\/code> gol, verifica\u021bi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme \u2014 sec\u021biunea de depanare<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"api\">API<\/h1>\n<p><\/p>\n<p>Python Gateway a fost instalat \u0219i a\u021bi verificat c\u0103 func\u021bioneaz\u0103. Este vremea s\u0103 \u00eencepe\u021bi s\u0103 \u00eel folosi\u021bi!<br \/>\nInterfa\u021ba principal\u0103 pentru Python este <code>isc.py.Main<\/code>. Acesta ofer\u0103 urm\u0103toarele grupuri de metode (toate returneaz\u0103 <code>%Status<\/code>):<\/p>\n<p><\/p>\n<ul>\n<li>Executarea codului<\/li>\n<li>Transferul de date<\/li>\n<li>Metode auxiliare<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"ispolnenie-koda\">Executarea codului<\/h2>\n<p><\/p>\n<p>Aceste metode permit executarea de cod Python arbitrar.<\/p>\n<p><\/p>\n<h3 id=\"simplestring\">SimpleString<\/h3>\n<p><\/p>\n<p><code>SimpleString<\/code> \u2014 este metoda principal\u0103. Ea accept\u0103 4 argumente op\u021bionale:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 \u0219ir de cod de executat. Simbolul de transfer pe linie: <code>$c(10)<\/code>.<\/li>\n<li><code>returnVariable<\/code> \u2014 numele variabilei de returnat.<\/li>\n<li><code>serialization<\/code> \u2014 cum s\u0103 serializ\u0103m. <code>returnVariable<\/code>. 0 \u2014 string (implicit), 1 \u2014 repr.<\/li>\n<li><code>rezultat<\/code> \u2014 ByRef referin\u021b\u0103 la variabila \u00een care se scrie valoarea <code>returnVariable<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Mai sus am executat:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).SimpleString(\"x='HELLO'\", \"x\", , .var).<\/code><\/pre>\n<p><\/p>\n<p>\u00cen acest exemplu, atribuim variabilei Python <code>x<\/code> valoarea <code>Hello<\/code> \u0219i dorim s\u0103 return\u0103m valoarea variabilei Python <code>x<\/code> \u00een variabila ObjectScript <code>var<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"executecode\">ExecuteCode<\/h3>\n<p><\/p>\n<p>ExecuteCode este o alternativ\u0103 mai sigur\u0103 \u0219i mai pu\u021bin restrictiv\u0103 <code>SimpleString<\/code>.<br \/>\n\u0218irurile \u00een platforma InterSystems IRIS sunt limitate la 3 641 144 de caractere, iar dac\u0103 dori\u021bi s\u0103 executa\u021bi un fragment de cod mai lung, trebuie s\u0103 folosi\u021bi fluxuri.<br \/>\nSe accept\u0103 dou\u0103 argumente:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 \u0219ir sau flux de cod Python de executat.<\/li>\n<li><code>variable<\/code> \u2014 (op\u021bional) atribuie rezultatul execut\u0103rii <code>code<\/code> acelei variabile Python.<\/li>\n<\/ul>\n<p><\/p>\n<p>Exemplu de utilizare:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).ExecuteCode(\"2*3\", \"y\").<\/code><\/pre>\n<p><\/p>\n<p>\u00cen acest exemplu, \u00eenmul\u021bim 2 cu 3 \u0219i salv\u0103m rezultatul \u00een variabila Python <code>Stabili\u021bi o parol\u0103 \u0219i p\u0103stra\u021bi-o \u00een siguran\u021b\u0103!<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"peredacha-dannyh\">Transferul de date<\/h2>\n<p><\/p>\n<p>Transfera\u021bi date \u00eentre Python \u0219iapoi \u00eenapoi.<\/p>\n<p><\/p>\n<h3 id=\"python---intersystems-iris\">Python -&gt; InterSystems IRIS<\/h3>\n<p><\/p>\n<p>Exist\u0103 4 modalit\u0103\u021bi de a ob\u021bine valoarea variabilei Python \u00een InterSystems IRIS, \u00een func\u021bie de serializarea de care ave\u021bi nevoie:<\/p>\n<p><\/p>\n<ul>\n<li><code>String<\/code> pentru tipuri simple de date \u0219i depanare.<\/li>\n<li><code>Repr<\/code> pentru stocarea obiectelor simple \u0219i depanare.<\/li>\n<li><code>JSON<\/code> pentru manipularea u\u0219oar\u0103 a datelor \u00een InterSystems IRIS.<\/li>\n<li><code>Pickle<\/code> pentru salvarea obiectelor.<\/li>\n<\/ul>\n<p><\/p>\n<p>Aceste metode permit ob\u021binerea variabilelor din Python sub form\u0103 de \u0219iruri sau fluxuri.<\/p>\n<p><\/p>\n<ul>\n<li><code>GetVariable(variable, serialization, .stream, useString)<\/code> \u2014 ob\u021bine <code>serialization<\/code> variabila <code>variable<\/code> \u00een <code>stream<\/code>. Dac\u0103 <code>useString<\/code> este egal cu 1 \u0219i serializarea este plasat\u0103 \u00eentr-un \u0219ir, se returneaz\u0103 un \u0219ir \u0219i nu un flux.<\/li>\n<li><code>GetVariableJson(variable, .stream, useString)<\/code> \u2014 ob\u021bine serializarea JSON a variabilei.<\/li>\n<li><code>GetVariablePickle(variable, .stream, useString, useDill)<\/code> \u2014 ob\u021bine serializarea Pickle (sau Dill) a variabilei.<\/li>\n<\/ul>\n<p><\/p>\n<p>S\u0103 \u00eencerc\u0103m s\u0103 ob\u021binem variabila noastr\u0103 <code>Stabili\u021bi o parol\u0103 \u0219i p\u0103stra\u021bi-o \u00een siguran\u021b\u0103!<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set sc = ##class(isc.py.Main).GetVariable(\"y\", , .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>\u00cenc\u0103rc\u0103m datele din InterSystems IRIS \u00een Python.<\/p>\n<p><\/p>\n<ul>\n<li><code>ExecuteQuery(query, variable, type, namespace)<\/code> \u2014 creeaz\u0103 un set de date (pandas <code>dataframe<\/code> sau <code>list<\/code>) dintr-o interogare SQL \u0219i \u00eel seteaz\u0103 \u00eentr-o variabil\u0103 Python <code>variable<\/code>. Pachetul <code>isc.py<\/code> trebuie s\u0103 fie disponibil \u00een domeniul <code>namespace<\/code> \u2014 acolo va fi executat\u0103 interogarea.<\/li>\n<li><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 \u00eencarc\u0103 date din global <code>global<\/code> de la subscript <code>start<\/code> la <code>end<\/code> \u00een Python ca variabil\u0103 de tip <code>type<\/code>: <code>list<\/code>, sau pandas <code>dataframe<\/code>. Descrierea argumentelor op\u021bionale <code>mask<\/code> \u0219i <code>labels<\/code> este disponibil\u0103 \u00een documenta\u021bia clasei \u0219i \u00een repository-ul <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Data Transfer docs<\/a><\/noindex>.<\/li>\n<li><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 \u00eencarc\u0103 date din clas\u0103 <code>class<\/code> de la id <code>start<\/code> la <code>end<\/code> \u00een Python ca variabil\u0103 de tip <code>type<\/code>: <code>list<\/code>, sau pandas <code>dataframe<\/code>. <code>properties<\/code> \u2014 list\u0103 (separator - virgul\u0103) de propriet\u0103\u021bi ale clasei care trebuie \u00eenc\u0103rcate \u00een setul de date. Se suport\u0103 m\u0103\u0219ti. <code>*<\/code> \u0219i <code>?<\/code>Prin default \u2014 <code>*<\/code> (toate propriet\u0103\u021bile). Proprietatea <code>%%CLASSNAME<\/code> este ignorat\u0103.<\/li>\n<li><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 \u00eencarc\u0103 date din tabel <code>table<\/code> de la id <code>start<\/code> la <code>end<\/code> \u00een Python.<\/li>\n<\/ul>\n<p><\/p>\n<p><code>ExecuteQuery<\/code> \u2014 este universal (orice interogare SQL corect\u0103 va fi transmis\u0103 \u00een Python). Totu\u0219i, <code>ExecuteGlobal<\/code> \u0219i wrapper-urile sale <code>ExecuteClass<\/code> \u0219i <code>ExecuteTable<\/code> func\u021bioneaz\u0103 cu o serie de restric\u021bii. Ele sunt mult mai rapide (de 3-5 ori mai rapide dec\u00e2t driver-ul ODBC \u0219i de 20 de ori mai rapide <code>ExecuteQuery<\/code>). Informa\u021bii suplimentare \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">Data Transfer docs<\/a><\/noindex>.<br \/>\nToate aceste metode suport\u0103 transmiterea datelor din orice domeniu. Pachetul <code>isc.py<\/code> trebuie s\u0103 fie disponibil \u00een domeniul \u021bint\u0103.<\/p>\n<p><\/p>\n<h3 id=\"executequery\">ExecuteQuery<\/h3>\n<p><\/p>\n<p><code>ExecuteQuery(request, variable, type, namespace)<\/code> \u2014 transmite rezultatele oric\u0103rei interog\u0103ri SQL corecte c\u0103tre Python. Aceasta este cea mai lent\u0103 metod\u0103 de transfer de date. Folosi\u021bi-o dac\u0103 <code>ExecuteGlobal<\/code> \u0219i wrapper-urile sale nu sunt disponibile.<\/p>\n<p><\/p>\n<p>Argumente:<\/p>\n<p><\/p>\n<ul>\n<li><code>query<\/code> \u2014 interogare SQL.<\/li>\n<li><code>variable<\/code> \u2014 numele variabilei Python \u00een care se scriu datele.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> sau Pandas <code>dataframe<\/code>.<\/li>\n<li><code>namespace<\/code> \u2014 domeniul \u00een care va fi executat\u0103 interogarea.<\/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 transferul globalului \u00een Python.<\/p>\n<p><\/p>\n<p>Argumente:<\/p>\n<p><\/p>\n<ul>\n<li><code>global<\/code> \u2014 numele globalului f\u0103r\u0103 <code>^<\/code><\/li>\n<li><code>variable<\/code> \u2014 numele variabilei Python \u00een care se scriu datele.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> sau Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 primul subscript al globalului. Este obligatoriu <code>%Integer<\/code>.<\/li>\n<li><code>end<\/code> \u2014 ultimul subscript al globalului. Este obligatoriu <code>%Integer<\/code>.<\/li>\n<li><code>mask<\/code> \u2014 masc\u0103 de valori pentru global. Masca poate fi mai scurt\u0103 dec\u00e2t num\u0103rul de c\u00e2mpuri \u00een global (\u00een acest caz, c\u00e2mpurile de la sf\u00e2r\u0219it vor fi omise). Cum se formateaz\u0103 masca:\n<ul>\n<li><code>+<\/code> transmite\u021bi valoarea a\u0219a cum este.<\/li>\n<li><code>-<\/code> omita\u021bi valoarea.<\/li>\n<li><code>b<\/code> \u2014 Tip logic (<code>0<\/code> \u2014 <code>False<\/code>, totul ce este altceva \u2014 <code>True<\/code>).<\/li>\n<li><code>d<\/code> \u2014 Dat\u0103 (din $horolog, pe Windows din 1970, pe Linux din 1900).<\/li>\n<li><code>t<\/code> \u2014 Timp ($horolog, secunde dup\u0103 miezul nop\u021bii).<\/li>\n<li><code>m<\/code> \u2014 Marcaj de timp (\u0219ir \u00een format AN- LUNA-ZI OR\u0102:MINUT:SECUND\u0102).<\/li>\n<\/ul>\n<\/li>\n<li><code>labels<\/code> \u2014 %List denumiri coloane. Primul element \u2014 denumirea subscriptului.<\/li>\n<li><code>namespace<\/code> \u2014 domeniul \u00een care va fi executat\u0103 interogarea.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeclass\">ExecuteClass<\/h3>\n<p><\/p>\n<p>\u00cempachetare peste <code>ExecuteGlobal<\/code>. Pe baza defini\u021biei clasei preg\u0103te\u0219te apelul <code>ExecuteGlobal<\/code> \u0219i \u00eel invoc\u0103.<\/p>\n<p><\/p>\n<p><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 transmiterea datelor clasei \u00een Python.<\/p>\n<p><\/p>\n<p>Argumente:<\/p>\n<p><\/p>\n<ul>\n<li><code>class<\/code> \u2014 numele clasei<\/li>\n<li><code>variable<\/code> \u2014 numele variabilei Python \u00een care se scriu datele.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> sau Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 ID de \u00eenceput.<\/li>\n<li><code>end<\/code> \u2014 ID final.<\/li>\n<li><code>properties<\/code> \u2014 list\u0103 (separator - virgul\u0103) de propriet\u0103\u021bi ale clasei care trebuie \u00eenc\u0103rcate \u00een setul de date. Se suport\u0103 m\u0103\u0219ti. <code>*<\/code> \u0219i <code>?<\/code>Prin default \u2014 <code>*<\/code> (toate propriet\u0103\u021bile). Proprietatea <code>%%CLASSNAME<\/code> este ignorat\u0103.<\/li>\n<li><code>namespace<\/code> \u2014 domeniul \u00een care va fi executat\u0103 interogarea.<\/li>\n<\/ul>\n<p><\/p>\n<p>Toate propriet\u0103\u021bile sunt transmise a\u0219a cum sunt, cu excep\u021bia propriet\u0103\u021bilor tipurilor <code>te<\/code>, <code>%Time<\/code>, <code>%Boolean<\/code> \u0219i <code>%TimeStamp<\/code> \u2014 acestea sunt convertite \u00een clase corespunz\u0103toare din Python.<\/p>\n<p><\/p>\n<h3 id=\"executetable\">ExecuteTable<\/h3>\n<p><\/p>\n<p>\u00cempachetare peste <code>ExecuteClass<\/code>. Transmite numele tabelului \u00een numele clasei \u0219i o invoc\u0103 <code>ExecuteClass<\/code>. Semn\u0103tur\u0103:<\/p>\n<p><\/p>\n<p><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 transmiterea datelor tabelului \u00een Python.<\/p>\n<p><\/p>\n<p>Argumente:<\/p>\n<p><\/p>\n<ul>\n<li><code>table<\/code> \u2014 numele tabelului.<br \/>\nToate celelalte argumente sunt transmise astfel cum sunt \u00een <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> \u0219i <code>ExecuteTable<\/code> func\u021bioneaz\u0103 la fel de repede.<\/li>\n<li><code>ExecuteGlobal<\/code> de 20 de ori mai repede dec\u00e2t <code>ExecuteQuery<\/code> pe seturi de date mari (timp de transmitere mai mare de &gt;0.01 secunde).<\/li>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> \u0219i <code>ExecuteTable<\/code> func\u021bioneaz\u0103 pe globaluri cu aceast\u0103 structur\u0103: <code>^global(key) = $lb(prop1, prop2, ..., propN)<\/code> unde <code>key<\/code> \u2014 num\u0103r \u00eentreg.<\/li>\n<li>Pentru <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> \u0219i <code>ExecuteTable<\/code> interval de valori suportat <code>te<\/code> corespunde intervalului <code>mktime<\/code> \u0219i depinde de OS (<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>). Folosi\u021bi <code>%TimeStamp<\/code>pentru a transmite date \u00een afara acestui interval sau utiliza\u021bi pandas dataframe, deoarece aceast\u0103 restric\u021bie este doar pentru list\u0103.<\/li>\n<li>Pentru <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> \u0219i <code>ExecuteTable<\/code> toate argumentele \u00een afar\u0103 de sursa de date (global, clas\u0103 sau tabel) \u0219i variabila sunt op\u021bionale.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"primery\">Exemple<\/h2>\n<p><\/p>\n<p>Clasa de 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> con\u021bine o metod\u0103 care demonstreaz\u0103 toate variantele de transmitere a datelor:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">set global = \"isc.py.test.PersonD\"\nset class = \"isc.py.test.Person\"\nset table = \"isc_py_test.Person\"\nset query = \"SELECT * FROM isc_py_test.Person\"\n\n\/\/ Argumente comune\nset variable = \"df\"\nset type = \"dataframe\"\nset start = 1\nset end = $g(^isc.py.test.PersonD, start)\n\n\/\/ Metod\u0103 0: ExecuteGlobal f\u0103r\u0103 argumente\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)\n\n\/\/ Metod\u0103 1: ExecuteGlobal cu argumente\n\/\/ C\u00e2nd se transmite global, numele c\u00e2mpurilor se stabilesc manual\n\/\/ globalKey - numele subscriptului \nset labels = $lb(\"globalKey\", \"Nume\", \"DOB\", \"TS\", \"RandomTime\", \"AgeYears\", \"AgeDecimal\", \"AgeDouble\", \"Bool\")\n\n\/\/ mask con\u021bine cu 1 element mai pu\u021bin dec\u00e2t labels pentru c\u0103 \"globalKey\" - numele subscriptului\n\/\/ S\u0103rim %%CLASSNAME\nset mask = \"-+dmt+++b\"\n\nset sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 1, type, start, end, mask, labels)\n\n\/\/ Metod\u0103 2: ExecuteClass\nset sc = ##class(isc.py.Main).ExecuteClass(class, variable _ 2, type, start, end)\n\n\/\/ Metod\u0103 3: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteTable(table, variable _ 3, type, start, end)\n\n\/\/ Metod\u0103 4: ExecuteTable\nset sc = ##class(isc.py.Main).ExecuteQuery(query, variable _ 4, type)<\/code><\/pre>\n<p><\/p>\n<p>Apela\u021bi metoda <code>do ##class(isc.py.test.Person).Test()<\/code> pentru a vedea cum func\u021bioneaz\u0103 toate metodele de transmitere a datelor.<\/p>\n<p><\/p>\n<h2 id=\"vspomogatelnye-metody\">Metode auxiliare<\/h2>\n<p><\/p>\n<ul>\n<li><code>GetVariableInfo(variable, serialization, .defined, .type, .length)<\/code> \u2014 ob\u021bine informa\u021bii despre variabil\u0103: dac\u0103 este definit\u0103, clasa \u0219i lungimea serializ\u0103rii.<\/li>\n<li><code>GetVariableDefined(variable, .defined)<\/code> \u2014 dac\u0103 variabila este definit\u0103.<\/li>\n<li><code>GetVariableType(variable, .type)<\/code> \u2014 ob\u021bine clasa variabilei.<\/li>\n<li><code>GetStatus()<\/code> \u2014 ob\u021bine \u0219i elimin\u0103 ultima excep\u021bie de pe partea Python.<\/li>\n<li><code>GetModuleInfo(module, .imported, .alias)<\/code> \u2014 ob\u021bine variabila modulului \u0219i statutul importului.<\/li>\n<li><code>GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)<\/code> \u2014 ob\u021bine informa\u021bii despre func\u021bie.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"interoperabelnost\">Interoperabilitate<\/h1>\n<p><\/p>\n<p>A\u021bi \u00eenv\u0103\u021bat cum s\u0103 apela\u021bi Python Gateway din terminal, acum vom \u00eencepe s\u0103-l folosim \u00een produc\u021bie. Baza interac\u021biunii cu Python \u00een acest mod este <code>isc.py.ens.Operation<\/code>. Acesta ne permite:<\/p>\n<p><\/p>\n<ul>\n<li>S\u0103 execut\u0103m cod Python<\/li>\n<li>S\u0103 salv\u0103m\/Restaur\u0103m contextul Python<\/li>\n<li>S\u0103 \u00eenc\u0103rc\u0103m \u0219i s\u0103 ob\u021binem date din Python<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00cen principiu, opera\u021bia Python este un wrapper peste <code>isc.py.Main<\/code>. Opera\u021bia <code>isc.py.ens.Operation<\/code> permite interac\u021biunea cu procesul Python din produsele InterSystems IRIS. Sunt suportate cinci cereri:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.ExecutionRequest<\/code> pentru a executa cod Python. Returneaz\u0103 <code>isc.py.msg.ExecutionResponse<\/code> cu rezultatul execu\u021biei \u0219i valorile variabilelor solicitate.<\/li>\n<li><code>isc.py.msg.StreamExecutionRequest<\/code> pentru a executa cod Python. Returneaz\u0103 <code>isc.py.msg.StreamExecutionResponse<\/code> rezultatul execu\u021biei \u0219i valorile variabilelor solicitate. Analog <code>isc.py.msg.ExecutionRequest<\/code>, dar prime\u0219te \u0219i returneaz\u0103 fluxuri \u00een loc de \u0219iruri.<\/li>\n<li><code>isc.py.msg.QueryRequest<\/code> pentru a transmite rezultatul execu\u021biei unei cereri SQL. Returneaz\u0103 <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> pentru transmiterea datelor globale\/clase\/tablouri. Returneaz\u0103 <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.SaveRequest<\/code> pentru salvarea contextului Python. Returneaz\u0103 <code>Ens.StringResponse<\/code> cu identificatorul contextului.<\/li>\n<li>\n<p><code>isc.py.msg.RestoreRequest<\/code> pentru restaurarea contextului Python.<\/p>\n<p><\/p>\n<p>\u00cen plus, <code>isc.py.ens.Operation<\/code> are dou\u0103 set\u0103ri:<\/p>\n<p><\/p>\n<ul>\n<li><code>Initializer<\/code> \u2014 alegerea clasei care implementeaz\u0103 interfa\u021ba <code>isc.py.init.Abstract<\/code>. Aceasta poate fi folosit\u0103 pentru a \u00eenc\u0103rca func\u021bii, module, clase etc. Ea se execut\u0103 o dat\u0103 la \u00eenceputul procesului.<\/li>\n<li><code>PythonLib<\/code> \u2014 (numai pentru Linux) dac\u0103 vezi erori la \u00eenc\u0103rcare, seteaz\u0103 valoarea acesteia la <code>libpython3.6m.so<\/code> sau chiar la calea complet\u0103 c\u0103tre biblioteca Python. <\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sozdanie-biznes-processov\">Crearea proceselor de afaceri<\/h2>\n<p><\/p>\n<p>Sunt disponibile dou\u0103 clase care faciliteaz\u0103 dezvoltarea proceselor de afaceri:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.ens.ProcessUtils<\/code> permite extragerea de anot\u0103ri din activit\u0103\u021bi cu substitu\u021bia variabilelor.<\/li>\n<li><code>isc.py.util.BPEmulator<\/code> permite testarea facil\u0103 a proceselor de afaceri cu Python. Poate executa un proces de afaceri (p\u0103r\u021bi \u00een limbajul Python) \u00een procesul actual.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"podstanovka-peremennyh\">Substitu\u021bia variabilelor<\/h2>\n<p><\/p>\n<p>Toate procesele de afaceri derivate de la <code>isc.py.ens.ProcessUtils<\/code>, pot folosi metoda <code>GetAnnotation(name)<\/code> pentru a ob\u021bine valoarea anot\u0103rii activit\u0103\u021bii dup\u0103 numele acesteia. Anotarea activit\u0103\u021bii poate con\u021bine variabile care vor fi calculate pe partea InterSystems IRIS \u00eenainte de a fi transmise \u00een Python. Iat\u0103 sintaxa substitu\u021biei variabilelor:<\/p>\n<p><\/p>\n<ul>\n<li><code>${class:method:arg1:...:argN}<\/code> \u2014 apelarea metodei<\/li>\n<li><code>#{expr}<\/code> \u2014 execut\u0103 cod \u00een limbajul ObjectScript.<\/li>\n<\/ul>\n<p><\/p>\n<p>Un exemplu este disponibil \u00een procesul de afaceri de testare <code>isc.py.test.Process<\/code>, de exemplu, \u00een activitatea <code>Correlation Matrix: Graph<\/code>: <code>f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')<\/code>. \u00cen acest exemplu:<\/p>\n<p><\/p>\n<ul>\n<li><code>#{process.WorkDirectory}<\/code> returneaz\u0103 proprietatea WorkDirectory a obiectului <code>process<\/code>, care este o instan\u021b\u0103 a clasei <code>isc.py.test.Process<\/code> adic\u0103 procesul de afaceri curent.<\/li>\n<li><code>${%PopulateUtils:Integer:1:100}<\/code> apeleaz\u0103 metoda <code>Integer<\/code> clasei <code>%PopulateUtils<\/code>, transmit\u00e2nd argumentele <code>1<\/code> \u0219i <code>100<\/code>, return\u00e2nd un num\u0103r \u00eentreg aleator \u00een intervalul <code>1...100<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"testovyy-biznes-process\">Proces de afaceri de testare<\/h2>\n<p><\/p>\n<p>Produse de testare \u0219i un proces de afaceri de testare sunt disponibile implicit ca parte a gateway-ului Python. Pentru a le utiliza:<\/p>\n<p><\/p>\n<ol>\n<li>\u00cen terminalul OS, execut\u0103: <code>pip install pandas matplotlib seaborn<\/code>. <\/li>\n<li>\u00cen terminalul InterSystems IRIS, execut\u0103: <code>do ##class(isc.py.test.CannibalizationData).Import()<\/code> pentru a completa datele de testare.<\/li>\n<li>Execut\u0103 produsul <code>isc.py.test.Production<\/code>.<\/li>\n<li>Trimite o cerere de tip <code>Ens.Request<\/code> \u00een <code>isc.py.test.Process<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>S\u0103 vedem cum func\u021bioneaz\u0103 toate acestea \u00eempreun\u0103. Deschide <code>isc.py.test.Process<\/code> \u00een editorul BPL:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway \u00een 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\">Executarea codului<\/h3>\n<p><\/p>\n<p>Cea mai important\u0103 apelare \u2014 executarea codului Python:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway \u00een InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/dafa6b8c878ae937b194ff577b86dc89.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Folosesc cererea <code>isc.py.msg.ExecutionRequest<\/code>, iat\u0103 propriet\u0103\u021bile sale:<\/p>\n<p><\/p>\n<ul>\n<li><code>Cod<\/code> \u2014 cod Python.<\/li>\n<li><code>SeparateLines<\/code> \u2014 s\u0103 fie sau nu codul separat pe linii pentru executare. <code>$c(10)<\/code> (<code>n<\/code>) este folosit pentru a separa liniile. Re\u021bine\u021bi c\u0103 NU este recomandat s\u0103 procesa\u021bi mesajul \u00een \u00eentregime, aceast\u0103 func\u021bie este destinat\u0103 doar pentru procesare <code>def<\/code> \u0219i astfel de expresii multiliniare. Implicit <code>0<\/code>.<\/li>\n<li><code>Variabile<\/code> \u2014 o list\u0103 separat\u0103 prin virgule de variabile care vor fi incluse \u00een r\u0103spuns.<\/li>\n<li><code>Serializare<\/code> \u2014 Cum s\u0103 serializ\u0103m variabilele pe care dorim s\u0103 le return\u0103m. Op\u021biuni: <code>Str<\/code>, <code>Repr<\/code>, <code>JSON<\/code>, <code>Pickle<\/code> \u0219i <code>Dill<\/code>, implicit <code>Str<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00cen cazul nostru, stabilim doar proprietatea <code>Cod<\/code>, astfel \u00eenc\u00e2t toate celelalte propriet\u0103\u021bi s\u0103 foloseasc\u0103 valorile implicite. O stabilim apel\u00e2nd <code>process.GetAnnotation(\"Import pandas\")<\/code>, care, la runtime, returneaz\u0103 nota\u021bia dup\u0103 ce a efectuat substitu\u021biile variabilelor. \u00cen cele din urm\u0103, codul <code>import pandas as pd<\/code> va fi transmis \u00een Python. <code>GetAnnotation<\/code> poate fi util pentru a ob\u021bine scripturi Python multiliniare, dar nu exist\u0103 restric\u021bii asupra acestei metode de ob\u021binere a codului. Pute\u021bi seta proprietatea <code>Cod<\/code> \u00een orice mod convenabil pentru dumneavoastr\u0103.<\/p>\n<p><\/p>\n<h3 id=\"poluchenie-peremennyh\">Ob\u021binerea variabilelor<\/h3>\n<p><\/p>\n<p>O alt\u0103 provocare interesant\u0103 cu utilizarea <code>isc.py.msg.ExecutionRequest<\/code> \u2014 <code>Matricea de Corela\u021bie: Tabular<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway \u00een InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/8824e49ecaa448551c830e9a90eb5781.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aceasta calculeaz\u0103 Matricea de Corela\u021bie pe partea Python \u0219i extrage variabila <code>corrmat<\/code> \u00eenapoi \u00een InterSystems IRIS \u00een format JSON, prin setarea propriet\u0103\u021bilor cererii:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabile<\/code>: <code>\"corrmat\"<\/code><\/li>\n<li><code>Serializare<\/code>: <code>\"JSON\"<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Putem vedea rezultatele \u00een Trace Vizual:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway \u00een InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/713bcade8cb1018f2974cba2cab712b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i dac\u0103 avem nevoie de aceast\u0103 valoare \u00een BP, o putem ob\u021bine astfel: <code>callresponse.Variables.GetAt(\"corrmat\")<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh-1\">Transferul de date<\/h3>\n<p><\/p>\n<p>Discut\u0103m acum despre transferul de date din InterSystems IRIS c\u0103tre Python, toate cererile de transfer de date implementeaz\u0103 interfa\u021ba <code>isc.py.msg.DataRequest<\/code>, care ofer\u0103 urm\u0103toarele propriet\u0103\u021bi:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variabil\u0103<\/code> \u2014 variabil\u0103 Python \u00een care se scriu datele.<\/li>\n<li><code>Tip<\/code> \u2014 tipul variabilei: <code>dataframe<\/code> (dataframe pandas) sau <code>list<\/code>.<\/li>\n<li><code>Namespace<\/code> \u2014 spa\u021biul din care ob\u021binem datele. Pachetul <code>isc.py<\/code> trebuie s\u0103 fie disponibil \u00een acest spa\u021biu. Poate fi un spa\u021biu f\u0103r\u0103 suport pentru produse.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pe baza acestei interfe\u021be sunt implementate 4 clase de cereri:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.QueryRequest<\/code> \u2014 seta\u021bi proprietatea <code>Query<\/code> pentru a transmite o cerere SQL.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code> \u2014 seta\u021bi proprietatea <code>Class<\/code> pentru a transmite datele unei clase.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2014 seta\u021bi proprietatea <code>Table<\/code> pentru a transmite datele unei tabele.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code> \u2014 seta\u021bi proprietatea <code>Global<\/code> pentru a transmite date globale.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00cen procesul de testare, observa\u021bi activitatea <code>RAW<\/code>, unde <code>isc.py.msg.QueryRequest<\/code> aratat \u00een ac\u021biune.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway \u00een 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\">Salvarea\/restaurarea contextului Python<\/h3>\n<p><\/p>\n<p>\u00cen cele din urm\u0103, putem salva contextul Python \u00een InterSystems IRIS, pentru a face acest lucru, vom trimite <code>isc.py.msg.SaveRequest<\/code> cu argumentele:<\/p>\n<p><\/p>\n<ul>\n<li><code>Mask<\/code> \u2014 Se salveaz\u0103 doar variabilele care \u00eendeplinesc masca. Se accept\u0103 <code>*<\/code> \u0219i <code>?<\/code>. Exemplu: <code>\"Data*, Figur\u0103?\"<\/code>. Implicit <code>*<\/code>.<\/li>\n<li><code>MaxLength<\/code> \u2014 Lungimea maxim\u0103 a variabilei p\u0103strate. Dac\u0103 serializarea variabilei dep\u0103\u0219e\u0219te aceast\u0103 lungime, va fi ignorat\u0103. Seta\u021bi 0 pentru a accepta variabile de orice lungime. Implicit, <code>$$$MaxStringLength<\/code>.<\/li>\n<li><code>Name<\/code> \u2014 Numele contextului (op\u021bional).<\/li>\n<li><code>Description<\/code> \u2014 Descrierea contextului (op\u021bional).<\/li>\n<\/ul>\n<p><\/p>\n<p>Returneaz\u0103 <code>Ens.StringResponse<\/code> de <code>Id<\/code> al contextului salvat. \u00cen procesul de testare, verifica\u021bi activitatea <code>Save Context<\/code>.<\/p>\n<p><\/p>\n<p>Cererea corespunz\u0103toare <code>isc.py.msg.RestoreRequest<\/code> \u00eencarc\u0103 contextul din InterSystems IRIS \u00een Python:<\/p>\n<p><\/p>\n<ul>\n<li><code>ContextId<\/code> \u2014 identificatorul contextului.<\/li>\n<li><code>Clear<\/code> \u2014 cur\u0103\u021b\u0103 contextul \u00eenainte de restaurare.<\/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 este o aplica\u021bie web open-source care permite crearea de notebook-uri con\u021bin\u00e2nd cod, vizualiz\u0103ri \u0219i text, \u0219i publicarea acestora. Python Gateway permite vizualizarea \u0219i editarea proceselor BPL sub form\u0103 de Jupyter Notebook. Re\u021bine\u021bi c\u0103 \u00een prezent se utilizeaz\u0103 executorul standard Python 3.<\/p>\n<p><\/p>\n<p>Aceast\u0103 extensie presupune c\u0103 anot\u0103rile con\u021bin cod Python \u0219i folosesc denumirile activit\u0103\u021bilor ca antete anterioare. Acum este posibil s\u0103 dezvolta\u021bi procese de afaceri PythonGateway \u00een Jupyter Notebook. Iat\u0103 ce este posibil: <\/p>\n<p><\/p>\n<ul>\n<li>Crearea de noi procese de afaceri<\/li>\n<li>\u0218tergerea proceselor de afaceri<\/li>\n<li>Crearea de noi activit\u0103\u021bi<\/li>\n<li>Modificarea activit\u0103\u021bilor<\/li>\n<li>\u0218tergerea activit\u0103\u021bilor<\/li>\n<\/ul>\n<p><\/p>\n<p>Iat\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/mZizgVtZ014\">video demo<\/a><\/noindex>. \u0218i c\u00e2teva capturi de ecran:<\/p>\n<p><\/p>\n<h2 id=\"provodnik-processov\">Explorer de procese<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway \u00een 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 de procese<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway \u00een 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\">Instalare<\/h2>\n<p><\/p>\n<ol>\n<li>Ave\u021bi nevoie de InterSystems IRIS 2019.2+.<\/li>\n<li>Instala\u021bi PythonGateway v0.8+ (este necesar doar <code>isc.py.util.Jupyter<\/code>, <code>isc.py.util.JupyterCheckpoints<\/code> \u0219i <code>isc.py.ens.ProcessUtils<\/code>).<\/li>\n<li>Actualiza\u021bi codul ObjectScript din repository.<\/li>\n<li>Executa\u021bi <code>do ##class(isc.py.util.Jupyter).Install()<\/code> \u0219i urma\u021bi instruc\u021biunile.<\/li>\n<\/ol>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/tree\/master\/jupyter\">Documenta\u021bie<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"vyvody\">Conclusions<\/h1>\n<p><\/p>\n<p>MLToolkit este un set de instrumente care are ca scop integrarea modelelor \u0219i a mediului tranzac\u021bional, astfel \u00eenc\u00e2t modelele construite s\u0103 poat\u0103 fi utilizate cu u\u0219urin\u021b\u0103 direct \u00een procesele dumneavoastr\u0103 de afaceri. Python Gateway este parte a MLToolkit \u0219i ofer\u0103 integrarea cu limbajul Python, permi\u021b\u00e2nd orchestrarea oric\u0103ror algoritmi de \u00eenv\u0103\u021bare automat\u0103 dezvolta\u021bi \u00een Python (mediu de baz\u0103 pentru mul\u021bi data scientists) \u0219i utilizarea numeroaselor biblioteci gata preg\u0103tite pentru a crea rapid solu\u021bii adaptive \u0219i robotizate de analiz\u0103 AI\/ML pe platforma InterSystems IRIS.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Linkuri<\/h1>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/473452\/\">Articolul precedent<\/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\">Exemple 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\">Documenta\u021bie \u0219i cursuri Python<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"mltoolkit\">MLToolkit<\/h1>\n<p><\/p>\n<p>Grupul utilizatorilor MLToolkit este un depozit privat GitHub creat ca parte a organiza\u021biei corporative GitHub InterSystems. Acesta este destinat utilizatorilor externi care instaleaz\u0103, studiaz\u0103 sau utilizeaz\u0103 deja componentele MLToolkit, inclusiv Python Gateway. Grupul ofer\u0103 o serie de cazuri implementate (cu cod surs\u0103 \u0219i date de test) \u00een domeniile marketingului, produc\u021biei, medicinei \u0219i multor altor industrii. Pentru a te al\u0103tura grupului utilizatorilor ML Toolkit, te rug\u0103m s\u0103 trimi\u021bi un mesaj scurt prin e-mail la urm\u0103toarea adres\u0103: <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> \u0219i s\u0103 men\u021bionezi \u00een mesajul t\u0103u urm\u0103toarele informa\u021bii:<\/p>\n<p><\/p>\n<ul>\n<li>Numele de utilizator GitHub<\/li>\n<li>Organiza\u021bia (unde lucrezi sau studiezi)<\/li>\n<li>Func\u021bia (pozi\u021bia dumneavoastr\u0103 efectiv\u0103 \u00een organiza\u021bia dumneavoastr\u0103, sau \"Student\", sau \"Independent\").<\/li>\n<li>\u021aara<\/li>\n<\/ul>\n<p><\/p>\n<p>Celor care au citit articolul \u0219i sunt interesa\u021bi de oportunit\u0103\u021bile InterSystems IRIS ca platform\u0103 pentru dezvoltarea sau g\u0103zduirea mecanismelor de inteligen\u021b\u0103 artificial\u0103 \u0219i \u00eenv\u0103\u021bare automat\u0103, le oferim s\u0103 discut\u0103m posibile scenarii de interes pentru compania dumneavoastr\u0103. Suntem preg\u0103ti\u021bi s\u0103 analiz\u0103m nevoile companiei dumneavoastr\u0103 \u0219i s\u0103 stabilim \u00eempreun\u0103 un plan de ac\u021biune; adresa de contact a grupului nostru de exper\u021bi AI\/ML este: <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com\">MLToolkit@intersystems.com<\/a><\/noindex>.<\/p>\n<p>Sursa: <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 5.0.2.1 - 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.\" \/>\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\/ro\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/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 \u00een InterSystems IRIS | ProHoster","description":"Acest articol este dedicat Python Gateway \u2014 un proiect comunitar cu surs\u0103 deschis\u0103 pentru platforma de date InterSystems IRIS.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/python-gateway-v-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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.","og:url":"https:\/\/prohoster.info\/ro\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/41221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=41221"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/41221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/41222"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=41221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=41221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=41221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}