การกำหนดพารามิเตอร์ให้กระบวนการด้วยพจนานุกรมการตั้งค่า
แทนที่เส้นทางไฟล์และชื่อคอลัมน์ที่กำหนดตายตัวด้วยพจนานุกรมการตั้งค่าที่ส่งขณะทำงาน เพื่อให้กระบวนการนำกลับมาใช้ใหม่ได้
การกำหนดพารามิเตอร์ให้กระบวนการด้วยพจนานุกรมการตั้งค่า เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การจัดโครงสร้างขั้นตอนการแปลงเป็นฟังก์ชัน
- การกำหนดพารามิเตอร์ให้กระบวนการด้วยพจนานุกรมการตั้งค่า
- การทดสอบขั้นตอนกระบวนการด้วยการยืนยันเงื่อนไข
- การจัดเวลาและบันทึกการทำงานของกระบวนการ