데이터 파편화 문제 - 데이터 파일이 분산 저장되어 있는 경우
.
Data_Preprocessing_TIL(20210710)
[학습자료]
패스트캠퍼스 온라인 강의 “파이썬을 활용한 데이터 전처리 Level UP 올인원 패키지 Online.” 를 공부하고 정리한 내용입니다.
URL : https://fastcampus.co.kr/data_online_preprocess
[학습내용]
- 파편화 문제가 뭐냐
지도학습 모델을 학습하려면 아래와 같이 반드시 통합된 데이터 집합이 필요함
하지만 많은 경우에 데이터가 두개 이상으로 파일들로 나뉘어져 있어서, 이들을 통합하는 전처리를 수행해야함
예를 들어서 센서, 로그, 거래 데이터 등 데이터가 큰 경우에는 시간 또는 ID등에 따라 분할저장되어 있는게 일반적이다.
- 파편화 문제를 해결하는 방법 : pandas.concat 함수를 이용해서 해결
통합해야 하는 파일개수가 많으면 빈 데이터프레임을 생성한 뒤, 이 데이터프레임과 반복문을 사용하여 불러온 데이터를 concat 함수를 이용하면 효율적으로 통합할 수 있다.
- pandas.concat
둘 이상의 데이터 프레임을 이어 붙이는데 사용하는 함수
주요 입력
1) objs : 데이터 프레임을 요소로하는 리스트로 입력순서대로 병합이 되는 형태
입력예시 : [df1, df2]
2) ignore_index : True이면 기존 인덱스를 무시하고 새로운 인덱스를 부여하며, False면 기존 인덱스를 사용
3) axis : 0 이면 행 단위로 병합을 수행하며, 1이면 열단위로 병합을 수행
- pandas.concat에서 axis 옵션
axis 옵션은 numpy 및 pandas의 많은 함수에서 사용되며 연산할때 축의 방향을 결정함
axis가 0이면 행을, 1이면 열을 나타내지만 이렇게만 기억하면 안됨
예시 1) sum(axis=0)
: 열 기준 합
예시 2) concat([df1, df2],axis=0)
: 행 단위 병합
axis 옵션은 그 함수의 결과구조가 벡터 형태(1차원)인지, 행렬 형태(2차원) 인지에 따라, 그 역할이 다르다.
결과
1) asix:0일때 벡터=행백터
2) asix:0일때 행렬은 연산과정이 행 기준
3) asix:1일때 벡터=열백터
4) asix:1일때 행렬은 연산과정이 열 기준
- 파편화 문제를 해결시 사용하면 유용한 함수 : os.listdir
path상에 있는 모든 파일명을 리스트 형태로 반환
- 실습
날짜별로 에너지 사용량 예측 데이터 파일들이 나누어져 있는데 이들을 5월 데이터는 제외하고 하나로 통합해보는 실습
# data 불러오기
import os
import pandas as pd
# pwd 시 경로 : /c/Users/user/Desktop/aa/2. 탐색적 데이터 분석/데이터
os.chdir(r"C:/Users/user/Desktop/aa/part-4.-머신러닝을-위한-필수-전처리/Part 4. 머신러닝을 위한 필수 전처리/데이터/")
# 파일 목록 확인
os.listdir("에너지 사용량 예측")
['1월11일.csv',
'1월12일.csv',
'1월13일.csv',
'1월14일.csv',
'1월15일.csv',
'1월16일.csv',
'1월17일.csv',
'1월18일.csv',
'1월19일.csv',
'1월20일.csv',
'1월21일.csv',
'1월22일.csv',
'1월23일.csv',
'1월24일.csv',
'1월25일.csv',
'1월26일.csv',
'1월27일.csv',
'1월28일.csv',
'1월29일.csv',
'1월30일.csv',
'1월31일.csv',
'2월10일.csv',
'2월11일.csv',
'2월12일.csv',
'2월13일.csv',
'2월14일.csv',
'2월15일.csv',
'2월16일.csv',
'2월17일.csv',
'2월18일.csv',
'2월19일.csv',
'2월1일.csv',
'2월20일.csv',
'2월21일.csv',
'2월22일.csv',
'2월23일.csv',
'2월24일.csv',
'2월25일.csv',
'2월26일.csv',
'2월27일.csv',
'2월28일.csv',
'2월29일.csv',
'2월2일.csv',
'2월3일.csv',
'2월4일.csv',
'2월5일.csv',
'2월6일.csv',
'2월7일.csv',
'2월8일.csv',
'2월9일.csv',
'3월10일.csv',
'3월11일.csv',
'3월12일.csv',
'3월13일.csv',
'3월14일.csv',
'3월15일.csv',
'3월16일.csv',
'3월17일.csv',
'3월18일.csv',
'3월19일.csv',
'3월1일.csv',
'3월20일.csv',
'3월21일.csv',
'3월22일.csv',
'3월23일.csv',
'3월24일.csv',
'3월25일.csv',
'3월26일.csv',
'3월27일.csv',
'3월28일.csv',
'3월29일.csv',
'3월2일.csv',
'3월30일.csv',
'3월31일.csv',
'3월3일.csv',
'3월4일.csv',
'3월5일.csv',
'3월6일.csv',
'3월7일.csv',
'3월8일.csv',
'3월9일.csv',
'4월10일.csv',
'4월11일.csv',
'4월12일.csv',
'4월13일.csv',
'4월14일.csv',
'4월15일.csv',
'4월16일.csv',
'4월17일.csv',
'4월18일.csv',
'4월19일.csv',
'4월1일.csv',
'4월20일.csv',
'4월21일.csv',
'4월22일.csv',
'4월23일.csv',
'4월24일.csv',
'4월25일.csv',
'4월26일.csv',
'4월27일.csv',
'4월28일.csv',
'4월29일.csv',
'4월2일.csv',
'4월30일.csv',
'4월3일.csv',
'4월4일.csv',
'4월5일.csv',
'4월6일.csv',
'4월7일.csv',
'4월8일.csv',
'4월9일.csv',
'5월10일.csv',
'5월11일.csv',
'5월12일.csv',
'5월13일.csv',
'5월14일.csv',
'5월15일.csv',
'5월16일.csv',
'5월17일.csv',
'5월18일.csv',
'5월19일.csv',
'5월1일.csv',
'5월20일.csv',
'5월21일.csv',
'5월22일.csv',
'5월23일.csv',
'5월24일.csv',
'5월25일.csv',
'5월26일.csv',
'5월27일.csv',
'5월2일.csv',
'5월3일.csv',
'5월4일.csv',
'5월5일.csv',
'5월6일.csv',
'5월7일.csv',
'5월8일.csv',
'5월9일.csv',
'desktop.ini']
# 빈 데이터 프레임 생성
merged_df = pd.DataFrame()
# file이 에너지 사용량 예측 폴더 내에 있는 파일명을 순회
for file in os.listdir("에너지 사용량 예측"):
# 5월 데이터는 제외하고 부른다고 가정
if '5월' not in file and ".csv" in file:
# 주의: 현재 경로는 ../데이터이므로 에너지 사용량 예측 폴더를 명시해줘야 함
df = pd.read_csv("에너지 사용량 예측/" + file, encoding='euc-kr')
merged_df = pd.concat([merged_df, df], axis = 0, ignore_index = True,sort=False)
merged_df
date | Appliances | lights | T1 | RH_1 | T2 | RH_2 | T3 | RH_3 | T4 | RH_4 | T5 | RH_5 | T6 | RH_6 | T7 | RH_7 | T8 | RH_8 | T9 | RH_9 | T_out | Press_mm_hg | RH_out | Windspeed | Visibility | Tdewpoint | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2016-01-11 17:00:00 | 60 | 30.0 | 19.890000 | 47.596667 | NaN | 44.790000 | 19.79 | 44.730000 | 19.000000 | 45.566667 | 17.166667 | 55.200000 | 7.026667 | NaN | 17.200000 | 41.626667 | 18.200000 | 48.900000 | 17.033333 | 45.530000 | 6.600000 | 733.500000 | 92.000000 | 7.000000 | 63.000000 | 5.300000 |
1 | 2016-01-11 17:10:00 | 60 | NaN | 19.890000 | 46.693333 | 19.200000 | 44.722500 | 19.79 | 44.790000 | 19.000000 | 45.992500 | 17.166667 | 55.200000 | 6.833333 | 84.063333 | 17.200000 | 41.560000 | 18.200000 | 48.863333 | 17.066667 | 45.560000 | 6.483333 | 733.600000 | 92.000000 | 6.666667 | 59.166667 | 5.200000 |
2 | 2016-01-11 17:20:00 | 50 | 30.0 | 19.890000 | 46.300000 | 19.200000 | 44.626667 | 19.79 | 44.933333 | 18.926667 | 45.890000 | 17.166667 | 55.090000 | 6.560000 | 83.156667 | 17.200000 | 41.433333 | 18.200000 | 48.730000 | 17.000000 | 45.500000 | 6.366667 | 733.700000 | 92.000000 | NaN | 55.333333 | 5.100000 |
3 | 2016-01-11 17:30:00 | 50 | 40.0 | 19.890000 | 46.066667 | 19.200000 | 44.590000 | 19.79 | 45.000000 | 18.890000 | 45.723333 | 17.166667 | 55.090000 | 6.433333 | 83.423333 | 17.133333 | 41.290000 | 18.100000 | 48.590000 | 17.000000 | NaN | 6.250000 | 733.800000 | 92.000000 | 6.000000 | 51.500000 | NaN |
4 | 2016-01-11 17:40:00 | 60 | 40.0 | 19.890000 | 46.333333 | 19.200000 | 44.530000 | 19.79 | 45.000000 | 18.890000 | 45.530000 | 17.200000 | 55.090000 | 6.366667 | 84.893333 | 17.200000 | 41.230000 | 18.100000 | 48.590000 | 17.000000 | NaN | 6.133333 | 733.900000 | 92.000000 | 5.666667 | NaN | 4.900000 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
15877 | 2016-04-09 23:10:00 | 50 | 0.0 | 22.323333 | 41.126667 | 20.000000 | 43.700000 | 22.79 | 39.700000 | 20.566667 | 38.500000 | NaN | 46.790000 | 7.690000 | 54.160000 | 21.700000 | 35.933333 | 23.100000 | 40.222857 | 20.000000 | 39.400000 | 7.933333 | 750.283333 | 92.166667 | 2.833333 | 26.666667 | 6.666667 |
15878 | 2016-04-09 23:20:00 | 50 | 0.0 | 22.290000 | 41.060000 | 19.890000 | NaN | 22.79 | 39.700000 | 20.566667 | 38.500000 | 20.000000 | 46.700000 | 7.590000 | 54.596667 | 21.700000 | 36.060000 | 23.100000 | 40.312000 | 20.066667 | 39.400000 | 7.766667 | 750.366667 | 92.333333 | 2.666667 | 29.333333 | 6.533333 |
15879 | 2016-04-09 23:30:00 | 60 | 0.0 | 22.290000 | 41.000000 | 19.823333 | 43.790000 | 22.79 | 39.700000 | 20.500000 | 38.500000 | 20.085714 | 46.777143 | 7.530000 | 54.930000 | 21.700000 | 36.200000 | 23.028571 | 40.321429 | 20.066667 | 39.526667 | 7.600000 | 750.450000 | 92.500000 | 2.500000 | 32.000000 | NaN |
15880 | 2016-04-09 23:40:00 | 60 | 0.0 | 22.200000 | 40.900000 | 19.790000 | 43.790000 | 22.79 | 39.700000 | 20.566667 | 38.530000 | 20.040000 | 46.736000 | 7.500000 | 55.326667 | 21.700000 | 36.333333 | 23.000000 | 40.290000 | 20.100000 | 39.826667 | 7.433333 | 750.533333 | 92.666667 | 2.333333 | 34.666667 | 6.266667 |
15881 | 2016-04-09 23:50:00 | 60 | 0.0 | 22.200000 | 40.900000 | NaN | 43.790000 | 22.79 | 39.700000 | 20.500000 | 38.590000 | 20.028571 | 46.725714 | 7.433333 | 55.400000 | 21.700000 | 36.530000 | 22.905714 | 40.367143 | 20.100000 | 39.966667 | 7.266667 | 750.616667 | 92.833333 | 2.166667 | 37.333333 | 6.133333 |
15882 rows × 27 columns
merged_df.sort_values('date', inplace = True) # 날짜 기준 정렬 수행
merged_df
date | Appliances | lights | T1 | RH_1 | T2 | RH_2 | T3 | RH_3 | T4 | RH_4 | T5 | RH_5 | T6 | RH_6 | T7 | RH_7 | T8 | RH_8 | T9 | RH_9 | T_out | Press_mm_hg | RH_out | Windspeed | Visibility | Tdewpoint | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2016-01-11 17:00:00 | 60 | 30.0 | 19.89 | 47.596667 | NaN | 44.790000 | 19.79 | 44.730000 | 19.000000 | 45.566667 | 17.166667 | 55.200000 | 7.026667 | NaN | 17.200000 | 41.626667 | 18.20 | 48.900000 | 17.033333 | 45.530000 | 6.600000 | 733.500000 | 92.000000 | 7.000000 | 63.000000 | 5.30 |
1 | 2016-01-11 17:10:00 | 60 | NaN | 19.89 | 46.693333 | 19.200000 | 44.722500 | 19.79 | 44.790000 | 19.000000 | 45.992500 | 17.166667 | 55.200000 | 6.833333 | 84.063333 | 17.200000 | 41.560000 | 18.20 | 48.863333 | 17.066667 | 45.560000 | 6.483333 | 733.600000 | 92.000000 | 6.666667 | 59.166667 | 5.20 |
2 | 2016-01-11 17:20:00 | 50 | 30.0 | 19.89 | 46.300000 | 19.200000 | 44.626667 | 19.79 | 44.933333 | 18.926667 | 45.890000 | 17.166667 | 55.090000 | 6.560000 | 83.156667 | 17.200000 | 41.433333 | 18.20 | 48.730000 | 17.000000 | 45.500000 | 6.366667 | 733.700000 | 92.000000 | NaN | 55.333333 | 5.10 |
3 | 2016-01-11 17:30:00 | 50 | 40.0 | 19.89 | 46.066667 | 19.200000 | 44.590000 | 19.79 | 45.000000 | 18.890000 | 45.723333 | 17.166667 | 55.090000 | 6.433333 | 83.423333 | 17.133333 | 41.290000 | 18.10 | 48.590000 | 17.000000 | NaN | 6.250000 | 733.800000 | 92.000000 | 6.000000 | 51.500000 | NaN |
4 | 2016-01-11 17:40:00 | 60 | 40.0 | 19.89 | 46.333333 | 19.200000 | 44.530000 | 19.79 | 45.000000 | 18.890000 | 45.530000 | 17.200000 | 55.090000 | 6.366667 | 84.893333 | 17.200000 | 41.230000 | 18.10 | 48.590000 | 17.000000 | NaN | 6.133333 | 733.900000 | 92.000000 | 5.666667 | NaN | 4.90 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
14869 | 2016-04-30 23:10:00 | 40 | 0.0 | 21.29 | 38.500000 | 18.633333 | 41.290000 | 23.29 | 36.290000 | 19.790000 | NaN | 19.500000 | 47.466667 | 5.000000 | 35.760000 | 19.500000 | NaN | 22.39 | 38.363333 | 19.200000 | 37.790000 | 5.216667 | 763.366667 | 82.666667 | 2.833333 | 40.000000 | 2.45 |
14870 | 2016-04-30 23:20:00 | 20 | 0.0 | 21.26 | 38.430000 | 18.600000 | 41.326667 | 23.20 | 36.290000 | 19.790000 | 38.060000 | 19.500000 | 47.400000 | 4.830000 | 36.256667 | 19.500000 | NaN | 22.39 | 39.000000 | 19.200000 | 37.863333 | 5.033333 | 763.433333 | 83.333333 | 2.666667 | 40.000000 | 2.40 |
14871 | 2016-04-30 23:30:00 | 40 | 0.0 | 21.20 | 38.290000 | 18.533333 | 41.400000 | 23.20 | 36.290000 | 19.790000 | 38.000000 | 19.500000 | 47.400000 | 4.690000 | 37.196667 | 19.500000 | 31.500000 | 22.39 | 39.400000 | 19.200000 | 38.030000 | 4.850000 | 763.500000 | 84.000000 | 2.500000 | 40.000000 | 2.35 |
14872 | 2016-04-30 23:40:00 | 30 | 0.0 | 21.20 | 38.260000 | 18.500000 | 41.450000 | 23.20 | 36.290000 | 19.790000 | 37.845000 | 19.500000 | 47.400000 | 4.690000 | 38.395000 | NaN | 31.500000 | 22.29 | 39.656667 | 19.200000 | 38.090000 | 4.666667 | 763.566667 | 84.666667 | 2.333333 | 40.000000 | 2.30 |
14873 | 2016-04-30 23:50:00 | 70 | 0.0 | 21.20 | 38.200000 | 18.463333 | 41.466667 | 23.20 | 36.363333 | 19.790000 | 37.790000 | 19.500000 | 47.345000 | 4.726667 | 39.600000 | 19.500000 | 31.533333 | 22.23 | 39.730000 | 19.166667 | 38.126667 | 4.483333 | NaN | 85.333333 | 2.166667 | 40.000000 | 2.25 |
15882 rows × 27 columns