루프하는 더 빠른 방법이 있습니까?JMP 커뮤니티 여러분, 안녕하세요.
저는 일반적으로 350,000행에 달하는 더 많은 양의 데이터를 분석하고 있습니다.
각 행에 대해 코드는 루프를 실행하여 평균 오프셋을 계산합니다. 웨이퍼 ID ". 저는 이 작업을 수행하는 더 빠른 방법을 찾고 있습니다.
처리 속도를 높이는 방법이 있나요? 현재 스크립트는 ~1시간 r 루프를 완료합니다.
Names Default To Here( 1 );
dt1 = Data Table( "Reference Data Table.jmp" );
dt2 = Data Table("Data table");
Col_List1 = dt2 << Get Column Names( "String" );
Summation(
c = 1,
N Col( dt2 ) - 1,
values = [];
name = Column( dt2, c ) << Get Name;
If( Contains( name, "Currents" ) | Contains( name, "Voltage" ) | Contains( name, "Resistance" ),
rows = dt1 << Get Rows Where( :tests == name );
col = Column( dt2, c );
col mean = Col Mean( col );
For Each Row(
dt2,
mean = dt1:Mean[rows];
measure = mean - Col Mean( As Column( dt2, c ), :Wafer ID );
values |/= col[] + measure
;
);
col << Set Values( values );
);
0
);고급 통계 모델링자동화 및 스크립팅데이터 접근Re: 더 빠르게 반복하는 방법이 있나요?내 시도는 다음과 같습니다. 하단의 "stacked_table"과 "summary_table_delta_by_wafer"에 있는 두 테이블이 이에 적합한 모양일 수 있습니다.
전체적으로 1초도 안걸리는 속도입니다
(HP Time() - 시작) / 1000000 = 0.664238;
Names Default To Here(1);
dt_ref = Open("$DOWNLOADS/Reference data table.jmp", invisible);
dt_dt = Open("$DOWNLOADS/Data table.jmp", invisible);
dt_dt << clear select;
dt_ref << clear select;
start = Hp Time();
curr_col_names_list = dt_dt << Get Column Names("string");
obj = dt_dt << Tabulate(
Show Control Panel( 0 ),
Add Table(
Column Table(
Analysis Columns(
eval list(curr_col_names_list)
),
Statistics( Mean )
),
Row Table( Grouping Columns( :Wafer ID ) )
)
);
my_new_table = obj << Make Into Data Table;
curr_col_names_list = my_new_table << Get Column Names("string");
transposed_table = my_new_table << Transpose(
columns(
eval list(curr_col_names_list)
),
Label( :Wafer ID ),
Output Table( "transposed_table" )
);
transposed_table << new column ("join_key"
,char
,formula(
regex(:Label,"\(([^\)]+)\)", "\1")
)
);
transposed_table_join = (
transposed_table << Join(
With( dt_ref )
,Match Columns( :join_key = :Tests),
,Merge same name columns
,output table("transposed_table_join")
)
);
// clean up
close(transposed_table,nosave);
close(my_new_table,nosave);
transposed_table_join << delete columns(:"Match Flag", :"Label","join_key");
transposed_table_join:"Mean" << Set Name( "Ref_Value" );
curr_col_names_list = transposed_table_join << Get Column Names("string");
matches_i_dont_want_to_stack = {"Tests","Ref_Value"};
clean_col_list = Associative Array(curr_col_names_list) << Remove(Associative Array(matches_i_dont_want_to_stack)) << get keys;
stacked_table = transposed_table_join << Stack(
columns( clean_col_list ),
Source Label Column( "Wafer_ID" ),
Stacked Data Column( "Measured_Value" ),
Output Table( "stacked_table" )
);
//Is this the formula you wanted on each value? A-B?
stacked_table << new column ("delta"
,numeric
,continuous
,formula(
(:Ref_Value -:Measured_Value)
)
);
//stacked table and final summary_table_delta_by_wafer seems like the useful combo here.
close(transposed_table_join,nosave);
//final output?
summary_table_delta_by_wafer = stacked_table << Transpose(
columns( :delta ),
By( :Wafer_ID ),
Label( :Tests ),
Output Table( "summary_table_delta_by_wafer" )
);
show((Hp Time() - start)/1e6);
Re: 더 빠르게 반복하는 방법이 있나요?Jarmo님 감사합니다!<3 
Re: 더 빠르게 반복하는 방법이 있나요?이것이 올바르게 계산되기를 바랍니다. 가장 간단한 스크립트는 아니지만 속도에 다소 최적화되어 있습니다(내 노트북에서는 한 열에 대한 계산이 200ms가 걸렸으므로 총 약 6초가 소요됩니다).
Names Default To Here(1);
dt_ref = Open("$DOWNLOADS/Reference data table.jmp", invisible);
dt_dt = Open("$DOWNLOADS/Data table.jmp", invisible);
dt_dt << clear select;
dt_ref << clear select;
aa_means = Associative Array(Column(dt_ref, "Tests"), Column(dt_ref, "Mean"));
col_list = Filter Each({col_name}, dt_dt << Get Column Names("String"),
Contains({"Currents", "Voltage", "Resistance"}, Word(1, col_name));
);
dt_dt << Add Row(1, At Start);
dt_dt << Begin Data Update;
For Each({col_name, idx}, col_list,
start = Hp Time();
Eval(Eval Expr(
Column(dt_dt, col_name) << Set Each Value(
//AsColumn(col_name) + aa_means[col_name] - Col Mean(AsColumn(col_name), :Wafer ID);
//Col Mean(Expr(Name Expr(AsColumn(col_name))), :Wafer ID);
//Col Mean(:Currents A17, :Wafer ID);
Expr(Name Expr(AsColumn(col_name)))+ Expr(aa_means[col_name]) - Col Mean(Expr(Name Expr(AsColumn(col_name))), :Wafer ID);
);
));
show((Hp Time() - start)/1e6);
);
dt_dt << Delete Row(1);
dt_dt << End Data Update;
//Summarize(dt_dt, b = by(:WAFER ID), m = Mean(:Currents A17));
//show(b,m, Col Mean(:Currents A17));
<< Set Each Value(단지 내 표현일 수도 있음)를 사용할 때 이상한 계산 문제를 피하기 위해 시작 부분에 1개의 행을 추가한 다음 나중에 제거해야 했으며 이것이 코드에 이상한 주석 처리된 줄이 있는 이유입니다. 시간이 나면 JMP 지원팀에 문의하겠습니다.
편집: 티켓이 TS-00036082로 생성되었습니다. 답변에 따라 Col Mean에 대해서는 별도의 포스팅을 하도록 하겠습니다.
Re: 더 빠르게 반복하는 방법이 있나요?아.. 스크립트에서 col[]을 놓쳤습니다. 곧 새로운 버전을 쓸게요
Re: 더 빠르게 반복하는 방법이 있나요?....
Re: 더 빠르게 반복하는 방법이 있나요?요약 사용(또는 데이터 테이블이 필요하지 않은 경우 요약)은 상당히 빠릅니다(필요한 경우 요약 테이블을 다시 대규모 데이터에 조인/업데이트할 수 있음).
Names Default To Here(1);
dt_ref = Open("$DOWNLOADS/Reference data table.jmp", invisible);
dt_dt = Open("$DOWNLOADS/Data table.jmp", invisible);
dt_dt << clear select;
dt_ref << clear select;
aa_means = Associative Array(Column(dt_ref, "Tests"), Column(dt_ref, "Mean"));
col_list = Filter Each({col_name}, dt_dt << Get Column Names("String"),
Contains({"Currents", "Voltage", "Resistance"}, Word(1, col_name));
);
dt_summary = dt_dt << Summary(
Group(:Wafer ID),
Mean(Eval(col_list)),
Freq("None"),
Weight("None"),
statistics column name format("column"), // this is important here
Link to original data table(0)
);
For Each({col_name}, col_list,
Eval(EvalExpr(
Column(dt_summary, col_name) << Set Each Value(
aa_means[col_name] - AsColumn(col_name)
);
));
);
값이 올바른지 확인하세요.
Re: 더 빠르게 반복하는 방법이 있나요?예, 웨이퍼당 하나의 평균을 수정하세요. 예, 팀을 위한 다기능 도구로 사용되는 스크립트를 개발 중이므로 모든 것을 한 번에 처리하고 싶습니다. 어떤 제안이라도 주시면 감사하겠습니다.
Re: 더 빠르게 반복하는 방법이 있나요?결국 각 열에 4개의 값(코드를 올바르게 이해한 경우)이 생기고 열당 웨이퍼당 하나의 평균이 발생한다면 350,000개 행을 모두 가져야 하는 특별한 필요성이 있습니까? 요약을 사용하면 훨씬 더 작은 테이블을 만들 수 있습니다.