#/section11/12-refine3.py
#데이터 정제(3) - 이상치 정제

from print_df import print_df
from pandas import DataFrame
from sklearn.impute import SimpleImputer
from sample import grade_dic
import numpy

df=DataFrame(grade_dic, index=["철수", "영희", "민철", "수현", "호영"])
print_df(df)
"""원본
+------+------+------+------+------+
|      | 국어 | 영어 | 수학 | 과학 |
+------+------+------+------+------+
| 철수 |  98  | nan  | 88.0 | 64.0 |
| 영희 |  88  | 90.0 | 62.0 | 72.0 |
| 민철 |  92  | 70.0 | nan  | nan  |
| 수현 |  63  | 60.0 | 31.0 | 70.0 |
| 호영 | 120  | 50.0 | nan  | 88.0 |
+------+------+------+------+------+
"""


#국어 점수에 대한 이상치 필터링
r=df.query("국어>100")
print_df(r)
"""
+------+------+------+------+------+
|      | 국어 | 영어 | 수학 | 과학 |
+------+------+------+------+------+
| 호영 | 120  | 50.0 | nan  | 88.0 |
+------+------+------+------+------+
"""

#필터링된 이상치 데이터에 대한 인덱스 추출
r_index=list(r.index)
print_df(r_index)       #['호영']


#이상치를 갖는 인덱스에 대한 국어 점수를 결측치로 변경
for i in r_index:
    df.loc[i, "국어"]=numpy.nan
print_df(df)
"""
+------+------+------+------+------+
|      | 국어 | 영어 | 수학 | 과학 |
+------+------+------+------+------+
| 철수 | 98.0 | nan  | 88.0 | 64.0 |
| 영희 | 88.0 | 90.0 | 62.0 | 72.0 |
| 민철 | 92.0 | 70.0 | nan  | nan  |
| 수현 | 63.0 | 60.0 | 31.0 | 70.0 |
| 호영 | nan  | 50.0 | nan  | 88.0 |
+------+------+------+------+------+
"""


#1) 결측치를 정제할 규칙 정의
#    → 결측치에 대해 평균점수 
imr=SimpleImputer(missing_values=numpy.nan, strategy="mean")

#2) dataframe의 값에 대해 규칙 적용
df_imr=imr.fit_transform(df.values)

#3) 적용된 규칙으로 새로운 데이터 프레임 생성
re_df2=DataFrame(df_imr, index=df.index, columns=df.columns)
print_df(re_df2)
"""
+------+-------+------+--------------------+------+
|      |  국어 | 영어 |        수학        | 과학 |
+------+-------+------+--------------------+------+
| 철수 |  98.0 | 67.5 |        88.0        | 64.0 |
| 영희 |  88.0 | 90.0 |        62.0        | 72.0 |
| 민철 |  92.0 | 70.0 | 60.333333333333336 | 73.5 |
| 수현 |  63.0 | 60.0 |        31.0        | 70.0 |
| 호영 | 85.25 | 50.0 | 60.333333333333336 | 88.0 |
+------+-------+------+--------------------+------+
"""
