데이터 파편화 문제 - 데이터 파일이 분산 저장되어 있는 경우

2021-07-10

.

Data_Preprocessing_TIL(20210710)

[학습자료]

패스트캠퍼스 온라인 강의 “파이썬을 활용한 데이터 전처리 Level UP 올인원 패키지 Online.” 를 공부하고 정리한 내용입니다.

URL : https://fastcampus.co.kr/data_online_preprocess

[학습내용]

  • 파편화 문제가 뭐냐

지도학습 모델을 학습하려면 아래와 같이 반드시 통합된 데이터 집합이 필요함

하지만 많은 경우에 데이터가 두개 이상으로 파일들로 나뉘어져 있어서, 이들을 통합하는 전처리를 수행해야함

예를 들어서 센서, 로그, 거래 데이터 등 데이터가 큰 경우에는 시간 또는 ID등에 따라 분할저장되어 있는게 일반적이다.

1

  • 파편화 문제를 해결하는 방법 : pandas.concat 함수를 이용해서 해결

2

통합해야 하는 파일개수가 많으면 빈 데이터프레임을 생성한 뒤, 이 데이터프레임과 반복문을 사용하여 불러온 데이터를 concat 함수를 이용하면 효율적으로 통합할 수 있다.

  • pandas.concat

둘 이상의 데이터 프레임을 이어 붙이는데 사용하는 함수

주요 입력

1) objs : 데이터 프레임을 요소로하는 리스트로 입력순서대로 병합이 되는 형태

입력예시 : [df1, df2]

2) ignore_index : True이면 기존 인덱스를 무시하고 새로운 인덱스를 부여하며, False면 기존 인덱스를 사용

3

3) axis : 0 이면 행 단위로 병합을 수행하며, 1이면 열단위로 병합을 수행

  • pandas.concat에서 axis 옵션

axis 옵션은 numpy 및 pandas의 많은 함수에서 사용되며 연산할때 축의 방향을 결정함

axis가 0이면 행을, 1이면 열을 나타내지만 이렇게만 기억하면 안됨

예시 1) sum(axis=0) : 열 기준 합

예시 2) concat([df1, df2],axis=0) : 행 단위 병합

4

axis 옵션은 그 함수의 결과구조가 벡터 형태(1차원)인지, 행렬 형태(2차원) 인지에 따라, 그 역할이 다르다.

결과

1) asix:0일때 벡터=행백터

2) asix:0일때 행렬은 연산과정이 행 기준

3) asix:1일때 벡터=열백터

4) asix:1일때 행렬은 연산과정이 열 기준

  • 파편화 문제를 해결시 사용하면 유용한 함수 : os.listdir

path상에 있는 모든 파일명을 리스트 형태로 반환

5

  • 실습

날짜별로 에너지 사용량 예측 데이터 파일들이 나누어져 있는데 이들을 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