다음과 같은 날씨 데이터가 있습니다.
2018-02-01 부터 2020-05-18 까지의 시간별 기온데이터로,
지역별(184, 185, 188, 189)로 각각 정리되어 있습니다.
해당 데이터를 일자별로 정리하되,
모든 지역을 고려한 일자별 최소, 최대, 평균 기온의 형태가 필요하다고 합니다.
이런 형태로 말이죠 :)
시작해 볼까요?
순서
-
시간별 지역들의 기온을 평균내거나 중앙값을 사용하여 지역을 없애기
-
시간별 기온에서 최소, 최대, 평균 기온을 추출하기
1. 시간별 지역들의 기온을 평균내거나 중앙값을 사용하여 지역을 없애기
지역의 속성을 모두 고려하기 위해 다음과 같은 데이터 형태를 만들어야 합니다.
밑으로 쭉 붙어있는 데이터를 같은 시간 기준으로 오른쪽으로 붙이는 작업을 해야겠네요.
블로그 '문법' 카테고리의 'concat vs merge'에 대한 포스팅을 보시면 필요한 문법이 merge인 것을 알 수 있겠죠?
코드를 한번 작성해 보겠습니다.
# 지역별로 한 뭉텅이를 만들어서 하나의 리스트에 넣어줍니다
weather_list = []
for area in weather['area'].unique():
weather_list.append(weather[weather['area']==area].copy())
# 불필요해진 area열을 버리고, 대신 기온 열에 area 정보를 추가해줍니다
for i, area in enumerate(weather['area'].unique()):
weather_list[i].drop(['area'],axis=1,inplace=True)
weather_list[i].columns = ['datetime',str(area)+'_temp']
weather_list # 출력
이제 새로운 데이터 프레임을 생성해서 for문과 merge를 이용해 한 뭉텅이씩 붙여볼게요
# 데이터 프레임 생성
start = '2018-02-01'
end = '2020-05-18'
hourly_temperature = pd.DataFrame(columns = ['datetime'])
date_range = pd.date_range(start,end,freq = 'H')
hourly_temperature['datetime'] = date_range
# 'datetime'을 기준으로 오른쪽으로 병합하기
for d in weather_list:
hourly_temperature = hourly_temperature.merge(d,how='outer')
hourly_temperature # 출력
완성이 됐습니다.
이제 중앙값을 이용해서 기온을 하나의 열로 나타내고, 결측치는 이후의 값으로 대체하겠습니다.
# 중앙값 추출
hourly_temperature['median'] = hourly_temperature.median(axis=1)
hourly_temperature = hourly_temperature.loc[:,['datetime','median']]
hourly_temperature.columns = ['date','temperature']
# 결측치 처리
hourly_temperature['temperature'][hourly_temperature['temperature'].isna()] = hourly_temperature.shift(-1)['temperature'][hourly_temperature['temperature'].isna()]
hourly_temperature # 출력
2. 시간별 기온에서 최소, 최대, 평균 기온을 추출하기
하루 중 최소, 최대, 평균 기온을 찾으려면 지역의 중앙값을 구하기 위해 행으로 나타냈듯, 하루의 24시간을 행으로 나타내야겠죠?
# 데이터 프레임 만들기
start = '2018-02-01'
end = '2020-05-18'
daily_temperature = pd.DataFrame(columns = ['date'])
date_range = pd.date_range(start, end, freq='D')
daily_temperature['date'] = date_range
# 24시간을 한 행으로 만들기
for d in range(daily_temperature.shape[0]):
for h in range(24):
daily_temperature.loc[d, 'temp_h'+str(h)] = hourly_temperature['temperature'][d*24:d*24+24][d*24+h]
daily_temperature.head() # 출력
이제 최대, 최소, 평균 기온을 구한 후, 나머지 속성은 지워도 될 것 같습니다 !!
# 최대, 최소, 평균값 추출
daily_temperature['temp_max'] = daily_temperature.loc[:,'temp_h0':].max(axis=1)
daily_temperature['temp_min'] = daily_temperature.loc[:,'temp_h0':].min(axis=1)
daily_temperature['temp_mean'] = daily_temperature.loc[:,'temp_h0':].mean(axis=1)
# 불필요한 정보 삭제
daily_temperature = daily_temperature[['date','temp_max','temp_min','temp_mean']]
daily_temperature # 출력
결론
데이터에서 최소/ 최대/ 평균 등을 쉽게 찾기 위해서는 일단 하나의 행으로 만드는 것이 중요하다.
'Data Handling > Data Preprocessing' 카테고리의 다른 글
피쳐 스케일링 (Feature Scaling) (0) | 2020.07.27 |
---|---|
범주형 변수 처리 - 인코딩(Encoding) (0) | 2020.06.20 |
훈련, 테스트 데이터 통합하기 (0) | 2020.06.18 |
결측치 처리하기 (삭제 / 대체) (0) | 2020.06.02 |
시계열 특징(년, 월, 일, 주말 등) 쉽게 추출하기 - to_datetime() (0) | 2020.06.01 |