나는야 데이터사이언티스트/PYTHON

[Python/pandas]데이터 결측치 처리하기(보간법/보외법) -pandas.DataFrame.interpolate

우주먼지의하루 2020. 6. 13. 00:03
728x90

보간법/보외법

python에서 간단하게 보간,보외할 수 있는 방법이 있다. 보간 보외에 관한 간단한 설명은 아래의 블로그에서 확인 가능.

 

http://blog.naver.com/PostView.nhn?blogId=release&logNo=50094947851

보간법(내삽법, Interpolate), 보외법(외삽법, Extrapolation)

pandas.DataFrame.interpolate

DataFrame.interpolate(self, method='linear', axis=0, limit=None, inplace=False, limit_direction='forward', limit_area=None, downcast=None, **kwargs)

 

 

Parameters : method : str, default ‘linear’

  • ‘linear’: 선형 방법으로 보간

  • ‘time’: 시간/날짜 간격으로 보간. 이때 시간/날짜가 index로 되어있어야함.

  • ‘index’, ‘values’: 정확하게 뭔지는 모르겠다. 문서는 'use the actual numerical values of the index' 이렇게 나와있는데 index 값을 어떻게 쓴다는지 정확하게 모르겠음.

  • ‘pad’: 바로 앞에 value 사용

  • ‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘spline’, ‘barycentric’, ‘polynomial’: scipy.interpolate.interp1d 설명이랑 똑같다고 나와있다. 몇개는 직관적으로 알 수 있을거 같고 스플라인 이런거는 조금 더 공부해서 써야할 듯.

  • ‘krogh’, ‘piecewise_polynomial’, ‘spline’, ‘pchip’, ‘akima’:  SciPy interpolation 에서 확인하라고 한다. 이것 또한 조금 더 공부하고 써야하는 방법.

  • ‘from_derivatives’: Refers to scipy.interpolate.BPoly.from_derivatives which replaces ‘piecewise_polynomial’ interpolation method in scipy 0.18.

axis{0 or ‘index’, 1 or ‘columns’, None}, default None : 행, 열 

 

limitint, optional : 어느 값 이상으로는 채우지 않게 제한.

 

inplacebool, default False :가능하면 내가 쓰는 데이터 안에서 해결

 

limit_direction{‘forward’, ‘backward’, ‘both’}, default ‘forward’ : limit을 사용했을 때, NAN 값 채워지는 방향

 

limit_area{None, ‘inside’, ‘outside’}, default None

limit을 사용했을 때, 그 limit을 어디까지 제한할지

  • None: No fill restriction.

  • ‘inside’: Only fill NaNs surrounded by valid values (interpolate).

  • ‘outside’: Only fill NaNs outside valid values (extrapolate).

downcast : optional, ‘infer’ or None, defaults to None

Downcast dtypes if possible.

 

**kwargs

Keyword arguments to pass on to the interpolating function.

실습하기

데이터를 만들어줍니다.

import pandas as pd
import numpy as np

df = pd.DataFrame([(0.0, np.nan, -1.0, 1.0),
                   (np.nan, 2.0, np.nan, np.nan),
                   (2.0, 3.0, np.nan, 9.0),
                   (np.nan, 4.0, -4.0, 16.0)],
                  columns=list('abcd'))

df

▼ df 출력값

method = linear을 써봅니다.

df.interpolate(method="linear")

 

method = time을 써봅니다.

time은 꼭 index에 날짜/시간 데이터가 있어야하기 때문에 예제 데이터를 조금 조작하겠습니다.

df = pd.DataFrame([(0.0, np.nan, -1.0, 1.0),
                   (np.nan, 2.0, np.nan, np.nan),
                   (2.0, 3.0, np.nan, 9.0),
                   (np.nan, 4.0, -4.0, 16.0)],
                  columns=list('abcd'))
df['time'] = ['2019-02-20 10:00 am', 
               '2019-02-20 10:30 am', '2019-02-20 11:00 pm', 
               '2019-02-20 11:30 pm']

df['time']=pd.to_datetime(df['time'])
df=df.set_index('time')

df

보간을 합니다.

df.interpolate(method='time')

 


보외법은 scipy.interpolate.interp1d에서 fill_value 파라미터에 extrapolate 옵션이 있긴 있다.

실습은 추후에 쓸일 있으면 해보는 걸로 !

 

반응형