#Python

0 Seguidores · 129 Publicaciones

Python es un lenguaje de programación interpretado de alto nivel para propósitos generales de programación. Creado por Guido van Rossum y publicado por primera vez en 1991, Python tiene una filosofía de diseño que hace hincapié en la legibilidad del código, en particular mediante el uso significativo de espacios en blanco.

Sitio oficial.

InterSystems Python Binding Documentatión.

Anuncio Esther Sanchez · jun 22, 2022

¡Hola Comunidad!

Os invitamos a participar en la tercera edición del Concurso de Artículos Técnicos en Inglés:

🐍 Concurso de Artículos Técnicos de InterSystems en Inglés: Edición Python 🐍

Escribe un artículo en inglés sobre cualquier tema relacionado con el uso de Python con las tecnologías de InterSystems.

🗓️ Duración: del 20 de junio al 31 de julio - ¡ampliado!

🎁 Premios para todos los participantes: Todas las personas que publiquen un artículo en inglés durante la vigencia del concurso recibirán un premio

🏆 Premios principales: Auriculares inalámbricos Apple AirPods Max; Reloj inteligente Apple Watch SE; Altavoz inteligente Apple HomePod mini / Lápiz inteligente Apple Pencil 

 

3
0 189
Artículo Ricardo Paiva · jun 24, 2021 6m read

Publicación Original por: Anton Umnikov
Arquitecto Senior de soluciones en la nube en InterSystems
AWS CSAA, GCP CACE

AWS Glue es un proceso ETL (extraer, transformar y cargar) completamente gestionado, que hace sencillo y rentable clasificar los datos, limpiarlos, enriquecerlos y moverlos de forma fiable entre diferentes almacenes de datos.

En el caso de InterSystems IRIS, AWS Glue permite mover grandes cantidades de datos a IRIS desde fuentes de datos tanto en la nube como en las propias instalaciones (on-premise). Las fuentes de datos potenciales incluyen, pero no se limitan a, bases de datos on-prem, archivos CSV, JSON, Parquet y Avro que residen en buckets S3, bases de datos nativas en la nube como AWS Redshift y Aurora, y muchas otras.

Este artículo asume que tienes un conocimiento básico de AWS Glue, al menos en el nivel para completar los Tutoriales de introducción a AWS Glue . Nos centraremos en los aspectos técnicos de la configuración de los trabajos (Jobs) en AWS Glue para utilizar InterSystems IRIS como Datos Objetivo, o en otros términos, "receptor de datos".

Imagen de https://docs.aws.amazon.com/glue/latest/dg/components-key-concepts.html
 

Los Trabajos en AWS Glue se ejecutan "sin servidor". Todos los recursos necesarios para realizar el trabajo son suministrados de forma dinámica por AWS solo durante el tiempo en que el trabajo se ejecuta realmente; y se destruyen en el momento en que el trabajo se completa. Por eso, en lugar de provisionar, gestionar e incurrir en costes continuos por la infraestructura necesaria, se te factura solo por el tiempo en que el trabajo realmente se ejecuta y puedes dedicar tus esfuerzos a escribir el código del Trabajo. Durante el tiempo de "inactividad" no se consumen recursos, salvo los buckets S3, que almacenan el código del Trabajo y la configuración.

Aunque hay varias opciones disponibles, normalmente los Trabajos en Glue se ejecutan con un suministro dinámico en Apache Spark y se escriben en código PySpark. El Trabajo en Glue contiene la sección _"Extraer"_ (donde los datos se extraen de las fuentes de datos), una serie de _"Transformaciones"_ (construidas utilizando la API de Glue) y finalmente la parte _"Cargar"_ o _"receptor"_, en la que después de la transformación final los datos se escriben en el sistema objetivo.

Para permitir que AWS Glue interactúe con IRIS necesitamos asegurar lo siguiente:

  • Glue tiene acceso a la red de las instancias IRIS involucradas
  • El archivo JAR del controlador JDBC de IRIS es accesible para el Trabajo en Glue
  • El Trabajo en Glue utiliza la API compatible con InterSystems IRIS JDBC

Examinemos cada uno de los pasos necesarios.

Crear una conexión a IRIS

En la consola AWS, selecciona AWS Glue->Connections->Add Connection

Introduce el nombre de tu conexión y selecciona "JDBC" como Tipo de Conexión.

En la URL de JDBC introduce la cadena de conexión JDBC para tu instancia de IRIS, el nombre de usuario y la contraseña.

El siguiente paso es crucial, necesitas asegurarte de que Glue coloca sus endpoints en el mismo VPC que tu instancia de IRIS. Selecciona la VPC y la Subred de tu instancia de IRIS. Cualquier grupo de seguridad con una regla de entrada de autorreferencias para todos los puertos TCP se ejecutaría aquí. Por ejemplo, el grupo de seguridad de tu instancia de IRIS.

Rol de IAM con acceso al controlador JDBC

Si aún no lo has hecho, carga el archivo JAR del controlador JDBC de IRIS intersystems-jdbc-3.0.0.jar en el bucket S3. En este ejemplo, estoy usando el bucket s3://irisdistr. Sería distinto para tu cuenta.

Necesitas crear un rol de IAM para tu Trabajo en Glue, que pueda acceder a ese archivo, junto con otros buckets S3 que Glue utilizaría para almacenar scripts, registros, etc.

Asegúrate de que tiene acceso de lectura al bucket de tu controlador JDBC. En este caso, concedemos a esta función (GlueJobRole) acceso de solo lectura (ReadOnly) a todos los buckets, junto con el AWSGlueServiceRole predefinido. Puedes elegir limitar aún más los permisos de este rol.

Crear y configurar el Trabajo en Glue

Crear un nuevo Trabajo en Glue. Selecciona el rol de IAM, que creamos en el paso anterior. Deja todo lo demás de forma predeterminada.

En "Security configuration, script libraries, y job parameters (optional)" establece en "Dependent jars path" la ubicación del intersystems-jdbc-3.0.0.jar  en el bucket S3.

 

Para la fuente: utiliza una de tus fuentes de datos preexistentes. Si seguiste los tutoriales mencionados más arriba, ya tendrás al menos una.

Utiliza la opción "Create tables in your data target" y selecciona la conexión IRIS que has creado en el paso anterior. Deja todo lo demás de forma predeterminada.

Si nos has seguido hasta ahora, deberías llegar a una pantalla similar a esta:

 

¡Ya queda poco! Solo necesitamos hacer un sencillo cambio en el script para cargar datos en IRIS.

Cómo ajustar el script

El script que Glue generó para nosotros utiliza AWS Glue Dynamic Frame, extensión propietaria de AWS para Spark. Aunque ofrece algunos beneficios para los trabajos de ETL, también garantiza que no puedes escribir datos en ninguna base de datos para la que AWS no haya administrado la oferta de servicios.

Buenas noticias- en el momento de escribir los datos en la base de datos ya no son necesarios todos los beneficios de Dynamic Dataframe, como no aplicación de esquema para los datos "sucios" (en el momento de escribir los datos se supone que están "limpios") y podemos convertir fácilmente Dynamic Dataframe a un Dataframe nativo en Spark que no está limitado a los objetivos administrados por AWS y puede trabajar con IRIS.

Así que la línea que necesitamos cambiar es la línea 40 de la imagen más arriba. Un último consejo.

Este es el cambio que necesitamos hacer:

#datasink4 = glueContext.write_dynamic_frame.from_jdbc_conf(frame = dropnullfields3, catalog_connection = "IRIS1", connection_options = {"dbtable": "elb_logs", "database": "USER"}, transformation_ctx = "datasink4")
dropnullfields3.toDF().write \
    .format("jdbc") \
    .option("url", "jdbc:IRIS://172.30.0.196:51773/USER/") \
    .option("dbtable", "orders") \
    .option("user", irisUsername) \
    .option("password", irisPassword) \
    .option("isolationlevel","NONE") \
    .save()

Donde irisUsername e irisPassword son el nombre de usuario y las contraseñas para tu conexión JDBC en IRIS.

Nota: almacenar las contraseñas en el código fuente NO es conveniente. Te animamos a utilizar herramientas como AWS Secrets Manager para ello, pero entrar en este nivel de detalles de seguridad está más allá del alcance de este artículo. Este es un buen artículo sobre el uso de AWS Secrets Manager en AWS Glue.

Ahora pulsa el botón "Run Job", siéntate y relájate mientras AWS Glue efectúa el proceso ETL por ti.

Bueno... lo más probable es que cometas algunos errores al principio... Todos sabemos cómo funciona. Una errata por aquí, un puerto equivocado en el grupo de seguridad por allí... AWS Glue utiliza CloudWhatch para almacenar todos los registros de ejecución y de errores. Busca grupos de registro en: /aws-glue/jobs/error y _ /aws-glue/jobs/output_, para identificar lo que salió mal.

¡Disfruta de la programación de los procesos ETL en la nube!

1
0 495
Artículo Kurro Lopez · jul 10, 2022 1m read

Durante mucho tiempo hemos estado usando una utilidad en producción para exportar el resultado de una consulta a una hoja de cálculo Excel. Además, hemos hecho una modificación en ella, en la que la configuración explícita de los formatos de las columnas es una prioridad.

Esta utilidad usaba el módulo %SYS.ZENReportExcelExporter y se basa en un programa java. Todos los años el informe crecía y no había suficiente memoria RAM en java, por lo que teníamos que aumentar el valor de la variable entorno. El valor ha alcanzado los 7gb y se ha convertido en un problema.

Así que decidimos buscar y crear un sustituto de la utilidad. Obviamente, busqué en python y la librería openxl.

Formando parte del Programa de Acceso Preferente a Python Embebido, implementé un pequeño ejemplo y lo publiqué en OpenExchange. Os invito a todos los que queráis participar en el desarrollo de la funcionalidad.

Estad atentos a la versión final y puesta en producción.

0
0 199
Artículo Muhammad Waseem · jun 14, 2022 2m read

Esta es una comparación creada en Python y Objectscript en InterSystems IRIS.

El objetivo es comparar la velocidad para enviar y recibir mil solicitudes/mensajes desde un BP a un BO en Python y en Objectscript.

Consultar https://github.com/LucasEnard/benchmark-python-objectscript para más información.

IMPORTANTE : Aquí están los resultados del tiempo en segundos, para enviar 1000 mensajes de ida y vuelta desde un bp a un bo usando Python, Graph Objectscript y Objectscript.

Los mensajes de cadena se componen de diez variables de cadena.

Los mensajes de objeto se componen de diez variables de objeto, cada objeto como su propio int, float, str y List(str).

Cadenas de mensajesTiempo (segundos) para 1000 mensajes de ida y vuelta
Python BP1.8
BPL1.8
ObjectScript1.4
Objetos de mensajesTiempo (segundos) para 1000 mensajes de ida y vuelta
Python BP3.2
BPL2.1
ObjectScript1.8

La función en la fila tiene x veces el tiempo de la función en la columna:

Cadenas de mensajesPythonBPLObjectScript
Python111.3
BPL111.3
ObjectScript0.760.761

Por ejemplo, la primera fila nos dice que el tiempo de cadena de Python es 1 vez el tiempo de la función de cadena de gráficos de Objectscript y 1,3 veces el tiempo de la función de cadena de Objectscript.
(gracias a la primera tabla podemos verificar nuestros resultados:
1.3 * 1.4 = 1.8
1.3 es la x en la tabla en la última columna de la primera fila, 1.4s es el tiempo para los mensajes de cadena en Objectscript vistos en la primera tabla de esta sección y 1.8s es de hecho el tiempo para los mensajes de cadena en python que podemos encontrar buscando en la primera tabla de esta sección o mediante el cálculo como se mostró antes).

Tenemos la función en la fila que tiene x veces el tiempo de la función en la columna:

Cadenas de mensajesPythonBPLObjectScript
Python11.51.8
BPL0.6611.2
ObjectScript0.550.831
0
0 91
Artículo Muhammad Waseem · abr 18, 2022 2m read

Antecedentes

En las versiones de InterSystems IRIS >=2021.2 podemos usar irispython para escribir directamente código python encima de nuestras instancias IRIS. Esto nos permite usar paquetes de python, llamar a métodos, hacer consultas SQL y hacer casi cualquier cosa en Objectscript excepto pythonic.

Por ejemplo, a continuación compruebo si hay un namespace:

#!/usr/irissys/bin/irispython
import iris
# call arbitrary class methods
result = iris.cls('%SYS.Namespace').Exists('USER')
if result == 1:
    print(f"Namespace USER is present")

Pero, ¿qué pasa si mi método en IRIS tiene parámetros especiales como Output y ByRef? ¿Cómo podemos usar los parámetros de Salida en irispython?

Por ejemplo, Ens.Director tiene muchos parámetros de salida en sus métodos, ¿cómo puedo usar estos parámetros en python?

Ens.Director:GetProductionStatus

// Un código auxiliar de método de ejemplo de Ens.Director
ClassMethod GetProductionStatus(Output pProductionName As %String, Output pState As %Integer...

Probando los métodos de variables normales

A primera vista, puedes intentar lo siguiente:

import os
# Establecer el namespace de forma manual
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'

import iris

# PRUEBA 1 con variables de salida
productionName, productionState = None, None
status = iris.cls('Ens.Director').GetProductionStatus(productionName, productionState) 

print("Success? -- {}".format(productionState != None))

¡Pero ambas pruebas no devolverán las variables de salida! Puedes probar esto por ti mismo en cualquier namespace de Ensemble

Usando iris.ref

La utilidad irispython iris.ref se puede utilizar para capturar las variables Output y ByRef.

  1. Crea un objeto iris.ref()
  2. Llama a tu Método ObjectScript
  3. Utiliza la variable .value para obtener el resultado de ese parámetro
import os
# Establecer el namespace de la manera difícil
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'

import iris

# PRUEBA 2 con variables de salida
productionName, productionState = iris.ref('productionName'), iris.ref('productionState')
status = iris.cls('Ens.Director').GetProductionStatus(productionName, productionState) 

print("Status: {}".format(status))
# see .value
print("Production: {}".format(productionName.value))
# see .value
print("Production State: {}".format(productionState.value))

image

0
0 192
Artículo Muhammad Waseem · abr 6, 2022 7m read

¡Hola Comunidad!

Esta publicación es una introducción a mi aplicación iris-globals-graphDB en Open Exchange.

En este artículo, mostraré cómo guardar y recuperar Graph Data en InterSystems Globals con la ayuda del frameworkPython Flask Web y la librería PYVIS Interactive network visualizations.

Recomendación

Paso 1: Establecer conexión con IRIS Globals mediante el SDK nativo de Python

0
0 203
Anuncio Esther Sanchez · mar 31, 2022

¡Hola Comunidad!

Hemos grabado el webinar que hicimos ayer y lo hemos subido al canal de YouTube de la Comunidad de Desarrolladores en español. Si os perdisteis el webinar o lo queréis volver a ver con más detalle, ya está disponible la grabación!

Eduardo Anglada mostró toda la potencia de Python, el nuevo lenguaje de programación añadido a IRIS. Explicó cómo crear datos anónimos, desarrollar cuadros de mando interactivos... ¡y muchas cosas más! Por eso, si queréis conocer la nueva funcionalidad de InterSystems IRIS, ¡no os perdáis el vídeo!

Explorando las nuevas funcionalidades de IRIS: Python Embebido

0
0 146
Artículo Muhammad Waseem · mar 10, 2022 5m read

¡Hola Comunidad!

Esta publicación es una introducción a mi aplicación iris-python-apps, disponible en Open Exchange y creada usando Embedded Python y Python Flask Web Framework. La aplicación muestra algunas de las funcionalidades de Python, como la ciencia de datos, el trazado de datos, la visualización de datos y la generación de códigos QR.

image

Características

  •  Cuadro de mando de IRIS de arranque responsive

  •  Vista de los detalles del cuadro de mando junto con el registro de eventos de interoperabilidad y los mensajes

  •  Uso del trazado de Python desde IRIS

  •  Uso de Jupyter Notebook

  •  Introducción a la ciencia de datos, trazado de datos y visualización de datos

  • Generación de código QR desde Python

0
1 1651
Anuncio Dmitry Maslennikov · mar 4, 2022

Creo que es por todos conocido que Populate Utility es bastante simple y para muchos casos puede tener una funcionalidad limitada. Solo admite un lenguaje y un país. La lista de valores posibles no tiene muchas opciones. 

Hay un tipo de herramienta que puede ayudar con esto, se llama Faker. Se puede implementar en distintos lenguajes, incluido Python. Como IRIS ahora tiene la funcionalidad de Python Embebido (Embedded Python), Python faker se puede implementar en IRIS.

0
0 197
Artículo Nigel Salm · feb 4, 2022 3m read

Acabo de exponer este tema en Global Masters: "IRIS Cheatsheets". IRIS ha introducido muchas funciones nuevas, especialmente en los lenguajes de programación, la compatibilidad con FHIR R4, las herramientas de interoperabilidad mejoradas e IRIS Analytics. Después trabajar 35 años en PC's y portátiles con Windows, sorprendentemente tengo poco conocimiento sobre Linux, Docker y Git. Es más, he escrito casi todas las aplicaciones e interfaces en ObjectScript con pizcas de SQL, .Net y Java Gateways y los conocimientos más básicos de WinSCP, Putty y SSH.

Todo cambió cuando recibí mi primera Raspberry Pi. Primero, tuve que elegir un sistema operativo para escribir en la tarjeta de memoria Micro SD. Las Raspberry Pi tienen su propio sistema operativo, pero a menos que quiera limitarme a ejecutar mis instancias de IRIS, IRIS for Health, Report Server y Ensemble en contenedores Docker, necesitaba escoger un sistema operativo que sea una plataforma compatible con IRIS. Después de investigar mis opciones mediante búsquedas en Google, fue evidente que no era una buena opción tener Windows en la Raspberry Pi, así que rápidamente lo borré de mi lista. Casualmente el primero de mis Raspberry Pi será el controlador de mi primer kit de robot Adeept (PiCar Pro). Me incorporé a STEM. STEM es un modelo educativo para introducir a gente desde 5 años en el mundo de la ingeniería y la programación. STEM son las siglas en inglés de Ciencia, Tecnología, Ingeniería y Matemáticas, y es el modelo predominante que utilizan los fabricantes de Arduino, Adeept, Lego y otros kits de robots. El lenguaje de programación que se utiliza en todas estas implementaciones de STEM es Python. Qué alegría. Python me fascinó desde el momento que me enteré que se implementaría como Lenguaje de programación nativo en IRIS. Desde muy joven, mi asignatura favorita eran las matemáticas, por lo que la introducción de Python, R y Julia en el mundo de IRIS me llenó de emoción.

Descubrí que todos estos lenguajes tienen una gran afinidad con Ubuntu de Linux, una plataforma muy popular para las implementaciones de IRIS. Mejor dicho, es la única plataforma compatible con ARM64, la tecnología que se utiliza en la Raspberry Pi. Así que Ubuntu era claramente la ruta que debía seguir. La siguiente decisión que debía tomar era qué implementación de Ubuntu quería utilizar. Hay tres opciones: Desktop, Server y Core. Se recomienda Ubuntu Server, ya que incluye una garantía de soporte por 5 años. Se interactua con Ubuntu Server proporcionando instrucciones y comandos desde un terminal. Ubuntu Core es una versión inferior de Server y es ideal como base para un contenedor Docker. Siendo novato en Ubuntu, me decidí por Ubuntu Desktop, y encendí mi Pi por primera vez, me encontré con una Interfaz gráfica en el escritorio muy familiar. Además, enseguida descubrí que todas las aplicaciones que utilizo cada día en Windows tienen equivalentes en Ubuntu. En poco tiempo ya tenía instalados Docker, Putty, Git y muchas otras aplicaciones y, lo más satisfactorio de todo, Visual Studio Code.

Dado que de pronto me encontré con tantas tecnologías nuevas con las que trabajar, empecé a buscar documentación sobre todos estos temas y, por supuesto, hay una enorme cantidad de material. La dificultad está en saber qué libro, preguntas frecuentes, video o aplicación de aprendizaje elegir. Mientras recorría página tras página de búsquedas en Google, los documentos que más atrajeron mi atención fueron los Cheatsheets o Guías Rápidas. Consulta mi reto en Global Masters para obtener más información sobre los Cheatsheets. Hay una Guía Rápida sobre la que quería llamar vuestra atención, una que particularmente me impresionó. Es un PDF llamado "Python-cheat-sheet-April-2021".

También descubrí que varios miembros de la Comunidad de Desarrolladores me ayudaron con las preguntas que tenía sobre Raspberry Pi, Ubuntu y Docker. Estoy deseando pasar más tiempo con ellos para acelerar mi formación en estos temas.

0
0 145
Artículo Pierre-Yves Duquesnoy · ene 5, 2022 1m read

Esta serie de artículos describe el uso del Python Gateway para InterSystems. Ejecuta el código de Python y mucho más desde InterSystems IRIS. Este proyecto te trae toda la potencia de Python directamente a tu entorno InterSystems IRIS:

  • Ejecuta cualquier código de Python
  • Transfiere datos de forma transparente desde InterSystems IRIS a Python
  • Crea procesos empresariales de interoperabilidad inteligentes, con el Adaptador de interoperabilidad de Python
  • Guarda, examina, modifica y restaura el contexto de Python desde InterSystems IRIS
# Otros artículos

El plan para la serie hasta el momento es el siguiente (sujeto a cambios):

  • Parte I: Resumen, entorno e introducción
  • Parte II: Instalación y resolución de problemas <-- estamos aquí
  • Parte III: Funcionalidades básicas
  • Parte IV: Adaptador de interoperabilidad
  • Parte V: Cómo ejecutar una función
  • Parte VI: Jupyter Notebook
  • Parte VII: Soporte a Jupyter

Instalación

Este artículo te ayudará a instalar el Python Gateway. Hay varias formas de instalarlo y utilizarlo:

  • Host
  • Windows
  • Linux
  • Mac
  • Docker
  • Extrae la imagen prediseñada
  • Crea tu propia imagen

Independientemente del método que utilices para la instalación, necesitarás el código. El único sitio donde se puede descargar es en la página de actualizaciones, que contiene versiones estables probadas. Coge siempre la más reciente. No clones/descargues el repositorio, descarga la última versión.

Host

Si instalas Python Gateway en el sistema operativo del host, primero (independientemente del sistema operativo) debes instalar Python.

  1. Instala Python 3.6.7 64 bits. Se recomienda instalar Python en la ubicación predeterminada.
  2. Instala el módulo dill: pip install dill.
  3. Carga el código ObjectScript (es decir, ejecutar $system.OBJ.ImportDir("C:\InterSystems\Repos\Python\isc\py\", "*.cls", "c",,1)) en el namespace Production (Ensemble-enabled). En caso de que quieras habilitar Production en la llamada del namespace: escribe ##class(%EnsembleMgr).EnableNamespace($Namespace, 1).
  4. Sitúa callout DLL/SO/DYLIB en la carpeta bin en la que está instalado InterSystems IRIS. El archivo de la librería se debe colocar en una ruta que devuelve write ##class(isc.py.Callout).GetLib().

Windows

  1. Revisa que tu variable de entorno PYTHONHOME señala a Python 3.6.7.
  2. Verifica que tu variable de entorno SYSTEM PATH incluye la variable PYTHONHOME (o el directorio al que señala).

Linux

  1. Comprueba que tu variable de entorno SYSTEM PATH incluye /usr/lib y /usr/lib/x86_64-linux-gnu, preferiblemente al principio. Utiliza el archivo /etc/environment para establecer las variables de entorno.
  2. En caso de error, consulta la sección Troubleshooting (Resolución de problemas) undefined symbol: _Py_TrueStruct y especifica la propiedad PythonLib.

Mac

  1. Por el momento, solo está soportada la versión python 3.6.7 de Python.org. Comprueba la variable PATH.

Si modificaste las variables de entorno, reinicia tu producto de InterSystems.

Docker

Hay muchas ventajas en utilizar contenedores:

  • Portabilidad
  • Eficiencia
  • Aislamiento
  • Diseño ligero
  • Inmutabilidad

Consulta esta serie de artículos para obtener más información sobre Docker.

Todas las creaciones de Docker para Python Gateway se basan en contenedores 2019.1.

Cómo extraer la imagen prediseñada

Ejecuta: docker run -d -p 52773:52773 --name irispy intersystemscommunity/irispy:latest para extraer y ejecutar Python Gateway sobre InterSystems IRIS Community Edition. Eso es todo.

Crea tu propia imagen

Para crear la imagen de Docker, ejecuta en el repositorio raíz: <code>docker build --force-rm --tag intersystemscommunity/irispy:latest .

De forma predeterminada, la imagen se crea a partir de la imagen intersystems/iris:2019.1.0.510.0-1. Sin embargo, se puede cambiar si se proporciona la variable <0>IMAGE.

Si quieres crearla desde InterSystems IRIS Community Edition, ejecuta: docker build --build-arg IMAGE=store/intersystems/iris:2019.1.0.510.0-community --force-rm --tag intersystemscommunity/irispy:latest.

Después, puedes ejecutar tu imagen de Docker:

docker run -d \
  -p 52773:52773 \
  -v /<HOST-DIR-WITH-iris.key>/:/mount \
  --name irispy \
  intersystemscommunity/irispy:latest \
  --key /mount/iris.key

Si estás ejecutando una imagen basada en InterSystems IRIS Community Edition, puedes omitir el proporcionar la clave.

Notas de Docker

Información sobre Docker:

  • El proceso de prueba isc.py.test.Process guarda la image artifact en el directorio temporal. Tal vez quieras cambiar esa ruta a un directorio que ya esté instalado. Para ello, edita la nota correspondiente a la llamada de la Correlation Matrix: Graph, donde se especifica una ruta de archivo válida para la función f.savefig.
  • Para acceder al terminal, ejecuta: docker exec -it irispy sh.
  • Accede al Multiprocesamiento simétrico (SMP) con el usuario/contraseña SuperUser/SYS o Admin/SYS.
  • Para detener el contenedor, ejecuta: docker stop irispy && docker rm --force irispy.

Cómo validar tu instalación

Después de que hayas instalado Python Gateway es hora de comprobar que funciona. Ejecuta este código:

set sc = ##class(isc.py.Callout).Setup() 
set sc = ##class(isc.py.Main).SimpleString("x='HELLO'", "x", , .var)
write var

La salida debería ser HELLO - valor de la variable x de Python. En caso de que el estado de respuesta/devolución sea un error o que var esté vacío, consulta la sección de resolución de problemas del archivo Readme.

Conclusión

La instalación de Python Gateway es rápida y sencilla. Si estás familiarizado con Docker, coge la última imagen. Si no, hay paquetes para los principales sistemas operativos de InterSystems IRIS: Windows, Linux y Mac. En el siguiente artículo comenzaremos a utilizar Python Gateway.

Guía ilustrada

También hay una guía de instalación ilustrada en el grupo de usuarios de ML Toolkit. El grupo de usuarios de ML Toolkit es un repositorio privado de GitHub que se estableció como parte del GitHub corporativo de InterSystems. Está dirigido a los usuarios externos que instalan, aprenden o ya utilizan los componentes del ML Toolkit. Si quieres unirte al grupo de usuarios de ML Toolkit, envía un email a la dirección MLToolkit@intersystems.com e indica los siguientes datos (son necesarios para que los miembros del grupo te puedan conocer e identificar durante los debates):

  • Nombre de usuario de GitHub
  • Nombre completo (tu nombre seguido de tu apellido en caracteres latinos)
  • Organización (para la que trabajas, estudias, o tu oficina en casa)
  • Cargo (tu cargo real en tu empresa, o "Estudiante", o "Independiente")
  • País (en el que resides)
0
0 235
Anuncio Esther Sanchez · nov 25, 2021

¡Hola desarrolladores!

Os traemos la primera ponencia del Virtual Summit 2021, ya disponible en el Canal de YouTube de la Comunidad de Desarrolladores en inglés.

El idioma del vídeo es el inglés y podéis activar los subtítulos en inglés si os resulta más fácil entender el vídeo leyendo el texto. Solo tenéis que hacer clic en el icono de subtítulos abajo:

 

Introducción a Python Embebido (Embedded Python)

0
0 425
Artículo Pablo Frigolett · nov 22, 2021 4m read

Servidor Externo de Lenguaje Python en un contenedor

La primera vez que se intenta iniciar un servidor externo de lenguaje Python (de aquí en adelante Gateway de Python), en la versión en contenedor, intenta ejecutar cierto código para detectar si está instalado el paquete python3-venv.

La imagen que está en containers.intersystems.com:

  • a la fecha de este artículo es la versión 2021.1.0.215.0
  • está basada en Ubuntu 18 LTS
  • viene con python 3.6.9 instalado
0
0 165
Artículo Mathew Lambert · jul 7, 2021 1m read

A veces necesitas importar datos a IRIS de forma rápida y sencilla. Por eso se ha desarrollado un gestor de importación en IRIS.

Esta aplicación permite importar datos en formato JSON y también ofrece una interfaz muy sencilla para transferir datos desde colecciones en MongoDB a globals en IRIS. Nunca ha sido más fácil.

Vamos a ver unos ejemplos.

Importación de JSON

0
0 222
Anuncio Jose-Tomas Salvador · jun 17, 2021

¡Estamos buscando desarrolladores en Python para participar en nuestro programa de acceso preliminar a Python embebido (EAP IRIS Embedded Python)! Si tu, o alguien que conozcas, es un desarrollador en Python y estais interesados, por favor, ponte en contacto con nosotros a través del email que indicamos abajo.

InterSystems está incorporando la potencia y simplicidad de Python a IRIS. Estamos trabajando decididamente para integrar Python en el kernel de IRIS, poniéndose a la par con ObjectScript.

0
0 126
Artículo Jose-Tomas Salvador · mayo 7, 2021 3m read

¡Hola desarrolladores!

Recientemente anunciamos la versión de prueba con Python embebido en InterSystems IRIS - echad un vistazo a este vídeo en inglés de @Robert.Kuszewski.

Python embebido ofrece la posibilidad de cargar y ejecutar el código Python en el servidor de InterSystems IRIS. Podéis utilizar módulos de librerías de Python instalándolos con pip, como NumPy, Pandas, etc., o podéis escribir vuestros propios módulos de Python como archivos .py independientes.

Bien, pero una vez que ya estáis satisfechos con el desarrollo de vuestra solución de Python embebida en IRIS, hay otra cuestión muy importante: cómo desplegar la solución.

Una de las opciones que podéis considerar es utilizar el Administrador de paquetes ZPM, que os voy a describir en este artículo.

Quiero presentaros un repositorio de plantillas que introduce un módulo ZPM desplegable y muestra cómo construirlo.

El ejemplo es muy sencillo y contiene un sample.py, que demuestra el uso de las librerías Pandas y NumPy de python y la clase test.cls de ObjectScript que las llama.

La solución podría instalarse con ZPM de la siguiente forma:

zpm "install iris-python-template"

Nota: aseguraos de que el IRIS en que instaláis el módulo es alguna de las versiones de prueba que ya soportan Python embebido. Por ejemplo, podéis utilizar la imagen: 

intersystemsdc/iris-ml-community:2020.3.0.302.0-zpm

Con los comandos:

docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-ml-community:2020.3.0.302.0-zpm
docker exec -it my-iris iris session IRIS

USER>zpm "install iris-python-template"

[iris-python-template] Reload START

...

[iris-python-template] Activate SUCCESS

  El módulo instala el archivo de python sample.py y el archivo de ejemplo titanic.csv junto con test.cls en el sistema. 

Por ejemplo sample.py expone la función meanage() que acepta la ruta del archivo csv y calcula el valor medio utilizando las bibliotecas NumPy y Pandas.

La clase ObjectScript test.cls carga el módulo de python con la siguiente línea de código:

set tt=##class(%SYS.Python).Import("sample")

luego proporciona la ruta al archivo csv y recoge el resultado de la función.

Así es como podéis probar el módulo instalado:

USER>d ##class(dc.python.test).Today()
2021-02-09
USER>d ##class(dc.python.test).TitanicMeanAge()
mean age=29.69911764705882
USER>

¡Muy bien! Lo siguiente es: ¿cómo desplegar los módulos de Python embebidos?

Podéis añadir la siguiente línea a module.xml:

<FileCopy Name="python/" Target="${mgrdir}python/"/>

la línea copia todos los archivos de Python desde la carpeta de Python del repositorio a la carpeta de Python dentro de la carpeta /mgr en la instalación de IRIS.

Esto permite importar los módulos de Python desde ObjectScript a través del método ##class(%SYS.Python).Import().

Además, si queréis que los archivos de datos se empaqueten en el módulo ZPM, comprobad otra línea FileCopy en el módulo que importa la carpeta data desde el repositorio junto con titanic.csv en el paquete:

<FileCopy Name="data/" Target="${mgrdir}data/"/>

¡Y eso es todo!

¡No dudéis en utilizar la plantilla como base para vuestros proyectos con Python embebido para IRIS!

¡Cualquier pregunta o comentario será bienvenido!

0
0 230
Artículo Jose-Tomas Salvador · abr 20, 2021 9m read

Palabras clave: Python, JDBC, SQL, IRIS, Jupyter Notebook, Pandas, Numpy y aprendizaje automático 

Hoy me he encontrado con este artículo de Zphong Li, que publicó en Enero de 2020 pero que creo que es muy interesante y aún útil a día de hoy. Así que... para los que estéis haciendo vuestros primeros pinitos en Machine Learning con InterSystems IRIS, Python y Jupyter... aquí lo tenéis!!

1. Objetivo

Esta es una nota sencilla de 5 minutos, donde os muestro cómo invocar el controlador JDBC de IRIS con la ayuda de Python 3, por ejemplo desde un Jupyter Notebook, para leer y escribir datos en una instancia de la base de datos de IRIS vía SQL.

El año pasado Zhong Li publicó una nota breve sobre como Enlazar Python con una base de datos Caché (sección 4.7). Ahora podría ser el momento de recapitular algunas opciones y discusiones sobre el uso de Python para acceder a una base de datos de IRIS, para leer sus datos en un dataframe de Pandas y una matriz de NumPy para realizar un análisis básico, y después escribir algunos datos pre-procesados o normalizados de nuevo en IRIS y que esté listo para canalizaciones (pipelines) adicionales de ML/DL.

Inmediatamente se me ocurren varias opciones:

  1.    ODBC: ¿Cómo hacerlo con PyODBC para Python 3 y SQL nativo?
  2.    JDBC: ¿Cómo hacerlo con JayDeBeApi para Python 3 y SQL nativo?
  3.    Spark:  ¿Cómo hacerlo con PySpark y SQL?
  4.    API nativa de Python para IRIS: ¿Qué hay más allá del anterior Python Binding para Caché?
  5.   ** ¿IPtyhon Magic SQL %%sql**? ¿Podría  funcionar con IRIS?

 ¿Hay alguna otra opción que se me haya escapado? También estoy interesado en probarla. 

2. Alcance 

¿Comenzamos con un enfoque JDBC común? En la siguiente nota breve recapitularemos ODBC, Spark y la API nativa de Python. 

En el alcance:

Los siguientes componentes comunes se abordan en esta demostración rápida:

  • Anaconda
  • Jupyter Notebook 
  • Python 3
  • JayDeBeApi
  • JPyPe
  • Pandas
  • NumPy
  • Una instancia de IRIS 2019.x
  • ### Fuera del alcance:

    En esta nota rápida NO se abordarán los siguientes aspectos - son importantes y pueden tratarse por separado con soluciones, implementaciones y servicios específicos: 

  • Seguridad de extremo a extremo.
  • Rendimiento no funcional, etc.
  • Solución de problemas y soporte.
  • Licencias. 
  • 3. Demostración

    3.1 Ejecución de una instancia de IRIS:

    Simplemente ejecuté un contenedor IRIS 2019.4 como servidor "remoto" de la base de datos. Puedes utilizar cualquier instancia de IRIS a la que tengas acceso autorizado.

    zhongli@UKM5530ZHONGLI MINGW64 /c/Program Files/Docker Toolbox
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                PORTS                                              NAMES
    d86be69a03ab        quickml-demo        "/iris-main"        3 days ago          Up 3 days (healthy)   0.0.0.0:9091->51773/tcp, 0.0.0.0:9092->52773/tcp   quickml

    3.2 Anaconda y Jupyter Notebook:

    Reutilizaremos el mismo enfoque de configuración descrito aquí para Anaconda (sección 4.1) y aquí para Jupyter Notebook (sección 4) en un ordenador portátil. Python 3.x se instala junto con este paso.

    3.3 Instalar JayDeBeApi y JPyPe:

    Inicié mi JupyterNotebook, y luego simplemente ejecuté lo siguiente en sus celdas para configurar un puente desde Python-a-JDBC/Java:
     
      !conda install --yes -c conda-forge jaydebeapi

    JayDeBeApi utiliza JPype 0.7 en el momento de escribir este artículo (enero del 2020), pero no funciona debido a un error conocido, por lo que tuve que utilizar la 0.6.3

    !conda install --yes -c conda-forge JPype1=0.6.3 --force-reinstall

    3.4 Conectar a una base de datos de IRIS por medio de JDBC 

    Hay una documentación oficial de JDBC en IRIS aquí. 

    Para las ejecuciones de Python SQL sobre JDBC, utilicé los siguientes códigos como ejemplo. Se conecta a una tabla de datos llamada "DataMining.IrisDataset" dentro del namespace "USER" de esta instancia de IRIS. 

    ### 1. Establezca las variables de entorno, si es necesario #importa os #os.environ['JAVA_HOME']='C:\Progra~1\Java\jdk1.8.0_241' #os.environ['CLASSPATH'] = 'C:\interSystems\IRIS20194\dev\java\lib\JDK18\intersystems-jdbc-3.0.0.jar' #os.environ['HADOOP_HOME']='C:\hadoop\bin'   #winutil binary must be in Hadoop's Home
    ### 2. Obtiene la conexión JDBC y el cursor import JayDeBeApi url = "jdbc:IRIS://192.168.99.101:9091/USER" driver = 'com.intersystems.jdbc.IRISDriver' user = "SUPERUSER" password = "SYS" #libx = "C:/InterSystems/IRIS20194/dev/java/lib/JDK18" jarfile = "C:/InterSystems/IRIS20194/dev/java/lib/JDK18/intersystems-jdbc-3.0.0.jar" conn = jaydebeapi.connect(driver, url, [user, password], jarfile) curs = conn.cursor()
    ### 3. Especifica la fuente de la tabla de datos dataTable = "DataMining.IrisDataset"
    ### 4. Obtiene el resultado y visualiza curs.execute("select TOP 20 * from %s" % dataTable) result = curs.fetchall() print("Total records: " + str(len(result))) for i in range(len(result)):     print(result[i])
    ### 5. Cerrar y limpiar - Los mantendre abiertos para los próximos accesos. #curs.close() #conn.close()
    Total records: 150
    (1, 1.4, 0.2, 5.1, 3.5, 'Iris-setosa')
    (2, 1.4, 0.2, 4.9, 3.0, 'Iris-setosa')
    (3, 1.3, 0.2, 4.7, 3.2, 'Iris-setosa')
    ... ...
    (49, 1.5, 0.2, 5.3, 3.7, 'Iris-setosa')
    (50, 1.4, 0.2, 5.0, 3.3, 'Iris-setosa')
    (51, 4.7, 1.4, 7.0, 3.2, 'Iris-versicolor')
    ... ... 
    (145, 5.7, 2.5, 6.7, 3.3, 'Iris-virginica')
    ... ... 
    (148, 5.2, 2.0, 6.5, 3.0, 'Iris-virginica')
    (149, 5.4, 2.3, 6.2, 3.4, 'Iris-virginica')
    (150, 5.1, 1.8, 5.9, 3.0, 'Iris-virginica')

      Ahora hemos verificado que Python en JDBC estaba funcionando. Lo siguiente es solo un poco de análisis de datos de rutina y preprocesamiento para los canales habituales de ML que deberíamos mencionar una y otra vez para demostraciones y comparaciones posteriores, por lo que se adjunta para mayor comodidad

    3.5 Convertir los resultados de SQL al DataFrame de Pandas y después a las matrices de NumPy

    Instala los paquetes Pandas y NumPy a través de Conda si aún no están instalados, como se explicó en el punto 3.3.

    A continuación, ejecute lo siguiente como un ejemplo:

    ### Transforma los resultados de SQL "sqlData" en un dataframe de Pandas "df", y después en una matriz de NumPy "arrayN" para otras canalizaciones (*pipelines*) de ML import pandas as pd sqlData = "SELECT * from DataMining.IrisDataset" df= pd.io.sql.read_sql(sqlData, conn) df = df.drop('ID', 1) df = df[['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']]
    # Establece las etiquetas en 0, 1, 2, para la matriz NumPy df.replace('Iris-setosa', 0, inplace=True) df.replace('Iris-versicolor', 1, inplace=True) df.replace('Iris-virginica', 2, inplace=True)
    # Convierte el dataframe en una matriz Numpy arrayN = df.to_numpy()
    ### 6. Cierra y limpia - ¿si la conexión ya no es necesaria? #curs.close() #conn.close()

    Echemos un vistazo rutinario a los datos actuales:

    df.head(5)

    df.describe()

    Ahora tenemos un DataFrame, y una matriz NumPy normalizada de una tabla de datos fuente a nuestra disposición.  

    Ciertamente, ¿podemos probar varios análisis de rutina con los que comenzaría un experto en ML, como se indica a continuación, en Python para reemplazar a R, como en el enlace que se encuentra aquí?

    La fuente de datos se cita aquí

    3.6 Dividir los datos y volver a escribirlos en la base de datos de IRIS por medio de SQL:

    Ciertamente, podemos dividir los datos en un conjunto de Entrenamiento y otro de Validación o Prueba, como es habitual, y después escribirlos de nuevo en tablas temporales de la base de datos, para algunas emocionantes funciones ML de IRIS:

    import numpy as np from matplotlib import pyplot from sklearn.model_selection import train_test_split
    # mantiene, por ejemplo, el 20% = 30 filas como datos de prueba, y el 80% = 120 filas para entrenamiento X = arrayN[:,0:4] y = arrayN[:,4] X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1, shuffle=True)
    # Hace que el 80% de las filas, escogidas aleatoriamente, estén en el conjunto Entrenamiento labels1 = np.reshape(Y_train,(120,1)) train = np.concatenate([X_train, labels1],axis=-1)
    # Hace que el 20% de las filas, escogidas eleatoriamente, estén en el conjunto Prueba, lTest1 = np.reshape(Y_validation,(30,1)) test = np.concatenate([X_validation, lTest1],axis=-1)
    # Escribe el conjunto de datos de entrenamiento en un dataframe de Pandas dfTrain = pd.DataFrame({'SepalLength':train[:, 0], 'SepalWidth':train[:, 1], 'PetalLength':train[:, 2], 'PetalWidth':train[:, 3], 'Species':train[:, 4]}) dfTrain['Species'].replace(0, 'Iris-setosa', inplace=True) dfTrain['Species'].replace(1, 'Iris-versicolor', inplace=True) dfTrain['Species'].replace(2, 'Iris-virginica', inplace=True)
    # Escribe los datos de pruebas en un dataframe de Pandas dfTest = pd.DataFrame({'SepalLength':test[:, 0], 'SepalWidth':test[:, 1], 'PetalLength':test[:, 2], 'PetalWidth':test[:, 3], 'Species':test[:, 4]}) dfTest['Species'].replace(0, 'Iris-setosa', inplace=True) dfTest['Species'].replace(1, 'Iris-versicolor', inplace=True) dfTest['Species'].replace(2, 'Iris-virginica', inplace=True)
    ### 3. Especifica los nombres de las tablas temporales dtTrain = "TRAIN02" dtTest = "TEST02"
    ### 4. Crea 2 tablas temporales - puedes probar eliminar las tablas temporales y volver a crearlas una y otra vez curs.execute("Create Table %s (%s DOUBLE, %s DOUBLE, %s DOUBLE, %s DOUBLE, %s VARCHAR(100))" %(dtTrain,dfTrain.columns[0],dfTrain.columns[1],dfTrain.columns[2], dfTrain.columns[3], dfTrain.columns[4])) curs.execute("Create Table %s (%s DOUBLE, %s DOUBLE, %s DOUBLE, %s DOUBLE, %s VARCHAR(100))" %(dtTest,dfTest.columns[0],dfTest.columns[1],dfTest.columns[2],dfTest.columns[3],dfTest.columns[4]))
    ### 5. Escribe el conjunto de Entrenamiento y el conjunto de Prueba en las tablas. Se puede intentar borrar cada vez el registro anterior y luego insertarlo otra vez. curs.fast_executemany = True curs.executemany( "INSERT INTO %s (SepalLength, SepalWidth, PetalLength, PetalWidth, Species) VALUES (?, ?, ?, ? ,?)" % dtTrain, list(dfTrain.itertuples(index=False, name=None)) ) curs.executemany( "INSERT INTO %s (SepalLength, SepalWidth, PetalLength, PetalWidth, Species) VALUES (?, ?, ?, ? ,?)" % dtTest, list(dfTest.itertuples(index=False, name=None)) )
    ### 6. Cierra y limpia - ¿si la conexión ya no es necesaria? #curs.close() #conn.close()

    Ahora, si cambiamos a la Consola de Administración de IRIS, o a la Consola del Terminal SQL, deberíamos ver 2 tablas temporales creadas: TRAIN02 con 120 filas y TEST02 con 30 filas.

    Tendré que detenerme aquí, ya que supuestamente este artículo es una nota rápida muy breve.

    4. Advertencias

    • El contenido anterior puede ser modificado o perfeccionado. 

    5. Siguiente

    Simplemente reemplazaremos las secciones 3.3 y 3.4 con PyODBC, PySPark y la API nativa de Python para IRIS, a menos que a alguien no le importe contribuir con una nota rápida - también lo agradeceré.

    0
    0 1496
    Artículo Kurro Lopez · abr 13, 2021 7m read

    En el artículo anterior creamos un gráfico simple con los datos de un solo archivo. Ahora bien, como todos sabemos, a veces tenemos diferentes archivos de datos para analizar y correlacionar. Así que en este artículo vamos a cargar datos adicionales de perfmon y aprenderemos a representarlos en el mismo gráfico.

    Como podemos querer utilizar en informes o en una página web nuestros gráficos generados, también revisaremos formas de exportar los gráficos generados.

    Cargando datos de Windows Perfmon

    Los datos de perfmon extraídos del informe estándar de pbuttons tienen un formato de datos un poco peculiar. A primera vista es un archivo csv bastante sencillo. La primera fila contiene los encabezados de las columnas, las filas siguientes los datapoints. Sin embargo, para nuestros propósitos tendremos que hacer algo con las comillas que rodean las entradas de los valores. Utilizando el enfoque estándar para analizar el archivo en python, terminaremos con columnas de objetos de tipo cadena, que no funcionan bien para ser representados de forma gráfica.

    perfmonfile="../vis-part2/perfmon.txt"
    perfmon=pd.read_csv(perfmonfile,
                        header=0,
                        index_col=0,
                        converters={0: parse_datetime
                        })
    

    A diferencia del archivo mgstat que utilizamos en la primera parte, los nombres de los encabezados están en la primera fila. Queremos que la primera columna defina nuestro índice (de esta manera no tenemos que volver a indexar el dataframe como hicimos la última vez). Por último, debemos analizar la primera columna para que realmente represente un DateTime. De lo contrario, terminaríamos con un índice de cadenas. Para ello, definimos una pequeña función de ayuda para analizar las fechas de perfmon:

    def parse_datetime(x):
        dt = datetime.strptime(x, '%m/%d/%Y %H:%M:%S.%f')
    
        return dt
    

    El parámetro ~~~conventers~~~ nos permite pasarlo como controlador de la primera columna.

    Después de ejecutar esto, terminamos con los datos de perfmon en un DataFrame:

    <class 'pandas.core.frame.DataFrame'>
    Index: 2104 entries, 01/03/2017 00:01:19.781 to 01/03/2017 17:32:51.957
    Columns: 105 entries, \\WEBSERVER\Memory\Available MBytes to \\WEBSERVER\System\Processor Queue Length
    dtypes: float64(1), int64(11), object(93)
    memory usage: 1.7+ MB
    

    Ten en cuenta que la mayoría de las columnas actualmente son un object. Para convertir estas columnas a un formato utilizable, emplearemos la función to_numeric. Aunque podríamos usar apply para llamarlo en cada columna, eso estropearía nuestro índice de nuevo. Así que vamos a trazar los datos directamente mientras se canaliza a través de eso.

    #Plotting En esta ocasión, nos interesa representar el tiempo total privilegiado de todas las CPUs. Lamentablemente, los números de las columnas no son constantes y varían con el número de CPU y drives. Así que tendrás que observar y averiguar qué columna es. En mi ejemplo es 91:

    perfmon.columns[91]
    
    '\\\\WEBSERVER\\Processor(_Total)\\% Privileged Time'
    

    Utilizaremos más o menos el mismo enfoque que la última vez para crear un gráfico con Glorefs, Rdratio y nuestro nuevo Privileged Time:

    plt.figure(num=None, figsize=(16,5), dpi=80, facecolor='w', edgecolor='k')
    host = host_subplot(111, axes_class=AA.Axes)
    plt.subplots_adjust(right=0.75)
    
    par1 = host.twinx()
    par2 = host.twinx()
    offset = 60
    new_fixed_axis = par2.get_grid_helper().new_fixed_axis
    par2.axis["right"] = new_fixed_axis(loc="right",axes=par2,offset=(offset, 0))
    par2.axis["right"].toggle(all=True)
    
    host.set_xlabel("time")
    host.set_ylabel("Glorefs")
    
    par1.set_ylabel("Rdratio")
    par2.set_ylabel("Privileged Time")
    ws=30
    p1,=host.plot(data.Glorefs,label="Glorefs")
    p2,=par1.plot(data.Rdratio,label="Rdratio")
    p3,=par2.plot(pd.to_numeric(perfmon[perfmon.columns[91]],errors='coerce'),label="PTime")
    
    host.legend()
    
    host.axis["left"].label.set_color(p1.get_color())
    par1.axis["right"].label.set_color(p2.get_color())
    par2.axis["right"].label.set_color(p3.get_color())
    
    plt.draw()
    plt.show()
    

    Aquí es donde se utiliza to_numeric:

    p3,=par2.plot(pd.to_numeric(perfmon[perfmon.columns[91]],errors='coerce'),label="PTime")
    

    gráfica

    Cómo redirigir la salida

    Mientras que Notebook es realmente bueno para tener un vistazo rápido de nuestros datos, con el tiempo nos gustaría ser capaces de ejecutar nuestros scripts de forma no interactiva, por lo que queremos que nuestros gráficos salgan como imágenes. Obviamente, realizar una captura de pantalla implica demasiado trabajo manual, así que utilizaremos la función pyplot savefig().

    Reemplazaremos las llamadas draw() y show() con la llamada savefig():

    #plt.draw()
    #plt.show()
    plt.savefig("ptime-out.png")
    

    que nos dará el png en nuestro directorio de trabajo actual.

    Salida avanzada

    Como un pequeño ejercicio adicional vamos a echar un vistazo a Bokeh. Una de las muchas útiles características que bokeh está añadiendo a nuestra caja de herramientas, es la capacidad de generar nuestros gráficos como un archivo HTML interactivo. Interactivo en este caso significa que podemos ampliar y desplazarnos por nuestros datos. Añade la capacidad de vincular gráficos entre sí y podrás crear fácilmente renderizados interactivos de datos de pbuttons (u otros). Estos son especialmente útiles, porque se ejecutan en cualquier navegador y se pueden distribuir fácilmente a varias personas.

    Por ahora, nuestro objetivo es añadir solo dos gráficos a nuestra salida. Nos gustaría obtener Glorefs y el tiempo privilegiado de perfom en una página.

    Para eso primero tendremos que importar bokeh:

    from bokeh.plotting import *
    

    Vamos a definir un par de propiedades y etiquetas, así como el tamaño de cada gráfico. Después, representaremos los datos de los objetos que recogimos antes y ya hemos terminado.

    Fíjate en el comentario output_notebook(), esto renderizaría la salida directamente en nuestro jupyter notebook. Estamos utilizando output_file ya que nos gustaría tener un archivo que podamos distribuir.

    output_file("mgstat.html")
    #output_notebook()
    TOOLS="pan,box_zoom,reset,save"
    
    left = figure(tools=TOOLS,x_axis_type='datetime',
        title="Glorefs",width=600, height=350,
       x_axis_label='time'
    )
    right=figure(tools=TOOLS,x_axis_type='datetime',
        title="PTime",width=600, height=350,
       x_axis_label='time',x_range=left.x_range
    )
    left.line(data.index,data.Glorefs,legend="Glorefs",line_width=1)
    right.line(perfmon.index,pd.to_numeric(perfmon[perfmon.columns[91]],errors='coerce'),legend="privileged time",line_width=1)
    p=gridplot([[left,right]])
    show(p)
    

    El ingrediente clave aquí es la vinculación de los rangos de nuestros dos gráficos con x_range=left.x_range. Esto actualizará la ventana derecha con nuestra selección/zoom/movimiento desde la izquierda (y viceversa).

    La lista de HERRAMIENTAS es solo la lista de herramientas que nos gustaría tener en nuestra pantalla resultante. Usando gridplot vamos a poner los dos gráficos uno al lado del otro:

    mgstat-bokeh

    También puedes echar un vistazo al html resultante en el repositorio de github. Parece que es demasiado grande para publicarlo directamente por medio de github, así que tendrás que descargarlo.

    Conclusiones

    En este artículo, exploramos la extracción de datos de diferentes fuentes y su representación en el mismo gráfico. También estamos gestionando datos con frecuencia de muestreo diferente (apuesto a que no te diste cuenta ;D ). Bokeh nos ofrece una potente herramienta para crear vistas interactivas fácilmente distribuibles para nuestros gráficos.

    En próximos artículos exploraremos más cosas para representar gráficamente: csp.log, registros de acceso de apache/iis, eventos de cconsole.log. Si tienes alguna sugerencia sobre algunos datos que te gustaría ver procesados con python, no dudes en comentarlo.

    ¡Comparte tus experiencias! ¡Esto está pensado como un aprendizaje interactivo!

    Enlaces

    Puedes encontrar todos los archivos de este artículo aquí También puedes ver la nueva herramienta de extracción pButtons de @murrayo, basada en algunas de las técnicas comentadas: https://github.com/murrayo/yape

    0
    0 113
    Artículo Alberto Fuentes · mayo 14, 2019 3m read

    Hola a todos, me gustaría compartir una guía rápida publicada en el Developer Community sobre cómo conectar Apache Spark +  Apache Zeppelin con InterSystems IRIS. 

    Introducción

    Apache Spark es un framework opensource para computación en cluster. Proporciona una interfaz para desarrollar sobre clusters incluyendo paralelismo y tolerancia a fallos. Por ello es muy utilizado en Big Data.

    Apache Zeppelin es un bloc de notas, que cuenta con una excelente interfaz de usuario para trabajar con diversos tipos análisis y machine learning.

    1
    0 1542
    Artículo Kurro Lopez · jul 30, 2020 9m read

    Este es el primer artículo de una serie que se sumerge en herramientas de visualización y análisis de datos de series temporales. Obviamente, estamos más interesados en analizar los datos relacionados con el rendimiento que podemos recopilar de la familia de productos Caché. Sin embargo, como veremos más adelante, no estamos limitados a eso. Por ahora estamos explorando Python y las bibliotecas/herramientas disponibles dentro de ese ecosistema.

    La serie está estrechamente vinculada a la excelente serie de Murray sobre el rendimiento y la supervisión de Caché. (ver aquí) y mas especificamente este artículo.

    Descargo de responsabilidad I: Si bien hablaré de pasada sobre la interpretación de los datos que estamos viendo, hablar de eso en detalle distraería demasiado del objetivo real. Recomiendo encarecidamente la serie de Murray para comenzar, para obtener una comprensión básica del tema.

    Descargo de responsabilidad II: Existen miles de millones de herramientas que le permiten visualizar los datos recopilados. Muchos de ellos trabajan directamente con los datos que obtiene de mgstat y sus amigos, o solo necesitan un ajuste mínimo. Esta no es una publicación de 'esta solución es la mejor'. Es solo una de las formas en que he encontrado útil y eficiente trabajar con los datos.

    Descargo de responsabilidad III: La visualización y el análisis de datos es un campo altamente adictivo, emocionante y divertido para sumergirse. Puede perder algo de tiempo libre por esto. ¡Usted ha sido advertido!

    Entonces, sin más preámbulos, profundicemos en ello.

    Prerequisitos

    Para comenzar, necesitará algunas herramientas y bibliotecas:

    • Jupyter notebooks
    • Python (3)
    • varias bibliotecas de Python que usaremos en el futuro

    Python (3) Necesitará Python en su máquina. Hay numerosas formas de instalarlo en varias arquitecturas. Yo uso homebrew en mi mac, lo que lo hizo fácil:

    brew install python3
    

    Solicite a google instrucciones para su plataforma favorita.

    Jupyter notebooks: Si bien no es técnicamente necesario, el Jupyter notebooks hace que trabajar en scripts de python sea muy fácil. Le permite ejecutar interactivamente y mostrar scripts de Python desde una ventana del navegador. También permite trabajar en colaboración en scripts. Como hace que sea muy fácil experimentar y jugar con código, es muy recomendable.

    pip3 install jupyter
    

    (de nuevo, habla con $search-engine ;)

    Librerías Python Mencioné las diferentes bibliotecas de Python mientras las usamos en el futuro. Si obtiene un error en una declaración import, una buena primera aproximación es siempre asegurarse de tener instalada la biblioteca:

    pip3 install matplotlib
    

    Empezando

    Suponiendo que tiene todo instalado en su máquina, debería poder ejecutar

    jupyter notebook
    

    de un directorio. Esto debería abrir automáticamente una ventana del navegador con una interfaz de usuario simple. emtpy-notebook

    Continuaremos y crearemos un nuevo cuaderno a través del menú y agregaremos un par de declaraciones de importación a nuestra primera celda de código (New -> Notebooks -> Python3):

    notebook-imports

    import math
    import pandas as pd
    import mpl_toolkits.axisartist as AA
    from mpl_toolkits.axes_grid1 import host_subplot
    import matplotlib.pyplot as plt
    from datetime import datetime
    from matplotlib.dates import DateFormatter
    

    En cuanto a las bibliotecas que estamos importando, solo quiero mencionar algunas:

    • Pandas "es una biblioteca de código abierto con licencia BSD que proporciona estructuras de datos y herramientas de análisis de datos de alto rendimiento y fáciles de usar para el lenguaje de programación Python". Lo que permite trabajar eficientemente con grandes conjuntos de datos. Si bien los conjuntos de datos que obtenemos de pButtons, de ninguna manera son 'big data'. Sin embargo, nos consolaremos con el hecho de que podríamos ver muchos datos a la vez. Imagine que ha estado recolectando pButtons con muestreo de 24 h/2 segundos durante los últimos 20 años en su sistema. Podríamos graficar eso.
    • Matplotlib "matplotlib es una biblioteca de trazado 2D de python que produce cifras de calidad de publicación en una variedad de formatos impresos y entornos interactivos en todas las plataformas". Este será el principal motor de gráficos que vamos a utilizar (por ahora).

    Si recibe un error al ejecutar la celda de código actual (shortcut: Ctrl+Enter) (lista de atajos), asegúrese de verificar que los tenga instalados.

    También notará que cambié el nombre del cuaderno Sin título, para hacerlo, simplemente puede hacer clic en el título.

    Cargando algunos datos

    Ahora que pusimos un poco de terreno, es hora de obtener algunos datos. Por suerte, Pandas proporciona una manera fácil de cargar datos CSV. Ya que tenemos un conjunto de datos de mgstat por ahí in csv-format, we'll just use that.

    mgstatfile = '/Users/kazamatzuri/work/proj/vis-articles/part1/mgstat.txt'
    data = pd.read_csv(
        mgstatfile, 
        header=1,
        parse_dates=[[0,1]]
       )
    

    Nosotras estamos utilizando el read_csv comando para leer directamente los datos de mgstat en un DataFrame. Consulte la documentación completa para una descripción completa de las opciones. En resumen: simplemente estamos pasando el archivo para leerlo y decirle que la segunda línea (¡basada en 0!) Contiene los nombres de los encabezados. Dado que mgstat divide los campos de fecha y hora en dos campos, también necesitamos combinarlos con el parámetro parse_dates.

    data.info()
    
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 25635 entries, 0 to 25634
    Data columns (total 37 columns):
    Date_       Time        25635 non-null datetime64[ns]
      Glorefs               25635 non-null int64
     RemGrefs               25635 non-null int64
     GRratio                25635 non-null int64
      PhyRds                25635 non-null int64
     Rdratio                25635 non-null float64
     Gloupds                25635 non-null int64
     RemGupds               25635 non-null int64
     Rourefs                25635 non-null int64
     RemRrefs               25635 non-null int64
      RouLaS                25635 non-null int64
     RemRLaS                25635 non-null int64
      PhyWrs                25635 non-null int64
       WDQsz                25635 non-null int64
      WDtmpq                25635 non-null int64
     WDphase                25635 non-null int64
      WIJwri                25635 non-null int64
      RouCMs                25635 non-null int64
     Jrnwrts                25635 non-null int64
       GblSz                25635 non-null int64
     pGblNsz                25635 non-null int64
     pGblAsz                25635 non-null float64
       ObjSz                25635 non-null int64
     pObjNsz                25635 non-null int64
     pObjAsz                25635 non-null int64
       BDBSz                25635 non-null int64
     pBDBNsz                25635 non-null int64
     pBDBAsz                25635 non-null float64
      ActECP                25635 non-null int64
      Addblk                25635 non-null int64
     PrgBufL                25635 non-null int64
     PrgSrvR                25635 non-null int64
      BytSnt                25635 non-null int64
      BytRcd                25635 non-null int64
      WDpass                25635 non-null int64
      IJUcnt                25635 non-null int64
     IJULock                25635 non-null int64
    dtypes: datetime64[ns](1), float64(3), int64(33)
    memory usage: 7.2 MB
    

    nos da una buena visión general del DataFrame recopilado.

    Trabajando con los datos

    Dado que algunos nombres de campo contienen espacios y guión bajo ("Date_ Time") es bastante difícil de manejar, seguiremos adelante y eiminamos espacios y cambiaremos el nombre de la primera columna:

    data.columns=data.columns.str.strip()
    data=data.rename(columns={'Date_       Time':'DateTime'})
    

    El Marco de datos predeterminado es un RangeIndex. Esto no es muy útil para ver nuestros datos. Como tenemos disponible una columna DateTime bastante práctica, seguiremos adelante y la configuraremos como índice:

    data.index=data.DateTime
    

    Ahora estamos listos para crear una versión inicial de nuestra trama. Como esta es siempre una de las primeras cosas a tener en cuenta, usemos Glorefs para esto:

    plt.figure(num=None, figsize=(16,5), dpi=80, facecolor='w', edgecolor='k')
    plt.xticks(rotation=70)
    plt.plot(data.DateTime,data.Glorefs)
    plt.show()
    

    Primero le decimos a la biblioteca en qué tamaño queremos el gráfico. También queremos que las etiquetas del eje x giren un poco, para que no se superpongan. Finalmente graficamos DateTime vs Glorefs y mostramos el gráfico. Esto nos da algo como el siguiente gráfico.

    Glorefs

    Podemos reemplazar fácilmente Glorefs con cualquiera de las otras columnas para tener una idea general de lo que está sucediendo.

    Combinando gráficos

    En algún momento es bastante útil mirar múltiples gráficos a la vez. Entonces, la idea de dibujar varias parcelas en una sola gráfica parece natural. Si bien es muy sencillo hacerlo solo con matplotlib:

    plt.plot(data.DateTime,data.Glorefs)
    plt.plot(data.DateTime,data.PhyRds)
    plt.show()
    

    Esto nos dará más o menos la misma gráfica que antes. El problema, por supuesto, es la escala y. Dado que Glorefs sube a millones, mientras que los PhyRds generalmente están en los 100 (a miles), no los vemos.

    Para resolver esto, necesitaremos usar el kit de herramientas axisartist previamente importado.

    plt.gcf()
    plt.figure(num=None, figsize=(16,5), dpi=80, facecolor='w', edgecolor='k')
    host = host_subplot(111, axes_class=AA.Axes)
    plt.subplots_adjust(right=0.75)
    
    par1 = host.twinx()
    par2 = host.twinx()
    offset = 60
    new_fixed_axis = par2.get_grid_helper().new_fixed_axis
    par2.axis["right"] = new_fixed_axis(loc="right",axes=par2,offset=(offset, 0))
    par2.axis["right"].toggle(all=True)
    
    host.set_xlabel("time")
    host.set_ylabel("Glorefs")
    par1.set_ylabel("Rdratio")
    par2.set_ylabel("PhyRds")
    
    p1,=host.plot(data.Glorefs,label="Glorefs")
    p2,=par1.plot(data.Rdratio,label="Rdratio")
    p3,=par2.plot(data.PhyRds,label="PhyRds")
    
    host.legend()
    
    host.axis["left"].label.set_color(p1.get_color())
    par1.axis["right"].label.set_color(p2.get_color())
    par2.axis["right"].label.set_color(p3.get_color())
    
    plt.draw()
    plt.show()
    

    El breve resumen es: agregaremos dos ejes y al diagrama, que tendrán su propia escala. Si bien utilizamos implícitamente la subtrama en nuestro primer ejemplo, en este caso necesitamos acceder a ella directamente para poder agregar el eje y las etiquetas. Establecemos un par de etiquetas y los colores. Después de agregar una leyenda y conectar los colores a las diferentes parcelas, terminamos con una imagen como esta:

    combinado

    Comentarios finales

    Esto ya nos da un par de herramientas muy poderosas para trazar nuestros datos. Exploramos cómo cargar datos de mgstat y crear algunos gráficos básicos. En la siguiente parte, jugaremos con diferentes formatos de salida para nuestros gráficos y obtendremos más datos.

    Comentarios y preguntas son alentados! ¡Comparte tus experiencias!

    -Fab

    ps. el cuaderno para esto está disponible aquí

    0
    0 323
    Artículo Pierre-Yves Duquesnoy · jul 6, 2020 11m read

    Apache Spark se ha convertido rápidamente en una de las tecnologías más atractivas para la analítica de big data y el machine learning. Spark es un motor de procesamiento de datos generales, creado para usar con entornos de procesamiento en clúster. Su corazón es el RDD (Resilient Distributed Dataset), que representa un conjunto de datos distribuido con tolerancia a fallos, sobre el que se puede operar en paralelo entre los nodos de un clúster. Spark se implementa con una combinación de Java y Scala, por lo que viene como una biblioteca que puede ejecutarse sobre cualquier JVM. Spark también es compatible con Python (PySpark) y R (SparkR) e incluye bibliotecas para SQL (SparkSQL), machine learning (MLlib), procesamiento de gráficas (GraphX) y procesamiento de flujos (Spark Streaming).

    0
    0 936
    Anuncio David Reche · jun 1, 2020

    ¡Hola Comunidad!

    El plazo para participar en el Tercer Concurso para Desarrolladores de InterSystems ha terminado y empieza la fase de votación.

    Hemos recibido 8 aplicaciones - así que ya hay suficientes para elegir la mejor!

    ¿Cómo puedes votar?

    Es muy fácil: tienes un voto, y tu voto irá en la Nominación de los Expertos o en la Nominación de la Comunidad.

    0
    0 98
    Anuncio David Reche · mayo 11, 2020

    ¡Hola desarrolladores!

    ¡Ya hemos lanzado el siguiente concurso para crear soluciones de código abierto utilizando InterSystems IRIS Data Platform!

    ¡Así que damos la bienvenida al tercer concurso de programación con InterSystems!

    El tema de este concurso es API Nativa deInterSystems IRIS.

    El concurso estará activo durante tres semanas: del 18 de mayo al 7 de junio de 2020

     

    1
    0 156