DataFrame.interpolate() — заполнение пропусков интерполяцией

interpolate заполняет пропуски (NaN) не константой, а вычисленными промежуточными значениями между известными точками. По умолчанию используется линейная интерполяция, но для временных рядов есть method='time', который учитывает реальные интервалы дат. Аналитику это полезно, когда в метриках или ценах есть дыры, а заливать их средним или предыдущим значением было бы грубо.

Синтаксис

df.interpolate(method='linear', axis=0, limit=…, limit_direction=…)

Примеры использования

Пример 1: Линейная интерполяция пропуска

s = pd.Series([100, np.nan, 400])
s.interpolate()

Результат:

0    100.0
1    250.0
2    400.0
dtype: float64

Пример 2: method='time' учитывает реальные даты

s = pd.Series([10, np.nan, 40],
              index=pd.to_datetime(['2026-01-01','2026-01-03','2026-01-04']))
s.interpolate(method='time')

Результат:

2026-01-01    10.0
2026-01-03    30.0
2026-01-04    40.0
dtype: float64
Порешать Python-задачи в тренажёре →

Типичная ошибка

method='linear' считает точки равноудалёнными и игнорирует индекс — для неравномерных дат бери method='time'. Ведущие NaN (до первого валидного значения) по умолчанию не заполняются; чтобы залить и их, нужен limit_direction='both'. Для 'polynomial'/'spline' требуется установленный scipy, а inplace=True меняет объект на месте.

Где спрашивают на собеседовании

Полезно для сглаживания дыр во временных рядах: пропущенные дни в выручке, показания сенсоров, курсы. На собеседовании проверяют, понимаешь ли разницу между interpolate, fillna(ffill) и заливкой средним.

FAQ: частые вопросы про interpolate

Чем interpolate лучше fillna?

fillna подставляет одно значение (константу, среднее, соседнее через ffill/bfill), а interpolate вычисляет плавный переход между известными точками. Для монотонных или трендовых рядов это точнее и не создаёт «ступенек». Для категорий и явного бизнес-дефолта, наоборот, лучше fillna.

Почему первые NaN остались незаполненными?

Линейной интерполяции нужна точка слева и справа; для ведущих NaN левой опоры нет, поэтому они остаются. Чтобы заполнить их экстраполяцией назад, задай limit_direction='backward' или 'both'. Параметр limit ограничивает, сколько подряд идущих NaN заполнять.

Как интерполировать по времени, а не по номеру строки?

Поставь datetime-индекс и вызови method='time'. Тогда pandas взвесит соседние значения по реальному расстоянию между датами, а не считая строки равноудалёнными. Это важно, когда пропуски в ряду неравномерны по дням.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas: временные ряды · Pandas: основы

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →