기술공부/개발_코드
그래프에서 끊어진 데이터를 이어주는 방법
넹넹선생님
2024. 8. 13. 14:49
728x90
반응형
1. 선형 보간법 (Linear Interpolation): 데이터 포인트 간에 직선을 그려서 결측값을 추정하는 방법입니다. numpy 또는 scipy의 함수들을 사용할 수 있습니다.
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
# 예시 데이터
x = np.array([0, 1, 4, 5])
y = np.array([1, 2, np.nan, 4])
# 결측값을 제외한 데이터로 보간 함수를 생성
x_no_nan = x[~np.isnan(y)]
y_no_nan = y[~np.isnan(y)]
f = interp1d(x_no_nan, y_no_nan, kind='linear', fill_value="extrapolate")
# 결측값을 보간
x_new = np.linspace(min(x), max(x), num=100)
y_new = f(x_new)
# 결과 시각화
plt.plot(x_no_nan, y_no_nan, 'o', label='Original Data')
plt.plot(x_new, y_new, '-', label='Interpolated Data')
plt.legend()
plt.show()
2. 다항식 보간법 (Polynomial Interpolation): numpy.polyfit 또는 scipy.interpolate의 BarycentricInterpolator 등을 사용하여 다항식 함수를 사용해 보간합니다.
import numpy as np
from numpy.polynomial import Polynomial
import matplotlib.pyplot as plt
# 예시 데이터
x = np.array([0, 1, 4, 5])
y = np.array([1, 2, np.nan, 4])
# 결측값을 제외한 데이터로 다항식 피팅
x_no_nan = x[~np.isnan(y)]
y_no_nan = y[~np.isnan(y)]
coeff = Polynomial.fit(x_no_nan, y_no_nan, deg=2) # 2차 다항식
# 보간
x_new = np.linspace(min(x), max(x), num=100)
y_new = coeff(x_new)
# 결과 시각화
plt.plot(x_no_nan, y_no_nan, 'o', label='Original Data')
plt.plot(x_new, y_new, '-', label='Polynomial Interpolation')
plt.legend()
plt.show()
3. 스플라인 보간법 (Spline Interpolation): scipy.interpolate의 UnivariateSpline 또는 make_interp_spline을 사용하여 매끄러운 곡선을 생성합니다.
import numpy as np
from scipy.interpolate import UnivariateSpline
import matplotlib.pyplot as plt
# 예시 데이터
x = np.array([0, 1, 4, 5])
y = np.array([1, 2, np.nan, 4])
# 결측값을 제외한 데이터로 스플라인 보간
x_no_nan = x[~np.isnan(y)]
y_no_nan = y[~np.isnan(y)]
spline = UnivariateSpline(x_no_nan, y_no_nan, s=0)
# 보간
x_new = np.linspace(min(x), max(x), num=100)
y_new = spline(x_new)
# 결과 시각화
plt.plot(x_no_nan, y_no_nan, 'o', label='Original Data')
plt.plot(x_new, y_new, '-', label='Spline Interpolation')
plt.legend()
plt.show()
4. 스무딩 방법 (Smoothing Methods): scipy.ndimage.uniform_filter1d 또는 pandas의 rolling 메서드를 사용하여 데이터를 스무딩할 수도 있습니다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 예시 데이터
x = np.array([0, 1, 4, 5])
y = np.array([1, 2, np.nan, 4])
# 결측값을 선형 보간
y_interp = pd.Series(y).interpolate(method='linear')
# 결과 시각화
plt.plot(x, y, 'o', label='Original Data')
plt.plot(x, y_interp, '-', label='Interpolated Data')
plt.legend()
plt.show()
728x90
반응형