기술공부/개발_코드

그래프에서 끊어진 데이터를 이어주는 방법

넹넹선생님 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
반응형