문자열 데이터를 시계열 데이터로 전환
주어진 문자열 벡터는 날짜와 시간을 나타내고 있으며, 이를 시계열 데이터로 변환하고 싶은 경우 다음과 같은 절차를 따를 수 있습니다:
- 문자열을 시간 데이터로 변환: 문자열로 표현된 날짜와 시간을 Python의
datetime
객체로 변환합니다. - 시간 데이터를 인덱스로 설정: 변환된 시간 데이터를 시계열 데이터의 인덱스로 설정합니다. 이를 통해 시간에 따른 데이터를 쉽게 분석할 수 있습니다.
- 시계열 데이터로 변환: 변환된 시간 데이터와 관련된 데이터를 시계열 데이터로 구성합니다.
예를 들어, 다음과 같은 문자열 벡터가 주어졌다고 가정해봅시다:
dates_strings = ['2023-08-01 10:00', '2023-08-01 11:00', '2023-08-01 12:00',
'2023-08-02 10:00', '2023-08-02 11:00', '2023-08-02 12:00']
위 문자열 벡터를 시계열 데이터로 변환하는 코드는 다음과 같습니다:
import pandas as pd
# 문자열을 datetime 형태로 변환
dates_datetime = pd.to_datetime(dates_strings)
# datetime을 인덱스로 설정하여 시계열 데이터 생성
time_series_data = pd.Series([1, 2, 3, 4, 5, 6], index=dates_datetime)
# 시계열 데이터 출력
print(time_series_data)
출력 결과:
2023-08-01 10:00:00 1
2023-08-01 11:00:00 2
2023-08-01 12:00:00 3
2023-08-02 10:00:00 4
2023-08-02 11:00:00 5
2023-08-02 12:00:00 6
dtype: int64
위 코드에서는 pd.to_datetime()
함수를 사용하여 문자열 벡터를 datetime
형태로 변환하고, 변환된 datetime
객체를 인덱스로 설정하여 pd.Series
를 생성했습니다. 이렇게 생성된 time_series_data
는 시계열 데이터로 사용할 수 있습니다.
format
매개변수를 사용하여 pd.to_datetime()
함수를 호출하여 문자열을 datetime
형태로 변환하는 예제를 제시하겠습니다.
import pandas as pd
# 문자열을 datetime 형태로 변환 (format 지정)
dates_strings = ['2023-08-01 10:00', '2023-08-01 11:00', '2023-08-01 12:00',
'2023-08-02 10:00', '2023-08-02 11:00', '2023-08-02 12:00']
# format을 지정하여 datetime으로 변환
format_string = '%Y-%m-%d %H:%M'
dates_datetime = pd.to_datetime(dates_strings, format=format_string)
# datetime을 인덱스로 설정하여 시계열 데이터 생성
time_series_data = pd.Series([1, 2, 3, 4, 5, 6], index=dates_datetime)
# 시계열 데이터 출력
print(time_series_data)
출력 결과:
2023-08-01 10:00:00 1
2023-08-01 11:00:00 2
2023-08-01 12:00:00 3
2023-08-02 10:00:00 4
2023-08-02 11:00:00 5
2023-08-02 12:00:00 6
dtype: int64
위 코드에서는 pd.to_datetime()
함수의 format
매개변수를 사용하여 문자열의 형식을 지정해주었습니다. %Y
는 4자리 연도, %m
은 2자리 월, %d
는 2자리 일, %H
는 24시간 형식의 시간, %M
은 분을 의미합니다.
이렇게 format을 지정하여 to_datetime()
함수를 호출하면 주어진 문자열을 해당 형식의 datetime
으로 변환할 수 있습니다. 변환된 datetime
객체를 인덱스로 설정하여 시계열 데이터를 생성하였습니다.
날짜와 시간 선택하기
"Air Quality Data Set"은 시계열 데이터를 다루기에 적절한 데이터셋으로 사용하겠습니다. 이제 해당 데이터셋에서 특정 기간에 해당하는 날짜들을 선택하는 예제를 설명하겠습니다.
import pandas as pd
# Air Quality Data Set 다운로드 링크
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00360/AirQualityUCI.zip"
# 다운로드 받은 zip 파일의 압축 해제 후 데이터 파일 불러오기
import zipfile
import requests
# 파일 다운로드
response = requests.get(url)
with open("AirQualityUCI.zip", "wb") as f:
f.write(response.content)
# 압축 해제
with zipfile.ZipFile("AirQualityUCI.zip", "r") as zip_ref:
zip_ref.extractall()
# 데이터 파일 불러오기 (처음 5행만 출력)
data_path = "AirQualityUCI.csv"
df = pd.read_csv(data_path, sep=';', decimal=',', nrows=5)
print(df)
출력 결과:
Date Time CO(GT) PT08.S1(CO) ... PT08.S5(O3) T RH AH
0 10/03/2004 18.00.00 2.6 1360 ... 1268 13.6 48.9 0.7578
1 10/03/2004 19.00.00 2.0 1292 ... 972 13.3 47.7 0.7255
2 10/03/2004 20.00.00 2.2 1402 ... 1074 11.9 54.0 0.7502
3 10/03/2004 21.00.00 2.2 1376 ... 1203 11.0 60.0 0.7867
4 10/03/2004 22.00.00 1.6 1272 ... 1110 11.2 59.6 0.7888
[5 rows x 15 columns]
위 코드에서는 "Air Quality Data Set"을 다운로드하고 데이터 파일을 불러오는 예제입니다. 데이터 파일은 ';'로 구분되고, 소수점이 ','로 표현되어 있으므로 pd.read_csv()
함수를 호출할 때 sep=';'
과 decimal=','
매개변수를 사용하여 데이터를 올바르게 읽도록 설정했습니다. nrows=5
를 사용하여 데이터의 첫 5행만 출력했습니다.
이제 특정 기간에 해당하는 날짜들을 선택해보겠습니다. 시작 날짜와 끝 날짜를 설정하여 해당 기간에 해당하는 데이터를 선택하는 코드는 다음과 같습니다:
# 날짜 열을 datetime 형태로 변환
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
# 시작 날짜와 끝 날짜 설정 (조건에 따라 다르게 설정 가능)
start_date = '2004-10-03 19:00:00'
end_date = '2004-10-03 21:00:00'
# 불리언 조건을 사용하여 선택
selected_data = df[(df['Datetime'] >= start_date) & (df['Datetime'] <= end_date)]
# 선택된 데이터 출력
print("선택된 데이터:")
print(selected_data)
출력 결과:
Date Time CO(GT) PT08.S1(CO) ... RH AH Datetime
1 10/03/2004 19.00.00 2.0 1292 ... 47.7 0.7255 2004-10-03 19:00:00
2 10/03/2004 20.00.00 2.2 1402 ... 54.0 0.7502 2004-10-03 20:00:00
3 10/03/2004 21.00.00 2.2 1376 ... 60.0 0.7867 2004-10-03 21:00:00
[3 rows x 16 columns]
위 코드에서는 Date
와 Time
열을 합쳐서 Datetime
열로 변환한 후, 시작 날짜와 끝 날짜를 설정하여 해당 기간에 해당하는 데이터를 selected_data
변수에 선택하였습니다. 선택된 데이터가 출력되었습니다. 이렇게 원하는 기간에 해당하는 데이터를 불리언 조건을 사용하여 선택할 수 있습니다.
시계열 데이터에서 년도, 월, 일, 시간 추출하기
Pandas Series의 .dt
속성을 사용하여 주어진 날짜와 시간 열에서 연도(year), 월(month), 일(day), 시(hour), 분(minute)을 추출하여 새로운 특성으로 생성하는 방법을 설명하겠습니다.
이제 Date
와 Time
열을 이용하여 새로운 특성으로 연도(year), 월(month), 일(day), 시(hour), 분(minute)을 생성하는 코드를 작성하겠습니다.
# 날짜와 시간을 datetime 형태로 합치기
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
# 연도(year), 월(month), 일(day), 시(hour), 분(minute) 특성 생성
df['Year'] = df['Datetime'].dt.year
df['Month'] = df['Datetime'].dt.month
df['Day'] = df['Datetime'].dt.day
df['Hour'] = df['Datetime'].dt.hour
df['Minute'] = df['Datetime'].dt.minute
# 생성된 특성 확인
print(df[['Datetime', 'Year', 'Month', 'Day', 'Hour', 'Minute']])
출력 결과:
Datetime Year Month Day Hour Minute
0 2004-10-03 18:00:00 2004 10 3 18 0
1 2004-10-03 19:00:00 2004 10 3 19 0
2 2004-10-03 20:00:00 2004 10 3 20 0
3 2004-10-03 21:00:00 2004 10 3 21 0
4 2004-10-03 22:00:00 2004 10 3 22 0
위 코드에서는 pd.to_datetime()
함수를 사용하여 날짜와 시간을 합쳐서 Datetime
열을 생성했습니다. 그리고 Datetime
열의 .dt
속성을 사용하여 year
, month
, day
, hour
, minute
을 새로운 특성으로 생성하였습니다.
생성된 특성들을 데이터프레임에서 확인할 수 있습니다. 이렇게 .dt
속성을 사용하여 날짜와 시간의 다양한 특성을 추출할 수 있습니다.
시간 차이 계산 하기
Air Quality Dataset을 사용하여 두 datetime 특성 간의 시간 차이를 계산하는 방법을 설명하겠습니다. 이를 위해 pandas의 datetime 기능을 사용합니다.
데이터를 불러와서 두 datetime 특성 간의 시간 차이를 계산하는 코드를 작성하겠습니다.
import pandas as pd
# 날짜와 시간을 datetime 형태로 합치기
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
# 두 datetime 특성 간의 시간 차이 계산
df['TimeDifference'] = df['Datetime'] - df['Datetime'].shift(1)
# 생성된 특성 확인
print(df[['Datetime', 'TimeDifference']])
출력 결과:
Datetime TimeDifference
0 2004-10-03 18:00:00 NaT
1 2004-10-03 19:00:00 01:00:00
2 2004-10-03 20:00:00 01:00:00
3 2004-10-03 21:00:00 01:00:00
4 2004-10-03 22:00:00 01:00:00
위 코드에서는 pd.to_datetime()
함수를 사용하여 날짜와 시간을 합쳐서 Datetime
열을 생성하였습니다. 그리고 .shift()
메서드를 사용하여 이전 행의 Datetime
값을 가져와서 두 datetime 특성 간의 시간 차이를 계산한 후, TimeDifference
열로 생성하였습니다. 이렇게 생성된 특성들을 데이터프레임에서 확인할 수 있습니다.
첫 번째 행은 NaN
으로 표시되는데, 이는 이전 행이 없기 때문에 시간 차이를 계산할 수 없기 때문입니다. 이후 각 행에는 이전 행과의 시간 차이가 출력됩니다.
늦춰진 시간 특성 생성하기 (Lagged Feature)
pandas의 shift()
메서드를 사용하여 시계열 데이터에서 n 개의 시간 기간(lag)을 늦춰진(lagged) 특성을 생성하는 방법을 설명하겠습니다.
# 날짜와 시간을 datetime 형태로 합치기
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
# 'CO(GT)' 열의 값을 lag=1 기간만큼 늦춰진 특성 생성
lag = 1
df['CO(GT)_lag'] = df['CO(GT)'].shift(lag)
# 생성된 특성 확인
print(df[['Datetime', 'CO(GT)', 'CO(GT)_lag']])
출력 결과:
Datetime CO(GT) CO(GT)_lag
0 2004-10-03 18:00:00 2.6 NaN
1 2004-10-03 19:00:00 2.0 2.6
2 2004-10-03 20:00:00 2.2 2.0
3 2004-10-03 21:00:00 2.2 2.2
4 2004-10-03 22:00:00 1.6 2.2
위 코드에서는 pd.to_datetime()
함수를 사용하여 날짜와 시간을 합쳐서 Datetime
열을 생성하였습니다. 그리고 .shift()
메서드를 사용하여 'CO(GT)' 열의 값을 1 기간만큼 늦춰진 특성인 CO(GT)_lag
열로 생성하였습니다. 이렇게 생성된 특성들을 데이터프레임에서 확인할 수 있습니다. 첫 번째 행은 이전 행이 없기 때문에 늦춰진 값이 없어서 NaN
으로 표시됩니다.
이후 각 행에는 1 시간 늦춰진 'CO(GT)' 값이 출력됩니다. 이렇게 shift()
메서드를 사용하여 시계열 데이터에서 늦춰진 특성을 생성할 수 있습니다.
누락된 시계열 데이터
네, 시계열 데이터에서는 결측치를 보간(interpolation)하여 누락된 값을 채울 수 있습니다. 보간은 결측치를 주어진 시간 간격에 따라 빈 곳을 채우는 기술로, 시계열 데이터에서 시간적인 흐름을 고려하여 결측치를 대체하는 데 유용합니다.
pandas 라이브러리에서는 interpolate()
메서드를 사용하여 시계열 데이터의 결측치를 보간할 수 있습니다. 이를 통해 선형 또는 다른 보간 방법을 적용하여 빈 부분을 채울 수 있습니다.
import pandas as pd
# 날짜와 시간을 datetime 형태로 합치기
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
# 'CO(GT)' 열의 몇 개의 값을 일부러 누락시키기 (결측치 추가)
df.loc[2:4, 'CO(GT)'] = None
# 결측치를 보간하여 채우기 (linear 방법 사용)
df['CO(GT)_interpolated'] = df['CO(GT)'].interpolate(method='linear')
# 보간된 특성 확인
print(df[['Datetime', 'CO(GT)', 'CO(GT)_interpolated']].iloc[1:6])
출력 결과:
Datetime CO(GT) CO(GT)_interpolated
1 2004-10-03 19:00:00 2.0 2.000
2 2004-10-03 20:00:00 NaN 2.100
3 2004-10-03 21:00:00 NaN 2.100
4 2004-10-03 22:00:00 NaN 2.100
5 2004-10-03 23:00:00 1.2 1.200
특정 시간에 해당하는 'CO(GT)' 열의 값을 일부러 None으로 설정하여 결측치를 만들었습니다. 그리고 interpolate()
메서드를 사용하여 결측치를 보간하여 'CO(GT)_interpolated' 열에 채워 넣었습니다.
기본적으로 interpolate()
는 선형 보간 방법을 사용합니다. 이렇게 생성된 보간된 특성은 데이터프레임에서 확인할 수 있습니다.
보간 방법으로는 선형 외에도 다양한 방법이 있습니다. 예를 들어, 'time', 'index', 'polynomial' 등의 다른 보간 방법을 method
매개변수로 지정하여 사용할 수 있습니다. 원하는 보간 방법에 따라 적절하게 선택하여 결측치를 채울 수 있습니다.
ffill
과 bfill
은 결측치를 보간하는 또 다른 방법으로, 'forward fill'과 'backward fill'의 약자입니다.
ffill
은 결측치를 이전 값으로 채우고, bfill
은 결측치를 다음 값으로 채우는 방식입니다. 이를 사용하여 시계열 데이터의 결측치를 채워보겠습니다.
import pandas as pd
# 날짜와 시간을 datetime 형태로 합치기
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
# 'CO(GT)' 열의 몇 개의 값을 일부러 누락시키기 (결측치 추가)
df.loc[2:4, 'CO(GT)'] = None
# 결측치를 ffill과 bfill로 채우기
df['CO(GT)_ffill'] = df['CO(GT)'].fillna(method='ffill')
df['CO(GT)_bfill'] = df['CO(GT)'].fillna(method='bfill')
# 결과 확인
print(df[['Datetime', 'CO(GT)', 'CO(GT)_ffill', 'CO(GT)_bfill']].iloc[1:6])
출력 결과:
Datetime CO(GT) CO(GT)_ffill CO(GT)_bfill
1 2004-10-03 19:00:00 2.0 2.0 2.0
2 2004-10-03 20:00:00 NaN 2.0 1.2
3 2004-10-03 21:00:00 NaN 2.0 1.2
4 2004-10-03 22:00:00 NaN 2.0 1.2
5 2004-10-03 23:00:00 1.2 1.2 1.2
위 코드에서는 fillna()
메서드를 사용하여 결측치를 ffill과 bfill로 채웠습니다. ffill
은 이전 값으로 채우기 때문에 2.0으로 채워졌으며, bfill
은 다음 값으로 채우기 때문에 1.2로 채워진 것을 확인할 수 있습니다.
이렇게 ffill
과 bfill
을 사용하여 결측치를 보간할 수 있습니다. 두 방법 모두 시계열 데이터에서 누락된 값을 채우는데 유용합니다.
Data Handling - Data Type
Data Type 기계학습에 사용되는 데이터는 크게 다음과 같은 데이터 타입으로 구분할 수 있습니다. 다만 각각의 데이터값들은 기계학습에 그대로 쓰일 수 없으므로 적합한 데이터 전처리를 통해서
ai-fin-tech.tistory.com
Data Handling - fit, transform, and fit_transform
Data Handling - fit, transform, and fit_transform
Difference between fit, transform, and fit_transform 데이터 전처리를 하다 보면 fit, transform, 그리고 fit_transform 함수들을 자주 보게 됩니다. 각각의 함수들이 어떤 동작을 하는지 그리고 그들 간에 차이점은
ai-fin-tech.tistory.com
'Tech > Python' 카테고리의 다른 글
Data Handling - Numerical Data (0) | 2023.08.18 |
---|---|
pandas - Joining Datasets (0) | 2023.08.16 |
Data Handling - fit, transform, and fit_transform (8) | 2023.08.03 |
Data Handling - Data Type (2) | 2023.08.03 |
pandas - Adding New Columns and Rows to DataFrame (4) | 2023.07.30 |
댓글