{"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\/pl\/blog\/python-gateway-v-intersystems-iris","title":{"rendered":"Python Gateway w InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ten artyku\u0142 po\u015bwi\u0119cony jest Python Gateway \u2013 projektowi spo\u0142eczno\u015bciowemu o otwartym kodzie \u017ar\u00f3d\u0142owym dla platformy danych InterSystems IRIS. Projekt ten umo\u017cliwia orkiestracj\u0119 wszelkich algorytm\u00f3w uczenia maszynowego stworzonych w j\u0119zyku Python (g\u0142\u00f3wnej przestrzeni roboczej dla wielu Data Scientist\u00f3w), wykorzystuj\u0105c liczne gotowe biblioteki do szybkiego tworzenia adaptacyjnych, zrobotyzowanych rozwi\u0105za\u0144 analitycznych AI\/ML na platformie InterSystems IRIS. W tym artykule poka\u017c\u0119, jak InterSystems IRIS mo\u017ce orkiestruje procesy w j\u0119zyku Python, efektywnie realizuj\u0105c dwustronny transfer danych i tworz\u0105c inteligentne procesy biznesowe.<\/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>Wprowadzenie.<\/li>\n<li>Narz\u0119dzia.<\/li>\n<li>Instalacja.<\/li>\n<li>API.<\/li>\n<li>Interopertywno\u015b\u0107.<\/li>\n<li>Jupyter Notebook.<\/li>\n<li>Wnioski.<\/li>\n<li>Linki.<\/li>\n<li>MLToolkit.<\/li>\n<\/ol>\n<p><\/p>\n<h1 id=\"vvedenie\">Wprowadzenie<\/h1>\n<p><\/p>\n<p>Python to j\u0119zyk programowania wysokiego poziomu og\u00f3lnego przeznaczenia, skoncentrowany na zwi\u0119kszeniu wydajno\u015bci programisty oraz czytelno\u015bci kodu. W tej serii artyku\u0142\u00f3w opowiem o mo\u017cliwo\u015bciach zastosowania j\u0119zyka Python na platformie InterSystems IRIS, z naciskiem na zastosowanie Pythona jako j\u0119zyka do tworzenia oraz wdra\u017cania modeli uczenia maszynowego.<\/p>\n<p><\/p>\n<p>Uczenie maszynowe (ML) to klasa metod sztucznej inteligencji, dla kt\u00f3rych charakterystyczne jest nie bezpo\u015brednie rozwi\u0105zanie problemu, ale uczenie si\u0119 w procesie rozwi\u0105zywania wielu podobnych zada\u0144. <\/p>\n<p><\/p>\n<p>Algorytmy i modele uczenia maszynowego staj\u0105 si\u0119 coraz bardziej powszechne. Jest wiele powod\u00f3w tego stanu, ale wszystko sprowadza si\u0119 do dost\u0119pno\u015bci, prostoty oraz osi\u0105gania praktycznych wynik\u00f3w. Czy klasteryzacja lub nawet modelowanie neuronowe to nowe technologie? <\/p>\n<p><\/p>\n<p>Oczywi\u015bcie, \u017ce nie, ale obecnie nie ma potrzeby pisania setek tysi\u0119cy linijek kodu, aby uruchomi\u0107 jeden model, a koszty tworzenia i wdra\u017cania modeli staj\u0105 si\u0119 coraz mniejsze.<\/p>\n<p><\/p>\n<p>Narz\u0119dzia ewoluuj\u0105 \u2013 chocia\u017c nie mamy jeszcze ca\u0142kowicie narz\u0119dzi AI\/ML zorientowanych na GUI, post\u0119p, kt\u00f3ry zauwa\u017cyli\u015bmy w wielu innych klasach system\u00f3w informacyjnych, na przyk\u0142ad BI (od pisania kodu do u\u017cycia framework\u00f3w i rozwi\u0105za\u0144 konfigurowalnych opartych na GUI), jest r\u00f3wnie\u017c dostrzegalny w narz\u0119dziach do tworzenia AI\/ML. Ju\u017c przeszli\u015bmy etap pisania kodu i dzi\u015b korzystamy z framework\u00f3w do budowania i szkolenia modeli.<\/p>\n<p><\/p>\n<p>Inne ulepszenia, takie jak mo\u017cliwo\u015b\u0107 dystrybucji wst\u0119pnie wytrenowanego modelu, w kt\u00f3rym ko\u0144cowy u\u017cytkownik musi jedynie doko\u0144czy\u0107 trening modelu na swoich specyficznych danych, u\u0142atwiaj\u0105 rozpocz\u0119cie stosowania uczenia maszynowego. Te osi\u0105gni\u0119cia znacznie upraszczaj\u0105 nauk\u0119 uczenia maszynowego zar\u00f3wno dla specjalist\u00f3w, jak i dla firm jako ca\u0142o\u015bci.<\/p>\n<p><\/p>\n<p>Z drugiej strony zbieramy coraz wi\u0119cej danych. Dzi\u0119ki zintegrowanej platformie danych, takiej jak InterSystems IRIS, wszystkie te informacje mog\u0105 by\u0107 natychmiast przygotowane i wykorzystane jako dane wyj\u015bciowe do modeli uczenia maszynowego.<\/p>\n<p><\/p>\n<p>Przej\u015bcie na chmur\u0119 sprawia, \u017ce uruchamianie projekt\u00f3w AI\/ML staje si\u0119 \u0142atwiejsze ni\u017c kiedykolwiek. Mo\u017cemy korzysta\u0107 tylko z tych zasob\u00f3w, kt\u00f3re s\u0105 nam potrzebne. Co wi\u0119cej, dzi\u0119ki paralelizacji oferowanej przez platformy chmurowe, mo\u017cemy zaoszcz\u0119dzi\u0107 czas.<\/p>\n<p><\/p>\n<p>Ale co z wynikami? Tutaj robi si\u0119 trudniej. Istnieje wiele narz\u0119dzi do budowania modeli, o kt\u00f3rych opowiem dalej. Zbudowanie dobrego modelu nie jest proste, ale co dalej? Uzyskanie korzy\u015bci z wykorzystania modelu przez biznes tak\u017ce jest nie\u0142atwym zadaniem. Rdze\u0144 problemu tkwi w rozdzieleniu obci\u0105\u017ce\u0144 analitycznych i transakcyjnych oraz modeli danych. Gdy szkolimy model, zazwyczaj robimy to na danych historycznych. Ale miejsce dla zbudowanego modelu znajduje si\u0119 w obr\u00f3bce transakcyjnej danych. Co dobrego jest w najlepszym modelu wykrywania oszuka\u0144czych transakcji, je\u015bli uruchamiamy go raz dziennie? Oszu\u015bci ju\u017c dawno uciekli z pieni\u0119dzmi. Musimy trenowa\u0107 model na danych historycznych, ale musimy go r\u00f3wnie\u017c stosowa\u0107 w czasie rzeczywistym na nowych danych przychodz\u0105cych, aby nasze procesy biznesowe mog\u0142y dzia\u0142a\u0107 zgodnie z prognozami, kt\u00f3re model wygenerowa\u0142.<\/p>\n<p><\/p>\n<p>ML Toolkit to zestaw narz\u0119dzi, kt\u00f3rego celem jest w\u0142a\u015bnie to: po\u0142\u0105czenie modeli i \u015brodowiska transakcyjnego, aby zbudowane modele mo\u017cna by\u0142o \u0142atwo wykorzysta\u0107 bezpo\u015brednio w twoich procesach biznesowych. Python Gateway jest cz\u0119\u015bci\u0105 ML Toolkit i zapewnia integracj\u0119 z j\u0119zykiem Python (podobnie jak R Gateway, b\u0119d\u0105c cz\u0119\u015bci\u0105 ML Toolkit, zapewnia integracj\u0119 z j\u0119zykiem R).<\/p>\n<p><\/p>\n<h1 id=\"instrumentariy\">Narz\u0119dzia<\/h1>\n<p><\/p>\n<p>Zanim przejdziemy dalej, chcia\u0142bym opisa\u0107 kilka narz\u0119dzi i bibliotek dla Pythona, kt\u00f3re b\u0119dziemy u\u017cywa\u0107 p\u00f3\u017aniej.<\/p>\n<p><\/p>\n<h2 id=\"tehnologii\">Technologie<\/h2>\n<p><\/p>\n<ul>\n<li>Python to interpretowany, wysokopoziomowy j\u0119zyk programowania og\u00f3lnego przeznaczenia. G\u0142\u00f3wn\u0105 zalet\u0105 j\u0119zyka jest obszerna biblioteka matematycznych, ML- i AI-bibliotek. Podobnie jak ObjectScript, jest to j\u0119zyk obiektowy, ale wszystko definiowane jest dynamicznie, a nie statycznie. Wszystko jest r\u00f3wnie\u017c obiektem. W p\u00f3\u017aniejszych artyku\u0142ach zak\u0142ada si\u0119 przelotne zapoznanie si\u0119 z j\u0119zykiem. Je\u015bli chcesz zacz\u0105\u0107 nauk\u0119, polecam zacz\u0105\u0107 od <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.python.org\/3.6\/tutorial\/index.html\">dokumentacji<\/a><\/noindex>.<\/li>\n<li>Do naszych nast\u0119pnych \u0107wicze\u0144 zainstaluj <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: U\u017cywam <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a><\/noindex>, ale og\u00f3lnie mo\u017cna u\u017cy\u0107 te\u017c <noindex><a rel=\"nofollow\" href=\"https:\/\/realpython.com\/python-ides-code-editors-guide\/\">wielu<\/a><\/noindex>. Je\u015bli u\u017cywasz Atelier, istnieje wtyczka Eclipse dla programist\u00f3w Pythona. Je\u015bli korzystasz z VS Code, dost\u0119pne jest rozszerzenie dla Pythona. <\/li>\n<li>Notebook: zamiast IDE mo\u017cesz pisa\u0107 i dzieli\u0107 si\u0119 swoimi skryptami w internetowych notatnikach. Najpopularniejszy z nich to <noindex><a rel=\"nofollow\" href=\"https:\/\/jupyter.org\/\">Jupyter<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"biblioteki\">Biblioteki<\/h2>\n<p><\/p>\n<p>Oto (niepe\u0142na) lista bibliotek do uczenia maszynowego:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.numpy.org\/\">Numpy<\/a><\/noindex> \u2014 podstawowy pakiet do oblicze\u0144 numerycznych.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pandas.pydata.org\/\">Pandas<\/a><\/noindex> \u2014 struktury danych i narz\u0119dzia do analizy danych o wysokiej wydajno\u015bci.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a><\/noindex> \u2014 tworzenie wykres\u00f3w.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a><\/noindex> \u2014 wizualizacja danych oparta na matplotlib.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/scikit-learn.org\/stable\/\">Sklearn<\/a><\/noindex> \u2014 metody uczenia maszynowego.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/index.html\">XGBoost<\/a><\/noindex> \u2014 algorytmy uczenia maszynowego w ramach metodologii 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 sieci neuronowe.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a><\/noindex> \u2014 platforma do tworzenia modeli uczenia maszynowego.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">PyTorch<\/a><\/noindex> \u2014 platforma do budowania modeli uczenia maszynowego, skierowana na Pythona.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nyoka-pmml\/nyoka\">Nyoka<\/a><\/noindex> \u2014 PMML z r\u00f3\u017cnych modeli.<\/li>\n<\/ul>\n<p><\/p>\n<p>Technologie AI\/ML pozwalaj\u0105 uczyni\u0107 biznes bardziej efektywnym i elastycznym. Co wi\u0119cej, dzisiaj te technologie staj\u0105 si\u0119 prostsze w rozwoju i wdra\u017caniu. Zacznij nauk\u0119 technologii AI\/ML i sprawd\u017a, jak mog\u0105 pom\u00f3c Twojej organizacji w rozwoju.<\/p>\n<p><\/p>\n<h1 id=\"ustanovka\">Instalacja<\/h1>\n<p><\/p>\n<p>Istnieje kilka sposob\u00f3w na zainstalowanie i u\u017cywanie Python Gateway:<\/p>\n<p><\/p>\n<ul>\n<li>systemem operacyjnym\n<ul>\n<li>Windows<\/li>\n<li>Linuxa<\/li>\n<li>Mac<\/li>\n<\/ul>\n<\/li>\n<li>Docker\n<ul>\n<li>U\u017cyj obrazu z DockerHub<\/li>\n<li>Stw\u00f3rz sw\u00f3j w\u0142asny obraz<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Bez wzgl\u0119du na spos\u00f3b instalacji, b\u0119dziesz potrzebowa\u0107 kodu \u017ar\u00f3d\u0142owego. Jedynym miejscem do pobrania kodu jest <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">strona wyda\u0144<\/a><\/noindex>. Zawiera ona przetestowane stabilne wydania, po prostu we\u017a ostatnie. Na ten moment to 0.8, ale z czasem b\u0119d\u0105 te\u017c nowe. Nie klonuj\/nie \u015bci\u0105gaj repozytorium, pobierz najnowsze wydanie.<\/p>\n<p><\/p>\n<h2 id=\"os\">systemem operacyjnym<\/h2>\n<p><\/p>\n<p>Je\u015bli instalujesz Python Gateway w systemie operacyjnym, najpierw (bez wzgl\u0119du na system operacyjny) musisz zainstalowa\u0107 Pythona. W tym celu:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Zainstaluj Pythona 3.6.7 w wersji 64 bitowej<\/a><\/noindex>. Zaleca si\u0119 zainstalowanie Pythona w katalogu domy\u015blnym.<\/li>\n<li>Zainstaluj modu\u0142 <code>dill<\/code>: <code>pip install dill<\/code>.<\/li>\n<li>Pobierz kod ObjectScript (tzn. <code>do $system.OBJ.ImportDir(&quot;C:InterSystemsReposPythoniscpy&quot;, &quot;*.cls&quot;, &quot;c&quot;,,1)<\/code>) do dowolnego obszaru z produktami. W przypadku, gdy chcesz, aby istniej\u0105cy obszar wspiera\u0142 produkty, wykonaj: <code>write ##class(%EnsembleMgr).EnableNamespace($Namespace, 1)<\/code>.<\/li>\n<li>Umie\u015b\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/releases\">callout DLL\/SO\/DYLIB<\/a><\/noindex> do folderu <code>bin<\/code> Twojego instancji InterSystems IRIS. Plik biblioteki powinien by\u0107 dost\u0119pny pod \u015bcie\u017ck\u0105, zwracan\u0105 przez <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>Upewnij si\u0119, \u017ce zmienna \u015brodowiskowa <code>PYTHONHOME<\/code> wskazuje na Pythona 3.6.7.<\/li>\n<li>Upewnij si\u0119, \u017ce zmienna \u015brodowiskowa <code>\u015aCIE\u017bKA<\/code> zawiera zmienn\u0105 <code>PYTHONHOME<\/code> (lub katalog, na kt\u00f3ry wskazuje).<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"linux-debianubuntu\">Linux (Debian\/Ubuntu)<\/h3>\n<p><\/p>\n<ol>\n<li>Sprawd\u017a, czy zmienna \u015brodowiskowa <code>\u015aCIE\u017bKA<\/code> zawiera <code>\/usr\/lib<\/code> i <code>\/usr\/lib\/x86_64-linux-gnu<\/code>. U\u017cyj pliku <code>\/etc\/environment<\/code> do ustawienia zmiennych \u015brodowiskowych.<\/li>\n<li>W przypadku b\u0142\u0119d\u00f3w <code>undefined symbol: _Py_TrueStruct<\/code> ustaw konfiguracj\u0119 <code>PythonLib<\/code>. Ponadto w <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme<\/a><\/noindex> jest sekcja Rozwi\u0105zywanie problem\u00f3w.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"mac\">Mac<\/h3>\n<p><\/p>\n<ol>\n<li>Obecnie wspierana jest tylko wersja Pythona 3.6.7 z <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/downloads\/release\/python-367\/\">Python.org<\/a><\/noindex>. Sprawd\u017a zmienn\u0105 <code>\u015aCIE\u017bKA<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Je\u015bli zmienia\u0142e\u015b zmienne \u015brodowiskowe, zrestartuj sw\u00f3j produkt InterSystems.<\/p>\n<p><\/p>\n<h2 id=\"docker\">Docker<\/h2>\n<p><\/p>\n<p>U\u017cycie kontener\u00f3w ma wiele zalet: <\/p>\n<p><\/p>\n<ul>\n<li>Przeno\u015bno\u015b\u0107<\/li>\n<li>Efektywno\u015b\u0107<\/li>\n<li>Izolacja<\/li>\n<li>Lekko\u015b\u0107<\/li>\n<li>Niezmienno\u015b\u0107<\/li>\n<\/ul>\n<p><\/p>\n<p>Zapoznaj si\u0119 z t\u0105 <noindex><a rel=\"nofollow\" href=\"https:\/\/community.intersystems.com\/post\/continuous-delivery-your-intersystems-solution-using-gitlab-part-v-why-containers\">seri\u0105 artyku\u0142\u00f3w<\/a><\/noindex> aby uzyska\u0107 wi\u0119cej informacji na temat korzystania z Dockera z produktami InterSystems. <\/p>\n<p><\/p>\n<p>Wszystkie wersje Python Gateway na ten moment s\u0105 oparte na kontenerach <code>2019.4<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"gotovyy-obraz\">Gotowy obraz<\/h3>\n<p><\/p>\n<p>Wykonaj: <code>docker run -d -p 52773:52773 --name irispy intersystemscommunity\/irispy-community:latest<\/code>, aby pobra\u0107 i uruchomi\u0107 Python Gateway z InterSystems IRIS Community Edition. To wszystko.<\/p>\n<p><\/p>\n<h3 id=\"sozdayte-svoy-sobstvennyy-obraz\">Stw\u00f3rz sw\u00f3j w\u0142asny obraz<\/h3>\n<p><\/p>\n<p>Aby zbudowa\u0107 obraz Docker, wykonaj w g\u0142\u00f3wnym katalogu repozytorium: <code>docker build --force-rm --tag intersystemscommunity\/irispy:latest .<\/code>.<br \/>\nDomy\u015blnie obraz jest budowany na podstawie obrazu <code>store\/intersystems\/iris-community:2019.4.0.383.0<\/code>, jednak mo\u017cesz to zmieni\u0107, ustawiaj\u0105c zmienn\u0105 <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>Nast\u0119pnie mo\u017cesz uruchomi\u0107 obraz 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>Je\u015bli u\u017cywasz obrazu opartego na InterSystems IRIS Community Edition, mo\u017cesz nie podawa\u0107 klucza.<\/p>\n<p><\/p>\n<h3 id=\"kommentarii\">Komentarze<\/h3>\n<p><\/p>\n<ul>\n<li>Proces testowy <code>isc.py.test.Process<\/code> zachowuje szereg obraz\u00f3w w katalogu tymczasowym. Mo\u017cesz chcie\u0107 zmieni\u0107 t\u0119 \u015bcie\u017ck\u0119 na zamontowany katalog. W tym celu edytuj ustawienie <code>WorkingDir<\/code> okazuj\u0105c zamontowany katalog.<\/li>\n<li>Aby uzyska\u0107 dost\u0119p do terminala, wykonaj: <code>docker exec -it irispy sh<\/code>.<\/li>\n<li>Dost\u0119p do Portalu Zarz\u0105dzania Systemem za pomoc\u0105 loginu <code>SuperUser<\/code>\/<code>SYS<\/code>.<\/li>\n<li>Aby zatrzyma\u0107 kontener, wykonaj: <code>docker stop irispy &amp;&amp; docker rm --force irispy<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"proverka-ustanovki\">Sprawdzenie instalacji<\/h2>\n<p><\/p>\n<p>Po zainstalowaniu Python Gateway warto sprawdzi\u0107, czy dzia\u0142a. Wykonaj ten kod w terminalu 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>W wyniku powinno by\u0107 wy\u015bwietlone <code>HELLO<\/code> \u2014 warto\u015b\u0107 zmiennej Python <code>x<\/code>. Je\u015bli zwr\u00f3cony status <code>sc<\/code> jest b\u0142\u0119dem lub <code>var<\/code> pusty, sprawd\u017a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\">Readme \u2014 sekcj\u0119 Rozwi\u0105zywanie problem\u00f3w<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"api\">API<\/h1>\n<p><\/p>\n<p>Python Gateway jest zainstalowany i upewni\u0142e\u015b si\u0119, \u017ce dzia\u0142a. Czas zacz\u0105\u0107 go u\u017cywa\u0107!<br \/>\nG\u0142\u00f3wnym interfejsem do Python jest <code>isc.py.Main<\/code>. Oferuje on nast\u0119puj\u0105ce grupy metod (wszystkie zwracaj\u0105 <code>%Status<\/code>):<\/p>\n<p><\/p>\n<ul>\n<li>Wykonanie kodu<\/li>\n<li>Przesy\u0142anie danych<\/li>\n<li>Pomocnicze<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"ispolnenie-koda\">Wykonanie kodu<\/h2>\n<p><\/p>\n<p>Te metody pozwalaj\u0105 na wykonanie dowolnego kodu Python.<\/p>\n<p><\/p>\n<h3 id=\"simplestring\">SimpleString<\/h3>\n<p><\/p>\n<p><code>SimpleString<\/code> \u2014 to g\u0142\u00f3wna metoda. Przyjmuje 4 opcjonalne argumenty:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 ci\u0105g kodu do wykonania. Znak ko\u0144ca linii: <code>$c(10)<\/code>.<\/li>\n<li><code>returnVariable<\/code> \u2014 nazwa zmiennej do zwr\u00f3cenia.<\/li>\n<li><code>serialization<\/code> \u2014 jak serializowa\u0107. <code>returnVariable<\/code>. 0 \u2014 string (domy\u015blnie), 1 \u2014 repr.<\/li>\n<li><code>result<\/code> \u2014 ByRef odniesienie do zmiennej, do kt\u00f3rej zapisywana jest warto\u015b\u0107 <code>returnVariable<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Powy\u017cej wykonali\u015bmy:<\/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>W tym przyk\u0142adzie przypisujemy zmiennej Python <code>x<\/code> warto\u015b\u0107 <code>Cze\u015b\u0107<\/code> i chcemy zwr\u00f3ci\u0107 warto\u015b\u0107 zmiennej Python <code>x<\/code> do zmiennej ObjectScript <code>var<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"executecode\">ExecuteCode<\/h3>\n<p><\/p>\n<p>ExecuteCode jest bezpieczniejsz\u0105 i mniej ograniczon\u0105 alternatyw\u0105 <code>SimpleString<\/code>.<br \/>\nCi\u0105gi w platformie InterSystems IRIS s\u0105 ograniczone do 3 641 144 znak\u00f3w, a je\u015bli chcesz wykona\u0107 d\u0142u\u017cszy fragment kodu, musisz u\u017cywa\u0107 strumieni.<br \/>\nPrzyjmuje dwa argumenty:<\/p>\n<p><\/p>\n<ul>\n<li><code>code<\/code> \u2014 ci\u0105g lub strumie\u0144 kodu Python do wykonania.<\/li>\n<li><code>variable<\/code> \u2014 (opcjonalnie) przypisuje wynik wykonania <code>code<\/code> tej zmiennej Python.<\/li>\n<\/ul>\n<p><\/p>\n<p>Przyk\u0142ad u\u017cycia:<\/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>W tym przyk\u0142adzie mno\u017cymy 2 przez 3 i zapisujemy wynik w zmiennej Python <code>y<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"peredacha-dannyh\">Przesy\u0142anie danych<\/h2>\n<p><\/p>\n<p>Przekazuj dane do Pythona i z powrotem.<\/p>\n<p><\/p>\n<h3 id=\"python---intersystems-iris\">Python -&gt; InterSystems IRIS<\/h3>\n<p><\/p>\n<p>S\u0105 4 sposoby na uzyskanie warto\u015bci zmiennej Python w InterSystems IRIS, w zale\u017cno\u015bci od potrzebnej serializacji:<\/p>\n<p><\/p>\n<ul>\n<li><code>String<\/code> dla prostych typ\u00f3w danych i debugowania.<\/li>\n<li><code>Repr<\/code> do przechowywania prostych obiekt\u00f3w i debugowania.<\/li>\n<li><code>YANG<\/code> do \u0142atwej manipulacji danymi po stronie InterSystems IRIS.<\/li>\n<li><code>Pickle<\/code> do zapisywania obiekt\u00f3w.<\/li>\n<\/ul>\n<p><\/p>\n<p>Te metody pozwalaj\u0105 uzyska\u0107 zmienne z Pythona w postaci ci\u0105gu lub strumieni.<\/p>\n<p><\/p>\n<ul>\n<li><code>GetVariable(variable, serialization, .stream, useString)<\/code> \u2014 otrzyma\u0107 <code>serialization<\/code> zmiennej <code>variable<\/code> do <code>stream<\/code>. Je\u015bli <code>useString<\/code> r\u00f3wna 1, a serializacja jest umieszczona w ci\u0105gu, to zwracany jest ci\u0105g, a nie strumie\u0144.<\/li>\n<li><code>GetVariableJson(variable, .stream, useString)<\/code> \u2014 otrzyma\u0107 serializacj\u0119 JSON zmiennej.<\/li>\n<li><code>GetVariablePickle(variable, .stream, useString, useDill)<\/code> - otrzyma\u0107 serializacj\u0119 Pickle (lub Dill) zmiennej.<\/li>\n<\/ul>\n<p><\/p>\n<p>Spr\u00f3bujmy uzyska\u0107 nasz\u0105 zmienn\u0105 <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>\u0141adujemy dane z InterSystems IRIS do Pythona.<\/p>\n<p><\/p>\n<ul>\n<li><code>ExecuteQuery(query, variable, type, namespace)<\/code> \u2014 tworzy zbi\u00f3r danych (pandas <code>dataframe<\/code> lub <code>list<\/code>) z zapytania sql i przypisuje go do zmiennej Pythona <code>variable<\/code>. Paczka <code>isc.py<\/code> musi by\u0107 dost\u0119pna w obszarze <code>namespace<\/code> \u2014 tam b\u0119dzie wykonywane zapytanie.<\/li>\n<li><code>ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)<\/code> \u2014 \u0142aduje dane globalne <code>global<\/code> z subskryptu <code>start<\/code> do <code>end<\/code> do Pythona jako zmienna typu <code>type<\/code>: <code>list<\/code>, lub pandas <code>dataframe<\/code>. Opis opcjonalnych argument\u00f3w <code>maskuj<\/code> i <code>labels<\/code> dost\u0119pny w dokumentacji klasy i repozytorium <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">dokumentacja transferu danych<\/a><\/noindex>.<\/li>\n<li><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 \u0142aduje dane klasy <code>class<\/code> z id <code>start<\/code> do <code>end<\/code> do Pythona jako zmienna typu <code>type<\/code>: <code>list<\/code>, lub pandas <code>dataframe<\/code>. <code>properties<\/code> \u2014 lista (separator \u2014 przecinek) w\u0142a\u015bciwo\u015bci klasy, kt\u00f3re nale\u017cy za\u0142adowa\u0107 do zbioru danych. Obs\u0142ugiwane s\u0105 maski <code>*<\/code> i <code>?<\/code>. Domy\u015blnie \u2014 <code>*<\/code> (wszystkie w\u0142a\u015bciwo\u015bci). W\u0142a\u015b\u0107no\u015b\u0107 <code>%%CLASSNAME<\/code> jest ignorowane.<\/li>\n<li><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 \u0142aduje dane tabeli <code>st\u00f3\u0142<\/code> z id <code>start<\/code> do <code>end<\/code> do Pythona.<\/li>\n<\/ul>\n<p><\/p>\n<p><code>ExecuteQuery<\/code> \u2014 jest uniwersalne (jakiekolwiek poprawne zapytanie SQL zostanie przekazane do Pythona). Jednak\u017ce, <code>ExecuteGlobal<\/code> i jego opakowania <code>ExecuteClass<\/code> i <code>ExecuteTable<\/code> dzia\u0142aj\u0105 z pewnymi ograniczeniami. S\u0105 znacznie szybsze (3-5 razy szybsze od sterownika ODBC i 20 razy szybsze <code>ExecuteQuery<\/code>). Dodatkowe informacje w <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/DataTransfer.md\">dokumentacja transferu danych<\/a><\/noindex>.<br \/>\nWszystkie te metody wspieraj\u0105 transfer danych z dowolnego obszaru. Paczka <code>isc.py<\/code> musi by\u0107 dost\u0119pna w docelowym obszarze.<\/p>\n<p><\/p>\n<h3 id=\"executequery\">ExecuteQuery<\/h3>\n<p><\/p>\n<p><code>ExecuteQuery(request, variable, type, namespace)<\/code> \u2014 przekazywanie wynik\u00f3w dowolnego poprawnego zapytania SQL do Pythona. To najwolniejsza metoda transferu danych. U\u017cywaj jej, je\u015bli <code>ExecuteGlobal<\/code> i jego opakowania s\u0105 niedost\u0119pne.<\/p>\n<p><\/p>\n<p>Argumenty:<\/p>\n<p><\/p>\n<ul>\n<li><code>query<\/code> \u2014 zapytanie sql.<\/li>\n<li><code>variable<\/code> \u2014 nazwa zmiennej Pythona, do kt\u00f3rej zapisywane s\u0105 dane.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> lub Pandas <code>dataframe<\/code>.<\/li>\n<li><code>namespace<\/code> \u2014 obszar, w kt\u00f3rym b\u0119dzie wykonywane zapytanie.<\/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 przekazywanie globalnej w Pythona.<\/p>\n<p><\/p>\n<p>Argumenty:<\/p>\n<p><\/p>\n<ul>\n<li><code>global<\/code> \u2014 nazwa globalnej bez <code>^<\/code><\/li>\n<li><code>variable<\/code> \u2014 nazwa zmiennej Pythona, do kt\u00f3rej zapisywane s\u0105 dane.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> lub Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 pierwszy subskrypt globalny. Obowi\u0105zkowy <code>%Integer<\/code>.<\/li>\n<li><code>end<\/code> \u2014 ostatni subskrypt globalny. Obowi\u0105zkowy <code>%Integer<\/code>.<\/li>\n<li><code>maskuj<\/code> \u2014 maska warto\u015bci globalnej. Maska mo\u017ce by\u0107 kr\u00f3tsza ni\u017c liczba p\u00f3l w globalnej (w takim przypadku pola na ko\u0144cu zostan\u0105 pomini\u0119te). Jak sformatowa\u0107 mask\u0119:\n<ul>\n<li><code>+<\/code> przekaza\u0107 warto\u015b\u0107 tak\u0105, jaka jest.<\/li>\n<li><code>-<\/code> pomin\u0105\u0107 warto\u015b\u0107.<\/li>\n<li><code>b<\/code> \u2014 Typ logiczny (<code>0<\/code> \u2014 <code>Fa\u0142sz<\/code>, wszystko inne \u2014 <code>Prawda<\/code>).<\/li>\n<li><code>d<\/code> \u2014 Data (z $horolog, na Windows od 1970, na Linux od 1900).<\/li>\n<li><code>t<\/code> \u2014 Czas ($horolog, sekundy po p\u00f3\u0142nocy).<\/li>\n<li><code>m<\/code> \u2014 Znacznik czasu (ci\u0105g w formacie ROK-MIESI\u0104C-DZIE\u0143 GODZINA:MINUTA:SEKUNDA).<\/li>\n<\/ul>\n<\/li>\n<li><code>labels<\/code> \u2014 %Lista nazw kolumn. Pierwszy element \u2014 nazwa subskryptu.<\/li>\n<li><code>namespace<\/code> \u2014 obszar, w kt\u00f3rym b\u0119dzie wykonywane zapytanie.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"executeclass\">ExecuteClass<\/h3>\n<p><\/p>\n<p>Owijka nad <code>ExecuteGlobal<\/code>. Na podstawie definicji klasy przygotowuje wywo\u0142anie <code>ExecuteGlobal<\/code> i wykonuje je.<\/p>\n<p><\/p>\n<p><code>ExecuteClass(class, variable, type, start, end, properties, namespace)<\/code> \u2014 przekazywanie danych klasy w Pythonie.<\/p>\n<p><\/p>\n<p>Argumenty:<\/p>\n<p><\/p>\n<ul>\n<li><code>class<\/code> \u2014 nazwa klasy<\/li>\n<li><code>variable<\/code> \u2014 nazwa zmiennej Pythona, do kt\u00f3rej zapisywane s\u0105 dane.<\/li>\n<li><code>type<\/code> \u2014 <code>list<\/code> lub Pandas <code>dataframe<\/code>.<\/li>\n<li><code>start<\/code> \u2014 pocz\u0105tkowy Id.<\/li>\n<li><code>end<\/code> \u2014 ko\u0144cowy Id<\/li>\n<li><code>properties<\/code> \u2014 lista (separator \u2014 przecinek) w\u0142a\u015bciwo\u015bci klasy, kt\u00f3re nale\u017cy za\u0142adowa\u0107 do zbioru danych. Obs\u0142ugiwane s\u0105 maski <code>*<\/code> i <code>?<\/code>. Domy\u015blnie \u2014 <code>*<\/code> (wszystkie w\u0142a\u015bciwo\u015bci). W\u0142a\u015b\u0107no\u015b\u0107 <code>%%CLASSNAME<\/code> jest ignorowane.<\/li>\n<li><code>namespace<\/code> \u2014 obszar, w kt\u00f3rym b\u0119dzie wykonywane zapytanie.<\/li>\n<\/ul>\n<p><\/p>\n<p>Wszystkie w\u0142a\u015bciwo\u015bci s\u0105 przekazywane dok\u0142adnie tak, jak s\u0105, z wyj\u0105tkiem w\u0142a\u015bciwo\u015bci typ\u00f3w <code>%Date<\/code>, <code>%Czas<\/code>, <code>%Boolean<\/code> i <code>%ZnacznikCzasu<\/code> \u2014 s\u0105 konwertowane na odpowiadaj\u0105ce klasy Pythona.<\/p>\n<p><\/p>\n<h3 id=\"executetable\">ExecuteTable<\/h3>\n<p><\/p>\n<p>Owijka nad <code>ExecuteClass<\/code>. Przekazuje nazw\u0119 tabeli w nazw\u0119 klasy i wywo\u0142uje <code>ExecuteClass<\/code>. Podpis:<\/p>\n<p><\/p>\n<p><code>ExecuteTable(table, variable, type, start, end, properties, namespace)<\/code> \u2014 przekazywanie danych tabeli w Pythonie.<\/p>\n<p><\/p>\n<p>Argumenty:<\/p>\n<p><\/p>\n<ul>\n<li><code>st\u00f3\u0142<\/code> \u2014 nazwa tabeli.<br \/>\nWszystkie pozosta\u0142e argumenty s\u0105 przekazywane dok\u0142adnie tak, jak s\u0105 do <code>ExecuteClass<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zametki\">Notatki<\/h3>\n<p><\/p>\n<ul>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> i <code>ExecuteTable<\/code> dzia\u0142aj\u0105 z tak\u0105 sam\u0105 szybko\u015bci\u0105.<\/li>\n<li><code>ExecuteGlobal<\/code> 20 razy szybciej ni\u017c <code>ExecuteQuery<\/code> na du\u017cych zbiorach danych (czas przesy\u0142u wynosi wi\u0119cej ni\u017c &gt;0.01 sekundy).<\/li>\n<li><code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> i <code>ExecuteTable<\/code> dzia\u0142aj\u0105 na globalach o danej strukturze: <code>^global(key) = $lb(prop1, prop2, ..., propN)<\/code> gdzie <code>key<\/code> \u2014 liczba ca\u0142kowita.<\/li>\n<li>Dla <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> i <code>ExecuteTable<\/code> obs\u0142ugiwany zakres warto\u015bci <code>%Date<\/code> odpowiada zakresowi <code>mktime<\/code> i zale\u017cy od systemu operacyjnego (<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>). U\u017cyj <code>%ZnacznikCzasu<\/code>do przekazywania danych poza tym zakresem lub u\u017cyj pandas dataframe, poniewa\u017c to ograniczenie dotyczy tylko listy.<\/li>\n<li>Dla <code>ExecuteGlobal<\/code>, <code>ExecuteClass<\/code> i <code>ExecuteTable<\/code> wszystkie argumenty opr\u00f3cz \u017ar\u00f3d\u0142a danych (globalnej, klasy lub tabeli) oraz zmiennej s\u0105 opcjonalne.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"primery\">Przyk\u0142ady<\/h2>\n<p><\/p>\n<p>Klasa testowa <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/blob\/master\/isc\/py\/test\/Person.cls\">isc.py.test.Person<\/a><\/noindex> zawiera metod\u0119, kt\u00f3ra demonstruje wszystkie sposoby przekazywania danych:<\/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>Wywo\u0142aj metod\u0119 <code>do ##class(isc.py.test.Person).Test()<\/code> aby zobaczy\u0107, jak dzia\u0142aj\u0105 wszystkie metody przesy\u0142ania danych.<\/p>\n<p><\/p>\n<h2 id=\"vspomogatelnye-metody\">Metody pomocnicze<\/h2>\n<p><\/p>\n<ul>\n<li><code>GetVariableInfo(variable, serialization, .defined, .type, .length)<\/code> \u2014 uzyskaj informacje o zmiennej: czy jest zdefiniowana, klasa i d\u0142ugo\u015b\u0107 serializacji.<\/li>\n<li><code>GetVariableDefined(variable, .defined)<\/code> \u2014 czy zmienna jest zdefiniowana.<\/li>\n<li><code>GetVariableType(variable, .type)<\/code> \u2014 uzyskaj klas\u0119 zmiennej.<\/li>\n<li><code>GetStatus()<\/code> \u2014 uzyskaj i usu\u0144 ostatni wyj\u0105tek po stronie Pythona.<\/li>\n<li><code>GetModuleInfo(module, .imported, .alias)<\/code> \u2014 uzyskaj zmienn\u0105 modu\u0142u i status importu.<\/li>\n<li><code>GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)<\/code> \u2014 uzyskaj informacje o funkcji.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"interoperabelnost\">Interoperacyjno\u015b\u0107<\/h1>\n<p><\/p>\n<p>Nauczy\u0142e\u015b si\u0119 wywo\u0142ywa\u0107 Python Gateway z terminala, teraz zaczniemy go u\u017cywa\u0107 w produkcji. Podstaw\u0105 interakcji z Pythonem w tym trybie jest <code>isc.py.ens.Operation<\/code>. Umo\u017cliwia nam:<\/p>\n<p><\/p>\n<ul>\n<li>Wykonywanie kodu w Pythonie<\/li>\n<li>Zapis\/Przywracanie kontekstu Pythona<\/li>\n<li>\u0141adowanie i pobieranie danych z Pythona<\/li>\n<\/ul>\n<p><\/p>\n<p>W zasadzie operacja w Pythonie to opakowanie wok\u00f3\u0142 <code>isc.py.Main<\/code>. Operacja <code>isc.py.ens.Operation<\/code> umo\u017cliwia interakcj\u0119 z procesem Pythona z produkcji InterSystems IRIS. Obs\u0142ugiwanych jest pi\u0119\u0107 zapyta\u0144:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.ExecutionRequest<\/code> do wykonywania kodu w Pythonie. Zwraca <code>isc.py.msg.ExecutionResponse<\/code> z wynikiem wykonania i warto\u015bciami \u017c\u0105danych zmiennych.<\/li>\n<li><code>isc.py.msg.StreamExecutionRequest<\/code> do wykonywania kodu w Pythonie. Zwraca <code>isc.py.msg.StreamExecutionResponse<\/code> wynikiem wykonania i warto\u015bciami \u017c\u0105danych zmiennych. Odpowiednik <code>isc.py.msg.ExecutionRequest<\/code>, ale przyjmuje i zwraca strumienie zamiast \u0142a\u0144cuch\u00f3w.<\/li>\n<li><code>isc.py.msg.QueryRequest<\/code> do przekazywania wyniku wykonania zapytania SQL. Zwraca <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> do przekazywania danych globalnych\/klas\/tabllic. Zwraca <code>Ens.Response<\/code>.<\/li>\n<li><code>isc.py.msg.SaveRequest<\/code> do zapisywania kontekstu Pythona. Zwraca <code>Ens.StringResponse<\/code> z identyfikatorem kontekstu.<\/li>\n<li>\n<p><code>isc.py.msg.RestoreRequest<\/code> do przywracania kontekstu Pythona.<\/p>\n<p><\/p>\n<p>Ponadto, <code>isc.py.ens.Operation<\/code> ma dwie opcje:<\/p>\n<p><\/p>\n<ul>\n<li><code>Initializer<\/code> \u2014 wyb\u00f3r klasy, kt\u00f3ra implementuje interfejs <code>isc.py.init.Abstract<\/code>. Mo\u017ce by\u0107 u\u017cywana do \u0142adowania funkcji, modu\u0142\u00f3w, klas itp. Wykonywana jest jeden raz przy uruchamianiu procesu.<\/li>\n<li><code>PythonLib<\/code> \u2014 (tylko dla systemu Linux) je\u015bli widzisz b\u0142\u0119dy podczas \u0142adowania, ustaw jej warto\u015b\u0107 na <code>libpython3.6m.so<\/code> lub nawet na pe\u0142n\u0105 \u015bcie\u017ck\u0119 do biblioteki Pythona. <\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sozdanie-biznes-processov\">Tworzenie proces\u00f3w biznesowych<\/h2>\n<p><\/p>\n<p>Dost\u0119pne s\u0105 dwie klasy, kt\u00f3re u\u0142atwiaj\u0105 rozw\u00f3j proces\u00f3w biznesowych:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.ens.ProcessUtils<\/code> umo\u017cliwia wyodr\u0119bnianie adnotacji z aktywno\u015bci z podstawianiem zmiennych.<\/li>\n<li><code>isc.py.util.BPEmulator<\/code> umo\u017cliwia \u0142atwe testowanie proces\u00f3w biznesowych w Pythonie. Mo\u017ce wykonywa\u0107 proces biznesowy (cz\u0119\u015bci w j\u0119zyku Python) w bie\u017c\u0105cym procesie.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"podstanovka-peremennyh\">Podstawianie zmiennych.<\/h2>\n<p><\/p>\n<p>Wszystkie procesy biznesowe dziedzicz\u0105ce po <code>isc.py.ens.ProcessUtils<\/code>, mog\u0105 u\u017cywa\u0107 metody <code>GetAnnotation(name)<\/code> do uzyskiwania warto\u015bci adnotacji aktywno\u015bci wed\u0142ug jej nazwy. Adnotacja aktywno\u015bci mo\u017ce zawiera\u0107 zmienne, kt\u00f3re b\u0119d\u0105 obliczane po stronie InterSystems IRIS przed przekazaniem do Pythona. Oto sk\u0142adnia podstawiania zmiennych:<\/p>\n<p><\/p>\n<ul>\n<li><code>${class:method:arg1:...:argN}<\/code> \u2014 wywo\u0142aj metod\u0119<\/li>\n<li><code>#{expr}<\/code> \u2014 wykonaj kod w j\u0119zyku ObjectScript.<\/li>\n<\/ul>\n<p><\/p>\n<p>Przyk\u0142ad dost\u0119pny w testowym procesie biznesowym <code>isc.py.test.Process<\/code>, na przyk\u0142ad w aktywno\u015bci <code>Macierz korelacji: Graf<\/code>: <code>f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')<\/code>. W tym przyk\u0142adzie:<\/p>\n<p><\/p>\n<ul>\n<li><code>#{process.WorkDirectory}<\/code> zwraca w\u0142a\u015bciwo\u015b\u0107 WorkDirectory obiektu <code>process<\/code>, b\u0119d\u0105cego instancj\u0105 klasy <code>isc.py.test.Process<\/code> tj. bie\u017c\u0105cego procesu biznesowego.<\/li>\n<li><code>${%PopulateUtils:Integer:1:100}<\/code> wywo\u0142uje metod\u0119 <code>Integer<\/code> klasy <code>%PopulateUtils<\/code>, przekazuj\u0105c argumenty <code>1<\/code> i <code>100<\/code>, zwracaj\u0105c losow\u0105 liczb\u0119 ca\u0142kowit\u0105 w zakresie <code>1...100<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"testovyy-biznes-process\">Testowy proces biznesowy<\/h2>\n<p><\/p>\n<p>Testowy produkt i testowy proces biznesowy s\u0105 dost\u0119pne domy\u015blnie jako cz\u0119\u015b\u0107 bramy Python Gateway. Aby z nich skorzysta\u0107:<\/p>\n<p><\/p>\n<ol>\n<li>W terminalu systemu operacyjnego wykonaj: <code>pip install pandas matplotlib seaborn<\/code>. <\/li>\n<li>W terminalu InterSystems IRIS wykonaj: <code>do ##class(isc.py.test.CannibalizationData).Import()<\/code> aby za\u0142adowa\u0107 dane testowe.<\/li>\n<li>Uruchom produkt <code>isc.py.test.Production<\/code>.<\/li>\n<li>Wy\u015blij zapytanie typu <code>Ens.Request<\/code> do <code>isc.py.test.Process<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<p>Zobaczmy, jak wszystko to dzia\u0142a razem. Otw\u00f3rz <code>isc.py.test.Process<\/code> w edytorze BPL:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway w 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\">Wykonanie kodu<\/h3>\n<p><\/p>\n<p>Najwa\u017cniejsze wywo\u0142anie \u2014 wykonanie kodu Pythona:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway w InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/dafa6b8c878ae937b194ff577b86dc89.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>U\u017cywa zapytania <code>isc.py.msg.ExecutionRequest<\/code>, oto jego w\u0142a\u015bciwo\u015bci:<\/p>\n<p><\/p>\n<ul>\n<li><code>Kod<\/code> \u2014 kod Pythona.<\/li>\n<li><code>SeparateLines<\/code> \u2014 czy rozdziela\u0107 kod na wiersze do wykonania. <code>$c(10)<\/code> (<code>n<\/code>) jest u\u017cywane do dzielenia linii. Prosz\u0119 zauwa\u017cy\u0107, \u017ce NIE zaleca si\u0119 przetwarzania wiadomo\u015bci ca\u0142kowicie na raz, ta funkcja jest przeznaczona tylko do przetwarzania <code>def<\/code> i innych podobnych wyra\u017ce\u0144 wieloliniowych. Domy\u015blnie <code>0<\/code>.<\/li>\n<li><code>Zmienne<\/code> \u2014 lista zmiennych oddzielonych przecinkami, kt\u00f3re zostan\u0105 dodane do odpowiedzi.<\/li>\n<li><code>Serializacja<\/code> \u2014 Jak serializowa\u0107 zmienne, kt\u00f3re chcemy zwr\u00f3ci\u0107. Opcje: <code>Str<\/code>, <code>Repr<\/code>, <code>YANG<\/code>, <code>Pickle<\/code> i <code>Dill<\/code>, domy\u015blnie <code>Str<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>W naszym przypadku tylko ustawiamy atrybut <code>Kod<\/code>, wi\u0119c wszystkie pozosta\u0142e atrybuty u\u017cywaj\u0105 warto\u015bci domy\u015blnych. Ustawiamy to wywo\u0142uj\u0105c <code>process.GetAnnotation(&quot;Import pandas&quot;)<\/code>, kt\u00f3ry w czasie wykonywania zwraca adnotacj\u0119 po wykonaniu podstawie\u0144 zmiennych. Ostatecznie kod <code>import pandas as pd<\/code> zostanie przekazany do Pythona. <code>GetAnnotation<\/code> mo\u017ce by\u0107 przydatna do uzyskiwania wieloliniowych skrypt\u00f3w Pythona, ale nie ma \u017cadnych ogranicze\u0144 co do tej metody pobierania kodu. Mo\u017cesz ustawi\u0107 atrybut <code>Kod<\/code> w dowolny spos\u00f3b, kt\u00f3ry Ci odpowiada.<\/p>\n<p><\/p>\n<h3 id=\"poluchenie-peremennyh\">Uzyskiwanie zmiennych<\/h3>\n<p><\/p>\n<p>Kolejne interesuj\u0105ce wywo\u0142anie przy u\u017cyciu <code>isc.py.msg.ExecutionRequest<\/code> \u2014 <code>Macierz korelacji: Tabularna<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway w InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/8824e49ecaa448551c830e9a90eb5781.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oblicza Macierz Korelacji po stronie Pythona i wyci\u0105ga zmienn\u0105 <code>corrmat<\/code> z powrotem do InterSystems IRIS w formacie JSON, poprzez ustawienie atrybut\u00f3w zapytania:<\/p>\n<p><\/p>\n<ul>\n<li><code>Zmienne<\/code>: <code>&quot;corrmat&quot;<\/code><\/li>\n<li><code>Serializacja<\/code>: <code>&quot;JSON&quot;<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Mo\u017cemy zobaczy\u0107 wyniki w Visual Trace:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway w InterSystems IRIS\" src=\"\/wp-content\/uploads\/2020\/02\/713bcade8cb1018f2974cba2cab712b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I je\u015bli ta warto\u015b\u0107 b\u0119dzie potrzebna w BP, mo\u017cna j\u0105 uzyska\u0107 w ten spos\u00f3b: <code>callresponse.Variables.GetAt(&quot;corrmat&quot;)<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh-1\">Przesy\u0142anie danych<\/h3>\n<p><\/p>\n<p>Nast\u0119pnie om\u00f3wimy przesy\u0142anie danych z InterSystems IRIS do Pythona, wszystkie \u017c\u0105dania przesy\u0142ania danych wdra\u017caj\u0105 interfejs <code>isc.py.msg.DataRequest<\/code>, kt\u00f3ry zapewnia nast\u0119puj\u0105ce atrybuty:<\/p>\n<p><\/p>\n<ul>\n<li><code>Variable<\/code> \u2014 zmienna Pythona, do kt\u00f3rej zapisywane s\u0105 dane.<\/li>\n<li><code>Type<\/code> \u2014 typ zmiennej: <code>dataframe<\/code> (pandas dataframe) lub <code>list<\/code>.<\/li>\n<li><code>Namespace<\/code> \u2014 obszar, z kt\u00f3rego uzyskujemy dane. Pakiet <code>isc.py<\/code> musi by\u0107 dost\u0119pny w tym obszarze. Mo\u017ce to by\u0107 obszar bez wsparcia produkt\u00f3w.<\/li>\n<\/ul>\n<p><\/p>\n<p>Na podstawie tego interfejsu zrealizowano 4 klasy \u017c\u0105da\u0144:<\/p>\n<p><\/p>\n<ul>\n<li><code>isc.py.msg.QueryRequest<\/code> \u2014 ustaw atrybut <code>Query<\/code> do przesy\u0142ania zapytania SQL.<\/li>\n<li><code>isc.py.msg.ClassRequest<\/code> \u2014 ustaw atrybut <code>Class<\/code> do przesy\u0142ania danych klasy.<\/li>\n<li><code>isc.py.msg.TableRequest<\/code> \u2014 ustaw atrybut <code>Tabela<\/code> do przesy\u0142ania danych tabeli.<\/li>\n<li><code>isc.py.msg.GlobalRequest<\/code> \u2014 ustaw atrybut <code>Global<\/code> do przesy\u0142ania danych globalnych.<\/li>\n<\/ul>\n<p><\/p>\n<p>W procesie testowym sprawd\u017a aktywno\u015b\u0107 <code>RAW<\/code>, gdzie <code>isc.py.msg.QueryRequest<\/code> pokazane w akcji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway w 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\">Zapis \/ przywracanie kontekstu Pythona<\/h3>\n<p><\/p>\n<p>Na koniec mo\u017cemy zapisa\u0107 kontekst Pythona w InterSystems IRIS, aby to zrobi\u0107, wy\u015blemy <code>isc.py.msg.SaveRequest<\/code> z argumentami:<\/p>\n<p><\/p>\n<ul>\n<li><code>Mask<\/code> \u2014 Zapisane zostan\u0105 tylko zmienne, kt\u00f3re odpowiadaj\u0105 masce. Obs\u0142ugiwane <code>*<\/code> i <code>?<\/code>. Przyk\u0142ad: <code>&quot;Data*, Figure?&quot;<\/code>. Domy\u015blnie <code>*<\/code>.<\/li>\n<li><code>MaxLength<\/code> \u2014 Maksymalna d\u0142ugo\u015b\u0107 przechowywanej zmiennej. Je\u015bli serializacja zmiennej b\u0119dzie d\u0142u\u017csza, zostanie zignorowana. Ustaw 0, aby uzyska\u0107 zmienne dowolnej d\u0142ugo\u015bci. Domy\u015blnie <code>$$$MaxStringLength<\/code>.<\/li>\n<li><code>Nazwa<\/code> \u2014 Nazwa kontekstu (opcjonalnie).<\/li>\n<li><code>Opis<\/code> \u2014 Opis kontekstu (opcjonalnie).<\/li>\n<\/ul>\n<p><\/p>\n<p>Zwraca <code>Ens.StringResponse<\/code> z <code>Id<\/code> przechowywanego kontekstu. W procesie testowym sprawd\u017a aktywno\u015b\u0107 <code>Zapisz kontekst<\/code>.<\/p>\n<p><\/p>\n<p>Odpowiednie zapytanie <code>isc.py.msg.RestoreRequest<\/code> \u0142aduje kontekst z InterSystems IRIS do Pythona:<\/p>\n<p><\/p>\n<ul>\n<li><code>ContextId<\/code> \u2014 identyfikator kontekstu.<\/li>\n<li><code>Wyczy\u015b\u0107<\/code> \u2014 wyczy\u015b\u0107 kontekst przed przywr\u00f3ceniem.<\/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 to aplikacja internetowa z otwartym \u017ar\u00f3d\u0142em, kt\u00f3ra pozwala tworzy\u0107 notatniki zawieraj\u0105ce kod, wizualizacje i tekst oraz publikowa\u0107 je. Python Gateway pozwala przegl\u0105da\u0107 i edytowa\u0107 procesy BPL w formie Jupyter Notebook. Zwr\u00f3\u0107 uwag\u0119, \u017ce obecnie u\u017cywany jest standardowy executor Pythona 3.<\/p>\n<p><\/p>\n<p>To rozszerzenie zak\u0142ada, \u017ce adnotacje zawieraj\u0105 kod Pythona i wykorzystuj\u0105 nazwy aktywno\u015bci jako wcze\u015bniejsze nag\u0142\u00f3wki. Teraz mo\u017cliwe jest rozwijanie proces\u00f3w biznesowych PythonGateway w Jupyter Notebook. Oto co jest mo\u017cliwe: <\/p>\n<p><\/p>\n<ul>\n<li>Tworzy\u0107 nowe procesy biznesowe<\/li>\n<li>Usuwa\u0107 procesy biznesowe<\/li>\n<li>Tworzy\u0107 nowe aktywno\u015bci<\/li>\n<li>Modyfikowa\u0107 aktywno\u015bci<\/li>\n<li>Usuwa\u0107 aktywno\u015bci<\/li>\n<\/ul>\n<p><\/p>\n<p>Oto <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/mZizgVtZ014\">film demo<\/a><\/noindex>. I kilka zrzut\u00f3w ekranu:<\/p>\n<p><\/p>\n<h2 id=\"provodnik-processov\">Eksplorator proces\u00f3w<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway w 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\">Edytor procesu<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Python Gateway w 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\">Instalacja<\/h2>\n<p><\/p>\n<ol>\n<li>Potrzebujesz InterSystems IRIS 2019.2+.<\/li>\n<li>Zainstaluj PythonGateway v0.8+ (wymagane tylko <code>isc.py.util.Jupyter<\/code>, <code>isc.py.util.JupyterCheckpoints<\/code> i <code>isc.py.ens.ProcessUtils<\/code>).<\/li>\n<li>Zaktualizuj kod ObjectScript z repozytorium.<\/li>\n<li>Wykonaj <code>do ##class(isc.py.util.Jupyter).Install()<\/code> i post\u0119puj zgodnie z instrukcjami.<\/li>\n<\/ol>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-community\/PythonGateway\/tree\/master\/jupyter\">Dokumentacja<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h1 id=\"vyvody\">Wnioski<\/h1>\n<p><\/p>\n<p>MLToolkit to zestaw narz\u0119dzi maj\u0105cy na celu integracj\u0119 modeli i \u015brodowiska transakcyjnego, aby stworzone modele mo\u017cna by\u0142o \u0142atwo wykorzystywa\u0107 bezpo\u015brednio w twoich procesach biznesowych. Python Gateway jest cz\u0119\u015bci\u0105 MLToolkit i zapewnia integracj\u0119 z j\u0119zykiem Python, umo\u017cliwiaj\u0105c orkiestracj\u0119 wszelkich algorytm\u00f3w uczenia maszynowego tworzonych w j\u0119zyku Python (g\u0142\u00f3wne \u015brodowisko dla wielu naukowc\u00f3w danych), a tak\u017ce korzystanie z licznych gotowych bibliotek do szybkiego tworzenia adaptacyjnych, zrobotyzowanych rozwi\u0105za\u0144 analitycznych AI\/ML na platformie InterSystems IRIS.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Linki<\/h1>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/473452\/\">Poprzedni artyku\u0142<\/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\">Przyk\u0142ady 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\">Dokumentacja i kursy dotycz\u0105ce Pythona<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"mltoolkit\">MLToolkit<\/h1>\n<p><\/p>\n<p>Grupa u\u017cytkownik\u00f3w MLToolkit to prywatne repozytorium GitHub, utworzone w ramach korporacyjnej organizacji GitHub InterSystems. Jest skierowana do zewn\u0119trznych u\u017cytkownik\u00f3w, kt\u00f3rzy instaluj\u0105, badaj\u0105 lub ju\u017c korzystaj\u0105 z komponent\u00f3w MLToolkit, w tym Python Gateway. W grupie dost\u0119pny jest szereg zrealizowanych przypadk\u00f3w (z kodem \u017ar\u00f3d\u0142owym i danymi testowymi) w obszarach marketingu, produkcji, medycyny i wielu innych bran\u017c. Aby do\u0142\u0105czy\u0107 do grupy u\u017cytkownik\u00f3w ML Toolkit, prosimy o wys\u0142anie kr\u00f3tkiej wiadomo\u015bci e-mail na adres: <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> i podanie w swoim li\u015bcie nast\u0119puj\u0105cych danych:<\/p>\n<p><\/p>\n<ul>\n<li>Nazwa u\u017cytkownika GitHub<\/li>\n<li>Organizacja (w kt\u00f3rej pracujesz lub si\u0119 uczysz)<\/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>Kraj<\/li>\n<\/ul>\n<p><\/p>\n<p>Osobom, kt\u00f3re przeczyta\u0142y artyku\u0142 i s\u0105 zainteresowane mo\u017cliwo\u015bciami InterSystems IRIS jako platformy dla rozwoju lub hostingowych mechanizm\u00f3w sztucznej inteligencji i uczenia maszynowego, proponujemy om\u00f3wienie mo\u017cliwych scenariuszy, kt\u00f3re mog\u0105 by\u0107 interesuj\u0105ce dla twojego przedsi\u0119biorstwa. Ch\u0119tnie przeanalizujemy potrzeby twojego przedsi\u0119biorstwa i wsp\u00f3lnie okre\u015blimy plan dzia\u0142ania; adres e-mail naszej ekspertnej grupy AI\/ML to: <noindex><a rel=\"nofollow\" href=\"mailto:MLToolkit@intersystems.com\">MLToolkit@intersystems.com<\/a><\/noindex>.<\/p>\n<p>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/blog\/python-gateway-v-intersystems-iris\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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 w InterSystems IRIS | ProHoster","description":"Niniejszy artyku\u0142 po\u015bwi\u0119cony jest Python Gateway \u2014 projektowi spo\u0142eczno\u015bciowemu z otwartym kodem \u017ar\u00f3d\u0142owym dla platformy danych InterSystems IRIS.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/python-gateway-v-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/41221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=41221"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/41221\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/41222"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=41221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=41221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=41221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}