Status 狀態追蹤
Status 負責追蹤整個工作流程的執行狀態,提供完整的執行歷史、結果儲存和詮釋資料(Schema)管理。
概述
Status 是 Executor 內部使用的狀態管理系統,不需要在 YAML 中配置。它會自動:
- 記錄每個模組的執行結果
- 追蹤詮釋資料(Schema)的變化
- 建立執行快照以供恢復
- 收集執行時間資訊
自動狀態追蹤
當 Executor 執行時,Status 會自動記錄:
1. 執行結果
每個模組執行後,結果會自動儲存到 Status 中:
from petsard import Executor
exec = Executor(config='config.yaml')
exec.run()
# 透過 Executor 取得結果
results = exec.get_result()
print(results)
2. 詮釋資料追蹤
Status 會追蹤資料的 Schema 在各模組間的變化:
# config.yaml
Loader:
load_data:
filepath: data.csv
Preprocessor:
preprocess:
method: default
Synthesizer:
generate:
method: sdv
執行過程中,Status 會記錄:
- Loader 載入後的原始 Schema
- Preprocessor 處理後的 Schema 變化
- Synthesizer 可用的 Schema 資訊
3. 執行快照
每個模組執行前後都會建立快照,包含:
- 執行時間戳
- 模組名稱和實驗名稱
- 詮釋資料狀態(執行前/執行後)
- 執行上下文資訊
4. 時間記錄
自動收集每個模組和步驟的執行時間:
from petsard import Executor
exec = Executor(config='config.yaml')
exec.run()
# 取得時間報告
timing = exec.get_timing()
print(timing)
透過 Executor 取得狀態
Status 的所有資訊都可以透過 Executor 的方法取得:
取得執行結果
# 取得所有結果
results = exec.get_result()
# 結果格式
# {
# 'Loader[load_data]_Synthesizer[generate]': {
# 'data': DataFrame,
# 'schema': Schema
# }
# }
取得執行時間
# 取得時間資訊
timing_df = exec.get_timing()
# DataFrame 欄位:
# - record_id: 記錄 ID
# - module_name: 模組名稱
# - experiment_name: 實驗名稱
# - step_name: 執行步驟
# - start_time: 開始時間
# - end_time: 結束時間
# - duration_seconds: 執行時間(秒)
檢查執行狀態
# 檢查是否執行完成
if exec.is_execution_completed():
print("執行完成")
results = exec.get_result()
else:
print("執行中或尚未執行")
多實驗結果管理
當配置包含多個實驗時,Status 會管理所有組合的結果:
配置範例
Loader:
load_v1:
filepath: data_v1.csv
load_v2:
filepath: data_v2.csv
Synthesizer:
method_a:
method: sdv
model: GaussianCopula
method_b:
method: sdv
model: CTGAN
Reporter:
save_all:
method: save_data
source: Synthesizer
結果組織
results = exec.get_result()
# 結果包含所有實驗組合:
# {
# 'Loader[load_v1]_Synthesizer[method_a]_Reporter[save_all]': {...},
# 'Loader[load_v1]_Synthesizer[method_b]_Reporter[save_all]': {...},
# 'Loader[load_v2]_Synthesizer[method_a]_Reporter[save_all]': {...},
# 'Loader[load_v2]_Synthesizer[method_b]_Reporter[save_all]': {...}
# }
Schema 推論和追蹤
Status 提供 Schema 推論功能,特別是在使用 Preprocessor 時:
自動 Schema 推論
Loader:
load_data:
filepath: data.csv
Preprocessor:
preprocess:
scaling:
age: minmax
income: standard
encoding:
education: onehot
Synthesizer:
generate:
method: sdv
執行流程:
- Loader 載入資料後,Status 記錄原始 Schema
- Executor 根據 Preprocessor 配置推論處理後的 Schema
- Synthesizer 使用推論的 Schema 進行合成
- 整個過程的 Schema 變化都被追蹤記錄
執行快照
Status 在執行過程中會建立多個快照:
快照內容
每個快照包含:
- 快照 ID:唯一識別碼
- 模組資訊:模組名稱和實驗名稱
- 時間戳:建立時間
- 詮釋資料:執行前後的 Schema 狀態
- 執行上下文:相關的配置和參數
快照用途
- 除錯:檢查執行過程中的狀態變化
- 稽核:追蹤資料處理的完整歷史
- 恢復:在需要時恢復到特定狀態
變更追蹤
Status 會記錄詮釋資料的所有變更:
追蹤內容
- 變更類型:建立、更新、刪除
- 變更目標:Schema 或 Field 層級
- 變更前後:狀態對比
- 變更時間:發生時間戳
- 模組上下文:哪個模組造成的變更
變更範例
Loader → Preprocessor:
- age: numerical → numerical (minmax scaled)
- education: categorical → categorical (onehot encoded)
- income: numerical → numerical (standard scaled)
狀態摘要
取得執行狀態的完整摘要:
# 透過 Python API 直接存取(進階用法)
from petsard import Executor
exec = Executor(config='config.yaml')
exec.run()
# 取得狀態摘要
summary = exec.status.get_status_summary()
# 摘要包含:
# - sequence: 模組執行序列
# - active_modules: 已執行的模組
# - metadata_modules: 具有詮釋資料的模組
# - total_snapshots: 總快照數
# - total_changes: 總變更記錄數
# - last_snapshot: 最新快照 ID
# - last_change: 最新變更 ID
注意事項
- 自動管理:Status 完全由 Executor 自動管理,不需要在 YAML 中配置
- 結果獲取:使用
exec.get_result()
和exec.get_timing()
取得狀態資訊 - 記憶體使用:長時間執行的工作流程會累積較多快照,Status 會自動管理記憶體
- 快照數量:每個模組執行會產生一個快照,大量實驗組合會產生相應數量的快照
- 進階功能:完整的 Status API 請參考 Python API 文檔