pd.cut을 이용한 label 부여
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
plt.rc('font',family='Malgun Gothic')
df = pd.read_csv('../data/final_data.csv',encoding='cp949')
labels = ['좋음','보통','나쁨','매우나쁨']
SO2_bins = [(0,0.02),(0.021,0.05),(0.051,0.15),(0.151,1)]
CO_bins = [(0,2),(2.01,9),(9.01,15),(15.01,50)]
O3_bins = [(0,0.03),(0.031,0.09),(0.091,0.15),(0.151,0.6)]
NO2_bins = [(0,0.03),(0.031,0.06),(0.061,0.2),(0.201,2)]
PM10_bins = [(0,30),(31,80),(81,150),(151,600)]
PM25_bins = [(0,15),(16,35),(36,75),(76,500)]
#both는 bins의 양끝값을 모두 포함합니다.
#대기오염을 좋음 부터 매우 나쁨까지 label을 부여하기 위한 함수입니다.
def condition(series,new_name,bins,labels,closed='both'):
#tuple로 interval을 만들어 줍니다
_bins = pd.IntervalIndex.from_tuples(bins,closed='both')
d = dict(zip(_bins,labels))
#dictionary와 map 함수를 통해 기존 컬럼의 값들을 label로 변경해서 새로운 컬럼에 할당합니다.
df[new_name] =pd.cut(series,_bins,include_lowest=True,).map(d)
return df[new_name]
# NUll값 발생이유 -> 자리수가 안 맞음
# 해결을 위해 SO2,O3,NO2컬럼을 소수 세번째 자리까지 반올림
# PM10,PM25경우 일의 자리까지 반올림
# 함수 다시 적용
df[['SO2_round','O3_round','NO2_round']] = df[['SO2','O3','NO2']].round(3)
df[['PM10_round','PM25_round']] = df[['PM10','PM25']].round(0).astype('int')
condition(df['SO2_round'],'SO2_condition',SO2_bins,labels)
condition(df['CO'],'CO_condition',CO_bins,labels)
condition(df['O3_round'],'O3_condition',O3_bins,labels)
condition(df['NO2_round'],'NO2_condition',NO2_bins,labels)
condition(df['PM10_round'],'PM10_condition',PM10_bins,labels)
condition(df['PM25_round'],'PM25_condition',PM25_bins,labels)
0 보통
1 보통
2 보통
3 보통
4 보통
..
32860 좋음
32861 보통
32862 보통
32863 보통
32864 보통
Name: PM25_condition, Length: 32865, dtype: category
Categories (4, object): [좋음 < 보통 < 나쁨 < 매우나쁨]
df.columns
Index(['판매일시', '파종일시', '도_num', '연도', 'SO2', 'CO', 'O3', 'NO2', 'PM10', 'PM25',
'합계 일조시간(hr)', '품종명', '도', '마켓명', '가격', 'SO2_condition', 'CO_condition',
'O3_condition', 'NO2_condition', 'PM10_condition', 'PM25_condition'],
dtype='object')
(df[['SO2_condition', 'CO_condition','O3_condition', 'NO2_condition', 'PM10_condition', 'PM25_condition']])
SO2_condition | CO_condition | O3_condition | NO2_condition | PM10_condition | PM25_condition | |
---|---|---|---|---|---|---|
0 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 | 보통 |
1 | 좋음 | 좋음 | 좋음 | 보통 | 보통 | 보통 |
2 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 | 보통 |
3 | 좋음 | 좋음 | 좋음 | 보통 | 보통 | 보통 |
4 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 | 보통 |
... | ... | ... | ... | ... | ... | ... |
32860 | 좋음 | 좋음 | 좋음 | 좋음 | 좋음 | 좋음 |
32861 | 좋음 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 |
32862 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 | 보통 |
32863 | 좋음 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 |
32864 | 좋음 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 |
32865 rows × 6 columns
df
판매일시 | 파종일시 | 도_num | 연도 | SO2 | CO | O3 | NO2 | PM10 | PM25 | ... | 품종명 | 도 | 마켓명 | 가격 | SO2_condition | CO_condition | O3_condition | NO2_condition | PM10_condition | PM25_condition | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2013-05-01 | 2013-01-01 | 0 | 2013 | 0.007216 | 0.770076 | 0.020583 | 0.018420 | 45.132576 | 31.543635 | ... | 토마토(10kg) | 강원도 | 가락도매 | -1.0 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 | 보통 |
1 | 2013-05-01 | 2013-01-01 | 1 | 2013 | 0.006340 | 0.649199 | 0.013143 | 0.031923 | 44.532051 | 31.543635 | ... | 토마토(10kg) | 경기도 | 가락도매 | -1.0 | 좋음 | 좋음 | 좋음 | 보통 | 보통 | 보통 |
2 | 2013-05-01 | 2013-01-01 | 2 | 2013 | 0.007477 | 0.713492 | 0.013913 | 0.030154 | 39.626984 | 31.543635 | ... | 토마토(10kg) | 인천광역시 | 가락도매 | -1.0 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 | 보통 |
3 | 2013-05-01 | 2013-01-01 | 3 | 2013 | 0.005741 | 0.658125 | 0.008458 | 0.043541 | 38.334375 | 31.543635 | ... | 토마토(10kg) | 서울특별시 | 가락도매 | -1.0 | 좋음 | 좋음 | 좋음 | 보통 | 보통 | 보통 |
4 | 2013-05-01 | 2013-01-01 | 4 | 2013 | 0.006363 | 0.739583 | 0.015653 | 0.017980 | 48.280093 | 31.543635 | ... | 토마토(10kg) | 경상북도 | 북부도매 | -1.0 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 | 보통 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
32860 | 2019-04-30 | 2018-12-31 | 10 | 2018 | 0.003241 | 0.502206 | 0.018193 | 0.023311 | 22.787681 | 12.066176 | ... | 토마토(10kg) | 울산광역시 | 엄궁도매 | 22000.0 | 좋음 | 좋음 | 좋음 | 좋음 | 좋음 | 좋음 |
32861 | 2019-04-30 | 2018-12-31 | 11 | 2018 | 0.003150 | 0.475868 | 0.017313 | 0.022639 | 29.648866 | 19.518839 | ... | 토마토(10kg) | 경상남도 | 엄궁도매 | 22000.0 | 좋음 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 |
32862 | 2019-04-30 | 2018-12-31 | 12 | 2018 | 0.003204 | 0.605093 | 0.015468 | 0.027125 | 34.759259 | 22.728704 | ... | 토마토(10kg) | 광주광역시 | 각화도매 | 21000.0 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 | 보통 |
32863 | 2019-04-30 | 2018-12-31 | 13 | 2018 | 0.004119 | 0.373418 | 0.014718 | 0.027532 | 28.525591 | 15.960829 | ... | 토마토(10kg) | 부산광역시 | 엄궁도매 | 22000.0 | 좋음 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 |
32864 | 2019-04-30 | 2018-12-31 | 14 | 2018 | 0.005988 | 0.594565 | 0.018808 | 0.015774 | 25.805264 | 20.055719 | ... | 토마토(10kg) | 전라남도 | 각화도매 | 22000.0 | 좋음 | 좋음 | 좋음 | 좋음 | 좋음 | 보통 |
32865 rows × 21 columns
df.isnull().sum
<bound method DataFrame.sum of 판매일시 파종일시 도_num 연도 SO2 CO O3 NO2 PM10 PM25 \
0 False False False False False False False False False False
1 False False False False False False False False False False
2 False False False False False False False False False False
3 False False False False False False False False False False
4 False False False False False False False False False False
... ... ... ... ... ... ... ... ... ... ...
32860 False False False False False False False False False False
32861 False False False False False False False False False False
32862 False False False False False False False False False False
32863 False False False False False False False False False False
32864 False False False False False False False False False False
... O3_round NO2_round PM10_round PM25_round SO2_condition \
0 ... False False False False False
1 ... False False False False False
2 ... False False False False False
3 ... False False False False False
4 ... False False False False False
... ... ... ... ... ... ...
32860 ... False False False False False
32861 ... False False False False False
32862 ... False False False False False
32863 ... False False False False False
32864 ... False False False False False
CO_condition O3_condition NO2_condition PM10_condition \
0 False False False False
1 False False False False
2 False False False False
3 False False False False
4 False False False False
... ... ... ... ...
32860 False False False False
32861 False False False False
32862 False False False False
32863 False False False False
32864 False False False False
PM25_condition
0 False
1 False
2 False
3 False
4 False
... ...
32860 False
32861 False
32862 False
32863 False
32864 False
[32865 rows x 26 columns]>
df.drop(['SO2_round','O3_round','NO2_round','PM10_round','PM25_round'],axis=1,inplace=True)