df = DataFrame.interpolate(method='linear', *, axis=0, limit=None, inplace=False, limit_direction=None, limit_area=None, downcast=None, **kwargs) s = Series.interpolate(method='linear', *, limit=None, inplace=False, limit_direction=None, limit_area=None, downcast=None, **kwargs)
method='linear'
- используемый метод интерполяции.
Принимает следующие строки:
'linear'
: игнорирует индекс и рассматривает значения как равномерно распределенные. Это единственный метод, поддерживаемый в MultiIndex
.'time'
: работает с дневными данными и данными с более высоким разрешением для интерполяции заданной длины интервала.'index'
, 'values'
: использует фактические числовые значения индекса.'pad'
: заполняет NaN
, используя существующие значения.'nearest'
, 'zero'
, 'slinear'
, 'quadratic'
, 'cubic'
, 'barycentric'
, 'polynomial'
: передается в scipy.interpolate.interp1d
, а 'spline'
передается в scipy.interpolate.UnivariateSpline
.
Эти методы используют числовые значения индекса. Как 'polynomial'
, так и 'spline'
требуют, чтобы был указан порядок order
(принимает значение int
- через **kwargs
передается в SciPy
), например, df.interpolate(method='polynomial', order=5)
. Обратите внимание, что линейный метод в pandas
относится к сплайну первого порядка SciPy
, а не к сплайну первого порядка pandas
.
'krogh'
, 'piecewise_polynomial'
, 'spline'
, 'pchip'
, 'akima'
, 'cubicspline'
: представляют собой обёртки вокруг методов интерполяции SciPy
с похожими именами.
'from_derivatives'
: Относится к scipy.interpolate.BPoly.from_derivatives
.
axis=0
- ось для интерполяции. Для Series
этот параметр не используется и по умолчанию равен 0.
limit=None
- максимальное количество последовательных NaN
для заполнения. Должно быть больше 0.
inplace=False
- по возможности обновляет данные на месте.
limit_direction=None
- последовательные NaN
будут заполнены в этом направлении. Принимает следующие строки: 'forward'
, 'backward'
, 'both'
limit
:method
имеет значение 'pad'
или 'ffill'
, то аргумент limit_direction
должен быть 'forward'
.method
имеет значение 'backfill'
или 'bfill'
, то аргумент `limit_direction' должен быть 'backwards'.limit
НЕ указан:method
имеет значение 'backfill'
или 'bfill'
, то по умолчанию используется limit_direction='backward'
ValueError
, если:limit_direction
является 'forward'
или 'both'
, а аргумент method
имеет значение 'backfill'
или 'bfill'
.limit_direction
является 'backward'
или 'both'
, а аргумент method
имеет значение 'pad'
или 'ffill'
.limit_area=None
- если указан аргумент limit
, то последовательные NaN
будут заполнены с этим ограничением.
None
: без ограничений по заполнению.'inside'
: заполнять только NaN
, окруженные допустимыми значениями (интерполировать).'outside'
: заполнять только NaN
за пределами допустимых значений (экстраполировать).downcast=None
- по возможности понижает разрядность dtype
. Принимает значения: 'infer'
или None
.
**kwargs
- ключевые аргументы для передачи функции интерполяций.
NaN
или None
, если inplace=True
..interpolate()
:Методы DataFrame.interpolate()
и Series.interpolate()
модуля pandas
заполняют значения NaN
соответствующего объекта методом интерполяции.
Обратите внимание, что для DataFrame
/Series
с MultiIndex
поддерживается только метод method='linear'
.
Методы
'krogh'
,'piecewise_polynomial'
,'spline'
,'pchip'
и'akima'
являются обертками для соответствующих реализаций библиотекиSciPy
с аналогичными именами. Они используют фактические числовые значения индекса.Для интерполяции методами, которые используют библиотеку
SciPy
- ее необходимо установить:# активируем виртуальное окружение $ source .venv/bin/activate # ставим модуль `scipy` (VirtualEnv):~$ python3 -m pip install -U scipy
Series.interpolate()
Заполнение NaN
в Series
с помощью линейной интерполяции.
>>> import pandas as pd >>> import numpy as np >>> s = pd.Series([0, 1, np.nan, 3]) >>> s # 0 0.0 # 1 1.0 # 2 NaN # 3 3.0 # dtype: float64 >>> s.interpolate() # 0 0.0 # 1 1.0 # 2 2.0 # 3 3.0 # dtype: float64
Заполнение NaN
в Series
с помощью полиномиальной интерполяции или сплайнов: Методы 'polynomial' и 'spline' требуют, чтобы был указан порядок order
(принимает значение int
- через **kwargs
передается в SciPy
).
>>> s = pd.Series([0, 2, np.nan, 8]) >>> s.interpolate(method='polynomial', order=2) # 0 0.000000 # 1 2.000000 # 2 4.666667 # 3 8.000000 # dtype: float64
DataFrame.interpolate()
Заполним DataFrame
вперед (т. е. вниз) вдоль каждого столбца с помощью линейной интерполяции.
Обратите внимание, что последняя запись в столбце 'a'
интерполируется по-разному, потому что после нее нет записи, которую можно было бы использовать для интерполяции. Обратите внимание, что первая запись в столбце 'b'
остается NaN
, потому что перед ней нет записи, которую можно было бы использовать для интерполяции.
>>> 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 # a b c d # 0 0.0 NaN -1.0 1.0 # 1 NaN 2.0 NaN NaN # 2 2.0 3.0 NaN 9.0 # 3 NaN 4.0 -4.0 16.0 >>> df.interpolate(method='linear', limit_direction='forward', axis=0) # a b c d # 0 0.0 NaN -1.0 1.0 # 1 1.0 2.0 -2.0 5.0 # 2 2.0 3.0 -3.0 9.0 # 3 2.0 4.0 -4.0 16.0
Использование полиномиальной интерполяции для заполнения NaN
в DataFrame
.
>>> df['d'].interpolate(method='polynomial', order=2) # 0 1.0 # 1 4.0 # 2 9.0 # 3 16.0 # Name: d, dtype: float64
Использование других методов интерполяции:
>>> df['d'].interpolate(method='krogh') # 0 1.0 # 1 4.0 # 2 9.0 # 3 16.0 # Name: d, dtype: float64 >>> df['d'].interpolate(method='akima') # 0 1.00 # 1 4.25 # 2 9.00 # 3 16.00 # Name: d, dtype: float64 >>> df['d'].interpolate(method='pchip') # 0 1.0000 # 1 4.1875 # 2 9.0000 # 3 16.0000 # Name: d, dtype: float64 >>> df['d'].interpolate(method='spline', order=2) # 0 1.0 # 1 4.0 # 2 9.0 # 3 16.0 # Name: d, dtype: float64 >>> df['d'].interpolate(method='quadratic') # 0 1.0 # 1 4.0 # 2 9.0 # 3 16.0 # Name: d, dtype: float64 >>> df['d'].interpolate(method='slinear') # 0 1.0 # 1 5.0 # 2 9.0 # 3 16.0 # Name: d, dtype: float64 >>> df['d'].interpolate(method='zero') # 0 1.0 # 1 1.0 # 2 9.0 # 3 16.0 # Name: d, dtype: float64 >>> df['d'].interpolate(method='nearest') # 0 1.0 # 1 1.0 # 2 9.0 # 3 16.0 # Name: d, dtype: float64 >>> df['d'].interpolate(method='barycentric') # 0 1.0 # 1 4.0 # 2 9.0 # 3 16.0 # Name: d, dtype: float64