Pemuatan data adalah langkah pertama yang dikerjakan atas data mentah sebelum analisis dimulai. Topik ini membahas cara memuat data dari tiga sumber yang paling sering ditemui, yaitu berkas CSV, berkas Excel, dan basis data SQLite, menggunakan pandas, library analisis data untuk Python. Seluruh contoh menghasilkan DataFrame, yaitu tabel dua dimensi yang terdiri atas baris dan kolom serta menjadi wadah utama analisis di jalur ini. Setelah topik ini selesai, data dari ketiga sumber tersebut dapat dimuat ke dalam DataFrame, dan kejutan encoding, yakni aturan penerjemahan karakter menjadi byte yang sering berbeda antarsistem, dapat diatasi.
Memuat berkas CSV#
Fungsi pd.read_csv adalah pintu masuk utama untuk memuat data dari berkas teks berformat CSV (Comma-Separated Values), yaitu berkas teks yang memisahkan nilai antarkolom dengan koma. Argumen pertamanya adalah alamat berkas, sedangkan argumen lain bersifat opsional. Fungsi ini mendeteksi kolom secara otomatis, mengonversi setiap kolom ke tipe data yang sesuai, dan menomori baris mulai dari nol. Hasilnya berupa DataFrame yang siap diinspeksi dan diolah pada topik-topik berikutnya.
Berkas contoh bernama nilai-ujian.csv berikut berisi nilai ujian empat siswa. Berkas tersebut tersedia di folder topik ini sehingga contoh dapat dijalankan langsung.
nis,nama,kelas,matematika,bahasa_indonesia
101,Ali,7A,78,82
102,Budi,7A,85,79
103,Citra,7B,90,88
104,Dewi,7B,76,81Pemanggilan pd.read_csv dengan nama berkas sebagai satu-satunya argumen sudah cukup untuk berkas yang rapi.
import pandas as pd
df = pd.read_csv("nilai-ujian.csv")
print(df) nis nama kelas matematika bahasa_indonesia
0 101 Ali 7A 78 82
1 102 Budi 7A 85 79
2 103 Citra 7B 90 88
3 104 Dewi 7B 76 81Kolom nis dan kedua kolom nilai terbaca sebagai bilangan bulat, sedangkan kolom nama dan kelas terbaca sebagai teks. Nomor di kolom paling kiri bukan bagian dari data, melainkan label baris yang dibuat pandas. Apabila berkas berasal dari sistem yang menggunakan pemisah lain, misalnya titik koma, argumen sep=";" ditambahkan agar kolom terbaca dengan benar. Pemeriksaan cepat dengan print setiap kali berkas dimuat menjadi kebiasaan yang menyelamatkan banyak waktu.
Kejutan encoding#
Nilai default, yaitu pilihan bawaan yang digunakan bila argumen tidak disebutkan, menjadi sumber kejutan yang paling sering pada pemuatan CSV. read_csv membaca berkas dengan encoding UTF-8 secara default, sedangkan berkas dari sistem lama atau aplikasi tertentu menggunakan encoding lain seperti latin-1. Perbedaan ini tidak terlihat pada data berisi huruf a-z dan angka, tetapi langsung muncul begitu data memuat karakter beraksen.
Contoh berikut membuat berkas peserta-pertukaran.csv berisi daftar peserta pertukaran pelajar dengan nama dan kota asal beraksen. Argumen encoding="latin-1" pada to_csv menyimpan byte dalam encoding tersebut.
import pandas as pd
peserta = pd.DataFrame({
"nama": ["Budi Santoso", "Renée Dubois", "Jürgen Müller", "Sofía Ibáñez"],
"kota_asal": ["Bandung", "Lyon", "München", "Málaga"],
"program": ["Biologi", "Fisika", "Matematika", "Kimia"],
})
peserta.to_csv("peserta-pertukaran.csv", encoding="latin-1", index=False)
print("peserta-pertukaran.csv tersimpan dalam encoding latin-1")peserta-pertukaran.csv tersimpan dalam encoding latin-1Pemanggilan read_csv tanpa argumen encoding kemudian gagal. Pesan errornya menyebut byte 0xe9, yaitu kode latin-1 untuk huruf é, beserta posisi byte tersebut di dalam berkas.
import pandas as pd
try:
pd.read_csv("peserta-pertukaran.csv")
except UnicodeDecodeError as e:
print("Gagal membaca berkas peserta-pertukaran.csv")
print(e)Gagal membaca berkas peserta-pertukaran.csv
'utf-8' codec can't decode byte 0xe9 in position 55: invalid continuation byteSolusinya adalah menyebutkan encoding yang benar saat berkas dimuat. Setelah argumen encoding="latin-1" ditambahkan, seluruh karakter beraksen tampil utuh dan data siap dianalisis.
import pandas as pd
df = pd.read_csv("peserta-pertukaran.csv", encoding="latin-1")
print(df) nama kota_asal program
0 Budi Santoso Bandung Biologi
1 Renée Dubois Lyon Fisika
2 Jürgen Müller München Matematika
3 Sofía Ibáñez Málaga KimiaMemuat berkas Excel#
Berkas Excel dimuat dengan pd.read_excel, dan format .xlsx dibaca melalui library openpyxl di belakang layar. Library tersebut perlu dipasang terlebih dahulu.
# tidak-dijalankan
# memasang openpyxl untuk membaca dan membuat berkas xlsx
pip install openpyxlContoh berikut membuat stok-perpustakaan.xlsx dari sebuah DataFrame, lalu berkas itu dibaca kembali dengan read_excel. Berkas xlsx tersebut menjadi bagian dari proyek topik ini dan tersimpan di folder topik.
import pandas as pd
stok = pd.DataFrame({
"judul": ["Kamus Biologi", "Atlas Dunia", "Ensiklopedia Sains", "Sejarah Nusantara"],
"kategori": ["Referensi", "Referensi", "Sains", "Sejarah"],
"stok": [4, 2, 6, 3],
})
stok.to_excel("stok-perpustakaan.xlsx", index=False)
print("stok-perpustakaan.xlsx tersimpan")stok-perpustakaan.xlsx tersimpanimport pandas as pd
df = pd.read_excel("stok-perpustakaan.xlsx")
print(df) judul kategori stok
0 Kamus Biologi Referensi 4
1 Atlas Dunia Referensi 2
2 Ensiklopedia Sains Sains 6
3 Sejarah Nusantara Sejarah 3Hasil read_excel berbentuk sama dengan hasil read_csv, yaitu DataFrame dengan label baris otomatis dan tipe kolom yang terdeteksi. Perbedaannya ada pada parameter yang sering dibutuhkan. Berkas Excel dapat memuat beberapa sheet, dan penanganannya diatur lewat argumen sheet_name.
Memuat data dari basis data SQLite#
Sumber ketiga yang sering ditemui adalah basis data. Modul sqlite3 sudah tersedia di dalam Python sehingga basis data SQLite dapat dibuat dan dibaca tanpa pemasangan tambahan. Fungsi pd.read_sql menjalankan sebuah query, yaitu perintah SQL yang mengambil data, melalui koneksi yang aktif, lalu mengembalikan hasilnya sebagai DataFrame. Pola ini juga berlaku untuk basis data server seperti PostgreSQL, dengan koneksi dari library yang berbeda.
import sqlite3
import pandas as pd
koneksi = sqlite3.connect(":memory:")
koneksi.execute("CREATE TABLE peminjaman (anggota TEXT, judul TEXT, lama_hari INTEGER)")
koneksi.executemany(
"INSERT INTO peminjaman VALUES (?, ?, ?)",
[
("Ali", "Atlas Dunia", 7),
("Budi", "Ensiklopedia Sains", 14),
("Citra", "Atlas Dunia", 5),
("Dewi", "Kamus Biologi", 10),
],
)
df = pd.read_sql("SELECT anggota, judul, lama_hari FROM peminjaman", koneksi)
koneksi.close()
print(df) anggota judul lama_hari
0 Ali Atlas Dunia 7
1 Budi Ensiklopedia Sains 14
2 Citra Atlas Dunia 5
3 Dewi Kamus Biologi 10Argumen ":memory:" membuat basis data hanya hidup di memori sehingga hilang begitu program berakhir, dan pola itu cukup untuk latihan. Empat baris data dimasukkan melalui executemany, kemudian query SELECT mengambil seluruh barisnya. Nama tabel dan kolom di dalam query mengikuti aturan SQL, sedangkan bentuk keluarannya mengikuti konvensi pandas. Dengan cara ini, data dari basis data dapat dimuat ke DataFrame tanpa proses ekspor berkas manual.
Kesalahan umum#
Kesalahan pertama adalah alamat berkas yang relatif. Pemanggilan pd.read_csv("nilai-ujian.csv") mencari berkas di folder kerja saat program dijalankan, bukan di folder berkas skripnya. Notebook yang dijalankan dari folder lain memunculkan FileNotFoundError meskipun berkasnya ada di tempat lain. Salin berkas ke folder kerja atau sebutkan alamatnya secara lengkap untuk mengatasinya.
Kesalahan kedua adalah mengabaikan pemisah kolom. Berkas CSV yang dihasilkan aplikasi dengan pengaturan wilayah yang menggunakan koma sebagai pemisah desimal umumnya memisahkan kolom dengan titik koma. Tanpa argumen sep=";", read_csv menganggap seluruh isi satu baris sebagai satu kolom, dan gejalanya berupa DataFrame dengan satu kolom saja. Pemeriksaan print setelah pemuatan menangkap gejala ini lebih awal.
Kesalahan ketiga terjadi saat menulis, bukan saat membaca. Menyimpan DataFrame dengan to_csv tanpa argumen index=False menuliskan nomor baris sebagai kolom pertama di dalam berkas. Berkas yang dibaca ulang kemudian memuat kolom tak bernama berisi 0, 1, 2, dan seterusnya. Sertakan index=False setiap kali nomor baris bukan bagian dari data.
Ringkasan#
pd.read_csvdanpd.read_excelmenghasilkan DataFrame dengan label baris otomatis dan tipe kolom terdeteksi, dengansep=";"untuk CSV berpemisah titik koma dansheet_nameuntuk berkas Excel berisi beberapa sheet.UnicodeDecodeErrorsaat memuat CSV menandakan encoding berkas tidak cocok dengan nilai default, dan solusinya adalah argumenencodingsepertiencoding="latin-1".pd.read_sqlmenjalankan query melalui koneksisqlite3, termasuk basis data":memory:"yang hidup di memori untuk keperluan latihan.
Referensi#
- pandas.read_csv — Pandas
— Daftar parameter
read_csv, termasuksep,encoding, dandtype. - pandas user guide — Pandas — Panduan resmi pandas yang memuat bagian pembacaan berkas teks, Excel, dan SQL.
- pandas.read_sql — Pandas
— Cara
read_sqlmenjalankan query melalui koneksi basis data. - sqlite3 — Python Software Foundation
— Dokumentasi modul
sqlite3untuk membuat koneksi dan mengeksekusi perintah SQL.