需要优化方面的帮助你好,
我想优化计算。我尝试了 Col Formula 和 Loop,但对于行数 > 10k 的情况,它们似乎都不是更快。
我比较了 exe 的速度,它们都需要很长时间
Col 公式 = 500.46s;
循环 = 491.70秒;
有没有办法使用 Matrix 或 J trans 进行优化?
Names Default To Here( 1 );
dt = Current Data Table();
testColumn = Column( "Test_A" );
slidervalue = 6;
////UsingFormula
start = Tick Seconds();
dt << New Column( "LL_formula",
Numeric,
Continuous,
Formula(
If( Row() < 200, // Skip the first 200 rows
.
,
current_device = :DeviceNumber; // Get the current site number
current_site = :SiteNumber;
// Get the indices of rows that match the current SiteNumber
matching_rows = Where( :DeviceNumber == current_device | :SiteNumber == current_site );
// Determine the start and end positions for the moving window
start_row = Max( 1, Row() - 199 );
end_row = Row();
// Get the moving window data for matching rows
m = Subscript( Expr( testColumn ), matching_rows[Loc( matching_rows >= start_row & matching_rows <= end_row )] );
//m = testColumn[Max( 1, Row() - 199 ) :: Row()];
// Calculate the quantiles and IQR
q1 = Quantile( 0.25, m );
q3 = Quantile( 0.75, m );
// Calculate the lower limit using the sigma function
q1 - (q3 - q1) * (slidervalue - 0.675) / 1.35;
)
)
);
dt << New Column( "UL_formula",
Numeric,
Continuous,
Formula(
If( Row() < 200,
., // Skip the first 200 rows
// Get the moving window data for matching rows
current_device = :DeviceNumber; // Get the current site number
current_site = :SiteNumber;
// Get the indices of rows that match the current SiteNumber
matching_rows = Where( :DeviceNumber == current_device | :SiteNumber == current_site );
start_row = Max( 1, Row() - 199 );
end_row = Row();
m = Subscript( Expr( testColumn ), matching_rows[Loc( matching_rows >= start_row & matching_rows <= end_row )] );
//m = testColumn[Max( 1, Row() - 199 ) :: Row()];
// Calculate the quantiles and IQR
q1 = Quantile( 0.25, m );
q3 = Quantile( 0.75, m );
// Calculate the upper limit using the sigma function
q3 + (q3 - q1) * (slidervalue - 0.675) / 1.35;
)
)
);
end = Tick Seconds();
Show( end - start );
///UsingLoop
start2 = Tick Seconds();
llColX = dt << New Column( "LL_loop", Numeric );
ulColX = dt << New Column( "UL_loop", Numeric );
For Each Row(
dt,
If( Row() < 200,
.,
// Skip the first 200 rows
current_device = :DeviceNumber[Row()]; // Get the current site number
current_site = :SiteNumber[Row()];
// Get the indices of rows that match the current SiteNumber
matching_rows = Where( :DeviceNumber == current_device | :SiteNumber == current_site );
// Determine the start and end positions for the moving window
start_row = Max( 1, Row() - 199 );
end_row = Row();
// Get the moving window data for matching rows
m2 = Subscript( testColumn, matching_rows[Loc( matching_rows >= start_row & matching_rows <= end_row )] );
//m = testColumn[Max( 1, Row() - 199 ) :: Row()];
// Calculate the quantiles and IQR
q1 = Quantile( 0.25, m2 );
q3 = Quantile( 0.75, m2 );
// Calculate the lower limit using the sigma function
llColX[Row()] = q1 - (q3 - q1) * (slidervalue - 0.675) / 1.35;
);
If( Row() < 200,
., // Skip the first 200 rows
// Get the moving window data for matching rows
current_device = :DeviceNumber[Row()]; // Get the current site number
current_site = :SiteNumber[Row()];
// Get the indices of rows that match the current SiteNumber
matching_rows = Where( :DeviceNumber == current_device | :SiteNumber == current_site );
start_row = Max( 1, Row() - 199 );
end_row = Row();
m = Subscript( testColumn, matching_rows[Loc( matching_rows >= start_row & matching_rows <= end_row )] );
//m = testColumn[Max( 1, Row() - 199 ) :: Row()];
// Calculate the quantiles and IQR
q1 = Quantile( 0.25, m );
q3 = Quantile( 0.75, m );
// Calculate the upper limit using the sigma function
ulColX[Row()] = q3 + (q3 - q1) * (slidervalue - 0.675) / 1.35;
);
);
end2 = Tick Seconds();
Show( end2 - start2 );
自动化和脚本回复:需要优化方面的帮助首先要尝试的是利用私有/不可见表,<< 开始数据更新和 << 结束数据更新。尝试之后,最好转向其他方法
回复:需要优化方面的帮助您可能想要使用 JMP 中的调试器和分析器来确定脚本花费大部分时间的地方。
回复:需要优化方面的帮助尝试使用开始/结束数据更新,但情况变得更糟
总时间:780.73秒
Names Default To Here( 1 );
dt = Current Data Table();
testColumn = Column( "Test_A" );
slidervalue = 6;
///UsingLoop
start2 = Tick Seconds();
llColX = dt << New Column( "LL_loop", Numeric );
ulColX = dt << New Column( "UL_loop", Numeric );
dt << show window( 0 );
dt << begin data update;
For Each Row(
dt,
If( Row() < 200,
.,
// Skip the first 200 rows
current_device = :DeviceNumber[Row()]; // Get the current site number
current_site = :SiteNumber[Row()];
// Get the indices of rows that match the current SiteNumber
matching_rows = Where( :DeviceNumber == current_device | :SiteNumber == current_site );
// Determine the start and end positions for the moving window
start_row = Max( 1, Row() - 199 );
end_row = Row();
// Get the moving window data for matching rows
m2 = Subscript( testColumn, matching_rows[Loc( matching_rows >= start_row & matching_rows <= end_row )] );
//m = testColumn[Max( 1, Row() - 199 ) :: Row()];
// Calculate the quantiles and IQR
q1 = Quantile( 0.25, m2 );
q3 = Quantile( 0.75, m2 );
// Calculate the lower limit using the sigma function
llColX[Row()] = q1 - (q3 - q1) * (slidervalue - 0.675) / 1.35;
);
If( Row() < 200,
., // Skip the first 200 rows
// Get the moving window data for matching rows
current_device = :DeviceNumber[Row()]; // Get the current site number
current_site = :SiteNumber[Row()];
// Get the indices of rows that match the current SiteNumber
matching_rows = Where( :DeviceNumber == current_device | :SiteNumber == current_site );
start_row = Max( 1, Row() - 199 );
end_row = Row();
m = Subscript( testColumn, matching_rows[Loc( matching_rows >= start_row & matching_rows <= end_row )] );
//m = testColumn[Max( 1, Row() - 199 ) :: Row()];
// Calculate the quantiles and IQR
q1 = Quantile( 0.25, m );
q3 = Quantile( 0.75, m );
// Calculate the upper limit using the sigma function
ulColX[Row()] = q3 + (q3 - q1) * (slidervalue - 0.675) / 1.35;
);
);
dt << end data update;
end2 = Tick Seconds();
Show( end2 - start2 );回复:需要优化方面的帮助还有一些可以改进的地方,但这在我的电脑上花了 10-15 秒
Names Default To Here(1);
dt = Open("$DOWNLOADS/sample_table.jmp");
slidervalue = 6;
start2 = Tick Seconds();
ds = dt[0, "DeviceNumber"];
ss = dt[0, "SiteNumber"];
m1 = J(1, N Rows(dt), .);
m2 = J(1, N Rows(dt), .);
For Each Row(dt,
If(Row() < 200,
.
,
d = :DeviceNumber[Row()];
s = :SiteNumber[Row()];
rs = (Row() - 199)::Row();
d1 = ds[rs];
s1 = ss[rs];
r = where(s1 == s | d1 == d);
vals = dt[rs[r], "Test_A"];
q1 = Quantile(0.25, vals);
q3 = Quantile(0.75, vals);
m1[Row()] = q1 - (q3 - q1) * (slidervalue - 0.675) / 1.35;
m2[Row()] = q3 + (q3 - q1) * (slidervalue - 0.675) / 1.35;
);
);
llColX = dt << New Column("LL_loop1", Numeric, Continuous, Values(m1));
llColX = dt << New Column("UL_loop2", Numeric, Continuous, Values(m2));
end2 = Tick Seconds();
Show(end2 - start2);