Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
---
html:
toc: true
offline: true
export_on_save:
html: true
---
# Missing Value Impute Operator
---
## Operator 설명
- 데이터 공백 처리기(MVI)는 사용자가 원하는 범위, MVI method, drop 조건 등을 설정하면, 입력 DataFrame에 대해 데이터 공백을 채우는 동작을 수행한 후, 결과 DataFrame을 생성한다.
## Operator 파라미터 설명
- scope: missing value imputation을 적용할 범위. Enum(SCOPE_ALL, SCOPE_SELECTED) (required)
- selectedColumnId: Missing Value Imputation을 수행 할 column ID.SCOPE_ALL일 경우 무시 (repeated)
- method: 적용할 방법. Enum(IM, SPECIFIC_VALUE, MEDIAN, MEAN) (required)
- how: 삭제 조건. Enum(HOW_ANY, HOW_ALL) (required)
'HOW_ANY': null값이 포함된 행이 삭제된다.
'HOW_ALL': 모든 column이 null인 경우에만 행을 삭제합니다.
- subParam: 특정 값을 채우는 option. (repeated)
Ex: {numeric, 0}
|filed|value|설명|
|:---:|:---:|:---:|
| subParam.key | numeric | 특정 숫자로 채우는 방법 선택 |
| subParam.value | 0 | missing value를 0의 값으로 채움|
##작동 순서
1. 입력 DataFrame 및 Protobuffer 입력 파라미터 유효성 검사를 진행한다.
2. Spark ml 및 DataFrame API를 이용하여 MVI 알고리즘 동작한다.
3. 출력 DataFrame을 생성한다.
## Operator 모듈 테스트 결과
### 입력 데이터
<table style="text-align:center; font-size:10pt;">
<tr>
<td>-0.2947324415</td><td>-0.1463210702</td><td> </td> <td>-0.3093645485</td><td>-0.3841973244</td><td>-0.3511705686</td><td>-0.1647157191</td>
</tr>
<tr>
<td>-0.2683946488</td><td>-0.1998327759</td><td>-0.1655518395</td><td>-0.2826086957</td><td>-0.3883779264</td><td>-0.3319397993</td><td>-0.1730769231</td>
</tr>
<tr>
<td>-0.2880434783</td><td></td><td>-0.2566889632</td><td></td><td>-0.3850334448</td><td>-0.3704013378</td><td>-0.1693143813</td>
</tr>
<tr>
<td>-0.3131270903</td><td>-0.2215719064</td><td>-0.1580267559</td><td>-0.2408026756</td><td>-0.3683110368</td><td></td><td>-0.2274247492</td>
</tr>
<tr>
<td>-0.3152173913</td><td>-0.1421404682</td><td>-0.1484113712</td><td>-0.1605351171</td><td>-0.3386287625</td><td>-0.3465719064</td><td></td>
</tr>
<tr>
<td>-0.2683946488</td><td>-0.1998327759</td><td>-0.1655518395</td><td>-0.2826086957</td><td></td><td>-0.3319397993</td><td>-0.1730769231</td>
</tr>
<tr>
<td>-0.2880434783</td><td>-0.2186454849</td><td></td><td>-0.2491638796</td><td>-0.3850334448</td><td></td><td>-0.1693143813</td>
</tr>
<tr>
<td></td><td>-0.2215719064</td><td>-0.1580267559</td><td>-0.2408026756</td><td>-0.3683110368</td><td>-0.3837792642</td><td></td>
</tr>
<tr>
<td>-0.3152173913</td><td>-0.1421404682</td><td>-0.1484113712</td><td>-0.1605351171</td><td>-0.3386287625</td><td>-0.3465719064</td><td>-0.1772575251</td>
</tr>
<tr>
<td>-0.3110367893</td><td>-0.1906354515</td><td>-0.2495819398</td><td></td><td>-0.3595317726</td><td>-0.3298494983</td><td>-0.1496655518</td>
</tr>
</table>
### 결과 데이터
<table style="text-align:center; font-size:10pt;">
<tr>
<td>-0.2947324415</td><td>-0.1463210702</td><td><b>0</b></td> <td>-0.3093645485</td><td>-0.3841973244</td><td>-0.3511705686</td><td>-0.1647157191</td>
</tr>
<tr>
<td>-0.2683946488</td><td>-0.1998327759</td><td>-0.1655518395</td><td>-0.2826086957</td><td>-0.3883779264</td><td>-0.3319397993</td><td>-0.1730769231</td>
</tr>
<tr>
<td>-0.2880434783</td><td><b>0</b></td><td>-0.2566889632</td><td><b>0</b></td><td>-0.3850334448</td><td>-0.3704013378</td><td>-0.1693143813</td>
</tr>
<tr>
<td>-0.3131270903</td><td>-0.2215719064</td><td>-0.1580267559</td><td>-0.2408026756</td><td>-0.3683110368</td><td><b>0</b></td><td>-0.2274247492</td>
</tr>
<tr>
<td>-0.3152173913</td><td>-0.1421404682</td><td>-0.1484113712</td><td>-0.1605351171</td><td>-0.3386287625</td><td>-0.3465719064</td><td><b>0</b></td>
</tr>
<tr>
<td>-0.2683946488</td><td>-0.1998327759</td><td>-0.1655518395</td><td>-0.2826086957</td><td><b>0</b></td><td>-0.3319397993</td><td>-0.1730769231</td>
</tr>
<tr>
<td>-0.2880434783</td><td>-0.2186454849</td><td><b>0</b></td><td>-0.2491638796</td><td>-0.3850334448</td><td><b>0</b></td><td>-0.1693143813</td>
</tr>
<tr>
<td><b>0</b></td><td>-0.2215719064</td><td>-0.1580267559</td><td>-0.2408026756</td><td>-0.3683110368</td><td>-0.3837792642</td><td><b>0</b></td>
</tr>
<tr>
<td>-0.3152173913</td><td>-0.1421404682</td><td>-0.1484113712</td><td>-0.1605351171</td><td>-0.3386287625</td><td>-0.3465719064</td><td>-0.1772575251</td>
</tr>
<tr>
<td>-0.3110367893</td><td>-0.1906354515</td><td>-0.2495819398</td><td><b>0</b></td><td>-0.3595317726</td><td>-0.3298494983</td><td>-0.1496655518</td>
</tr>
</table>
- DataFrame의 missing value를 원하는 특정 값으로 채울 수 있고 예제에서는 0 값으로 설정하였다.
- 입력 DataFrame에서 missing value(빈 공간)가 결과 DataFrame에서는 0 값으로 채워지는 것을 알 수 있다.
- parameter는 다음과 같이 설정하였다.
```scala
val mviInfo = MissingValueImputationInfo.newBuilder()
.setScope(MissingValueImputationInfo.Scope.SCOPE_ALL)
.addSelectedColumnId(1)
.setMethod(MissingValueImputationInfo.Method.SPECIFIC_VALUE)
.setHow(MissingValueImputationInfo.How.HOW_ANY)
.addSubParam(
SubParameter.newBuilder
.setKey("numeric")
.setValue("0")
.build
)
.build
```