ffill() dan bfill() pada chapter sebelumnya menyalin satu nilai tetangga apa adanya. Untuk besaran yang berubah landai seperti suhu gudang, menyalin berarti mengabaikan informasi bahwa nilai biasanya bergeser sedikit setiap hari. Method interpolate() mengambil jalan tengah: menghitung estimasi di antara dua titik terisi sehingga lubang terisi dengan angka yang masuk akal, bukan salinan nilai lama. Chapter ini membedah interpolasi linear bawaan pandas, perilakunya di ujung deret, dan parameter pengendalinya.
Mekanisme Interpolasi Linear #
Secara bawaan, interpolate() memakai metode linear berbasis posisi baris: lubang di antara dua nilai terisi dianggap berada pada garis lurus yang menghubungkan keduanya. Skrip berikut mengulang deret suhu 1-14 Januari 2026 yang sama, lalu mengisinya dengan interpolasi:
"""Mengisi kekosongan suhu gudang dengan interpolate() dan mengendalikan ujungnya."""
import pandas as pd
import numpy as np
kalender = pd.date_range("2026-01-01", periods=14, freq="D")
suhu = pd.Series(
[
22.5, 23.1, np.nan, 24.0, 24.8, np.nan, np.nan,
25.5, 41.0, 25.2, 12.0, 23.8, 24.1, np.nan,
],
index=kalender,
name="suhu",
)
print("Data asli:")
print(suhu)
print()
print("interpolate() menghitung nilai tengah antar dua titik terisi:")
print(suhu.interpolate().round(2))
print()
didalam = suhu.interpolate(limit_area="inside")
print("limit_area='inside', hari yang tetap kosong:", end=" ")
print(didalam.index[didalam.isna()].strftime("%d Jan").tolist())
print()
uji = pd.Series([np.nan, 22.5, np.nan, 24.0, np.nan])
print("Perilaku di ujung deret, NaN di posisi 0 dan 4:")
print("default (hanya ke depan):")
print(uji.interpolate())
print("limit_direction='both':")
print(uji.interpolate(limit_direction="both"))Output yang Dihasilkan:
Data asli:
2026-01-01 22.5
2026-01-02 23.1
2026-01-03 NaN
2026-01-04 24.0
2026-01-05 24.8
2026-01-06 NaN
2026-01-07 NaN
2026-01-08 25.5
2026-01-09 41.0
2026-01-10 25.2
2026-01-11 12.0
2026-01-12 23.8
2026-01-13 24.1
2026-01-14 NaN
Freq: D, Name: suhu, dtype: float64
interpolate() menghitung nilai tengah antar dua titik terisi:
2026-01-01 22.50
2026-01-02 23.10
2026-01-03 23.55
2026-01-04 24.00
2026-01-05 24.80
2026-01-06 25.03
2026-01-07 25.27
2026-01-08 25.50
2026-01-09 41.00
2026-01-10 25.20
2026-01-11 12.00
2026-01-12 23.80
2026-01-13 24.10
2026-01-14 24.10
Freq: D, Name: suhu, dtype: float64
limit_area='inside', hari yang tetap kosong: ['14 Jan']
Perilaku di ujung deret, NaN di posisi 0 dan 4:
default (hanya ke depan):
0 NaN
1 22.50
2 23.25
3 24.00
4 24.00
dtype: float64
limit_direction='both':
0 22.50
1 22.50
2 23.25
3 24.00
4 24.00
dtype: float64Mari kita telaah bagian pentingnya:
- Baris 20 (
suhu.interpolate().round(2)): lubang 3 Januari terisi23.55, tepat titik tengah antara23.1dan24.0; lubang 6 dan 7 Januari terisi25.03dan25.27, dua titik yang berbaris rapi di antara24.8dan25.5. - Lubang 14 Januari: terisi
24.10— angka ini BUKAN hasil interpolasi, melainkan nilai 13 Januari yang dibawa ke depan karena tidak ada titik berikutnya sebagai acuan. - Baris 23-25 (
limit_area="inside"): parameter ini membatasi pengisian hanya pada lubang yang diapit dua nilai terisi, sehingga 14 Januari tetap kosong dan tidak ada ekstrapolasi terselubung. - Baris 28-33 (Series uji): Series kecil dengan
NaNdi posisi 0 dan 4 memperlihatkan arah bawaan; posisi 0 tidak pernah terisi karena tidak ada nilai sebelumnya, dan posisi 4 terisi24.0hasil pembawaan ke depan.
Dua baris terakhir output menunjukkan peran limit_direction="both": pengisian diperbolehkan ke dua arah, sehingga NaN di posisi 0 akhirnya terisi 22.5 yang ditarik dari belakang. Detail parameter interpolate() ada pada pandas.DataFrame.interpolate
, dan versi Series-nya di pandas.Series.interpolate
.
Membandingkan dengan ffill dan bfill #
Pada lubang 6-7 Januari, ketiga method memberi jawaban berbeda untuk hari yang sama:
| Method | 6 Januari | 7 Januari | Sumber angka |
|---|---|---|---|
ffill() | 24.80 | 24.80 | Nilai 5 Januari disalin |
bfill() | 25.50 | 25.50 | Nilai 8 Januari disalin |
interpolate() | 25.03 | 25.27 | Garis antara 24.8 dan 25.5 |
Tidak ada pemenang mutlak; pilihannya bergantung pada sifat besaran. Interpolasi paling tepat untuk besaran kontinu yang bergerak landai seperti suhu, kelembapan, atau posisi. Sebaliknya, hindari interpolasi untuk nilai yang tidak bermakna pecahan atau yang bergerak melompat: jumlah transaksi, harga jual, dan status kategori lebih jujur diisi ffill(), statistik ringkas, atau dibiarkan kosong.
Kita kini punya tiga alat pengisi untuk data berurutan: menyalin dari depan, menyalin dari belakang, dan menghitung nilai tengah. Semuanya masih bekerja pada satu deret utuh. Pertanyaan berikutnya: bagaimana bila data terdiri atas beberapa kelompok sensor yang tidak boleh saling meminjam nilai? Chapter Missing Data pada GroupBy menjawabnya.