0Pricing
Pandas & NumPy Academy · Pelajaran

Membuat Pipeline Berparameter dengan Dict Konfigurasi

Ganti jalur file dan nama kolom yang ditulis langsung dengan dict konfigurasi yang diteruskan saat runtime agar pipeline dapat digunakan kembali.

Membuat Pipeline Berparameter dengan Dict Konfigurasi adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Masalah dengan Nilai yang Dikodekan Secara Tetap

Alur kerja dengan jalur berkas, nama kolom, dan nilai ambang yang dikodekan secara tetap akan rusak setiap kali lingkungan berubah — misalnya server berbeda, kolom berganti nama, atau aturan bisnis berubah. Setiap perubahan mengharuskan Anda mengedit kode alur kerja itu sendiri, sehingga meningkatkan risiko munculnya bug. Solusinya adalah mengeksternalkan semua nilai yang dapat berubah ke dalam dict konfigurasi yang dimuat saat waktu berjalan dan diteruskan ke fungsi-fungsi alur kerja.

import pandas as pd

# BAD: hardcoded values scattered through code
df = pd.read_csv('/data/orders_2024.csv')
df = df.dropna(subset=['revenue', 'quantity'])
df = df[df['revenue'] < 5000]
df.to_parquet('/output/orders_clean.parquet')
print('Hardcoded paths and thresholds are fragile')

Mendefinisikan Dict Konfigurasi

Ganti setiap nilai yang dikodekan secara tetap dengan entri dalam dict konfigurasi. Kelompokkan pengaturan terkait secara logis: jalur masukan dan keluaran bersama-sama, ambang pembersihan bersama-sama, serta pemetaan nama kolom bersama-sama. Dict konfigurasi menjadi satu-satunya sumber kebenaran untuk semua parameter alur kerja. Mengubah satu nilai dalam konfigurasi akan memperbarui setiap fungsi yang menggunakannya tanpa menyentuh isi fungsi.

CONFIG = {
    'input_path': '/data/orders_2024.csv',
    'output_path': '/output/orders_clean.parquet',
    'required_cols': ['order_id', 'order_date', 'revenue', 'quantity'],
    'date_cols': ['order_date'],
    'revenue_cap': 5000,
    'min_quantity': 1,
    'categorical_cols': ['region', 'category']
}
print('Config loaded:', list(CONFIG.keys()))

Meneruskan Konfigurasi ke Fungsi Ekstrak

Fungsi ekstrak membaca semua parameternya dari konfigurasi: jalur masukan, kolom tanggal yang akan diuraikan, serta pengaturan penyandian atau pemisah apa pun. Dengan demikian, menjalankan alur kerja yang sama pada kumpulan data pengujian atau berkas dari bulan yang berbeda hanya memerlukan perubahan konfigurasi — tanpa perubahan kode. Anda dapat mempertahankan konfigurasi terpisah untuk lingkungan pengembangan, staging, dan produksi.

def extract(config):
    return pd.read_csv(
        config['input_path'],
        parse_dates=config.get('date_cols', [])
    )

df = extract(CONFIG)
print('Extracted:', df.shape)

Meneruskan Konfigurasi ke Fungsi Transformasi

Setiap fungsi transformasi menerima konfigurasi lengkap dan mengambil nilai yang diperlukan. Fungsi sebaiknya menggunakan config.get('key', default) dengan nilai bawaan yang wajar agar alur kerja tetap tangguh terhadap konfigurasi yang tidak lengkap. Fungsi yang secara bawaan memerlukan ambang 5000 tetapi dapat diganti melalui konfigurasi bersifat aman sekaligus fleksibel.

def transform(df, config):
    required = config.get('required_cols', [])
    cap = config.get('revenue_cap', float('inf'))
    min_qty = config.get('min_quantity', 1)

    return (
        df
        .dropna(subset=required)
        .query(f'quantity >= {min_qty}')
        .assign(revenue=lambda d: d['quantity'] * d['unit_price'])
        .assign(revenue_capped=lambda d: d['revenue'].clip(upper=cap))
    )

df_clean = transform(df, CONFIG)
print(df_clean.shape)

Memuat Konfigurasi dari Berkas JSON

Untuk alur kerja produksi, simpan konfigurasi dalam berkas JSON, bukan dict Python yang dikodekan secara tetap di dalam skrip. Muat konfigurasi dengan json.load() saat alur kerja dimulai. Hal ini memungkinkan tim operasional mengubah ambang tanpa akses ke kode Python, serta memungkinkan pembuatan versi konfigurasi melalui Git — setiap perubahan konfigurasi menjadi commit terlacak yang disertai keterangan alasan bisnis perubahan tersebut.

import json

# config.json would contain the same keys as CONFIG above
# with open('config.json') as f:
#     config = json.load(f)

# Example: write and read back
with open('/tmp/pipeline_config.json', 'w') as f:
    json.dump(CONFIG, f, indent=2)

with open('/tmp/pipeline_config.json') as f:
    loaded_config = json.load(f)

print('Loaded config from JSON:', loaded_config['revenue_cap'])

Konfigurasi Khusus Lingkungan

Pertahankan berkas konfigurasi terpisah untuk setiap lingkungan: config_dev.json, config_staging.json, dan config_prod.json. Tentukan berkas yang akan dimuat berdasarkan variabel lingkungan. Pola ini mencegah penggunaan jalur berkas produksi secara tidak sengaja selama pengembangan dan menjaga rahasia khusus lingkungan (seperti kredensial basis data) agar tidak masuk ke repositori kode bersama.

import os

ENV = os.environ.get('PIPELINE_ENV', 'dev')
CONFIG_PATH = f'config_{ENV}.json'

# In practice:
# with open(CONFIG_PATH) as f:
#     config = json.load(f)

print(f'Using config for environment: {ENV}')
print(f'Config file: {CONFIG_PATH}')

Pemetaan Ulang Nama Kolom melalui Konfigurasi

Data sumber sering memiliki nama kolom yang berbeda dari konvensi penamaan internal Anda. Daripada menulis df.rename(columns={'OrderDate': 'order_date', 'Qty': 'quantity'}) secara tetap di dalam isi alur data, simpan pemetaan penggantian nama tersebut di dalam konfigurasi. Dengan begitu, alur data tidak bergantung pada nama kolom sumber dan mudah disesuaikan ketika penyedia data hulu mengubah format ekspornya.

CONFIG['column_rename'] = {
    'OrderDate': 'order_date',
    'Qty': 'quantity',
    'UnitPrice': 'unit_price',
    'OrderID': 'order_id'
}

def rename_columns(df, config):
    return df.rename(columns=config.get('column_rename', {}))

print('Column rename mapping stored in config.')

Konfigurasi Agregasi: Kunci groupby Dinamis

Tahap agregasi sering mengelompokkan data berdasarkan kolom yang berbeda untuk berbagai keperluan. Simpan kunci pengelompokan dan spesifikasi agregasi di dalam konfigurasi, bukan menuliskannya secara tetap. Dengan begitu, analis dapat menghasilkan tabel ringkasan yang berbeda (berdasarkan wilayah, kategori, atau bulan) cukup dengan mengubah konfigurasi, tanpa menyentuh fungsi agregasi. Fungsi tersebut menjadi agregator serbaguna yang sepenuhnya dikendalikan oleh konfigurasi.

CONFIG['agg_spec'] = {
    'group_by': ['region', 'category'],
    'agg_cols': {
        'revenue': ['sum', 'mean'],
        'quantity': ['sum', 'count']
    }
}

def aggregate(df, config):
    spec = config['agg_spec']
    return df.groupby(spec['group_by']).agg(spec['agg_cols'])

result = aggregate(df_clean, CONFIG)
print(result.head())

Memvalidasi Konfigurasi saat Startup

Validasikan konfigurasi saat alur data dimulai untuk menemukan kunci yang hilang atau tidak valid sebelum data apa pun dimuat. Alur data yang berjalan selama 10 menit lalu gagal karena revenue_cap berupa string, bukan float, hanya membuang waktu. Validasi bahwa semua kunci yang diperlukan tersedia, nilainya memiliki tipe yang benar, dan jalurnya dapat diakses menggunakan fungsi pemeriksaan konfigurasi singkat yang dijalankan sebelum operasi I/O yang mahal.

def validate_config(config):
    required_keys = ['input_path', 'output_path', 'required_cols']
    for key in required_keys:
        assert key in config, f'Config missing key: {key}'
    assert isinstance(config['required_cols'], list), 'required_cols must be a list'
    assert isinstance(config.get('revenue_cap', 1), (int, float)), 'revenue_cap must be numeric'
    print('Config validation passed.')

validate_config(CONFIG)

Menggabungkan Konfigurasi Bawaan dengan Konfigurasi Pengguna

Izinkan pengguna memberikan konfigurasi sebagian yang hanya mengganti nilai yang mereka perlukan. Gabungkan konfigurasi pengguna di atas konfigurasi bawaan menggunakan {**defaults, **user_config}. Pola ini menyediakan nilai bawaan yang masuk akal sekaligus tetap dapat dikonfigurasi sepenuhnya. Pola yang sama digunakan oleh pustaka Python populer yang menerima konfigurasi sebagai dict atau kwargs.

DEFAULT_CONFIG = {
    'revenue_cap': 10000,
    'min_quantity': 1,
    'date_cols': ['order_date'],
    'required_cols': ['order_id', 'revenue']
}

user_config = {'revenue_cap': 5000, 'input_path': '/data/q1.csv'}

final_config = {**DEFAULT_CONFIG, **user_config}
print('Final config revenue_cap:', final_config['revenue_cap'])  # 5000
print('Final config min_quantity:', final_config['min_quantity'])  # 1 (from default)

Menyimpan Konfigurasi Bersama Output

Simpan konfigurasi bersama file output agar siapa pun yang memeriksa output dapat segera mereproduksi proses alur data yang membuatnya. Simpan konfigurasi sebagai file pendamping JSON dengan nama yang sama seperti output, tetapi menggunakan ekstensi .config.json. Sertakan stempel waktu proses alur data dalam konfigurasi yang disimpan agar setiap file output dapat dilacak sepenuhnya.

import json
from datetime import datetime

def save_with_config(df, config):
    output_path = config['output_path']
    config_path = output_path.replace('.parquet', '.config.json')

    run_metadata = {**config, 'run_at': datetime.now().isoformat()}
    with open(config_path, 'w') as f:
        json.dump(run_metadata, f, indent=2, default=str)

    df.to_parquet(output_path, index=False)
    print(f'Saved data to {output_path}')
    print(f'Saved config to {config_path}')

Pemeriksaan Singkat

Uji pemahaman Anda tentang konsep Analisis Data dari pelajaran ini.

Ringkasan Pelajaran

Dalam pelajaran ini, Anda mempelajari: mengganti nilai yang ditulis secara tetap dengan kamus konfigurasi yang dimuat dari JSON, meneruskan konfigurasi ke fungsi ekstraksi, transformasi, dan agregasi untuk parameterisasi penuh, serta memvalidasi konfigurasi saat startup dan menyimpannya bersama file output agar dapat direproduksi. Selanjutnya, kita akan membahas pengujian tahapan alur data dengan pemeriksaan jumlah baris dan penjaga assertion.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membuat Pipeline Berparameter dengan Dict Konfigurasi” gratis?

Ya — teks lengkap “Membuat Pipeline Berparameter dengan Dict Konfigurasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Membuat Pipeline Berparameter dengan Dict Konfigurasi”?

Ganti jalur file dan nama kolom yang ditulis langsung dengan dict konfigurasi yang diteruskan saat runtime agar pipeline dapat digunakan kembali. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?

Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Membuat Pipeline Berparameter dengan Dict Konfigurasi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?

Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menyusun Langkah Transformasi sebagai Fungsi
  2. Membuat Pipeline Berparameter dengan Dict Konfigurasi
  3. Menguji Langkah Pipeline dengan Assertion
  4. Menjadwalkan dan Mencatat Proses Pipeline
← Kembali ke Pandas & NumPy Academy