有沒有更快的循環方法?JMP 社群您好,
我正在分析大量數據,通常為 350k 行。
對於每一行,程式碼運行一個循環來計算平均偏移量“晶圓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
);進階統計建模自動化和腳本編寫資料存取回覆: 有沒有更快的循環方式?這是我的嘗試,底部的兩個表“stacked_table”和“summary_table_delta_by_wafer”可能是正確的形狀。
整個過程不到1秒,速度很快
(生命值時間() - 開始) / 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);
回覆: 有沒有更快的循環方式?謝謝賈莫!<3 
回覆: 有沒有更快的循環方式?希望這個計算正確。 它不是最簡單的腳本,但它對速度進行了一定程度的最佳化(在我的筆記型電腦上,一列的計算需要 200 毫秒,因此總共大約需要 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));
我必須在開頭添加1 行,然後在稍後將其刪除,以避免使用<< Set Each Value (可能只是我的表達式)時出現一些奇怪的計算問題,這就是為什麼它在程式碼中有一些奇怪的註解行。 當我有時間時,我會聯繫 JMP 支援人員
編輯:創建的票證 TS-00036082。 根據我收到的回复,我將單獨發布有關 Col Mean 的帖子
回覆: 有沒有更快的循環方式?啊..錯過了你腳本中的 col[] 。 我很快就會寫新版本
回覆: 有沒有更快的循環方式?....
回覆: 有沒有更快的循環方式?使用摘要(如果不需要資料表,則使用摘要)應該相當快(如果需要,您可以將摘要表連接/更新回大資料)
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)
);
));
);
請記住檢查這些值是否正確
回覆: 有沒有更快的循環方式?是的,修正每個晶圓的一個平均值。 是的,我想一次處理所有內容,因為我正在開發一個腳本,該腳本可以作為我的團隊的多功能工具。 任何建議將不勝感激
回覆: 有沒有更快的循環方式?如果最終每列有 4 個值(如果我正確理解了程式碼),即每列每個晶圓都有一個值,是否有特定需求擁有所有 350k 行? 您可以使用 Summary 來製作更小的表。