#Machine Learning (ML)

0 Seguidores · 61 Publicaciones

El aprendizaje automático es un subconjunto de la Inteligencia artificial en el campo de las ciencias de la computación, que con frecuencia utiliza técnicas estadísticas para que los equipos tengan la capacidad de "aprender" mediante datos, sin la necesidad de programarlos explícitamente.

Wikipedia.

Anuncio Alberto Fuentes · sep 30, 2025

¿Te gustaría integrar capacidades de machine learning directamente en tu plataforma IRIS desde tus datos SQL?

<iframe width="560" height="315" src="https://www.youtube.com/embed/kBl-WrgijBA?si=oEbita-dqLYfSrXn" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Este vídeo te muestra exactamente cómo hacerlo utilizando InterSystems IRIS e IntegratedML.

En el vídeo 🎥 aprenderás:

  • Los conceptos básicos de IntegratedML: qué es y para qué sirve.
  • Cómo usarlo dentro de IRIS para crear, entrenar, evaluar y utilizar modelos de machine learning.
  • Ejemplos práctico paso a paso de esta funcionalidad integrada.

¿Por qué verlo?

  • Convierte a IRIS en una plataforma "todo en uno" donde crear rápidamente modelos de predicción desde SQL.
  • Facilita la adopción de IA en tus aplicaciones sin ser un experto en ciencia de datos.

👉 Te invito a verlo y comentarlo: comparte tus dudas, experiencias o ideas en la Comunidad.

0
0 15
Artículo Alberto Fuentes · jun 26, 2025 4m read

Público

Aquellos interesados en explorar nuevos casos de uso de GenerativeAI.

Comparte ideas y razones al entrenar inteligencia artificial generativa para el reconocimiento de patrones.

Desafío 1 – Simple pero no más simple

Un desarrollador aspira a concebir una solución elegante para ciertos requerimientos.
Los patrones de coincidencia (como las expresiones regulares) pueden resolverse de muchas maneras. ¿Cuál es la mejor solución en código?
¿Puede una IA postular una solución elegante de coincidencia de patrones para un rango de ejemplos que van de simples a complejos?

1
0 42
Artículo Kurro Lopez · abr 14, 2025 15m read

 

Como todos sabemos, InterSystems es una gran empresa.

Sus productos pueden ser tan útiles como complejos.

Sin embargo, a veces nuestro orgullo nos impide admitir que quizá no entendamos algunos conceptos o productos que InterSystems nos ofrece.

Hoy comenzamos una serie de artículos que explican, de forma sencilla y clara, cómo funcionan algunos de los complejos productos de InterSystems.

En este ensayo, aclararé qué es el Machine Learning y cómo aprovecharlo... porque esta vez, SABRÁS con certeza de qué estoy hablando.

0
0 69
Artículo Alberto Fuentes · feb 28, 2025 3m read

Resumen

Con la ayuda de SQL, podéis crear, entrenar y gestionar modelos de aprendizaje automático directamente en la base de datos con la potente herramienta IntegratedML de InterSystems IRIS. Usando ejemplos de SQL que representan vuestros datos, en este artículo repasaremos la configuración de IntegratedML y su aplicación en situaciones prácticas.

0
0 52
Pregunta Kurro Lopez · jul 7, 2024

Hola a todos,

Hace unos días vi a un youtuber hablando de cómo crear una red neuronal (en español)

En resumen, utiliza la red neuronal para aprender a convertir grados Celsius a grados Fahrenheit.
Grados Fahrenheit= (Grados  Celsius × 9/5) +32

En este vídeo utiliza Python para crear la red neuronal, donde crea una tabla con los valores de grados Celsius y grados Fahrenheit.
Luego hace 1000 entrenamientos al modelo que ha creado, cuando consulta la predicción a un valor que no está en la tabla que ha utilizado para entrenar, le da un valor correcto (o bastante cercano).

2
0 223
Artículo Ricardo Paiva · jul 18, 2024 8m read

image

Hola Comunidad,

En este artículo, os demostraré los siguientes pasos para crear vuestro propio chatbot utilizando spaCy (spaCy es una biblioteca de software de código abierto para el procesamiento avanzado del lenguaje natural, escrita en los lenguajes de programación Python y Cython):

  • Paso 1: Instalar las librerías necesarias

  • Paso2: Crear el archivo de patrones y respuestas

  • Paso 3: Entrenar el modelo

  • Paso 4: Crear una aplicación ChatBot basada en el modelo entrenado

Empecemos

0
0 406
Artículo Heloisa Paiva · jun 2, 2024 6m read

La idea

Ya estamos en 2024, la version IRIS 2024.1 acaba de salir y todos estamos hablando de ello aquí. Ya tenemos muchos tutoriales sobre búsqueda vectorial y aplicaciones de chats de inteligencia artificial. Hoy quiero proponer algo diferente. Quiero presentar una idea y explorar todos sus límites, y a lo largo del texto plantearé algunas preguntas sobre la capacidad de las herramientas utilizadas, para que luego podamos comprender no solo los resultados de las nuevas funcionalidades, sino también cómo la máquina las procesa.

0
0 42
Artículo Heloisa Paiva · jun 2, 2024 6m read

La idea

Ya estamos en 2024, la versión IRIS 2024.1 acaba de salir y todos estamos hablando de ello aquí. Ya tenemos muchos tutoriales sobre búsqueda vectorial y aplicaciones de chats de inteligencia artificial. Hoy quiero proponer algo diferente. Quiero presentar una idea y explorar todos sus límites, y a lo largo del texto plantearé algunas preguntas sobre la capacidad de las herramientas utilizadas, para que luego podamos comprender no solo los resultados de las nuevas funcionalidades, sino también cómo la máquina las procesa.

0
0 138
Anuncio Sergio Farago · mayo 3, 2024

¡Hola Comunidad!

¡Tenemos más noticias emocionantes! El nuevo concurso de programación en línea de InterSystems dedicado a la IA generativa, la búsqueda vectorial y el aprendizaje automático está activo. 

🏆 InterSystems Vector Search, GenAI and ML Contest 🏆

Duración: 22 de abril - 19 de mayo, 2024

Fondo de premios: $14,000


0
0 117
Artículo Kurro Lopez · feb 2, 2024 9m read

Considerar el nuevo interés empresarial en la aplicación de IA generativa a información y datos privados locales comercialmente sensibles, sin exposición a nubes públicas. Al igual que una cerilla necesita la energía del golpe para encenderse, el nuevo desafío de "energía de activación" del líder tecnológico es revelar cómo la inversión en hardware GPU podría respaldar nuevas capacidades competitivas. La capacidad puede revelar los casos de uso que brindan nuevo valor y ahorro.

Afilar este hacha comienza con un protocolo funcional para ejecutar LLM en un portátil local.

0
0 298
Artículo Luis Angel Pérez Ramos · oct 6, 2023 1m read

Como no podía ser de otra manera y fieles a nuestra cita de los viernes, procedemos a publicar las predicciones de la aplicación QuinielaML para la jornada 9ª de Primera División y 10ª de Segunda.

Os recuerdo que QuinielaML está desarrollada sobre InterSystems IRIS haciendo uso de sus capacidades de Machine Learning que proporciona mediante la funcionalidad IntegratedML así como de Embedded Python que permite la captura de datos para entrenar el modelo predictivo.

Aquí tenemos la jornada de este fin de semana:

Veamos que tenemos para Primera División:

Y ahora Segunda:

1
0 307
Artículo Luis Angel Pérez Ramos · sep 29, 2023 1m read

¡Volvemos al ataque con la Quiniela! 8ª jornada en Primera y Segunda División y con la QuinielaML deseando resarcirse de los 4 aciertos del pasado fin de semana. Aquí tenemos el boleto de esta jornada:

Y estas son las predicciones para Primera División:

Y ahora para Segunda División:

Por lo que la Quiniela quedaría tal que así:

Pues ale, ya tenéis lo necesario para haceros ricos. ¡Feliz viernes!

1
0 201
Anuncio Esther Sanchez · mayo 18, 2023

¡Hola Comunidad!

Os presentamos a los ganadores del hackathon que InterSystems realizó la semana pasada en Málaga.

Todos los equipos trabajaron duro durante todo el día, para tener listos sus increíbles proyectos. ¡Enhorabuena a todos!! 🎊👏🏻

Reto: Crear un modelo predictivo usando InterSystems IntegratedML

Ganadores:

 

2
0 124
Anuncio Esther Sanchez · mayo 10, 2023

¡Hola Comunidad!

Todos los equipos ya están concentrados en sus proyectos durante el hackathon de InterSystems en la Conferencia "J On The Beach" en Málaga. Ganará el equipo cuyo modelo predictivo sea el más innovador. Así que... ¡mucha suerte a todos!

¡Y muchas gracias a @Thomas Dyar, @Anastasia Dyubaylo y @Dmitry Maslennikovpor su soporte!

Pronto anunciaremos los ganadores.

Stay tuned! 😉

    

0
0 71
Anuncio Esther Sanchez · abr 21, 2023

¡Hola desarrolladores!

Como ya os anunciamos hace unos días, InterSystems Iberia va a ser uno de los patrocinadores de la conferencia Internacional "J On The Beach" que tendrá lugar en Málaga los días 10-12 de mayo.

¡Y queremos invitaros a uno de vosotros al evento! (*)

El primer día de la Conferencia será el Hackathon de InterSystems. No deberíais perdéroslo, porque es una oportunidad de oro para aprender sobre IA y ML, hacer networking y conocer a otros desarrolladores. Además, es gratuito y hay unos premios chulísimos para los ganadores. Pero... no estábamos hablando del hackathon... ¿O sí?? Porque para conseguir la entrada gratis (valorada en 250€), tenéis que responder a la siguiente pregunta:

¿Cuál es el tema del Hackathon de InterSystems en J On The Beach?

 

¿Cómo participar?

➡️ Tenéis que escribir la respuesta en un comentario a esta publicación.

🗓️ Podéis participar hasta el martes 25 de abril a las 23:59 (CEST).

🍀 El miércoles 26 de abril haremos el sorteo e informaremos del ganador.

❗️Solo pueden participar miembros registrados en la Comunidad. Los empleados de InterSystems no pueden participar. Registraos aquí en la Comunidad si aún no tenéis una cuenta.

¡Mucha suerte a todos y esperamos vuestras respuestas!


¿No sabéis qué es "J On The Beach"?

"J On The Beach" es una Conferencia Internacional sobre Big Data, para desarrolladores y DevOps. Incluye ponencias, charlas, workshops, un hackaton... Y cuenta con la presencia de prestigiosos profesionales de grandes empresas como Tesla, Grafana Labs, Microsoft, Facebook, Red Hat, Freepik, Wix... Para más información, consulta su página web, donde te cuentan todos los detalles sobre el evento: www.jonthebeach.com


(*) La invitación incluye una entrada estándar a J On The Beach, que permite el acceso a todas las ponencias de los días 10-12, y a los workshops "Canela". También incluye los coffee-breaks y las comidas. No incluye el transporte a la Conferencia ni el alojamiento en la ciudad.

11
0 204
Anuncio Esther Sanchez · sep 8, 2022

La Comunidad de Desarrolladores en español tiene un canal de YouTube propio, con 33 vídeos sobre la tecnología de InterSystems, organizados en 4 listas:

Y subimos vídeos con frecuencia...

¿Aún no te has suscrito al canal? No te lo pienses más y dale a "Suscribirme" aquí:

Canal de YouTube la Comunidad de Desarrolladores en español >>

¡Nos vemos!

    

0
0 99
Anuncio Esther Sanchez · abr 6, 2022

Hola desarrolladores:

Como ya os anunciamos hace unos días, InterSystems va a ser uno de los patrocinadores de la conferencia Internacional "J On The Beach" que tendrá lugar en Málaga los días 28-29 de abril.

El primer día de la Conferencia @David Reche @Eduardo.Angladadarán una ponencia titulada "Capitán Kirk, descubierto un exoplaneta en la ruta usando AutoML"

Y, además, InterSystems contará con un stand que, como siempre, tendrá sorpresas... 😁

¿Quieres saber qué han preparado?? Sigue leyendo...

 

0
0 156
Anuncio Esther Sanchez · mar 25, 2022

¡Hola desarrolladores!

Ya hemos realizado el sorteo entre todas las personas que propusieron un nombre al exoplaneta descubierto en la ruta.

Y el ganador ha sido @Daniel Mory. ¡Enhorabuena!! 🎉🎉

¡Muchas gracias a todos los que habéis participado!

Aquí podéis ver el vídeo del sorteo entre todos los participantes.


  

3
0 144
Anuncio Esther Sanchez · mar 19, 2022

¡Hola desarrolladores!

Estamos muy contentos de anunciaros que InterSystems Iberia va a ser uno de los patrocinadores de la conferencia Internacional "J On The Beach" que tendrá lugar en Málaga los días 28-29 de abril.

¡Y queremos invitaros a uno de vosotros al evento! (*)

El primer día de la Conferencia @David Reche y @Eduardo Angladadarán una ponencia titulada "Capitán Kirk, descubierto un exoplaneta en la ruta usando AutoML". Por ello, para conseguir la entrada gratis (valorada en 250€), tenéis que responder a la siguiente pregunta:

¿Qué nombre le pondrías al exoplaneta descubierto en la ruta?

  

5
0 457
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
Artículo Eduardo Anglada · dic 29, 2021 2m read

Hablando con mi amigo @Renato Banzai, especialista en Machine Learning, me comentó uno de los mayores retos a los que se enfrentan las empresas hoy en día: implementar el Machine Learning (ML) o la Inteligencia Artificial (IA) en entornos reales.

InterSystems IRIS ofrece IntegratedML. IntegratedML es una excelente funcionalidad para formarse, probar e implementar modelos de ML/IA.

La parte más difícil al crear ML/IA es el tratamiento de los datos, su limpieza, hacerlos fiables.

¡Y ahí es donde podemos sacar ventaja del potente estándar FHIR!

La idea del proyecto muestra cómo podemos crear/entrenar/validar modelos de ML/IA con FHIR y utilizarlos con datos de diferentes fuentes.

0
0 184
Artículo Ricardo Paiva · nov 18, 2021 2m read

Hablando con mi amigo @Renato Banzai, especialista en Machine Learning, me expuso uno de los mayores retos a los que se enfrentan actualmente las empresas: la implementación del Machine Learning (ML) y la Inteligencia Artificial (IA) en entornos reales.

Intersystems IRIS ofrece IntegratedML. IntegratedML es una excelente herramienta para practicar, probar y realizar implementaciones de modelos de ML e IA.

La parte más complicada de crear ML/IA es procesar los datos, depurarlos y hacerlos fiables.

¡Ahí es donde podemos aprovechar el estándar FHIR!

La idea del proyecto muestra cómo podemos crear/practicar/validar modelos ML/IA con FHIR y utilizarlos con datos de distintas fuentes.

Creemos que este proyecto tiene un gran potencial y también hay algunas ideas que pueden analizarse:

  • Reutilizar/ampliar las transformaciones DTL en otras bases de datos FHIR para modelos de ML personalizados
  • Utilizar las transformaciones DTL para normalizar los mensajes FHIR y publicar los modelos ML como servicios
  • Crear un tipo de modelos + un repositorio con las reglas de las transformaciones para utilizarlos en cualquier conjunto de datos FHIR

Si exploramos nuevas posibilidades de este proyecto, imaginemos datos de distintas fuentes.

 

Como se muestra en la imagen anterior, el recurso FHIR, que consume la API REST, se puede utilizar con un FHIRaaS.

Y no solo es posible utilizar FHIRaaS en AWS, sino que además podemos aprovechar el nuevo servicio de HealthShare Message Transformation Services, que automatiza la conversión de HL7v2 a FHIR® para ingresar datos en Amazon HealthLake, donde podrás extraer más valor para tus datos.

Con estas sencillas demostraciones, creo que estos recursos pueden utilizarse muy bien en escenarios más grandes, permitiendo implementaciones más sencillas en entornos de producción verdaderamente novedosos, como el de AWS Healthlake. ¿Por qué no? 😃 

0
0 108
Artículo Ariel Arias · nov 8, 2021 8m read

MODELO RESUMIDO {#1}

Siguiendo el ejemplo disponible en GitHub FHIR IntegratedML vamos usar el modelo resumido para entrenar el modelo de predicción de "No Asistirá" (NotShow).

Haremos un match entre los campos de la tabla PackageSample.NoShowMLRow y los campos de TrakCare. El punto de partida en TrakCare será la tabla SQLUser.RB_Appointment.

CAMPOTRAKCAREOBSERVACIONES
GenderAPPT_PAPMI_DR->PAPMI_Sex_DR->CTSEX_GenderSe espera valores "F" y "M"
ScheduledWeekDay{fn DAYOFWEEK(APPT_DateComp) }Días de la semana Domingo (1) a Sábado (7)
ScheduledWeek{fn WEEK(APPT_DateComp)}El número de la semana (1 a 52)
WaitingDaysDATEDIFF('dd',APPT_BookedDate, APPT_DateComp)Días entre el agendamiento y la fecha del compromiso)
AgeDATEDIFF('YY',APPT_PAPMI_DR->PAPMI_PAPER_DR->PAPER_DOB,APPT_DateComp)Edad del paciente (en años) al día de la cita.
HypertensionCIE10: (I10-I15) Enfermedades hipertensivas
DiabetesCIE10: (E10-E14) Diabetes mellitus
AlcoholismCIE10: (F10) Trastornos mentales y de comportamiento debidos al consumo de alcohol
HandicapCIE10: (Z73.6) Problemas relacionados con la limitación de las actividades debido a discapacidad
SMSreceivedAPPT_ConfirmationSi no tenemos sistema de envío de mensajes, usaremos el campo "Confirmado"
NoshowAPPT_StatusUsaremos el estado de cita para saber si el paciente fue atendido o se presentó al menos al compromiso

Preparamos la consulta para traer los datos de las citas {#2}

Para traer los datos desde TrakCare, vamos a preparar la consulta, y teniendo en cuenta los campos que se requieren, la query quedaría así:

Select
APPT_PAPMI_DR->PAPMI_PAPER_DR PatientID,
APPT_RowId ApptID,
APPT_DateComp ApptDate,
APPT_PAPMI_DR->PAPMI_Sex_DR->CTSEX_Gender Gender,
{fn DAYOFWEEK(APPT_DateComp)} ScheduledWeekDay,
{fn WEEK(APPT_DateComp)} ScheduledWeek,
DATEDIFF('dd',APPT_BookedDate, APPT_DateComp) WaitingDays,
DATEDIFF('YY',APPT_PAPMI_DR->PAPMI_PAPER_DR->PAPER_DOB,APPT_DateComp) Age,
CASE APPT_Confirmation
WHEN 'Y' THEN 1
ELSE 0
END SMSreceived,
CASE APPT_Status
WHEN 'P' THEN 1
WHEN 'A' THEN 0
WHEN 'X' THEN 0
WHEN 'I' THEN 0
WHEN 'N' THEN 1
WHEN 'T' THEN 0
WHEN 'H' THEN 0
WHEN 'C' THEN 0
WHEN 'S' THEN 0
WHEN 'D' THEN 0
ELSE APPT_Status
END Noshow
from RB_Appointment

Se puede modificar para traer todos los registros o filtrar por ejemplo el año en curso (dejar al menos fuera las citas futuras, pues estas servirán posteriormente, una vez entrenado el modelo para predecir el comportamiento de citas futuras. Se puede igualmente filtrar por establecimiento (APPT_AS_ParRef->AS_RES_ParRef->RES_CTLOC_DR->CTLOC_HOSPITAL_DR) pues es posible que el comportamiento sea diferente dependiendo esta variable (por cercanía al centro de atención por ejemplo).

Nota: Considerar si excluir del análsis citas canceladas (X) u otros estados como Transferido (T) pues son citas que se mostrarán como "NoShow" pero no se puede atribuir eso a un comportamiento del paciente necesariamente. Para este ejemplo se han considerado, pero a valor "0", es decir NoShow = False.

import pandas as pd
import jaydebeapi as jdbc
import time
import pyodbc as odbc
import irisnative

Función Diagnósticos {#3}

Tendremos funciones para determinar si el paciente está diagnosticado con Huipertensión, Diabetes, Alcoholismo o alguna restricción física (invalidez).

La función recibirá un arreglo con los diagnósticos del paciente al momento de la cita (filtrados por fecha) para retornar un 0 (False) o un 1 (True). Basta con que uno de los diagnósticos sea HTA para saber que el paciente en ese momento es hipertenso.

def is_hta (dxlist):
    ishta = 0
    htalist = ('I10', 'I11','I12', 'I13', 'I14', 'I15')
    for i in dxlist:
        if i in htalist:
            ishta = 1
    return ishta

def is_dbt (dxlist):
    isdbt = 0
    dbtlist = ('E10', 'E11','E12', 'E13', 'I14')
    for i in dxlist:
        if i in dbtlist:
            isdbt = 1
    return isdbt

def is_disabilited (dxlist):
    isdisabilited = 0
    disabilitedlist = ('Z73.6','1')
    for i in dxlist:
        if i in disabilitedlist:
            isdisabilited = 1
    return isdisabilited

def is_alcoholism (dxlist):
    isalcoholism = 0
    alcoholismlist = ('F10','1')
    for i in dxlist:
        if i in alcoholismlist:
            isalcoholism = 1
    return isalcoholism

def listdxbypatid (patid):
listadxsql = ()
if patid:
    idpaciente = patid
    sqlpatdx = """
    select %nolock
    MR_DIAGNOS.MRDIA_ICDCode_DR->MRCID_Code,
    MR_DIAGNOS.MRDIA_DATE
    from    SQLUser.MR_ADM, SQLUser.MR_DIAGNOS
    where   MR_ADM.MRADM_RowId IN (SELECT PAADM_MainMRADM_DR
    FROM  PA_Adm
    WHERE PAADM_PAPMI_DR = """ + str(idpaciente) + """ )
    and MR_ADM.MRADM_RowId = MR_DIAGNOS.MRDIA_MRADM_ParRef
    """
    listadxsql = pd.read_sql(sqlpatdx, conn)
return listadxsql

Preparar la Conexión {#4}

Preparamos la conexión utilizando la librería jaydebeapi y el conector que corresponde al ambiente a utilizar. En este caso, se trata de un ambiente sobre HealthShare, por lo que usaremos el JDBC de Cache.

# Establecemos nuestras variables de conexión (host, port, namespace)
envhost = "localhost"
envport = 1983
envns = "TRAK"

dbuser = "superuser"
dbaccess = "SYS"

url = "jdbc:Cache://" + envhost + ":" + str(envport) + "/" + envns
driver = 'com.intersys.jdbc.CacheDriver'
irisdriver = 'com.intersystems.jdbc.IRISDriver'

user = dbuser
password = dbaccess
# Para este ejemplo, el jar para Cache se encuentra bajo la carpeta "resources"
# ruta relativa a la ubicación de este notebook
#jarfile = "resources/cachejdbc.jar"
jarfile = "/Users/ArielArias/cachejdbc.jar"
conn = jdbc.connect(driver, url, [user, password], jarfile)
curs = conn.cursor()

Asignamos la consulta en una variable, para poder modificar posteriormente si es necesario. De esta forma además podemos utilizar asignación en múltiples líneas para tener una mejor vosión de lo que estamos extrayendo desde TrakCare.

sql_str = """Select TOP 3500
APPT_PAPMI_DR->PAPMI_PAPER_DR PatientID,
APPT_RowId ApptID,
APPT_DateComp ApptDate,
APPT_PAPMI_DR->PAPMI_Sex_DR->CTSEX_Gender Gender,
{fn DAYOFWEEK(APPT_DateComp)} ScheduledWeekDay,
{fn WEEK(APPT_DateComp)} ScheduledWeek,
DATEDIFF('dd',APPT_BookedDate, APPT_DateComp) WaitingDays,
DATEDIFF('YY',APPT_PAPMI_DR->PAPMI_PAPER_DR->PAPER_DOB,APPT_DateComp) Age,
CASE APPT_Confirmation
WHEN 'Y' THEN 1
ELSE 0
END SMSreceived,
CASE APPT_Status
WHEN 'P' THEN 1
WHEN 'A' THEN 0
WHEN 'X' THEN 0
WHEN 'I' THEN 0
WHEN 'N' THEN 1
WHEN 'T' THEN 0
WHEN 'H' THEN 0
WHEN 'C' THEN 0
WHEN 'S' THEN 0
WHEN 'D' THEN 0
ELSE APPT_Status
END Noshow
from RB_Appointment
Where 
APPT_DateComp BETWEEN to_date('01/01/2021','dd/mm/yyyy') AND NOW()
AND APPT_AS_ParRef->AS_RES_ParRef->RES_CTLOC_DR->CTLOC_HOSPITAL_DR IN (12129)"""

Ejecutar la consulta (DataFrame) {#5}

Utilizando la librerías pandas ejecutamos la consulta SQL y la dejamos en un DataFrame para posterior manipulación. Nos falta aún las columnas relacionadas a diagnósticos del paciente a la fecha de la cita (por ahora no consideraremos TODOS los diagnósticos del paciente, sólo los confirmados y que fueron ingresados previo a la fecha del compromiso.

start = time.time()
data = pd.read_sql(sql_str, conn)
end = time.time()
elapsedtime = end - start

# Sólo para tener una referencia veremos el tiempo de ejecución de la consulta
# Esto ayudará a evaluar cuántos registros se puede procesar
# O planificar una ejecución por períodos de tiempo más reducidos
print("Tiempo de Ejecución SQL: ",int(elapsedtime), " Segundos")

# Agregamos las columnas de Dx;  con valores negativos por ahora
data["Hypertension"] = 0
data["Diabetes"] = 0
data["Alcoholism"] = 0
data["Handicap"] = 0

# Verificamos nuestro dataframe
data.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
PatientIDApptIDApptDateGenderScheduledWeekDayScheduledWeekWaitingDaysAgeSMSreceivedNoshowHypertensionDiabetesAlcoholismHandicap
059820511683||11250||12021-01-21F54027000000
159820511683||11804||12021-01-28F55127010000
259820511683||13466||12021-02-18F58027000000
359820511683||15128||12021-03-11F511027000000
459820511683||15682||12021-03-18F512027000000

Recorremos el Arreglo y traemos la lista de diagnósticos para cada paciente. Para optimizar el tiempo, verificamos si ya tenemos los diagnósticos del paciente teniendo una lista con los PatientID

start = time.time()
patient = []
## is_hta
## is_dbt
## is_disabilited
## is_alcoholism
for index, row in data.iterrows():
    if row['PatientID'] not in patient:
        patient.append(row['PatientID'])
        patappt = (row['ApptID'], row['PatientID'], row['ApptDate'])
        listpatdx = listdxbypatid(row['PatientID'])
    # Ya tenemos los diagnósticos del Paciente; 
    # ahora filtramos sólo los previos a la cita y los dejamos en una lista:
    if len(listpatdx):
        low_apptdate = listpatdx[listpatdx["MRDIA_Date"] <= patappt[2]]
        if len(low_apptdate):
            # Ahora necesitamos saber si el paciente "ES" o "ERA" Hipertenso para la fecha de la cita:
            diaghta = is_hta(low_apptdate.MRCID_Code)
            diagdbt = is_dbt(low_apptdate.MRCID_Code)
            diagdis = is_disabilited(low_apptdate.MRCID_Code)
            diagalcohol = is_alcoholism(low_apptdate.MRCID_Code)
        else:
            diaghta = 0
            diagdbt = 0
            diagdis = 0
    else:
        diaghta = 0
        diagdbt = 0
        diagdis = 0
    # Modificamos la información en la fila correspondiente
    # Sabemos que por ApptID habrá sólo un registro:
    data.loc[data.ApptID == row['ApptID'],'Hypertension'] = diaghta
    data.loc[data.ApptID == row['ApptID'],'Diabetes'] = diagdbt
    data.loc[data.ApptID == row['ApptID'],'Handicap'] = diagdis
    data.loc[data.ApptID == row['ApptID'],'Alcoholism'] = diagalcohol
    
end = time.time()

print(end - start)

Cerramos la conexión, de momento no la usaremos.

conn.close()

LLEVAR LOS REGISTROS A UNA INSTANCIA CON ML INTEGRADO {#6}

En este ejemplo, no podemos usar el mismo servidor pues en su versión no incluye la función de ML; así es que usaremos una instancia con IRIS for Health que incorpora ML.

Dado que la librería de python jaydebeapi soporta sólo un dirver conexión por ejecución, no podemos usar el mismo método pues habrá un error al intentar usarla para conectar IRIS (posterior a conectar Caché).

Para seguir con el ejemplo y no perder el DataFrame obtenido, vamos a crear una conexión a IRIS utilizando ODBC

Usaremos la misma instancia del ejemplo que hemos usado hasta ahora, es decir el NameSpace FHIRSERVER

dsn = 'IRIS FHIRML'
server = 'localhost' #IRIS server container or the docker machine's IP
port = '32782' # or 8091 if docker machine IP is used
database = 'FHIRSERVER'
username = 'SUPERUSER'
password = 'SYS'

irisconn = odbc.connect('DSN='+dsn+';')
irisconn.setencoding(encoding='utf-8')
iriscurs = irisconn.cursor()

modelName = "TrakNoShow"

fhirsql = """Select
Age, Alcoholism, Diabetes, 
Gender, Handicap, Hypertension, 
Noshow, SMSreceived, ScheduledWeek, 
ScheduledWeekDay, WaitingDays
FROM PackageSample.""" + modelName + "MLRow"

# Copiamos la tabla NoShowMLRow a nuestra TrakNoShowMLRow:
sqlcreate = "CREATE TABLE PackageSample." + modelName + "MLRow ("
sqlcreate = sqlcreate + "Gender CHAR(30)," 
sqlcreate = sqlcreate + "ScheduledWeekDay INT," 
sqlcreate = sqlcreate + "ScheduledWeek INT," 
sqlcreate = sqlcreate + "WaitingDays INT," 
sqlcreate = sqlcreate + "Age INT," 
sqlcreate = sqlcreate + "Hypertension BIT," 
sqlcreate = sqlcreate + "Diabetes BIT," 
sqlcreate = sqlcreate + "Alcoholism BIT," 
sqlcreate = sqlcreate + "Handicap BIT," 
sqlcreate = sqlcreate + "SMSreceived BIT," 
sqlcreate = sqlcreate + "Noshow BIT)" 

Ejecutamos la creción de la tabla:

iriscurs.execute(sqlcreate)
iriscurs.commit()

Inserción del DataFrame TrakCare {#7}

Para hacer una inserción directa de los datos, haremos una copia del DataFrame para eliminar luego algunas columnas que no usaremos de momento; esto sólo para hacer un INSERT más directo al momento de recorrer el DataFrame.

sqltest = "INSERT INTO PackageSample." + modelName + "MLRow"
sqltest = sqltest + " (Gender,ScheduledWeekDay,ScheduledWeek,WaitingDays,"
sqltest = sqltest + "Age,SMSreceived,Noshow,Hypertension,Diabetes,Alcoholism,Handicap) "
sqltest = sqltest + "values(?,?,?,?,?,?,?,?,?,?,?)"

for index, row in data.iterrows():
    params = [[row.Gender,row.ScheduledWeekDay,row.ScheduledWeek,row.WaitingDays,row.Age,row.SMSreceived,row.Noshow,row.Hypertension,row.Diabetes,row.Alcoholism,row.Handicap]]
    iriscurs.executemany(sqltest,params)

iriscurs.commit()

Preparación del Modelo {#8}

Para efecto de visualización, vamos a trabajar con variables para nombrar nuestro modelo, y definir con cuántos datos vamos a entrenar y cuántos vamos a utilizar para validar.

datasize = len(irisdata)
modelName = "TrakNoShow"
predictingCol = "Noshow"
# si requiere reiniciar el modelo, se elimina las tablas creadas:
sqldropcross = "DROP TABLE PackageSample." + modelName + "MLRowCrossValidation"
sqldroptest = "DROP TABLE PackageSample." + modelName + "MLRowTest"
sqldroptrain = "DROP TABLE PackageSample." + modelName + "MLRowTraining"
sqldropval = "DROP TABLE PackageSample." + modelName + "MLRowValidation"
sqldropmodel = "DROP MODEL " + modelName + "Model"

# definimos con qué porcentaje de los datos realizaremos el crossvalidation:
cvLen = int(datasize * 0.9)
# Y el resto para testing:
testLen = datasize - cvLen
# tamaño de los datos para entrenamiento:
trainLen = int(cvLen * 0.75)
validationLen = cvLen - trainLen
# Crearemos modelo con CrossValidation:
sqlcrossval = "CREATE TABLE PackageSample." + modelName + "MLRowCrossValidation AS "
sqlcrossval = sqlcrossval + "SELECT * FROM PackageSample." + modelName + "MLRow WHERE Id IN ("
sqlcrossval = sqlcrossval + "SELECT TOP " + str(cvLen) + " idx "
sqlcrossval = sqlcrossval + "FROM community.randrange(1, " + str(datasize+1)  + ") "
sqlcrossval = sqlcrossval + "ORDER BY randValue)"

# Creamos la tabla para pruebas del modelo
sqltest = "CREATE TABLE PackageSample." + modelName + "MLRowTest AS "
sqltest = sqltest + "SELECT TOP " + str(testLen) + " * FROM PackageSample." + modelName + "MLRow WHERE Id NOT IN ("
sqltest = sqltest + "SELECT Id FROM PackageSample." + modelName + "MLRowCrossValidation)"

# Creamos tabla para entrenamiento:
sqltrain = "CREATE TABLE PackageSample." + modelName + "MLRowTraining AS "
sqltrain = sqltrain + "SELECT * FROM PackageSample." + modelName + "MLRowCrossValidation WHERE Id IN ("
sqltrain = sqltrain + "SELECT TOP " + str(trainLen) + " idx "
sqltrain = sqltrain + "FROM community.randrange(1, " + str(datasize+1) + ") "
sqltrain = sqltrain + "ORDER BY randValue)"

# Tabla para validación:
sqlval = "CREATE TABLE PackageSample." + modelName + "MLRowValidation AS "
sqlval = sqlval + "SELECT TOP " + str(validationLen) + " * "
sqlval = sqlval + "FROM PackageSample." + modelName + "MLRowCrossValidation "
sqlval = sqlval + "WHERE Id NOT IN ("
sqlval = sqlval + "SELECT Id FROM PackageSample." + modelName + "MLRowTraining)"

# Para creación del modelo:
sqlcreatemodel = "CREATE MODEL "+ modelName + "Model PREDICTING (" + predictingCol + ") "
sqlcreatemodel = sqlcreatemodel + "FROM PackageSample." + modelName + "MLRowTraining"

# Para entrenar modelo:
sqltrainmodel = 'TRAIN MODEL ' + modelName + 'Model USING {"seed": 1}'

# Para validar modelo:
sqlvalmodel = "VALIDATE MODEL " + modelName + "Model FROM PackageSample." + modelName + "MLRowValidation"

Podemos ejecutar una a una las sentencias desde nuestro notebook para crear el modelo, y luego entrenarlo.

# Creamos tabla CrossValidation:
iriscurs.execute(sqlcrossval)
iriscurs.commit()

# Creamos tabla Test:
iriscurs.execute(sqltest)
iriscurs.commit()

# Creamos tabla para entrenamiento:
iriscurs.execute(sqltrain)
iriscurs.commit()

# Creamos tabla para validacion:
iriscurs.execute(sqlval)
iriscurs.commit()

# Creamos el modelo:
iriscurs.execute(sqlcreatemodel)
iriscurs.commit()

# Entrenamos el modelo:
iriscurs.execute(sqltrainmodel)
iriscurs.commit()

# Validamos el modelo:
iriscurs.execute(sqlvalmodel)
iriscurs.commit()

Entrenado el modelo, podemos utilizarlo para conocer la predicción, ya sea que enviamos datos desde otro origen o podemos utilizar consultas directamente sobre el modelo. Un ejemplo:

# TrakNoShowModel
# Probar consultas hacia el modelo:

sqlpredict = "SELECT top 10 PREDICT(TrakNoShowModel) AS PredictedNoshow, Noshow AS ActualNoshow FROM PackageSample.TrakNoShowMLRowTest"

predictdata = pd.read_sql(sqlpredict, irisconn)
predictdata
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
PredictedNoshowActualNoshow
0FalseFalse
1TrueTrue
2FalseFalse
3FalseFalse
4FalseFalse
5FalseFalse
6FalseFalse
7FalseFalse
8FalseFalse
9TrueFalse

ALGUNOS PROBLEMAS ENCONTRADOS {#9}

Durante la preparación de este documento se debió ajustar algunos parámetros y consultas para poder terminarlo. Se detalla a continuación para posible solución al replicar los pasos en otro ambiente:

  • Se ajustó la conexión a IRIS para forzar utilización de encoding UTF8; al no hacerlo, se detectó que el campo "Gender" quedaba vacío.
  • Problema de Performance al consultar los diagnósticos del paciente de forma iterativa; por eso se ajustó la consulta para traer todos los diagnósticos del paciente con fecha de ingreso, y luego con Python filtrar según fecha de la cita.
  • jaydebeapi soporta una conexión por ejecución; por esto se trabajó la conexión a TrakCare (sobre Caché) con esta librería y se utilizó pyodbc para conectar IRIS. Se puede hacer lo contrario, ODBC para Caché y JDBC para IRIS.

TO DO {#10}

Algunas mejoras a la aplicación de este ejemplo, y que pueden estar disponible en nuevos post:

  1. Se puede trabajar estos mismos pasos, direcamente desde IRIS, aprovechando aún más sus propiedades y facilidad para acceder a los datos. Se hizo como notebook sólo para ejemplificar que se puede traer varios origenes de datos a IRIS para crear un modelo de Machine Learning, entrenarlo, y validarlo.

  2. Tener estos pasos en una clase de IRIS, permitirá además operativizar el modelo, por medio de webservice como el ejemplo disponible en readmision demo

  3. Contar con una carga programada desde el origen que permita incluso actualizar datos, por ejemplo, del estado de cita. Esto permitirá por ejemplo, construir un cubo y posterior cuadro de mando que permita identificar a los pacientes con alta posibilidad de no asistir para reforzar el contacto.

0
2 149
Anuncio Esther Sanchez · oct 4, 2021

¡Hola Comunidad!

Hemos grabado el webinar que hicimos la semana pasada 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 ha trabajado diez años en la Agencia Espacial Europea y nos descubrió muchas cosas interesantes sobre el espacio profundo. Así que... si queréis descubrir de forma práctica cómo crear modelos de Machine Learning, ¡no os perdáis el vídeo!

IntegratedML - Cómo crear modelos de Machine Learning en minutos

0
0 78
Anuncio Esther Sanchez · sep 15, 2021

¡Hola desarrolladores!

Os invitamos a un nuevo webinar en español: "IntegratedML - Cómo crear modelos de Machine Learning en minutos", el jueves 30 de septiembre, a las 4:00 PM (CEST).

 

El webinar está dirigido a programadores que quieran empezar a crear modelos de Machine Learning (no hace falta ser un experto, con saber un mínimo de SQL es suficiente).

1
0 571
Artículo Jose-Tomas Salvador · jul 7, 2021 8m read

Palabras clave PyODBC, unixODBC, IRIS, IntegratedML, Jupyter Notebook, Python 3

Propósito

Hace unos meses traté el tema de la "conexión con JDBC desde Python a la base de datos de IRIS", y desde entonces utilicé ese artículo con más frecuencia que mi propia nota oculta en mi PC. Por eso, traigo aquí otra nota de 5 minutos sobre cómo hacer una "conexión con JDBC desde Python a la base de datos de IRIS". ODBC y PyODBC parecen bastante fáciles de configurar en un cliente de Windows, sin embargo, siempre me atasco un poco en la configuración de un cliente unixODBC y PyODBC en un servidor de estilo Linux/Unix. ¿Existe un enfoque tan sencillo y consistente como se supone que debe ser para hacer que el trabajo de instalación de PyODBC/unixODBC funcione en un cliente linux estándar sin ninguna instalación de IRIS, contra un servidor IRIS remoto?

Alcance

Hace poco tuve que dedicar un tiempo a hacer funcionar desde cero una demo de PyODBC dentro de Jupyter Notebook en un entorno Docker en Linux. De ahí me surgió la idea de realizar esta nota detallada, para futuras consultas.

En el alcance:

En esta nota vamos a tratar los siguientes componentes:

  • PyODBC sobre unixODBC 
  • El servidor de Jupyter Notebook con Tensorflow 2.2 y Python 3
  • Servidor IRIS2020.3 CE con IntegratedML, incluyendo datos de prueba de ejemplo.
  • dentro de este entorno
  • El motor Docker con Docker-compose sobre AWS Ubuntu 16.04 
  • Docker Desktop para MacOS, y la Docker Toolbos for Windows 10 también están probadas

Fuera del alcance:

De nuevo, los aspectos no funcionales no se evalúan en este entorno de demo. Son importantes y pueden tratarse por separado, como:

  • Seguridad y auditoría de extremo a extremo.
  • Rendimiento y escalabilidad
  • Licencias y soporte, etc.

Entorno

Se puede usar cualquier imagen en Docker para Linux en las configuraciones y los pasos de prueba que se indican a continuación, pero una forma sencilla de configurar un entorno de este tipo en 5 minutos es:

  1. Clonar en Git esta plantilla de demostración
  2. Ejecutar "docker-compose up -d" en el directorio clonado que contiene el archivo docker-compose.yml. Simplemente creará un entorno de demostración, como se muestra en la siguiente imagen, de 2 contenedores. Uno para el servidor de Jupyter Notebook como cliente PyODBC, y otro para un servidor IRIS2020.3 CE.

En el entorno anterior, el tf2jupyter solo contiene una configuración de cliente "Python sobre JDBC", todavía no contiene ninguna configuración de cliente ODBC o PyODBC. Así que ejecutaremos los siguientes pasos para configurarlo, directamente desde Jupyter Notebook para que sea autoexplicativo.

Pasos

Ejecuté las siguientes configuraciones y pruebas en un servidor AWS Ubuntu 16.04. Mi colega @Thomas Dyar los ejecutó en MacOS. También lo probé brevemente en Docker Toolbox for Windows. Pero haznos saber si encuentras algún problema. Los siguientes pasos se pueden automatizar de forma sencilla en tu Dockerfile. Lo grabé manualmente aquí en caso de que se me olvide cómo se hacía después de unos meses.

1. Documentación oficial:

  • Soporte de ODBC para IRIS
  • Cómo definir la fuente de datos ODBC en Unix
  • Soporte PyODBC para IRIS
  • 2. Conectarse al servidor Jupyter

    Utilicé el SSH tunneling de Putty en forma local en el puerto 22 de AWS Ubuntu remoto, después mapeé al puerto 8896 como en la imagen anterior. (Por ejemplo, en el entorno local de Docker también se puede utilizar http directamente en la IP:8896 del equipo Docker).

    3. Ejecutar la instalación de ODBC desde Jupyter Notebook

    Ejecuta la siguiente línea de comando directamente desde una celda en Jupyter:

    !apt-get update !apt-get install gcc !apt-get install -y tdsodbc unixodbc-dev !apt install unixodbc-bin -y !apt-get clean -y

    Instalará el compilador gcc (incluyendo g++), FreeTDS, unixODBC y unixodbc-dev , que son necesarios para volver a compilar el driver PyODBC en el siguiente paso. Este paso no es necesario en un servidor nativo de Windows o PC para la instalación de PyODBC.

    4. Ejecutar la instalación de PyODBC desde Jupyter

    !pip install pyodbc
    Collecting pyodbc
      Downloading pyodbc-4.0.30.tar.gz (266 kB)
         |████████████████████████████████| 266 kB 11.3 MB/s eta 0:00:01
    Building wheels for collected packages: pyodbc
      Building wheel for pyodbc (setup.py) ... done
      Created wheel for pyodbc: filename=pyodbc-4.0.30-cp36-cp36m-linux_x86_64.whl size=273453 sha256=b794c35f41e440441f2e79a95fead36d3aebfa74c0832a92647bb90c934688b3
      Stored in directory: /root/.cache/pip/wheels/e3/3f/16/e11367542166d4f8a252c031ac3a4163d3b901b251ec71e905
    Successfully built pyodbc
    Installing collected packages: pyodbc
    Successfully installed pyodbc-4.0.30

    Lo anterior es la instalación mínima de PIP para esta demostración de Docker. En la documentación oficial, para la "Instalación de MacOS X", se proporcionan instrucciones para una instalación de PIP más detallada.

    5. Volver a configurar los archivos y enlaces ODBC INI en Linux:

    Ejecuta las siguientes líneas de comando para volver a crear los enlaces odbcinst.ini y odbc.ini

    !rm /etc/odbcinst.ini !rm /etc/odbc.ini
    !ln -s /tf/odbcinst.ini /etc/odbcinst.ini !ln -s /tf/odbc.ini /etc/odbc.ini

    Nota: La razón de realizar lo anterior es que los pasos 3 y 4 normalmente crearían 2 archivos ODBC en blanco (por lo tanto, no válidos) en el directorio \etc. A diferencia de la instalación de Windows, estos archivos ini en blanco causan problemas, por lo tanto, debemos eliminarlos y luego simplemente volver a crear un enlace a los archivos ini reales proporcionados en un volumen Docker mapeado: /tf/odbcinst.ini, y /tf/odbc.ini Revisemos estos 2 archivos ini - en este caso, son la forma más simple para las configuraciones ODBC de Linux:

    !cat /tf/odbcinst.ini
    [InterSystems ODBC35]
    UsageCount=1
    Driver=/tf/libirisodbcu35.so
    Setup=/tf/libirisodbcu35.so
    SQLLevel=1
    FileUsage=0
    DriverODBCVer=02.10
    ConnectFunctions=YYN
    APILevel=1
    DEBUG=1
    CPTimeout=<not Pooled>
    !cat /tf/odbc.ini
    [IRIS PyODBC Demo]
    Driver=InterSystems ODBC35
    Protocol=TCP
    Host=irisimlsvr
    Port=51773
    Namespace=USER
    UID=SUPERUSER
    Password=SYS
    Description=Sample namespace
    Query Timeout=0
    Static Cursors=0
    Los archivos anteriores están pre-configurados y se proporcionan en la unidad mapeada. Esto se refiere al driver **libirisodbcu35.so,** que también se puede conseguir en la instancia del contenedor del servidor IRIS (en su directorio {iris-installation}/bin). Por lo tanto, para que la instalación ODBC anterior funcione, **deben existir estos 3 archivos** en la unidad mapeada (o en cualquier unidad de Linux) **con los permisos de los archivos adecuados**:
  • libirisodbcu35.so
  • odbcinst.ini
  • odbc.ini
  • 6. Verificar la instalación de PyODBC 

    !odbcinst -j
    unixODBC 2.3.4
    DRIVERS............: /etc/odbcinst.ini
    SYSTEM DATA SOURCES: /etc/odbc.ini
    FILE DATA SOURCES..: /etc/ODBCDataSources
    USER DATA SOURCES..: /root/.odbc.ini
    SQLULEN Size.......: 8
    SQLLEN Size........: 8
    SQLSETPOSIROW Size.: 8
    import pyodbc print(pyodbc.drivers())
    ['InterSystems ODBC35']
    Por ahora, las salidas anteriores indicarán que el *driver* ODBC tiene los enlaces válidos. Deberíamos poder ejecutar alguna prueba de ODBC de Python en Jupyter Notebook.

    7. Ejecutar la conexión ODBC de Python en las muestras de IRIS:

    import pyodbc import time
    ### 1. Get an ODBC connection #input("Hit any key to start") dsn = 'IRIS PyODBC Demo' server = 'irisimlsvr' #IRIS server container or the docker machine's IP port = '51773' # or 8091 if docker machine IP is used database = 'USER' username = 'SUPERUSER' password = 'SYS'
    #cnxn = pyodbc.connect('DSN='+dsn+';') # use the user DSN defined in odbc.ini, or use the connection string below cnxn = pyodbc.connect('DRIVER={InterSystems ODBC35};SERVER='+server+';PORT='+port+';DATABASE='+database+';UID='+username+';PWD='+ password)
    ###ensure it reads strings correctly. cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf8') cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf8') cnxn.setencoding(encoding='utf8')
    ### 2. Get a cursor; start the timer cursor = cnxn.cursor() start= time.clock()
    ### 3. specify the training data, and give a model name dataTable = 'DataMining.IrisDataset' dataTablePredict = 'Result12' dataColumn = 'Species' dataColumnPredict = "PredictedSpecies" modelName = "Flower12" #chose a name - must be unique in server end
    ### 4. Train and predict #cursor.execute("CREATE MODEL %s PREDICTING (%s) FROM %s" % (modelName, dataColumn, dataTable)) #cursor.execute("TRAIN MODEL %s FROM %s" % (modelName, dataTable)) #cursor.execute("Create Table %s (%s VARCHAR(100), %s VARCHAR(100))" % (dataTablePredict, dataColumnPredict, dataColumn)) #cursor.execute("INSERT INTO %s SELECT TOP 20 PREDICT(%s) AS %s, %s FROM %s" % (dataTablePredict, modelName, dataColumnPredict, dataColumn, dataTable)) #cnxn.commit()
    ### 5. show the predict result cursor.execute("SELECT * from %s ORDER BY ID" % dataTable) #or use dataTablePredict result by IntegratedML if you run step 4 above row = cursor.fetchone() while row: print(row) row = cursor.fetchone()
    ### 6. CLose and clean cnxn.close() end= time.clock() print ("Total elapsed time: ") print (end-start)
    (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')
    (4, 1.5, 0.2, 4.6, 3.1, 'Iris-setosa')
    (5, 1.4, 0.2, 5.0, 3.6, 'Iris-setosa')
    ... ...
    ... ...
    ... ...
    (146, 5.2, 2.3, 6.7, 3.0, 'Iris-virginica')
    (147, 5.0, 1.9, 6.3, 2.5, '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')
    Total elapsed time: 
    0.023873000000000033

    Un par de consejos:

    1. cnxn = pyodbc.connect() - en el entorno Linux, la cadena de conexión expresada en esta llamada debe ser literalmente correcta y sin espacios.
    2. Establece la codificación de la conexión correctamente con, por ejemplo, utf8. En este caso, el valor predeterminado no funcionaría para las cadenas.
    3. libirisodbcu35.so - lo ideal es que este driver esté estrechamente alineado con la versión del servidor IRIS remoto.

    Siguiente

    Ahora tenemos un entorno Docker con un Jupyter notebook que incluye Python3 y Tensorflow2.2 (sin GPU) a través de una conexión PyODBC (así como JDBC) en un servidor IRIS remoto. Deben funcionar para todas las sintaxis SQL personalizadas, como las que son propiedad de IntegratedML en IRIS, así que ¿por qué no explorar un poco más en IntegratedML y ser creativo con su forma SQL de conducir ciclos de vida ML? Además, me gustaría que pudiéramos volver a tratar o recapitular el enfoque más sencillo sobre IRIS nativo o incluso Magic SQL en el entorno Python, que se conectará con el servidor IRIS. Y, el extraordinario Python Gateway está disponible ahora, así que incluso podemos intentar invocar las aplicaciones y servicios externos de Python ML, directamente desde el servidor IRIS. Me gustaría que pudiéramos probar más sobre eso también.

    ##Anexo El archivo del bloc de notas anterior se revisará en este repositorio de Github, y también en Open Exchange.

    0
    0 561