FFT로 반복 주기 찾기
설명
반복 패턴이 있는 신호에서 가장 강한 주기(몇 샘플마다 반복되는지)를 FFT로 찾는다
필요 데이터
수치형 신호 컬럼 1개 이상 (실행 시 선택)
출력
컬럼별 주기(샘플 수) 표
필요 패키지
- numpy
- pandas
태그
science, timeseries
작성자
SDSL | MDS 1.0
반복 패턴이 있는 신호에서 가장 강한 주기(몇 샘플마다 반복되는지)를 FFT로 찾는다
Finds the dominant repeating period of a signal using FFT
README
반복 패턴이 있는 신호에서 가장 강한 주기(몇 샘플마다 반복되는지)를 FFT로 찾는다
수치형 신호 컬럼 1개 이상 (실행 시 선택)
컬럼별 주기(샘플 수) 표
science, timeseries
SDSL | MDS 1.0
# MDS_TITLE: FFT로 반복 주기 찾기
# MDS_REQUIRES: numpy, pandas
# MDS_DESC: 반복 패턴이 있는 신호에서 가장 강한 주기(몇 샘플마다 반복되는지)를 FFT로 찾는다
# MDS_DESC[en]: Finds the dominant repeating period of a signal using FFT
# MDS_TAGS: science, timeseries
# MDS_INPUT: 수치형 신호 컬럼 1개 이상 (실행 시 선택)
# MDS_OUTPUT: 컬럼별 주기(샘플 수) 표
# MDS_AUTHOR: SDSL
# MDS_VERSION: 1.0
def dominant_period(series: pd.Series) -> float | None:
s = pd.to_numeric(series, errors='coerce').dropna()
if len(s) < 4:
return None
normalized = (s - s.mean()) / (s.std() + 1e-10)
power = np.abs(np.fft.rfft(normalized.to_numpy())) ** 2
freqs = np.fft.rfftfreq(len(s))
peak = int(np.argmax(power[1:])) + 1
return float(1.0 / freqs[peak]) if freqs[peak] > 0 else None
def run_period_detect(df: pd.DataFrame) -> pd.DataFrame | None:
numeric_cols = df.select_dtypes(include='number').columns.tolist()
if not numeric_cols:
mIO.print('수치형 컬럼이 없습니다.')
return None
chosen = mIO.checkboxes('주기를 찾을 컬럼을 선택하세요', numeric_cols, default_checked=numeric_cols[:1])
if not chosen:
return None
rows = []
for col in chosen:
period = dominant_period(df[col])
rows.append({'컬럼': col, '주기(샘플)': round(period, 3) if period else None})
table = pd.DataFrame(rows)
mIO.show_df(table, title='검출된 주기')
return table
result = run_period_detect(df)