안녕,
스크립트를 사용하여 JMP를 사용하여 hdf5 파일을 열려고 합니다. Open() 명령을 사용하여 성공적으로 열 수 있습니다.
blobpath = "/Documents/myblob";
dtblob_lis = Open(blobpath);
하지만 어떤 데이터 세트를 열고 싶은지 묻는 팝업이 나타납니다.

제 질문: Open() 명령에서 blob 내에서 열고 싶은 데이터 세트를 지정하고 팝업을 피하는 데 사용할 수 있는 옵션이 있습니까? 감사합니다.
... 그리고 그 동작을 기록할 방법이 있나요?
대안으로 h5py를 사용하세요.
매우 매끄러운 신데 JMP18 : )
제가 시도한 첫 번째 것이었습니다. 아니요, 로그나 생성된 테이블에는 동작에 대한 명백한 기록이 없습니다.
안타깝게도 저희 조직에서는 아직 JMP18을 채택하지 않았습니다.
LearnBot: 똑같습니다.
상쾌할 정도로 솔직해요 : )

추측이지만 hdf5 파일을 자동으로 여는 것에 대한 토론을 기반으로 하면 Python 통합이 답일 수 있습니다. @briancorcoran
Python으로 파일 열기/변환을 관리하기 위해 JMP의 Python 통합을 사용할 필요는 없습니다. 명령줄에서 실행할 수 있는 Python 스크립트를 만들어(Run Program() 사용) 필요한 입력(최소한 파일 경로)을 받아서 .csv로 저장한 다음 JMP에서 해당 .csv를 엽니다. 저는 JMP18 이전에 JMP에서 Python을 이렇게 사용했습니다(그리고 지금도 가끔 사용합니다). 물론 18 이전 버전에서 JMP의 Python 통합을 사용해 볼 수는 있지만, 저는 귀찮게 하지 않고 명령줄에서 실행할 것입니다.
JSL 목록을 사용하여 열 멤버를 지정하여 HDF5 데이터 세트 내의 개별 항목을 열 수 있습니다. 예를 들어, 다음은 저에게 효과가 있었습니다(파일 확장자도 지정):
("d:\testdata\HDF5\hdf5data.h5", {"/g2/float"})를 엽니다.
귀하의 경우에는 다음과 같습니다.
open("/Documents/myblob.h5", {"/CSIG_RAW_IMG_OFF/F0/프레임번호", "/CSIG_RAW_IMG_OFF/F0/프레임"});
도움이 되길 바랍니다.
브라이언 코코란
JMP 개발
이게 바로 내가 찾던 솔루션이에요. 효과가 있네요. 고맙습니다.
저는 Python과 JMP 17 사이에서 데이터를 전송하는 더 빠르고 효율적인 방법을 찾고 있었습니다. 왜냐하면 판다스와 JMP 모두 CSV를 읽고 쓰는 속도가 매우 느리고, GetTable() 함수조차도 적어도 JMP 17에서는 내부적으로 CSV를 사용하는 것 같기 때문입니다. 판다스의 to_hdf 함수는 HDF 호환 데이터 세트에 문자열 데이터를 저장하는 대신, Numpy 배열을 문자열로 저장하는 몇 가지 사용자 지정 기법을 사용하기 때문에 작동하지 않습니다. 이는 공간 효율성이 낮을 뿐만 아니라 Python으로 읽어야 하는 상황에 놓이게 됩니다.
저는 h5py를 사용하여 .h5 테이블을 저장하는 사용자 정의 개념 증명 Python 코드와 테이블을 읽고 별도의 데이터 세트에서 원래 테이블을 재구성하는 JSL 코드를 작성했습니다.
import pandas as pd
import numpy as np
from pathlib import Path
import h5py
from time import perf_counter
last_time = perf_counter()
compression = "gzip"
def log_time(msg):
global last_time
current_time = perf_counter()
elapsed_time = current_time - last_time
print(f"{elapsed_time:1.3f} s: {msg}")
last_time = current_time
# read dataframe (just for the development example)
df = pd.read_csv(Path(__file__).parent / "my_table.csv")
log_time("Read df")
string_columns = df.select_dtypes(include=["object"]).columns
# min_itemsize = {col: df[col].str.len().max() for col in string_columns}
max_string_length = np.max([df[col].str.len().max() for col in string_columns]) if len(string_columns) > 0 else 1
max_string_column_length = np.max([len(col) for col in string_columns]) if len(string_columns) > 0 else 1
log_time("max_string_length =" + str(max_string_length))
float_columns = df.select_dtypes(include=["float"]).columns
max_float_column_length = np.max([len(col) for col in float_columns]) if len(float_columns) > 0 else 1
log_time("max_float_column_length =" + str(max_float_column_length))
int_columns = df.select_dtypes(include=["int"]).columns
max_int_column_length = np.max([len(col) for col in int_columns]) if len(int_columns) > 0 else 1
log_time("max_int_column_length =" + str(max_int_column_length))
max_column_length = np.max(
[max_float_column_length, max_int_column_length, max_string_column_length]
)
log_time("max_column_length =" + str(max_column_length))
file = h5py.File(Path(__file__).parent / "sample.h5", "w")
log_time("Opened h5 file")
string_data = df[string_columns].astype(str).values
log_time("Converted string data to str")
string_data_ascii = np.array(
[[s.encode("ascii", "ignore") for s in row] for row in string_data]
)
log_time("Converted string data to ascii")
file.create_dataset(
"string_data",
data=string_data_ascii,
dtype=f"S{max_string_length}",
compression=compression,
)
log_time("Created string_data dataset")
file.create_dataset(
"string_columns",
data=np.array(string_columns, dtype=f"S{max_string_column_length}"),
compression=compression,
)
log_time("Created string_columns dataset")
file.create_dataset(
"float_data", data=df[float_columns].values, dtype="f4", compression=compression
)
log_time("Created float_data dataset")
file.create_dataset(
"float_columns",
data=np.array(float_columns, dtype=f"S{max_float_column_length}"),
compression=compression,
)
log_time("Created float_columns dataset")
file.create_dataset(
"int_data", data=df[int_columns].values, dtype="i4", compression=compression
)
log_time("Created int_data dataset")
file.create_dataset(
"int_columns",
data=np.array(int_columns, dtype=f"S{max_int_column_length}"),
compression=compression,
)
log_time("Created int_columns dataset")
file.create_dataset(
"column_order",
data=np.array(
df.columns,
dtype=f"S{max_column_length}",
),
compression=compression,
)
log_time("Created column_order dataset")
file.flush()
file.close
CloseAll(datatables, nosave);
last_time = TickSeconds();
log_time = Function({msg},
now = TickSeconds();
print(Char(now - last_time) || " - " || Char(msg));
last_time = now;
);
hdf5_file_path = "my_table.h5";
dataset_names = {
// "/column_order",
"/float_columns",
"/float_data",
"/int_columns",
"/int_data",
"/string_columns",
"/string_data"
};
// Open the hdf file
hdf5_file = Open(hdf5_file_path, dataset_names, invisible);
log_time("Opened HDF5 file: " || hdf5_file_path);
// Get list
// columns = As Column(DataTable("-column_order"), "Column 1"n) << get as matrix;
string_columns = As Column(DataTable("-string_columns"), "Column 1"n) << get as matrix;
float_columns = As Column(DataTable("-float_columns"), "Column 1"n) << get as matrix;
int_columns = As Column(DataTable("-int_columns"), "Column 1"n) << get as matrix;
Close(DataTable("-string_columns"), nosave);
Close(DataTable("-float_columns"), nosave);
Close(DataTable("-int_columns"), nosave);
log_time("Got columns");
dt_int = DataTable("-int_data");
ForEach({cname, i}, int_columns,
Column(dt_int, "Column " || Char(i)) << SetName(cname)
);
log_time("Assembled int table");
dt_float = DataTable("-float_data");
ForEach({cname, i}, float_columns,
Column(dt_float, "Column " || Char(i)) << SetName(cname)
);
log_time("Assembled float table");
dt_string = DataTable("-string_data");
ForEach({cname, i}, string_columns,
Column(dt_string, "Column " || Char(i)) << SetName(cname)
);
log_time("Assembled string table");
dt_string << Update(
With( dt_int ),
Replace Columns in Main Table( None )
);
Close(dt_int, nosave);
dt_string << Update(
With( dt_float ),
Replace Columns in Main Table( None )
);
Close(dt_float, nosave);
log_time("Combined table");
// For( i = N Items( columns ), i >= 1, i--,
// Eval( Parse( "combined_dt << Move Selected Columns(\!"" || columns[i] || "\!"n, To first )" ) )
// );
// log_time("Moved columns");
dt_string << SetName("my_table");
dt_string << ShowWindow(1);
원래 열 순서를 재구성하는 코드를 비활성화했습니다. 테이블이 넓을 경우 속도가 매우 느리기 때문입니다. 또한, 특정 유형의 열이 없는 경우는 고려하지 않았습니다. 이 부분이 중요하다면 JSL 쪽에서 약간의 추가 작업이 필요할 것입니다.
결과: 80행 115,791열의 데이터 테이블을 pandas로 csv로 저장하는 데 20초, jmp로 여는 데 24초가 걸리는데, 제 스크립트는 저장하는 데 1.7초, jmp로 여는 데 11.5초가 걸렸습니다. 또한, gzip 압축을 사용했을 때 파일 크기가 88.8MB에서 24.5MB로 줄었습니다. 이는 시간 측면에서 총 70%, 공간 측면에서 72%를 절약한 것입니다.