Python

[Python] 데이터 사전 처리(Preprocessing)_4

구루싸 2019. 10. 10. 22:24
반응형
SMALL

이번 학습 주제도 저번 시간에 이어 데이터 사전 처리(Preprocessing)에 관한 것입니다

그 중에서도 정규화(Normalization)와 시계열 데이터(time series)에 관해 학습하겠습니다

먼저 정규화(Normalization)에 대해 알아보겠습니다

분석하려는 데이터의 어떤 두 열 A, B가 각각 A 열의 데이터는 0~ 10000, B 열의 데이터는 0~1의 범위를 갖는다고 가정하겠습니다

이 때 두 개의 열에 대해서 그래프를 그린다고하면 범위가 더 큰 A 열에 의해 그래프가 더 영향도가 높을 것입니다

이런 차이를 제거하고 분석의 신뢰도를 높이기 위해 데이터를 동일한 크기 기준으로 나눈 비율로 나타내는 방법을 사용하는데

이를 정규화(Normalization)라고 하고 이 과정을 거친 데이터의 범위는 0~1 또는 -1~1이 됩니다

# 판다스(Pandas)
import pandas
import numpy
from sklearn import preprocessing
filepath = "/Users/dennis_sa/Documents/"
#header가 없고 길이가 정해지지 않은 공백이 구분자인 데이터
read_data = pandas.read_csv(filepath+"auto-mpg.data-original", header = None, sep = '\s+') 
read_data.columns = ['연비(mpg)', '실린더 수(cylinders)', '배기량(displacement)', '출력(horsepower)',
                     '차중(weight)', '가속능력(acceleration)', '출시년도(model_year)', '제조국(origin)', '모델명(name)']
print(read_data.head(), end = '\n') #앞 5행 보기

# 데이터 자료형 확인
print(read_data.dtypes, end = '\n')

# 출력(horsepower)의 고유값 확인
print(read_data['출력(horsepower)'].unique())

# 누락 데이터 제거
read_data.dropna(subset = ['출력(horsepower)'], axis = 0, inplace = True)
print(read_data['출력(horsepower)'].unique())

# 요약 정보 확인
print(read_data['출력(horsepower)'].describe(), end = '\n')

# 최대값(Max) - 최소값(Min)을 기준값으로 설정하고 모든 데이터를 나눔
minus_min = read_data['출력(horsepower)'] - read_data['출력(horsepower)'].min()
max_minus_min = read_data['출력(horsepower)'].max() - read_data['출력(horsepower)'].min()
read_data['출력(horsepower)'] = minus_min/max_minus_min
print(read_data['출력(horsepower)'].describe(), end = '\n')

 

다음으로 시계열(Time series) 데이터에 대해 알아보겠습니다

판다스(Pandas)는 금융데이터(환율, 주식 등)를 다루기 위해서 개발되었기 때문에 시계열 데이터를 다루는 유용한 기능을 제공합니다

환율과 주식에 대해 잘 모르기 때문에 왜 시계열 데이터가 중요한지는 좀 알아봐야겠네요-_-

아시는 분이 혹시 이 글을 보신다면 댓글로 알려주시면 감사하겠습니다^^

학습할 내용은 판다스의 시간 표시 방식 중에 시계열 데이터 표현에 자주 이용된다는 Timestamp(시점)와 Period(기간)입니다

※ freq 옵션 정보

https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html

freq 옵션
옵션 설명 옵션 설명
D day(1일) B business day(휴일 제외)
W week(1주) H hour(1시간)
M month end(월말) T minute(1분)
MS month begin(월초) S second(1초)
Q quarter end(분기말) L milisecond(1/1000초)
QS quarter begin(분기초) U microsecond(1/1000000초)
A year end(연말) N nanosecond(1/1000000000초)
AS year begin(연초)    
# 판다스(Pandas)
import pandas
import numpy
from sklearn import preprocessing
filepath = "/Users/dennis_sa/Documents/"

# header가 있고 구분자가 ',' 인 데이터
read_data = pandas.read_csv(filepath+"주식.csv", header = 0, sep = ',') 
print(read_data.head(), end = '\n')
print(read_data.info(), end = '\n')

# Date 컬럼이 문자열 타입이므로 Timestamp 형으로 변환
read_data['Date'] = pandas.to_datetime(read_data['Date'])

# Data Frame 속성을 이용하여 연-월-일 정보 구분
read_data['Year'] = read_data['Date'].dt.year
read_data['Month'] = read_data['Date'].dt.month
read_data['Day'] = read_data['Date'].dt.day

# to_period() 메소드를 이용하여 연, 연-월 정보 추출
read_data['Date_Year'] = read_data['Date'].dt.to_period(freq = 'A')
read_data['Date_YrMn'] = read_data['Date'].dt.to_period(freq = 'M')

read_data.set_index('Date', inplace = True)
print(read_data.head(), end = '\n')
print(read_data['2018'], end = '\n')
print(read_data['2018-06'], end = '\n')
print(read_data.loc['2018-06', 'Start':'High'], end = '\n')

reference_date = pandas.to_datetime('2019-10-10')
read_data['Interval_date'] = reference_date - read_data.index
read_data.set_index('Interval_date', inplace = True)
print(read_data, end = '\n')
print(read_data['480 days' : '500 days'], end = '\n')

# Timestamp 배열 생성
timestamp_array = pandas.date_range(start = '2019-01-01', # 날짜 범위 시작점
                                    end = None, # 날짜 범위 끝점
                                    periods = 6, # 생성할 timestamp 개수
                                    freq = '3MS', # 월의 시작일
                                    tz = 'Asia/Seoul') # 시간대(timezone)
print(timestamp_array, end = '\n')

# Timestamp 형을 Period 형으로 변환
period_day = timestamp_array.to_period(freq = 'D')
print(period_day, end = '\n')
period_month = timestamp_array.to_period(freq = 'M')
print(period_month, end = '\n')
period_year = timestamp_array.to_period(freq = 'A')
print(period_year, end = '\n')

# Period 배열 생성
period_month = pandas.period_range(start = '2019-01-01', # 날짜 범위 시작점
                                   end = None, # 날짜 범위 끝점
                                   periods = 3, # 생성할 period 개수
                                   freq = '3M') # 월
print(period_month, end = '\n')

이것으로 오늘의 학습을 마치겠습니다-_-

반응형
LIST