Deret waktu dari sensor, pencatatan stok, dan hasil pengukuran laboratorium sering memiliki celah: pembacaan tertentu gagal direkam, atau pengukuran diambil dengan jarak yang tidak rata. Daripada membuang seluruh baris data, kita bisa memperkirakan nilai di antara dua titik yang diketahui. Teknik paling sederhana adalah interpolasi linear, dan di NumPy fungsi ini siap pakai sebagai np.interp.

Cara Kerja np.interp #

Fungsi np.interp(x_baru, xp, fp) menerima tiga argumen: titik yang ingin dicari (x_baru), titik acuan yang sudah diketahui (xp), dan nilainya (fp). NumPy menghubungkan dua titik acuan yang mengapit x_baru dengan garis lurus, lalu membaca nilai pada posisi tersebut:

python
import numpy as np

xp = np.array([0.0, 10.0, 20.0])
fp = np.array([0.0, 100.0, 180.0])
x_baru = np.array([5.0, 12.5, 20.0])
print(np.interp(x_baru, xp, fp))

Output yang Dihasilkan:

text
[ 50. 120. 180.]

Mari kita periksa perhitungannya:

  1. Baris 3-4 (xp dan fp): titik acuan berupa pasangan (0, 0), (10, 100), dan (20, 180); xp wajib berisi nilai yang meningkat (increasing).
  2. Titik 5.0: berada di antara 0 dan 10, tepat di tengah segmen, sehingga hasilnya 50.0.
  3. Titik 12.5: berada di segmen 10-20. NumPy menghitung 100 + (12.5 - 10) * (180 - 100) / (20 - 10) = 120.0, yaitu nilai awal ditambah proporsi jarak dikali kemiringan segmen.
  4. Titik 20.0: sama persis dengan titik acuan terakhir, sehingga dikembalikan 180.0 tanpa perubahan.

Nilai di Luar Rentang: Menjepit ke Ujung #

Perilaku np.interp di luar rentang xp perlu dipahami dengan baik: fungsi ini tidak mengekstrapolasi dan tidak error. Nilai di luar rentang dijepit ke nilai ujung yang terdekat:

python
import numpy as np

xp = np.array([0.0, 10.0, 20.0])
fp = np.array([0.0, 100.0, 180.0])
print(np.interp(np.array([-5.0, 25.0]), xp, fp))
print(np.interp(np.array([-5.0, 25.0]), xp, fp, left=-1.0, right=999.0))

Output yang Dihasilkan:

text
[  0. 180.]
[ -1. 999.]

Baris pertama menunjukkan perilaku default: -5.0 menghasilkan 0.0 (nilai ujung kiri) dan 25.0 menghasilkan 180.0 (nilai ujung kanan). Bila perilaku ini tidak diinginkan, parameter left dan right mengganti nilai penggantinya, seperti pada baris kedua.

Mengisi Pembacaan Sensor yang Hilang #

Kasus nyata: sensor suhu mencatat data tiap jam, tetapi dua pembacaan gagal dan tersimpan sebagai nan. Kita isi celah tersebut dengan interpolasi dari pembacaan yang valid:

python
import numpy as np

jam = np.array([8.0, 9.0, 10.0, 11.0, 12.0])
suhu = np.array([26.0, np.nan, 29.0, np.nan, 33.0])
mask = np.isnan(suhu)
suhu[mask] = np.interp(jam[mask], jam[~mask], suhu[~mask])
print(suhu)

Output yang Dihasilkan:

text
[26.  27.5 29.  31.  33. ]

Bedah baris demi baris:

  1. Baris 3-4: deret asli memuat dua nan pada jam 9 dan jam 11.
  2. Baris 5 (mask = np.isnan(suhu)): boolean mask menandai posisi nilai yang hilang.
  3. Baris 6 (np.interp(jam[mask], jam[~mask], suhu[~mask])): fungsi hanya menerima titik valid (~mask berarti “bukan nan”), lalu menghitung taksiran untuk jam yang hilang: jam 9 berada tepat di tengah 26.0 dan 29.0, menghasilkan 27.5; jam 11 berada di tengah 29.0 dan 33.0, menghasilkan 31.0.
  4. Penugasan suhu[mask] = ...: nilai nan digantikan langsung di array asli, dan deret kembali utuh.

Tabel berikut membandingkan deret sebelum dan sesudah pengisian:

JamSuhu asliSuhu hasil
826.026.0
9nan27.5
1029.029.0
11nan31.0
1233.033.0

Pendekatan ini menjaga panjang deret tetap sama sehingga aman untuk perhitungan lanjutan seperti rata-rata bergulir. Perlu diingat, nilai hasil interpolasi adalah taksiran linear — pada data yang bergerak melengkung tajam, metode yang lebih halus seperti spline akan memberi hasil lebih akurat.