Re: JSL 인덱싱된 열을 그룹별로 쌓기(센서 데이터 및 자산)아마도 다음과 같을 것입니다:
Names Default To Here( 1 );
//dt=open("input_example.jmp");
//Stack data table
Data Table( "input_example.jmp" ) << Stack(
columns( Column Group( "A sensors" ), Column Group( "B sensors" ) ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Output Table( "Stacked Data" )
);
//Text to columns
Data Table( "Stacked Data" ) << Text to Columns(
columns( :Label ),
Delimiters( " " )
);
//Delete column: Label 2
Data Table( "Stacked Data" ) << Delete Columns( :Label 2 );
//Change column name: Label 1 → Asset
Data Table( "Stacked Data" ):Label 1 << Set Name( "Asset" );
//Change column name: Label 3 → Sensor
Data Table( "Stacked Data" ):Label 3 << Set Name( "Sensor" );
//New column: Column 6
Data Table( "Stacked Data" ) << New Column( "Stddev of Sensor by Asset by Index",
Numeric,
"Continuous",
Format( "Best", 12 )
);
//Change column formula: Stddev of Sensor by Asset by Index
Data Table( "Stacked Data" ):Stddev of Sensor by Asset by Index <<
Set Formula( Col Std Dev( :Data, :Asset, :Index ) );
//Report snapshot: Stacked Data - Graph Builder
Data Table( "Stacked Data" ) << Graph Builder(
Size( 517, 450 ),
Show Control Panel( 0 ),
Variables(
X( :Index ),
Y( :Stddev of Sensor by Asset by Index ),
Overlay( :Asset )
),
Elements( Line( X, Y, Legend( 7 ) ), Points( X, Y, Legend( 8 ) ) )
);
JMP 17의 Worflow Builder를 사용하여 이 스크립트를 "작성"했습니다.
핵심은 수식에서 "by" 인수를 사용하는 것입니다.

이렇게 하면 하나의 열에 데이터가 모두 있는 완전한 계층 구조를 갖도록 데이터를 완전히 쌓을 수 있습니다.
그런 다음 자산 및 인덱스별로 전체 데이터 열의 stddev를 가져옵니다. 이렇게 하면 이 그래프를 만들 수 있습니다.

Re: JSL 인덱싱된 열을 그룹별로 쌓기(센서 데이터 및 자산)이것은 좋은 접근법입니다. 그러나 완전히 쌓인 테이블에는 "by" 인수가 있는 수식으로 제한되는 문제가 있습니다.
예를 들어 (센서 1 - 센서 2) / 센서 3이라는 수식을 수행하려면 by-stacked 테이블이 필요합니다.
Re: JSL 인덱싱된 열을 그룹별로 쌓기(센서 데이터 및 자산)향후 독자의 혼란을 피하기 위해 응답이 삭제되었습니다.
Re: JSL 인덱싱된 열을 그룹별로 쌓기(센서 데이터 및 자산)한 가지 옵션은 계층 구조 테이블이 있는 경우 순수 JSL 경로로 이동하는 것입니다. 코드는 스스로를 설명할 수 있습니다.
Names Default To Here(1);
dt_hier = Open("$DOWNLOADS/hierarchy_example.jmp");
dt_input = Open("$DOWNLOADS/input_example.jmp");
// some assumptions:
// both parents will have same amount of columns
new_col = dt_hier << New Column("Data Cols", Character, Nominal, << Set Each Value(
Regex(:Child column, "sensor \d")
));
data_cols = Associative Array(new_col) << get keys;
dt_hier << Delete Column(new_col);
dt_collector = New Table("data",
New Column("Index", Numeric, Ordinal),
New Column("Group", Character, Nominal)
);
For Each({data_col}, data_cols,
dt_collector << New Column(data_col, Numeric, Continuous)
);
Summarize(dt_hier, parents = by(:Parent));
For Each({parent}, parents,
parent_rows = Loc(dt_hier[0, "Parent"], parent);
parent_cols = dt_hier[parent_rows, "Child column"];
parent_data = dt_input[0, parent_cols];
non_missing_idx = Loc(parent_data);
row_count = N Items(non_missing_idx) / n cols(parent_data);
parent_data_clean = Shape(parent_data[non_missing_idx], row_count);
first_row = N Rows(dt_collector) + 1;
last_row = first_row + row_count - 1;
dt_collector << Add Rows(row_count);
dt_collector[Index(first_row, last_row), "Index"] = Index(1, row_count)`;
dt_collector[Index(first_row, last_row), "Group"] = Repeat({parent}, row_count);
dt_collector[Index(first_row, last_row), data_cols] = parent_data_clean
);

여기에는 몇 가지 가정이 있으며 적절한 오류 처리가 없습니다.
Re: JSL 인덱싱된 열을 그룹별로 쌓기(센서 데이터 및 자산)계층 구조는 이미 메타데이터(열 속성)로 테이블에 있을 수 있습니다.
예제를 업데이트하여 상위(그룹), 상위 별칭, 하위 및 하위 별칭이 테이블에 포함되도록 했습니다.
가장 직관적인 접근 방식은 자산(하위 집합)별로 테이블을 쌓고 레이블별로 데이터를 분할한 다음 테이블을 함께 연결하는 것입니다.
Re: JSL 인덱싱된 열을 그룹별로 쌓기(센서 데이터 및 자산)또한 요구 사항을 단순화했으며(더 이상 빈 값 없음) 반복적으로(자산당) 수행해야 하는 솔루션(스택, 분할, 연결)을 찾았습니다. 이제 계층 구조 데이터가 기본 테이블에 포함됩니다(input_example에서 진행 상황을 확인할 수 있음).
Re: JSL 인덱싱된 열을 그룹별로 쌓기(센서 데이터 및 자산)내가 찾은 가장 간단한 작업은 이러한 데이터 단계를 자동화하는 것입니다.
1) 스택

2) 분할

3) 연결

그룹별 JSL 색인 열 스택(센서 데이터 및 자산)제조에서는 다음과 같은 형식으로 센서 데이터를 추출하는 것이 일반적입니다. A와 B는 유사한 장치에 해당합니다( 자산 ).
이 형식에서는 사용자가 각 상위 그룹에 대해 결합된 수식을 만들어야 합니다. 예를 들어:
(입력: 센서 데이터 테이블에는 상위 그룹당 특정 열이 필요합니다.)

여러 자산을 처리할 경우 번거로우므로 그룹 자산별로 데이터를 쌓는 것이 더 좋은 방법입니다.
이를 프로그래밍 방식으로 수행하려면 계층 구조를 포함하는 상황별 데이터가 필요합니다. 예를 들어:
(입력: 자산 계층)

JSL에서는 센서 데이터 및 계층 구조(입력)에서 자산 테이블(원하는 출력)로 어떻게 이동할 수 있습니까?
(출력: 자산 데이터 테이블)

모든 테이블과 스크립트가 첨부되어 있습니다. 다음은 입력 테이블 스크립트입니다(상위-하위를 포함하는 메타데이터가 열 속성으로 추가됨).
Names Default To Here( 1 );
// New data table
dt = New Table( "sensor table" );
n_rows = 10;
n_additional_rows = 0;
// New column: Index
dt << New Column( "Index", Numeric, "Continuous", Format( "Best", 12 ) ) <<
Begin Data Update << Add Rows( n_rows );
dt:Index << Set Formula( Row() );
dt << End Data Update;
// A sensor
dt << New Column( "A sensor 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
) << New Column( "A sensor 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
) << New Column( "A sensor 3",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
) << Group Columns( "A sensors", {:A sensor 1, :A sensor 2, :A sensor 3} )
<< Begin Data Update;
For Each Row(
dt,
:A sensor 1 = Random Normal( 0, 1 );
:A sensor 2 = Random Normal( 0, 1 );
:A sensor 3 = Random Normal( 0, 1 );
);
dt << End Data Update;
// B sensors
dt << Add Rows( n_additional_rows );
dt << New Column( "B sensor 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
) << New Column( "B sensor 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
/*) << New Column( "B sensor 3",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected*/
) << Group Columns( "B sensors", {:B sensor 1, :B sensor 2}) //, :B sensor 3} )
<< Begin Data Update;
For Each Row(
dt,
:B sensor 1 = Random Normal( 0, 3 );
:B sensor 2 = Random Normal( 0, 2 );
//:B sensor 3 = Random Normal( 0, 3.5 );
);
dt << End Data Update;
colnames = dt << Get Column Names( String );
for each({col, index}, colnames,
column(dt, col) << Set Property( "child", col ) );
// Calculations.
// New formula column: Stdev[A sensor ...r 2,A sensor 3]
dt << New Column( "Stdev[A sensors]",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Std Dev( :A sensor 1, :A sensor 2, :A sensor 3 ) ));
// Move selected column: Stdev[A sensors]
dt <<MOVE selected="" columns=""></MOVE>
자동화 및 스크립팅