공학/일반

[공학일반] Resampling

슬기나무 2024. 6. 20. 21:53
반응형

이번 포스팅에서는 Resampling의 개념과 예시에 대해 알아보겠습니다.

 

 Resampling이란?

Resampling은 원본 dataset의 sample을 다시 생성하는 것을 말하며,

 

주로 시계열 데이터에서 시간 간격을 재조정하기 위해 사용됩니다.

 

 

 Resampling의 유형

Resampling은 크게 두가지로 나눌 수 있는데요.

 

1. DownSampling

 

  데이터의 빈도를 낮추는 방법을 말합니다.

 

  예를 들어 초단위 데이터를 분단위로 변환한다거나,

 

  0.01초 간격의 데이터를 0.1초 간격으로 변환하는 등의 방법이 있습니다.

 

2. UpSampling

 

  이름에서 알 수 있듯이 위 방법과는 반대로 데이터의 빈도를 높이는 방법입니다.

 

 

위 두 방법에 대해 예시로 알아보겠습니다.

 

 

 DownSampling

DownSampling의 예시입니다.

 

원본 데이터는 0에서 100초까지 0.001초 간격(1000Hz)의 사인파 형태이고,

 

이를 데이터프레임으로 변환하여 0.5초 간격(2Hz)으로 Downsampling하면 아래와 같습니다.

DownSampling 예시. sampling frequency 1000Hz -> 2Hz

 

DownSampling을 수행하면서 0.5초 사이 간격의 데이터를 평균값으로 취했더니,

 

원본 데이터와 비교했을 때 약간의 오차를 보이는 모습을 알 수 있습니다.

 

아래는 위 예시를 실행해볼 수 있는 Python 코드입니다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 원래 데이터 생성 (0초부터 100초까지 0.001초 간격)
time_rng = np.arange(0, 100, 0.001)
data = np.sin(time_rng)  # 예시로 sine 함수를 데이터로 사용

# 데이터프레임 생성
df = pd.DataFrame({'time': time_rng, 'data': data})

# 시간을 초 단위로 변환하여 timedelta로 설정
df['time'] = pd.to_timedelta(df['time'], unit='s')

# DataFrame을 시간 인덱스로 설정
df.set_index('time', inplace=True)

# 0.5초 간격으로 다운샘플링
downsampled_df = df.resample('500ms').mean()

# 그래프 그리기
plt.figure(figsize=(14, 7))
plt.plot(df.index.total_seconds(), df['data'], label='Original Data (0.001s)', alpha=0.5)
plt.plot(downsampled_df.index.total_seconds(), downsampled_df['data'], label='Downsampled Data (0.5s)', marker='o')
plt.xlabel('Time (s)')
plt.ylabel('Data Value')
plt.title('Original Data vs Downsampled Data')
plt.legend(loc='upper right')
plt.show()

 

 

 UpSamping

UpSampling의 예시입니다.

 

DownSampling과는 반대로 원본 데이터는 0에서 100초까지 0.5초 간격(2Hz)의 사인파 형태이고,

 

이를 데이터프레임으로 변환하여 0.001초 간격(1000Hz)으로 UpSampling하면 아래와 같습니다.

UpSampling 예시. sampling frequency 2Hz -> 1000Hz

 

UpSampling을 수행하면서 0.5초 사이 간격의 데이터를 선형보간법을 이용하여 채워넣었습니다.

 

DownSampling 시와는 다르게 원본 데이터를 그대로 따라가는 모습입니다.

 

원래 듬성듬성 있던 데이터인데 그 사이 데이터를 선형으로 이어줬기 때문에 

 

예측 가능한 결과라고 생각되며, 실행할 수 있는 Python 코드는 아래에 있습니다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 원래 데이터 생성 (0초부터 100초까지 0.5초 간격)
time_rng = np.arange(0, 100, 0.5)
data = np.sin(time_rng)  # 예시로 sine 함수를 데이터로 사용

# 데이터프레임 생성
df = pd.DataFrame({'time': time_rng, 'data': data})

# 시간을 초 단위로 변환하여 timedelta로 설정
df['time'] = pd.to_timedelta(df['time'], unit='s')

# DataFrame을 시간 인덱스로 설정
df.set_index('time', inplace=True)

# 0.001초 간격의 새로운 시간 인덱스 생성
new_time_rng = pd.timedelta_range(start='0s', end='100s', freq='1ms')

# 기존 데이터프레임을 새로운 시간 인덱스에 맞춰 재인덱싱
upsampled_df = df.reindex(new_time_rng)

# 보간 (선형 보간법 사용)
upsampled_df['data'] = upsampled_df['data'].interpolate(method='linear')

# 그래프 그리기
plt.figure(figsize=(14, 7))
plt.plot(df.index.total_seconds(), df['data'], label='Original Data (0.5s)', marker='o')
plt.plot(upsampled_df.index.total_seconds(), upsampled_df['data'], label='Upsampled Data (0.001s)', alpha=0.5)
plt.xlabel('Time (s)')
plt.ylabel('Data Value')
plt.title('Original Data vs Upsampled Data')
plt.legend(loc='upper right')
plt.show()

 

 

 

여기까지 ReSampling에 대해 알아보았습니다.

반응형

'공학 > 일반' 카테고리의 다른 글

[공학일반] 평균 필터  (0) 2021.07.01