Integrazione Python per ottenere le proprietà della colonnaCIAO,
Esiste un modo per ottenere le proprietà delle colonne dalla tabella dati JMP (ad esempio "Ruolo di progettazione" e "Modifiche ai fattori") in Python, se utilizzo df = jmp.current() come riferimento alla tabella dati JMP aperta?
Conosco df[0].dtype e df[0].mtype per ottenere le proprietà del tipo di dati e del tipo di modellazione, ma vorrei elencare i fattori e le risposte in Python da una tabella generata da DoE.
Grazie!
Automazione e scriptingProgettazione degli esperimentiRe: Integrazione Python per ottenere le proprietà della colonnaPuoi sempre ricorrere a run_jsl se qualche funzionalità non è ancora stata implementata
Re: Integrazione Python per ottenere le proprietà delle colonneCerto, tuttavia il seguente codice:
df = jmp.current()
sc = jmp.run_jsl('df << Get Column Names();')
print(sc)
restituisce il seguente errore: Nome non risolto: df in accesso o valutazione di 'df' , df/*###*/
Avete qualche idea?
Re: Integrazione Python per ottenere le proprietà delle colonneIl lato JMP non conosce le tue variabili Python di df a meno che tu non le "condivida". Non ho idea di quale sia il metodo migliore, ma puoi usare ad esempio 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'))
Oppure potresti usare Python Get dal lato 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: Integrazione Python per ottenere le proprietà delle colonneMolto utile, grazie. Anche se quando si esegue:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
Come output ottengo "Nessuno", nonostante nella mia tabella ci siano ovviamente alcune colonne.
Inoltre, se si utilizza lo script con "Names Default To Here(1)", il mio JMP si blocca...
Re: Integrazione Python per ottenere le proprietà delle colonneOttieni None perché non hai accesso a questo namespace. Puoi usare 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: Integrazione Python per ottenere le proprietà delle colonneGrazie mille jthi!
Funziona non solo perché utilizzo Python Send (perché l'ho già provato in precedenza), ma anche perché per cname è specificato il tipo "string".
Re: Integrazione Python per ottenere le proprietà della colonnaUn'altra domanda/desiderio: come si fa a scorrere tutte le colonne e a verificare se hanno una proprietà "Ruolo di progettazione" o "Modifiche ai fattori" ed elencare solo quelle colonne?
Re: Integrazione Python per ottenere le proprietà delle colonneVuoi ottenere il risultato nell'elenco Python se una di queste proprietà viene trovata per le colonne?
Re: Integrazione Python per ottenere le proprietà delle colonneSÌ
Re: Integrazione Python per ottenere le proprietà delle colonneModificare la logica secondo necessità per renderla più facile da capire
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: Integrazione Python per ottenere le proprietà delle colonneSebbene una tabella dati sia accessibile da Python e JSL, df nello script precedente è la variabile nell'ambiente Python che contiene un puntatore alla tabella dati. JSL non sa nulla della variabile df a meno che non si esegua un Python Get(df); da JSL, che crea una variabile JSL che fa riferimento alla stessa tabella dati a cui fa riferimento df. Sebbene non esista un Get Column Names() dal lato Python, è necessario pensare in Python invece che in JSL. Ogni colonna nella tabella ha una proprietà name (vedere l'Indice di scripting).
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 tabella dati JMP si comporta come un elenco di colonne e le colonne si comportano come un elenco di righe. La categoria Python dell'indice di scripting contiene numerose informazioni. Il supporto di cui sopra è disponibile dalla versione 18.0.0.
Il principio di progettazione del supporto Python è quello di comportarsi come si aspetterebbe un programmatore Python e il supporto è ampio, in particolare nell'oggetto jmp.DataTable, per fare le cose in modo "Pythonico".
Re: Integrazione Python per ottenere le proprietà delle colonnePer quanto riguarda:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
Ci sono un paio di problemi con lo script sopra. La variabile cname non si trova nello spazio dei nomi here, ma piuttosto nello spazio dei nomi globale, perché non esiste un Names Default to Here(1); nello script jmp.run_jsl(). Quindi, per impostazione predefinita, usa lo spazio dei nomi globals. In secondo luogo, è necessario il parametro "Strings" per << Get Column Names("Strings") per poter passare l'elenco corretto a Python con un Python Send(cname), come indicato da altre risposte. Ottenere cname come elenco di stringhe consente anche di ottenerlo dal lato Python utilizzando gli accessor here o globals in JMP 19 e versioni successive. Senza rendere l'elenco un elenco di stringhe, si ottiene un elenco di oggetti interni Opaque invece di stringhe.
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'))