Pemuatan data

Memuat data dari CSV, Excel, dan basis data, termasuk mengatasi kejutan encoding yang sering muncul.

Daftar isi

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.

csv nilai-ujian.csv
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,81

Pemanggilan pd.read_csv dengan nama berkas sebagai satu-satunya argumen sudah cukup untuk berkas yang rapi.

python Memuat nilai-ujian.csv dengan read_csv
import pandas as pd

df = pd.read_csv("nilai-ujian.csv")
print(df)
text Keluaran
   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                81

Kolom 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.

python Membuat berkas CSV dengan encoding latin-1
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")
text Keluaran
peserta-pertukaran.csv tersimpan dalam encoding latin-1

Pemanggilan 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.

python Membaca berkas latin-1 dengan encoding default
import pandas as pd

try:
    pd.read_csv("peserta-pertukaran.csv")
except UnicodeDecodeError as e:
    print("Gagal membaca berkas peserta-pertukaran.csv")
    print(e)
text Keluaran
Gagal membaca berkas peserta-pertukaran.csv
'utf-8' codec can't decode byte 0xe9 in position 55: invalid continuation byte

Solusinya adalah menyebutkan encoding yang benar saat berkas dimuat. Setelah argumen encoding="latin-1" ditambahkan, seluruh karakter beraksen tampil utuh dan data siap dianalisis.

python Membaca berkas latin-1 dengan encoding latin-1
import pandas as pd

df = pd.read_csv("peserta-pertukaran.csv", encoding="latin-1")
print(df)
text Keluaran
            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       Kimia

Memuat 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.

bash
# tidak-dijalankan
# memasang openpyxl untuk membaca dan membuat berkas xlsx
pip install openpyxl

Contoh 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.

python Membuat stok-perpustakaan.xlsx dengan to_excel
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")
text Keluaran
stok-perpustakaan.xlsx tersimpan
python Membaca stok-perpustakaan.xlsx dengan read_excel
import pandas as pd

df = pd.read_excel("stok-perpustakaan.xlsx")
print(df)
text Keluaran
                judul   kategori  stok
0       Kamus Biologi  Referensi     4
1         Atlas Dunia  Referensi     2
2  Ensiklopedia Sains      Sains     6
3   Sejarah Nusantara    Sejarah     3

Hasil 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.

python Membuat dan membaca tabel SQLite
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)
text Keluaran
  anggota               judul  lama_hari
0     Ali         Atlas Dunia          7
1    Budi  Ensiklopedia Sains         14
2   Citra         Atlas Dunia          5
3    Dewi       Kamus Biologi         10

Argumen ":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_csv dan pd.read_excel menghasilkan DataFrame dengan label baris otomatis dan tipe kolom terdeteksi, dengan sep=";" untuk CSV berpemisah titik koma dan sheet_name untuk berkas Excel berisi beberapa sheet.
  • UnicodeDecodeError saat memuat CSV menandakan encoding berkas tidak cocok dengan nilai default, dan solusinya adalah argumen encoding seperti encoding="latin-1".
  • pd.read_sql menjalankan query melalui koneksi sqlite3, termasuk basis data ":memory:" yang hidup di memori untuk keperluan latihan.

Referensi#