Reporter API
報告產生模組,支援多種報告格式的輸出與檔案儲存。
類別架構
classDiagram
class Reporter {
<<Factory>>
__new__(**kwargs) ReporterBase
}
class ReporterBase {
<<abstract>>
dict config
__init__()
create(data) dict|DataFrame|None
report(processed_data) None
}
class ReporterSaveData {
create(data) dict
report(processed_data) None
}
class ReporterSaveReport {
create(data) dict
report(processed_data) None
}
class ReporterSaveTiming {
create(data) DataFrame
report(processed_data) None
}
class ReporterSaveValidation {
create(data) dict
report(processed_data) None
}
class ReporterMethod {
<<enumeration>>
int SAVE_DATA
int SAVE_REPORT
int SAVE_TIMING
int SAVE_VALIDATION
map(method) int
}
class ReporterConfig {
string method
string output
string naming_strategy
string source
string|list granularity
string|list eval
string time_unit
string|list module
}
ReporterBase <|-- ReporterSaveData
ReporterBase <|-- ReporterSaveReport
ReporterBase <|-- ReporterSaveTiming
ReporterBase <|-- ReporterSaveValidation
Reporter ..> ReporterSaveData
Reporter ..> ReporterSaveReport
Reporter ..> ReporterSaveTiming
Reporter ..> ReporterSaveValidation
Reporter ..> ReporterMethod
ReporterBase *-- ReporterConfig
%% 樣式標示
style Reporter fill:#e6f3ff,stroke:#4a90e2,stroke-width:3px
style ReporterBase fill:#f3e6ff,stroke:#9966cc,stroke-width:2px
style ReporterSaveData fill:#fff2e6,stroke:#ff9800,stroke-width:2px
style ReporterSaveReport fill:#fff2e6,stroke:#ff9800,stroke-width:2px
style ReporterSaveTiming fill:#fff2e6,stroke:#ff9800,stroke-width:2px
style ReporterSaveValidation fill:#fff2e6,stroke:#ff9800,stroke-width:2px
style ReporterMethod fill:#f3e6ff,stroke:#9966cc,stroke-width:2px
style ReporterConfig fill:#f3e6ff,stroke:#9966cc,stroke-width:2px圖例說明:
- 藍色框:工廠類別
- 淺紫框:抽象基底類別
- 橘色框:子類別實作
- 淺紫框(其他):配置與枚舉類別
<|--:繼承關係 (inheritance)*--:組合關係 (composition)..>:依賴關係 (dependency)
基本使用
from petsard import Reporter
# 儲存合成資料
reporter = Reporter(method='save_data', source='Synthesizer')
processed = reporter.create({('Synthesizer', 'exp1'): synthetic_df})
reporter.report(processed)
# 產生評估報告
reporter = Reporter(method='save_report', granularity='global')
processed = reporter.create({('Evaluator', 'eval1_[global]'): results})
reporter.report(processed)
# 儲存時間資訊
reporter = Reporter(method='save_timing', time_unit='minutes')
processed = reporter.create({'timing_data': timing_df})
reporter.report(processed)建構函式 (new)
初始化報告產生器實例。Reporter 使用工廠模式(通過 __new__ 方法),根據指定的 method 參數自動創建並返回對應的報告器實例。
語法
Reporter(**kwargs)參數
method : str, required
- 報告產生方式
- 必要參數
- 支援的方法:
'save_data':將資料集儲存為 CSV'save_report':產生評估報告'save_timing':儲存時間資訊'save_validation':儲存驗證結果
output : str, optional
- 輸出檔案名稱前綴
- 預設值:
'petsard'
naming_strategy : str, optional
- 檔名命名策略
- 可選值:
'traditional':使用傳統命名格式(預設)'compact':使用簡化命名格式
save_data 方法專用參數
- source : str | List[str], required for save_data
- 目標模組或實驗名稱
- 指定要儲存資料的來源模組
- 可為單一字串或字串列表
save_report 方法專用參數
granularity : str | List[str], required for save_report
- 報告詳細度
- 單一粒度:
'global'、'columnwise'、'pairwise'、'details'、'tree' - 多重粒度:
['global', 'columnwise']或['details', 'tree']
eval : str | List[str], optional
- 目標評估實驗名稱
- 用於過濾特定評估實驗的結果
- 可為單一字串或字串列表
save_timing 方法專用參數
time_unit : str, optional
- 時間單位
- 可選值:
'seconds'、'minutes'、'hours'、'days' - 預設值:
'seconds'
module : str | List[str], optional
- 依特定模組過濾時間資訊
- 可為單一字串或字串列表
返回值
- BaseReporter
- 根據 method 參數返回對應的報告器實例
- 實際類別:
ReporterSaveData:儲存資料模式ReporterSaveReport:評估報告模式ReporterSaveTiming:時間資訊模式ReporterSaveValidation:驗證結果模式
使用範例
from petsard import Reporter
# 儲存合成資料
reporter = Reporter(method='save_data', source='Synthesizer')
# 產生評估報告(單一粒度)
reporter = Reporter(method='save_report', granularity='global')
# 產生評估報告(多重粒度)
reporter = Reporter(
method='save_report',
granularity=['global', 'columnwise']
)
# 使用簡化命名策略
reporter = Reporter(
method='save_report',
granularity='global',
naming_strategy='compact'
)
# 儲存時間資訊(指定時間單位)
reporter = Reporter(
method='save_timing',
time_unit='minutes',
module=['Loader', 'Synthesizer']
)
# 自訂輸出檔名前綴
reporter = Reporter(
method='save_data',
source='Synthesizer',
output='my_experiment'
)函式化設計模式
Reporter 採用函式化的「拋出再拋回」設計模式,具有以下特性:
- 無狀態設計:
create()處理資料但不將其儲存在實例變數中 - 純函式操作:
report()接收處理後的資料並產生輸出檔案 - 記憶體效率:不維護內部狀態,減少記憶體使用量
- 靈活流程:允許靈活的資料處理流程
工作流程
# 步驟 1:初始化報告器
reporter = Reporter(method='save_report', granularity='global')
# 步驟 2:處理資料(create 返回處理後的資料)
processed_data = reporter.create({
('Evaluator', 'eval1_[global]'): results
})
# 步驟 3:產生報告(report 接收處理後的資料)
reporter.report(processed_data)粒度類型
Reporter 支援多種報告粒度,用於評估報告的不同層級分析:
傳統粒度
- global:整體摘要統計
- columnwise:逐欄分析
- pairwise:欄位間成對關係
擴展粒度
- details:詳細分解與額外指標
- tree:階層樹狀結構分析
多粒度支援
Reporter 支援在單一操作中處理多個粒度:
# 同時處理多個粒度
reporter = Reporter(
method='save_report',
granularity=['global', 'columnwise', 'details']
)
result = reporter.create(evaluation_data)
reporter.report(result) # 為每個粒度產生個別報告當使用多粒度時:
- 每個粒度會產生獨立的報告檔案
- 報告檔名會包含粒度資訊
- 可以一次性收集所有粒度的結果
命名策略
Reporter 支援兩種檔名命名策略:
Traditional 策略(預設)
使用原有的命名格式,保持向後相容性:
- 包含完整的模組和實驗資訊
- 使用方括號標記特殊資訊
- 適合需要詳細檔名資訊的場景
範例:
petsard_Synthesizer[exp1].csvpetsard_Reporter[eval1_global].csvpetsard_timing_report.csv
Compact 策略
使用簡化的命名格式:
- 使用模組簡寫(如 Sy = Synthesizer, Ev = Evaluator)
- 使用點號分隔各部分
- 產生更簡潔易讀的檔名
範例:
petsard_Sy.exp1.csvpetsard.report.Ev.eval1.G.csv(G = Global)petsard_timing_report.csv
命名策略使用範例:
# Traditional 策略範例
reporter = Reporter(
method='save_report',
granularity='global',
naming_strategy='traditional'
)
# 輸出:petsard_Reporter[eval1_global].csv
# Compact 策略範例
reporter = Reporter(
method='save_report',
granularity='global',
naming_strategy='compact'
)
# 輸出:petsard.report.Ev.eval1.G.csv範例場景
儲存合成資料
from petsard import Reporter
# 儲存合成資料
reporter = Reporter(method='save_data', source='Synthesizer')
processed = reporter.create({('Synthesizer', 'exp1'): synthetic_df})
reporter.report(processed)
# 產生:petsard_Synthesizer[exp1].csv產生評估報告(單一粒度)
from petsard import Reporter
# 產生全域評估報告
reporter = Reporter(method='save_report', granularity='global')
processed = reporter.create({('Evaluator', 'eval1_[global]'): global_results})
reporter.report(processed)
# 產生:petsard_Reporter[eval1_global].csv產生評估報告(多重粒度)
from petsard import Reporter
# 產生多粒度評估報告
reporter = Reporter(
method='save_report',
granularity=['global', 'columnwise', 'details']
)
processed = reporter.create({
('Evaluator', 'eval1_[global]'): global_results,
('Evaluator', 'eval1_[columnwise]'): columnwise_results,
('Evaluator', 'eval1_[details]'): details_results
})
reporter.report(processed)
# 產生:
# - petsard_Reporter[eval1_global].csv
# - petsard_Reporter[eval1_columnwise].csv
# - petsard_Reporter[eval1_details].csv儲存時間資訊
from petsard import Reporter
# 儲存特定模組的時間資訊
reporter = Reporter(
method='save_timing',
time_unit='minutes',
module=['Loader', 'Synthesizer']
)
processed = reporter.create({'timing_data': timing_df})
reporter.report(processed)
# 產生:petsard_timing_report.csv使用簡化命名策略
from petsard import Reporter
# 使用簡化命名
reporter = Reporter(
method='save_data',
source='Synthesizer',
naming_strategy='compact',
output='results'
)
processed = reporter.create({('Synthesizer', 'exp1'): df})
reporter.report(processed)
# 產生:results_Sy.exp1.csv(更簡潔的檔名)版本相容性
預計在 v2.0 移除的功能
以下功能已標記為 deprecated,將在 v2.0 版本中移除:
- ReporterMap 類別:請改用
ReporterMethodenum - ReporterSaveReportMap 類別:請改用
ReportGranularityenum - Tuple-based 實驗命名系統:將被
ExperimentConfig系統取代
建議使用者開始遷移至新的 API 以確保未來相容性。
注意事項
- 工廠模式:Reporter 使用
__new__方法實作工廠模式,自動創建對應的報告器類別 - 建議作法:使用 YAML 配置檔而非直接使用 Python API
- 方法調用順序:必須先呼叫
create()再呼叫report() - 資料處理:
create()返回的資料必須傳遞給report()方法 - 檔案輸出:報告檔案會儲存在當前工作目錄
- 檔案覆寫:同名檔案會被覆寫,請謹慎使用
- 文件說明:本段文件僅供開發團隊內部參考,不保證向後相容
- 記憶體效率:函式化設計確保不會在實例中保留大量資料
- 多粒度處理:使用多粒度時,每個粒度會產生獨立的報告檔案
- 命名策略選擇:根據專案需求選擇合適的命名策略,traditional 保持向後相容,compact 更簡潔
相關文件
create()方法:資料處理方法詳細說明report()方法:報告產生方法詳細說明- Reporter YAML:YAML 配置說明
- ReporterAdapter:Adapter 模式說明