Integración de Python para obtener propiedades de columnaHola,
¿Hay alguna manera de obtener propiedades de columna de la tabla de datos JMP (como "Rol de diseño" y "Cambios de factor") en Python, si uso df = jmp.current() como referencia a la tabla de datos JMP abierta?
Soy consciente de df[0].dtype y df[0].mtype para obtener propiedades de tipo de datos y tipo de modelado, pero me gustaría enumerar los factores y las respuestas en Python a partir de una tabla generada por DoE.
¡Gracias!
Automatización y scriptingDiseño de experimentosRe: Integración de Python para obtener propiedades de columnaSiempre puedes recurrir a run_jsl si alguna característica aún no se ha implementado
Re: Integración de Python para obtener propiedades de columnaClaro, pero el siguiente código:
df = jmp.current()
sc = jmp.run_jsl('df << Get Column Names();')
print(sc)
devuelve el siguiente error: Nombre sin resolver: df en acceso o evaluación de 'df', df/*###*/
¿Alguna idea?
Re: Integración de Python para obtener propiedades de columnaEl lado de JMP no conoce tus variables de Python de df a menos que las compartas. No tengo idea de cuál es el método preferido, pero puedes usar, por ejemplo, jmp.here.
import jmp
dt = jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
jmp.here["dt"] = dt
jmp.run_jsl('''
Names Default To Here(1);
p = Column(dt, "name") << Get Property("Notes");
'''
);
print(jmp.here.get('p'))
O podrías usar Python Get desde el lado JMP.
import jmp
dt = jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
jmp.run_jsl('''
dtref = Python Get(dt);
p1 = Column(dtref, "name") << Get Property("Notes");
'''
);
print(jmp.here.get('p1'))
Re: Integración de Python para obtener propiedades de columnaMuy útil, gracias. Aunque al ejecutar:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
Obtengo "Ninguno" como resultado, a pesar de que obviamente tengo algunas columnas en mi tabla.
Además, si uso el script con "Nombres predeterminados aquí (1)", mi JMP se bloquea...
Re: Integración de Python para obtener propiedades de columnaObtienes "Ninguno" porque no tienes acceso a este espacio de nombres. Puedes usar Python Send.
import jmp
jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
df = jmp.current()
jmp.run_jsl('''
dt = Python Get(df);
cname = dt << Get Column Names("string");
Python Send(cname);
''')
print(cname) # ['name', 'age', 'sex', 'height', 'weight']
Re: Integración de Python para obtener propiedades de columna¡Muchas gracias jthi!
Esto funciona, no solo por usar Python Send (porque lo intenté antes), sino también por especificar el tipo "cadena" para cname.
Re: Integración de Python para obtener propiedades de columnaOtra pregunta/deseo: ¿cómo se podría desplazar uno por todas las columnas y comprobar si tienen una propiedad de "Rol de diseño" o "Cambios de factor", y enumerar solo esas columnas?
Re: Integración de Python para obtener propiedades de columna¿Quieres el resultado en una lista de Python si se encuentra una de esas propiedades para las columnas?
Re: Integración de Python para obtener propiedades de columnaSí
Re: Integración de Python para obtener propiedades de columnaModifique la lógica según sea necesario para que sea más fácil de entender.
import jmp
# demo setup
jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
jmp.run_jsl('''
Data Table("Big Class"):weight << Set Property("Design Role", Design Role("Continuous"));
Data Table("Big Class"):name << Set Property("Factor Changes", Easy);
''')
df = jmp.current()
jmp.run_jsl('''
dt = Python Get(df);
colnames = dt << Get Column Names("string");
res = Filter Each({colname}, colnames,
!Is Empty(Column(dt, colname) << Get Property("Design Role")) | !Is Empty(Column(dt, colname) << Get Property("Factor Changes"));
);
Python Send(res);
''')
print(res) # ['name', 'weight']
Re: Integración de Python para obtener propiedades de columnaAunque se puede acceder a una tabla de datos desde Python y JSL, df en el script anterior es la variable en el entorno Python que contiene un puntero a la tabla de datos. JSL no sabe nada sobre la variable df a menos que se ejecute un Get(df); de Python desde JSL, lo que crea una variable JSL que hace referencia a la misma tabla de datos que df. Aunque no existe la función Get Column Names() desde Python, se debe usar Python en lugar de JSL. Cada columna de la tabla tiene una propiedad de nombre (véase el Índice de scripts).
import jmp
dt = jmp.open(jmp.SAMPLE_DATA + "Big Class.jmp")
# print then set the first column's name from python
# note the column index is zero-based just like Python.
# You can also access the column by name: print(dt['age'])
print(dt[0].name)
dt[0].name = 'First Name'
# simple list comprehension to walk data table columns
# and build a list of names from the column's name property
names = [x.name for x in dt]
print(names)
Una tabla de datos JMP se comporta como una lista de columnas, y estas, como una lista de filas. Existe abundante información en la categoría Python del índice de scripting. Esta compatibilidad está disponible desde la versión 18.0.0.
El principio de diseño del soporte de Python es comportarse de la forma en que un programador de Python esperaría y hay un amplio soporte, especialmente en el objeto jmp.DataTable para hacer las cosas de manera "Pythonic".
Re: Integración de Python para obtener propiedades de columnaAcerca de:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
El script anterior presenta un par de problemas. La variable cname no se encuentra en el espacio de nombres "here", sino en el espacio de nombres global, ya que no existe un parámetro "Names Default to Here(1);" en el script jmp.run_jsl(). Por lo tanto, su valor predeterminado es el espacio de nombres globals. En segundo lugar, se necesita el parámetro "Strings" en "<< Get Column Names("Strings")" para poder pasar la lista correcta a Python con un Python Send(cname), como se ha referenciado en otras respuestas. Obtener cname como una lista de cadenas también permite obtenerla desde Python mediante los accesores "here" o "globals" en JMP 19 y posteriores. Sin convertir la lista en una lista de cadenas, se obtiene una lista de objetos internos opacos en lugar de cadenas.
import jmp
dt = jmp.open(jmp.SAMPLE_DATA + "Big Class.jmp")
print(dt[0].name)
dt[0].name = 'First Name'
# do it in a python way
names = [x.name for x in dt]
print(names)
# using JSL
jmp.run_jsl('''
Names default to here(1);
dt = Python Get( dt );
jname = dt << Get Column Names("String");
''')
print(jmp.here['jname'])
print(jmp.here.get('jname'))