0Pricing
Pandas & NumPy Academy · บทเรียน

การกำหนดพารามิเตอร์ให้กระบวนการด้วยพจนานุกรมการตั้งค่า

แทนที่เส้นทางไฟล์และชื่อคอลัมน์ที่กำหนดตายตัวด้วยพจนานุกรมการตั้งค่าที่ส่งขณะทำงาน เพื่อให้กระบวนการนำกลับมาใช้ใหม่ได้

การกำหนดพารามิเตอร์ให้กระบวนการด้วยพจนานุกรมการตั้งค่า เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาของค่าที่กำหนดตายตัว

สายงานที่กำหนดเส้นทางไฟล์ ชื่อคอลัมน์ และค่าเกณฑ์ตายตัวจะทำงานผิดพลาดทุกครั้งที่สภาพแวดล้อมเปลี่ยนแปลง — ไม่ว่าจะเป็นเซิร์ฟเวอร์ที่ต่างออกไป คอลัมน์ที่เปลี่ยนชื่อ หรือกฎทางธุรกิจที่เปลี่ยนไป การเปลี่ยนแปลงแต่ละครั้งต้องแก้ไขโค้ดสายงานโดยตรง ซึ่งเพิ่มความเสี่ยงที่จะนำข้อผิดพลาดเข้ามา วิธีแก้คือย้ายค่าที่เปลี่ยนแปลงได้ทั้งหมดไปไว้ใน พจนานุกรมการตั้งค่า ซึ่งโหลดขณะทำงานและส่งต่อให้ฟังก์ชันของสายงาน

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')

การกำหนดพจนานุกรมการตั้งค่า

แทนที่ค่าที่กำหนดตายตัวทุกค่าด้วยรายการในพจนานุกรมการตั้งค่า จัดกลุ่มการตั้งค่าที่เกี่ยวข้องกันอย่างเป็นเหตุเป็นผล เช่น จัดเส้นทางขาเข้าและขาออกไว้ด้วยกัน จัดเกณฑ์การทำความสะอาดไว้ด้วยกัน และจัดการจับคู่ชื่อคอลัมน์ไว้ด้วยกัน พจนานุกรมการตั้งค่าจะเป็น แหล่งข้อมูลจริงเพียงแหล่งเดียว สำหรับพารามิเตอร์ทั้งหมดของสายงาน การเปลี่ยนค่าเพียงหนึ่งค่าในการตั้งค่าจะอัปเดตทุกฟังก์ชันที่ใช้ค่านั้น โดยไม่ต้องแก้ไขเนื้อหาของฟังก์ชัน

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()))

การส่งการตั้งค่าให้ฟังก์ชันสกัดข้อมูล

ฟังก์ชันสกัดข้อมูลจะอ่านพารามิเตอร์ทั้งหมดจากการตั้งค่า ได้แก่ เส้นทางขาเข้า คอลัมน์วันที่ที่ต้องแปลง และการตั้งค่าการเข้ารหัสหรือตัวคั่น ซึ่งหมายความว่าการเรียกใช้สายงานเดียวกันกับชุดข้อมูลทดสอบหรือไฟล์ของเดือนอื่น ต้องเปลี่ยนเพียงการตั้งค่า ไม่ต้องแก้โค้ด คุณสามารถดูแลการตั้งค่าแยกกันสำหรับสภาพแวดล้อมการพัฒนา การทดสอบก่อนใช้งานจริง และการใช้งานจริงได้

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

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

การส่งการตั้งค่าให้ฟังก์ชันแปลงข้อมูล

ฟังก์ชันการแปลงแต่ละฟังก์ชันจะได้รับการตั้งค่าทั้งหมด แล้วดึงค่าที่ต้องการออกมา ฟังก์ชันควรใช้ config.get('key', default) พร้อมค่าเริ่มต้นที่เหมาะสม เพื่อให้สายงานทนทานต่อการตั้งค่าที่ไม่ครบถ้วน ฟังก์ชันที่ใช้เกณฑ์เริ่มต้น 5000 แต่เปิดให้เปลี่ยนผ่านการตั้งค่าได้นั้นมีทั้งความปลอดภัยและความยืดหยุ่น

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)

การโหลดการตั้งค่าจากไฟล์ JSON

สำหรับสายงานระดับใช้งานจริง ให้จัดเก็บการตั้งค่าไว้ในไฟล์ JSON แทนการกำหนดพจนานุกรม Python ตายตัวไว้ในสคริปต์ โหลดการตั้งค่าด้วย json.load() เมื่อเริ่มสายงาน วิธีนี้ทำให้ทีมปฏิบัติการเปลี่ยนค่าเกณฑ์ได้โดยไม่ต้องเข้าถึงโค้ด Python และทำให้จัดการเวอร์ชันการตั้งค่าผ่าน Git ได้ การเปลี่ยนแปลงการตั้งค่าแต่ละครั้งจะเป็นการคอมมิตที่ติดตามได้ พร้อมคำอธิบายเหตุผลทางธุรกิจของการเปลี่ยนแปลง

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'])

การตั้งค่าเฉพาะสภาพแวดล้อม

ดูแลไฟล์การตั้งค่าแยกกันสำหรับแต่ละสภาพแวดล้อม ได้แก่ config_dev.json, config_staging.json และ config_prod.json กำหนดว่าจะโหลดไฟล์ใดโดยอิงจากตัวแปรสภาพแวดล้อม รูปแบบนี้ช่วยป้องกันการใช้เส้นทางไฟล์ของระบบใช้งานจริงโดยไม่ตั้งใจระหว่างการพัฒนา และเก็บข้อมูลลับเฉพาะสภาพแวดล้อม (เช่น ข้อมูลเข้าสู่ระบบฐานข้อมูล) ออกจากคลังโค้ดที่ใช้ร่วมกัน

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}')

การจับคู่ชื่อคอลัมน์ใหม่ผ่านการตั้งค่า

ข้อมูลต้นทางมักมีชื่อคอลัมน์ที่แตกต่างจากหลักเกณฑ์การตั้งชื่อภายในของคุณ แทนที่จะเขียน df.rename(columns={'OrderDate': 'order_date', 'Qty': 'quantity'}) ไว้ตายตัวในส่วนเนื้อหาของ pipeline ให้เก็บแผนผังการเปลี่ยนชื่อไว้ใน config วิธีนี้ทำให้ pipeline ไม่ขึ้นอยู่กับชื่อคอลัมน์ของข้อมูลต้นทาง และปรับใช้ได้ง่ายเมื่อผู้ให้บริการข้อมูลต้นทางเปลี่ยนรูปแบบการส่งออกข้อมูล

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.')

การตั้งค่า Aggregation: คีย์ groupby แบบไดนามิก

ขั้นตอนการรวมข้อมูลมักจัดกลุ่มตามคอลัมน์ที่แตกต่างกันสำหรับกรณีการใช้งานแต่ละแบบ ให้เก็บคีย์การจัดกลุ่มและข้อกำหนดการรวมไว้ใน config แทนการเขียนค่าตายตัว วิธีนี้ช่วยให้นักวิเคราะห์สร้างตารางสรุปที่แตกต่างกันได้ เช่น ตามภูมิภาค ตามหมวดหมู่ หรือตามเดือน เพียงเปลี่ยน config โดยไม่ต้องแก้ฟังก์ชันการรวมข้อมูล ฟังก์ชันจึงกลายเป็นตัวรวมข้อมูลสำหรับใช้งานทั่วไปที่ขับเคลื่อนด้วยการตั้งค่าทั้งหมด

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())

ตรวจสอบ Config เมื่อเริ่มต้นทำงาน

ตรวจสอบ config เมื่อเริ่มต้น pipeline เพื่อค้นหาคีย์ที่ขาดหายหรือไม่ถูกต้องก่อนโหลดข้อมูลใด ๆ pipeline ที่ทำงานนาน 10 นาทีแล้วจึงล้มเหลวเพราะ revenue_cap เป็นสตริงแทนที่จะเป็น float ย่อมทำให้เสียเวลา ให้ตรวจสอบว่ามีคีย์ที่จำเป็นครบถ้วน ค่าต่าง ๆ เป็นชนิดข้อมูลที่ถูกต้อง และเส้นทางสามารถเข้าถึงได้ โดยใช้ฟังก์ชันตรวจสอบ config สั้น ๆ ที่ทำงานก่อนการดำเนินการ I/O ที่ใช้เวลานาน

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)

รวม Config เริ่มต้นกับ Config ของผู้ใช้

เปิดโอกาสให้ผู้ใช้ระบุ config เพียงบางส่วนเพื่อแทนที่เฉพาะค่าที่ต้องการ ให้รวม config ของผู้ใช้ทับบน config เริ่มต้นโดยใช้ {**defaults, **user_config} รูปแบบนี้ให้ค่าเริ่มต้นที่เหมาะสม ขณะเดียวกันก็ยังปรับแต่งได้อย่างเต็มที่ เป็นรูปแบบเดียวกับที่ไลบรารี Python ยอดนิยมซึ่งรับการตั้งค่าเป็น dict หรือ 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)

จัดเก็บ Config ไว้พร้อมกับผลลัพธ์

บันทึก config ไว้ข้างไฟล์ผลลัพธ์ เพื่อให้ผู้ที่ตรวจสอบผลลัพธ์สามารถทำ pipeline รอบที่สร้างผลลัพธ์นั้นซ้ำได้ทันที ให้จัดเก็บเป็นไฟล์ JSON ประกอบ โดยใช้ชื่อเดียวกับผลลัพธ์แต่มีนามสกุล .config.json รวมเวลาที่ pipeline ทำงานไว้ใน config ที่บันทึก เพื่อให้ติดตามที่มาของไฟล์ผลลัพธ์ทุกไฟล์ได้อย่างครบถ้วน

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}')

ตรวจสอบอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดด้านการวิเคราะห์ข้อมูลจากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับ: การแทนที่ค่าที่เขียนตายตัวด้วยพจนานุกรม config ที่โหลดจาก JSON การส่ง config ให้ฟังก์ชัน extract, transform และ aggregate เพื่อให้กำหนดพารามิเตอร์ได้อย่างครบถ้วน และ การตรวจสอบ config เมื่อเริ่มต้นทำงาน รวมถึงการบันทึกไว้ข้างไฟล์ผลลัพธ์เพื่อให้ทำซ้ำได้ บทถัดไป เราจะสำรวจการทดสอบขั้นตอนของ pipeline ด้วยการตรวจสอบจำนวนแถวและตัวป้องกันแบบ assertion

คำถามที่พบบ่อย

บทเรียน “การกำหนดพารามิเตอร์ให้กระบวนการด้วยพจนานุกรมการตั้งค่า” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การกำหนดพารามิเตอร์ให้กระบวนการด้วยพจนานุกรมการตั้งค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดพารามิเตอร์ให้กระบวนการด้วยพจนานุกรมการตั้งค่า”

แทนที่เส้นทางไฟล์และชื่อคอลัมน์ที่กำหนดตายตัวด้วยพจนานุกรมการตั้งค่าที่ส่งขณะทำงาน เพื่อให้กระบวนการนำกลับมาใช้ใหม่ได้ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การกำหนดพารามิเตอร์ให้กระบวนการด้วยพจนานุกรมการตั้งค่า” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การจัดโครงสร้างขั้นตอนการแปลงเป็นฟังก์ชัน
  2. การกำหนดพารามิเตอร์ให้กระบวนการด้วยพจนานุกรมการตั้งค่า
  3. การทดสอบขั้นตอนกระบวนการด้วยการยืนยันเงื่อนไข
  4. การจัดเวลาและบันทึกการทำงานของกระบวนการ
← กลับไปที่ Pandas & NumPy Academy