반응형
16. ch03.데이터분석 준비하기 시계열 데이터패턴 추출 - 06. 시계열 데이터패턴의 추출 실습하기2-2
17. ch04.데이터분석 준비하기 시계열 데이터패턴 분리 - 01. 시계열과 비시계열 데이터의 훈련, 검증, 실험
18. ch03.데이터분석 준비하기 시계열 데이터패턴 분리 - 02. 시계열과 데이터의 훈련, 검증, 실험, 데이터 분리
지난 포스팅 시계열 데이터 패턴의 추출 실습(1)에 이어서.
4.6 데이터 나누기
pd.cut 함수를 이용해 temp 열 데이터를 n개의 그룹으로 나눠 패턴을 파악하는데 도움을 받고자 합니다.
확인하기
4.7 시간정보 추출하기
연도와 분기 설정(1)
분기를 연도별로 구분할 수 있도록 한 버전
또 새로운 열 생성 : 달, 일, 시, 요일
4.8 지연 값 생성하기
지연 값은 shift 함수를 통해 생성하는데 경우에 따라 어떤 값을 입력할지는 적절하게 선택해야 한다. 그리고 지연 값의 특성상 nan 이 생기는데 또한 처리해야 한다.
4.9 더미변수 생성
범주형 변수를 원할 인코딩하는 것과 같다.
pd.get_dummies(raw_all['Quater'])
# pd.get_dummies(raw_all['Quater']).describe().T
pd.get_dummies(raw_all['Quater'], prefix='Quater_Dummy') #원하는 이름 붙이기
pd.get_dummies(raw_all['Quater'], prefix='Quater_Dummy', drop_first=True)
pd.concat([raw_all, pd.get_dummies(raw_all['Quater'], prefix='Quater_Dummy', drop_first=True)], axis=1)
좀 더 정리해서 표현한 코드 방식
# feature extraction using dummy variables
if 'Quater' in raw_all.columns:
raw_all = pd.concat([raw_all, pd.get_dummies(raw_all['Quater'], prefix='Quater_Dummy', drop_first=True)
], axis=1)
del raw_all['Quater']
raw_all
4.10 Code Summary
지금까지 진행한 내용을 함수 화해 정리해 두었다.
### Functinalize
### Feature engineering of default
def non_feature_engineering(raw):
raw_nfe = raw.copy()
if 'datetime' in raw_nfe.columns:
raw_nfe['datetime'] = pd.to_datetime(raw_nfe['datetime'])
raw_nfe['DateTime'] = pd.to_datetime(raw_nfe['datetime'])
if raw_nfe.index.dtype == 'int64':
raw_nfe.set_index('DateTime', inplace=True)
# bring back
# if raw_nfe.index.dtype != 'int64':
# raw_nfe.reset_index(drop=False, inplace=True)
raw_nfe = raw_nfe.asfreq('H', method='ffill')
return raw_nfe
# raw_rd = non_feature_engineering(raw_all)
### Feature engineering of all
def feature_engineering(raw):
raw_fe = raw.copy()
if 'datetime' in raw_fe.columns:
raw_fe['datetime'] = pd.to_datetime(raw_fe['datetime'])
raw_fe['DateTime'] = pd.to_datetime(raw_fe['datetime'])
if raw_fe.index.dtype == 'int64':
raw_fe.set_index('DateTime', inplace=True)
raw_fe = raw_fe.asfreq('H', method='ffill')
result = sm.tsa.seasonal_decompose(raw_fe['count'], model='additive')
Y_trend = pd.DataFrame(result.trend)
Y_trend.fillna(method='ffill', inplace=True)
Y_trend.fillna(method='bfill', inplace=True)
Y_trend.columns = ['count_trend']
Y_seasonal = pd.DataFrame(result.seasonal)
Y_seasonal.fillna(method='ffill', inplace=True)
Y_seasonal.fillna(method='bfill', inplace=True)
Y_seasonal.columns = ['count_seasonal']
pd.concat([raw_fe, Y_trend, Y_seasonal], axis=1).isnull().sum()
if 'count_trend' not in raw_fe.columns:
if 'count_seasonal' not in raw_fe.columns:
raw_fe = pd.concat([raw_fe, Y_trend, Y_seasonal], axis=1)
Y_count_Day = raw_fe[['count']].rolling(24).mean()
Y_count_Day.fillna(method='ffill', inplace=True)
Y_count_Day.fillna(method='bfill', inplace=True)
Y_count_Day.columns = ['count_Day']
Y_count_Week = raw_fe[['count']].rolling(24*7).mean()
Y_count_Week.fillna(method='ffill', inplace=True)
Y_count_Week.fillna(method='bfill', inplace=True)
Y_count_Week.columns = ['count_Week']
if 'count_Day' not in raw_fe.columns:
raw_fe = pd.concat([raw_fe, Y_count_Day], axis=1)
if 'count_Week' not in raw_fe.columns:
raw_fe = pd.concat([raw_fe, Y_count_Week], axis=1)
Y_diff = raw_fe[['count']].diff()
Y_diff.fillna(method='ffill', inplace=True)
Y_diff.fillna(method='bfill', inplace=True)
Y_diff.columns = ['count_diff']
if 'count_diff' not in raw_fe.columns:
raw_fe = pd.concat([raw_fe, Y_diff], axis=1)
raw_fe['temp_group'] = pd.cut(raw_fe['temp'], 10)
raw_fe['Year'] = raw_fe.datetime.dt.year
raw_fe['Quater'] = raw_fe.datetime.dt.quarter
raw_fe['Quater_ver2'] = raw_fe['Quater'] + (raw_fe.Year - raw_fe.Year.min()) * 4
raw_fe['Month'] = raw_fe.datetime.dt.month
raw_fe['Day'] = raw_fe.datetime.dt.day
raw_fe['Hour'] = raw_fe.datetime.dt.hour
raw_fe['DayofWeek'] = raw_fe.datetime.dt.dayofweek
raw_fe['count_lag1'] = raw_fe['count'].shift(1)
raw_fe['count_lag2'] = raw_fe['count'].shift(2)
raw_fe['count_lag1'].fillna(method='bfill', inplace=True)
raw_fe['count_lag2'].fillna(method='bfill', inplace=True)
if 'Quater' in raw_fe.columns:
if 'Quater_Dummy' not in ['_'.join(col.split('_')[:2]) for col in raw_fe.columns]:
raw_fe = pd.concat([raw_fe, pd.get_dummies(raw_fe['Quater'], prefix='Quater_Dummy', drop_first=True)], axis=1)
del raw_fe['Quater']
return raw_fe
# raw_fe = feature_engineering(raw_all)
5. Data Split : 최종 전처리 및 학습/검증/테스트용 데이터 분리
데이터 분리
### Functionalize
### Data split of cross sectional
def datasplit_cs(raw, Y_colname, X_colname, test_size, random_seed=123):
X_train, X_test, Y_train, Y_test = train_test_split(raw[X_colname], raw[Y_colname], test_size=test_size, random_state=random_seed)
print('X_train:', X_train.shape, 'Y_train:', Y_train.shape)
print('X_test:', X_test.shape, 'Y_test:', Y_test.shape)
return X_train, X_test, Y_train, Y_test
# X_train, X_test, Y_train, Y_test = datasplit_cs(raw_fe, Y_colname, X_colname, 0.2)
### Data split of time series
def datasplit_ts(raw, Y_colname, X_colname, criteria):
raw_train = raw.loc[raw.index < criteria,:]
raw_test = raw.loc[raw.index >= criteria,:]
Y_train = raw_train[Y_colname]
X_train = raw_train[X_colname]
Y_test = raw_test[Y_colname]
X_test = raw_test[X_colname]
print('Train_size:', raw_train.shape, 'Test_size:', raw_test.shape)
print('X_train:', X_train.shape, 'Y_train:', Y_train.shape)
print('X_test:', X_test.shape, 'Y_test:', Y_test.shape)
return X_train, X_test, Y_train, Y_test
# X_train, X_test, Y_train, Y_test = datasplit_ts(raw_fe, Y_colname, X_colname, '2012-07-01')
데이터 준비 방향
비시계열 데이터 준비(General Validation)
k - 교차검사(K-fold Cross Validation)
시계열 데이터 준비
시계열 데이터의 경우 랜덤성을 부여하면 안 되고 시간축 유지가 중요하다
그렇기 때문에 비 시계열 검증과는 다르게 교차검증 시에도 시간축을 유지하며 교차검증을 수행한다.
강의 소개 링크 : https://bit.ly/3czfg42
반응형
'Python > 시계열 데이터 분석' 카테고리의 다른 글
[시계열 분석] 과소적합/과적합/편향/분산 (0) | 2021.03.07 |
---|---|
[시계열 분석] 시계열 회귀분석 레퍼런스 모델 적용, 검증지표 개념 및 이해 (0) | 2021.03.03 |
[시계열 분석] 시계열 데이터 패턴의 추출 실습(1) (1) | 2021.02.24 |
[시계열 분석] 시계열 딥러닝(1) : 비교, 필요한 이유, CNN, RNN (0) | 2021.02.20 |
[시계열 분석] 추세 , 계절성, 주기, 더미변수 활용, 지연값 (0) | 2021.02.16 |
댓글