Python 集成获取列属性你好,
如果我使用 df = jmp.current() 作为对已打开的 JMP 数据表的引用,是否有办法在 Python 中获取 JMP 数据表中的列属性(例如“设计角色”和“因子变化”)?
我知道可以使用 df[0].dtype 和 df[0].mtype 获取数据类型和建模类型属性,但我希望用 Python 列出 DoE 生成的表中的因子和响应。
谢谢!
自动化和脚本编写实验设计回复:Python 集成获取列属性如果某些功能尚未实现,您可以始终回退到 run_jsl。
回复:Python 集成获取列属性当然可以,但是以下代码:
df = jmp.current()
sc = jmp.run_jsl('df << Get Column Names();')
print(sc)
返回以下错误:名称未解析:在访问或评估“df”时出现“df”错误,df/*###*/
有什么想法吗?
回复:Python 集成获取列属性除非你“共享”它们,否则 JMP 端无法识别你的 Python 数据框变量。我不知道哪种方法更好,但你可以使用 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'))
或者你可以使用 JMP 端的 Python Get 方法。
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'))
回复:Python 集成获取列属性非常有用,谢谢。不过运行的时候:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
尽管我的表中显然有一些列,但输出结果却是“None”。
另外,如果使用脚本并设置“Names Default To Here(1)”,我的 JMP 会崩溃……
回复:Python 集成获取列属性你收到 None 是因为没有访问 here 命名空间的权限。你可以使用 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']
回复:Python 集成获取列属性非常感谢jthi!
这之所以有效,不仅是因为使用了 Python Send(因为我之前试过),还因为为 cname 指定了“字符串”类型。
回复:Python 集成获取列属性还有一个问题/愿望:如何遍历所有列,检查它们是否具有“设计角色”或“因素变化”属性,并仅列出这些列?
回复:Python 集成获取列属性如果列中存在这些属性之一,您是否希望将结果以 Python 列表的形式返回?
回复:Python 集成获取列属性是的
回复:Python 集成获取列属性根据需要修改逻辑,使其更容易理解
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']
回复:Python 集成获取列属性虽然 Python 和 JSL 都可以访问数据表,但上面脚本中的 `df` 是 Python 环境中的变量,它保存着指向该数据表的指针。除非你在 JSL 中执行 `Get(df)`,否则 JSL 对变量 `df` 一无所知。`Get(df)` 会创建一个 JSL 变量,该变量引用与 `df` 指向的同一个数据表。虽然 Python 端没有 `GetColumnNames()` 函数,但你需要用 Python 的思维方式来思考,而不是用 JSL 的思维方式。表中的每一列都有一个 `name` 属性,请参阅脚本索引。
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)
JMP 数据表以列列表的形式存在,列又以行列表的形式存在。脚本索引的 Python 类别中包含大量相关信息。上述支持自 18.0.0 版本起就已存在。
Python 支持的设计原则是按照 Python 程序员的期望行事,并且提供了丰富的支持,尤其是在 jmp.DataTable 对象中,可以以“Pythonic”的方式做事。
回复:Python 集成获取列属性关于:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
上述脚本存在一些问题。变量 cname 不在 here 命名空间中,而是在 global 命名空间中,因为 jmp.run_jsl() 脚本中没有设置 Names Default to Here(1);,所以它默认使用 globals 命名空间。其次,你需要将 "Strings" 参数传递给 << Get Column Names("Strings"),以便能够像其他回复中提到的那样,使用 Python 的 Send(cname) 将正确的列表传递给 Python。将 cname 作为字符串列表获取,也允许在 JMP 19 及更高版本中使用 here 或 globals 访问器从 Python 端获取它。如果不将列表转换为字符串列表,你将得到一个包含不透明内部对象的列表,而不是字符串列表。
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'))