KNIME

[KNIME] Loop 실습(2)

슈퍼짱짱 2024. 8. 29. 11:15
반응형

이전 포스팅에서 KNIME에서 Loop 노드가 어떤 역할을 하는지와 Counting Loop Start 노드 및 Flow variable에 대해 알아보았다.

2024.08.28 - [KNIME] - [KNIME] Loop 실습(1)

 

[KNIME] Loop 실습(1)

KNIME 노드에 loop를 검색하면 다양한 노드들이 나온다.  오늘은 이 Loop 노드들에 대해서 알아보고 실습해보겠다.  Loop 노드는 이름에서 알 수 있듯이 뭔가를 반복적으로 수행하는 노드이다.Loop S

leedakyeong.tistory.com

 

이어서 다른 loop 노드들도 알아보도록 하겠다.

 

(사용할 데이터는 이전 포스팅에 첨부되어있다.)

 


 

2. Group Loop Start

 

Group Loop Start는 어떤 Group 별로 반복을 수행할 때 사용하는 노드이다.

예로 제품이 여러개인 데이터에 대해서 각 제품별로 모델을 따로 만들고 싶을 때 활용할 수 있다.

 

Group Loop Start 노드 추가

 

 

먼저 isExit(하차 여부) 를 기준으로 Group Loop Start 노드를 사용해보도록 하겠다.

옵션창으로 들어가서 isExit 컬럼만 Include에 남겨주고 실행시킨다.

 

Group Loop Start 옵션창

 

 

실행 시 첫 번째 Loop에 대한 결과가 나온다.

 

첫 번째 loop 실행 결과

 

Group Loop Start 노드의 Flow Variables를 확인해보면 currentIteration은 0이고 그 때의 isExit은 o이다.

 

isExit 컬럼은 o와 x로만 이루어진 컬럼이므로 o 끼리, x 끼리 Grouping이 되며

첫 번째 loop는 isExit이 o인 데이터가 대상이 된 것을 확인할 수 있다.

 

Group Loop Start - Flow Variables

 

 

Loop End 노드를 붙여주고 실행시켜주면

Loop End 노드 추가

 

다음과 같은 결과를 얻을 수 있다.

 

Loop End 실행 결과

 

isExit이 o와 x 뿐이므로 Iteration은 두 번만 돈다.

첫 번째 Iteration은 isExit이 o일때, 두 번째 Iteration은 isExit이 x일때가 대상이된다.

 

Start 와 End 노드 사이에 아무 노드도 없으므로 대상이 되는 데이터만 불러와졌다.

 

Loop End노드가 실행된 상태에서 Group Loop Start 노드를 눌러보면 가장 마지막 Iteration의 결과를 확인 할 수 있다.

 

Group Loop Start 실행 결과

 

Flow Variables를 확인해보면 currentIteration이 1이고 그때의 isExit은 x인걸 확인할 수 있다.

 

Group Loop Start - Flow Variables

 


 

이번에는 Group Loop Start 노드를 활용하여 여자들은 여자키 평균값을 빼주고 남자들은 남자키 평균값을 빼주는 작업을 해보도록 하겠다.

 

동일한 성별 별로 키의 평균값을 구해야 하므로 Group Loop Start 노드에서 gender 컬럼만 Include에 남겨준다.

 

Group Loop Start

 

 

각 Group 별 키의 평균값을 구해서 빼줘야하므로 Math Formula 노드를 연결한다.

 

Math Formula 노드 연결

 

옵션창을 열어서 height에서 height의 평균을 빼주는 수식을 작성한다.

 

Math Formula 옵션창

 

 

Math Formula 노드 뒤에 Loop End 노드 연결하고 실행하면 다음과 같은 결과를 얻을 수 있다.

 

Loop End 실행 결과

 

 

(gender 값이 female인 사람들 키의 평균은 168.567이고 male인 사람들 키의 평균은 176.775이다.)

각 gender 별로 여자들은 여자들 키 평균을 뺀 값이, 남자들은 남자들 키 평균을 뺀 값이 new column에 생성되었다.

 


 

3. Column List Loop Start

 

이번에는 Column List Loop Start 노드에 대해 알아보겠다.

여러개 컬럼에 대해 동일한 처리를 해줄 때 사용하는 노드이다.

 

Column List Loop Start

 

 

isExit과 gender 컬럼의 값을 모두 대문자로 변경하는 실습을 해보겠다.

 

옵션창을 켜서 대상이되는 isExit과 gender 컬럼만 Include에 남겨준다.

 

Column List Loop Start 옵션창

 

Column List Loop Start 노드를 실행하면 첫 번째 loop에 대한 결과가 뜬다.

 

Column List Loop Start 실행 결과

 

이때 Flow Variables는 다음과 같다.

 

Column List Loop Start 실행 결과 - Flow Variables

 

 

첫 번째 loop이므로 currentIteration은 0이고 현재 대상이되는 컬럼은 isExit이다.(currentColumnName)

 

그래서 실행 결과를 보면 isExit과 gender 중 현재 대상이 되는 컬럼이 isExit이기때문에 gender 컬럼은 빠진 것을 볼 수 있다.

 

이제 현재 대상 컬럼(currentColumnName)을 대문자로 바꿔주기위해 String Manipulation 노드를 사용한다.

 

String Manipulation 노드 추가

 

 

대문자로 바꾸기 위해 upperCase() function을 사용하여 수식을 써주며,

다음 loop에서는 isExit이 아니라 gender가 대상이 되어야하므로 Column 명을 직접 써주는게 아니라 Flow Variables를 활용하여 다음과 같이 써준다.(왼쪽에 currentColunnName 더블클릭)

 

upperCase($${ScurrentColumnName}$$)

 

 

String Manipulation 옵션창

 

 

OK 하고 실행시키면 다음과같이 잘못된 결과가 나온다.

 

String Manipulation 실행 결과

 

원한건 x를 X로, o를 O로 바꿔주는것인데 isExit이라는 문자가 ISEXIT으로 변했다.

 

Flow Variables를 컬럼명의 의미로 전달해준건데 문자 그대로 받아드렸기 때문이다.

따라서 Column List Loop Start 뒤에 바로 String Manipulation 노드를 붙여서 사용하는게 아니라 

현재 대상이 되는 컬럼의 컬럼명을 다른 이름으로 바꿔주고 그 다음에 String Manipulation 노드로 대문자로 변환해주는 방식으로 해야한다.

 

 

즉, 다음과같이 Column Renamer 노드를 활용하여 현재 대상이 되는 컬럼명을 먼저 변경한다.

 

 

옵션창을 켜서 현재 대상이되는 컬럼명을 Flow Variables로 전달해야 하는데,

기본적으로 옵션창 키면 왼쪽에 이름을 변경할 컬럼을 선택하고 오른쪽에 변경할 이름을 설정한다.

 

Colunm Renamer 옵션창

 

이름을 변경할 컬럼을 Flow Variables로 설정할 때는 아래와 같이 한다.

 

 

Column Renamer - Flow Variables 설정

 

 

그리고 대상이 되는 컬럼의 컬럼명을 rename으로 변경한다. 

 

Column Renamer - 컬렴명 변경

 

 

그럼 isExit의 컬럼명이 rename으로 변한걸 볼 수 있다.

 

Column Renamer 결과창

 

 

이제 String Mainipulation 노드로 rename 컬럼의 값을 대문자로 바꿔준다.

단, Append Column으로 설정하지말고 Replace Column(rename)으로 설정해서 새로운 컬럼을 만드는 대신 rename 컬럼을 그대로 대체해주도록 설정한다.

 

String Manipulation 옵션창

 

OK하고 실행 시 아래처럼 rename 컬럼의 값이 대문자로 잘 변경된 것을 볼 수 있다.(o->O, x->X)

 

String Manipulation 결과창

 

이제 다시 rename으로 바꾼 컬럼명을 isExit으로 바꿔준다.

Column Renamer 노드를 사용하며, Flow Variables를 활용한다.

 

Column Renamer 노드 추가

 

컬럼명을 바꿀 컬럼은 rename 컬럼이며, 바꿀 이름은 Flow Variables로 설정한다.

 

Column Renamer 옵션창

 

실행 시 rename 컬럼의 컬럼명이 isExit이 된 걸 확인할 수 있다.

즉, 현재 loop에서 대상이 되는 컬럼의 컬럼명을 rename으로 바꾸고 -> rename 컬럼을 대문자로 바꾼 후 -> 다시 컬럼명을 바꿔주었다.

 

Column Renamer 실행 결과

 

이제 Loop End 노드를 붙이고 실행해주면 되는데, 그냥 Loop End 노드를 붙이면 다음과 같은 에러가 난다.

 

Loop End 에러메세지

 

에러가 나는 이유는 isExit과 gender 컬럼 중

첫 번째 loop의 대상은 isExit으로, Column List Loop Start 실행 결과에 gender 컬럼은 포함되어있지 않다.

두 번째 loop의 대상은 gender로, Column List Loop Start 실행 결과에 isExit 컬럼은 포함되어있지 않다.

 

즉, name, isExit, birth, height로 구성된 첫 번째 데이터와

name, gender, birth, height로 구성된 두 번째 데이터의 컬럼이 다르게 구성되어있어 하나로 합칠 수 가 없기때문에 난 에러이다.

 

이럴 땐 Loop End 노드가 아니라 Loop End (Column Append) 노드를 사용한다.

 

Loop End (Column Append) 노드 추가

 

실행 시 다음과 같이 isExit 컬럼과 gender 컬럼의 값이 모두 대문자로 변경된걸 볼 수 있다.

 

Loop End (Column Append) 실행 결과

 

 

단, name, birth, height에 대해서는 동일한 컬럼이 중복되어 합쳐졌기 때문에 Column Filter 노드로 제외한다.

 

Column Filter 노드 추가

 

옵션창 들어가서 모두 Includes에 넣은 다음 "iter" 검색해서 나오는 모든 노드를 Excludes로 보내주면 된다.

 

Column Filter 옵션창

 

실행 시 다음과 같이 원하는 결과가 된다.

 

Column Filter 실행 결과

 


마지막으로 Window Loop StartGeneric Loop Start에 대해 다음 포스팅에 이어서 작성하도록 하겠다.

 

반응형