将 Pandas DataFrame 从 Python 发送到 JMP 18 数据表的问题语境:
I am using JMP 18 with Python integration to merge multiple datasets. The merge and processing in Python works correctly using pandas, but when I try to send the final pandas DataFrame back to JMP using Python Get(), the resulting JMP Data Table is empty. I want to create a JMP table from my pandas DataFrame in Python and access it in JSL.
我正在尝试的示例:
</CODE></STRONG></PRE>
<PRE>// Send JMP tables to Python
Python Send(jmp_table1);
Python Send(jmp_table2);
// Python processing
Python Submit("
import pandas as pd
def jmp_to_pandas(jmp_table):
cols = list(jmp_table)
data_dict = {}
for col in cols:
data_dict[col.name] = list(col)
return pd.DataFrame(data_dict)
# Convert JMP tables to pandas DataFrames
df1 = convert_jmp_to_pandas(jmp_table1)
df2 = convert_jmp_to_pandas(jmp_table2)
# Merge tables
merged_df = pd.merge_asof(df2, df1, left_on='Time', right_on='Time', direction='nearest')
");
// Attempt to bring merged DataFrame back to JMP
dt_merged = Python Get(merged_df);
dt_merged << Set Name("Merged_Data");
dt_merged << Show Window;
</PRE>
<PRE><STRONG data-start="638" data-end="669"><CODE class=" language-jsl">
观察到的问题:
-
dt_merged is created but contains no data. [但数据框已生成,因为我可以将其保存为 csv 并使用它]
-
Using global in Python does not seem to fix the issue.
-
Python Get() does not appear to recognize the pandas DataFrame correctly.
我想要的是:
我正在考虑的潜在解决方案:
环境:
-
JMP 18
-
Python 3.x(嵌入式)
- 在 JSL 脚本中使用
非常感谢任何将 pandas DataFrames 从 Python 发送回 JMP 的指导或工作示例!
自动化和脚本基本数据分析与建模数据访问数据混合和清理数据探索与可视化回复:将 Pandas DataFrame 从 Python 发送到 JMP 18 数据表的问题请查看“脚本指南 > Python > 从 JMP 数据表创建 Pandas 数据表”中的“通过循环遍历数据表列构建 Pandas 数据表”示例。另外,我认为在 JMP19 中,将Python 数据表转换为 JMP 数据表更容易,无需中间 csv 文件(JMP 愿望清单),但由于 JMP19 存在太多问题,我还没有尝试过。
回复:将 Pandas DataFrame 从 Python 发送到 JMP 18 数据表的问题您的 dt_merged 确实包含数据,但不包含视图。
使用
dt_merged <<新数据视图;
而不是
dt_merged << 显示窗口;
该表存在但尚无关联窗口。
另请注意,在 JMP 18 中,Python Get( df ) 内部确实使用了 dataframe -> CSV CSV -> data_table 的转换方式,就像 JMP 14-17 中那样。只有 JMP 数据表可以跨 JMP/Python 边界实时访问数据。
在 JMP 19 中,情况要好得多。JMP 支持可移植 Dataframe 协议,只需一行代码即可从 JMP dt => pandas DataFrame 转换,再用一行代码即可将 DataFrame 转换为 DataTable。这适用于任何支持 DataFrame 协议的 DataFrame 类包,并且转换过程在内存中进行。
您的另一个选择是使用 jmp.DataTable API 在 Python 中创建合并数据表,并遍历数据框列,在新数据表中逐一创建 JMP 列。看起来您的表格中包含时间数据。这需要注意确保正确。在 JMP 14-18 中,您必须在 JMP 的数据时间表示和 Python 的数据时间表示之间进行编组。JMP 的纪元日期是 1904 年 1 月 1 日(与 Mac 上的 Excel 相同),而 Python 的纪元日期是 1970 年 1 月 1 日。
JMP 19 正确地跨 JSL / Python 边界编组日期时间值。
脚本索引的“Python”部分中有跳转导入包的示例。
我强烈建议更新到 JMP 19。JMP 18 对 JMP 中的 Python 集成进行了根本性的改进。虽然 JMP 18 的支持不如我们期望的那么全面,但它提供了如此丰富的功能,我们不想等到 JMP 19 才升级。
回复:将 Pandas DataFrame 从 Python 发送到 JMP 18 数据表的问题我还想指出的是,jmp.DataTable 对象是可迭代的,因此你可以在 for 循环中直接使用 jmp_table。它的行为已经类似于列的列表了。
def jmp_to_pandas(jmp_table):
data_dict = {}
for col in jmp_table:
data_dict[col.name] = list(col)
return pd.DataFrame(data_dict)
回复:将 Pandas DataFrame 从 Python 发送到 JMP 18 数据表的问题我确实观察到我的数据框中的日期非常奇怪,请参考屏幕截图。这是日期格式,只有少数受到影响,日期时间似乎不受影响。
回复:将 Pandas DataFrame 从 Python 发送到 JMP 18 数据表的问题这是以秒为单位的日期。您可以通过更改列设置将任何数字显示为日期:

回复:将 Pandas DataFrame 从 Python 发送到 JMP 18 数据表的问题嘿,谢谢,我已经解决了这个问题,但我正在使用 JSL 和 Python 代码。有没有更好的方法在代码本身中解决这个问题?
1 - 使用纪元时间偏移的 Python 进程
2- 将列格式重新分配给 jsl 代码中的每一列。[繁琐]
回复:关于从 Python 向 JMP 18 数据表发送 Pandas DataFrame 的问题- Unix 时间戳转换为实际日期和时间
<BR />:col << Format( "yyyy-mm-dd" );
回复:将 Pandas DataFrame 从 Python 发送到 JMP 18 数据表的问题截图是一个例子,我有 100 多列:\,源数据格式不一致。顺便说一句,谢谢
回复:将 Pandas DataFrame 从 Python 发送到 JMP 18 数据表的问题JMP19?
回复:将 Pandas DataFrame 从 Python 发送到 JMP 18 数据表的问题JMP 18 org 无法迁移到 JMP19,我不确定这是测试版本还是已开发的应用程序。我怀疑是后续版本。
回复:关于从 Python 向 JMP 18 数据表发送 Pandas DataFrame 的问题或许可以等 JMP19.1 版本发布,届时一些缺失的功能将会恢复: 未公开的密钥。
除此之外:
切换到 JMP19 的原因之一: from_dataframe()
在 JMP 19 中进一步使用 Python
另一个原因是:数据网格的出色改进,例如列标签和筛选视图。
在 JMP 19 数据表中组织和筛选数据
您有机会在测试系统上“手动”安装 JMP19 吗?
回复:关于从 Python 向 JMP 18 数据表发送 Pandas DataFrame 的问题是的,我可以做到。但我还没这么做。我不使用它的另一个原因是脚本兼容性问题,因为其他用户还会继续使用 JMP18。我已经遇到了很多表引用和连接方面的问题。
回复:关于从 Python 向 JMP 18 数据表发送 Pandas DataFrame 的问题
@zetaVagabond1写道:
我目前在表引用和连接方面已经遇到了不少问题。
JMP18 与 JMP17 相比存在哪些问题?
回复:关于从 Python 向 JMP 18 数据表发送 Pandas DataFrame 的问题JMP 使用 1904 年 1 月 1 日的纪元作为时间 0(以秒为单位)(Mac Excel 纪元日期)。
Python 使用标准的 UNIX 1970 年 1 月 1 日纪元日期作为时间 0 秒。
JMP 19 能够正确地跨越 JSL / Python 边界对日期时间值进行序列化。
JMP 19 有一个 dt = jmp.from_dataframe(df) 函数,可以直接从内存中的数据框创建日期表。
在 JMP 18 中,唯一的内存选择是自己构建列,循环遍历 pandas 列并注意日期/时间转换。
或者,您也可以使用 CSV 文件。JMP 14-17 就是这么做的。但请注意,二进制数据 -> CSV -> 二进制的转换过程中,数值可能会出现细微的二进制差异。JMP 18 的 SAMPLE_SCRIPTS/Python 目录中有一些示例,展示了如何使用 CSV 文件。简而言之,就是告诉 pandas 将数据保存为 CSV 文件,然后告诉 JMP 打开该 CSV 文件。
我强烈建议您升级到 19 版本。19 版本在数据表处理方面进行了重大改进。
回复:关于从 Python 向 JMP 18 数据表发送 Pandas DataFrame 的问题罗里·瓦登:如何倍增你的时间?
https://www.youtube.com/watch?v=y2X7c9TUQJ8

现在就等着你们的IT部门切换到JMP19吧——或许可以花点功夫说服他们。
明天你就可以编写和使用一些很棒的代码了。
另一种选择是今天就开始编写今天就已经过时的代码。
Python 与 JMP19:
易于编码
- 苗条的
速度快得多