Сообщить об ошибке.

Метод .interpolate() объектов Series/DataFrame в pandas

Заполняет значения NaN, используя метод интерполяции

Синтаксис:

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'
      • в противном случае по умолчанию используется 'forward'
    • Вызывает ошибку 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