Metadater API
資料結構描述管理器,提供資料集的詮釋資料(Metadata)定義、推斷、比較與對齊功能。
模組概覽
Metadater 採用三層架構:
配置類別(Configuration)
定義資料結構的靜態配置:
Metadata:資料集層級配置Schema:表格層級配置Attribute:欄位層級配置
操作類別(Operations)
提供類別方法來操作配置:
Metadater:多表格操作SchemaMetadater:單表格操作AttributeMetadater:單欄位操作
資料抽象類別(Data Abstraction)
結合資料與配置的高階抽象:
Datasets:多表格資料集(資料 + Metadata)Table:單一表格(資料 + Schema)Field:單一欄位(資料 + Attribute)
Schema 推斷工具
SchemaInferencer:推斷 Processor 轉換後的 SchemaProcessorTransformRules:定義轉換規則TransformRule:單一轉換規則的資料類別
基本使用
透過 Loader 使用(推薦)
# 在 YAML 中定義
Loader:
my_experiment:
filepath: data/users.csv
schema: schemas/user_schema.yaml直接使用 Metadater
from petsard.metadater import Metadater
import pandas as pd
# 從資料推斷
data = {'users': pd.DataFrame(...)}
metadata = Metadater.from_data(data)
# 從字典建立
config = {'schemas': {'users': {...}}}
metadata = Metadater.from_dict(config)
# 比較差異
diff = Metadater.diff(metadata, new_data)
# 對齊資料
aligned = Metadater.align(metadata, new_data)配置類別
Metadata
資料集層級配置:
from petsard.metadater import Metadata, Schema
metadata = Metadata(
id="my_dataset",
schemas={'users': Schema(...)}
)主要屬性:
id: 資料集識別碼schemas: 表格結構字典{table_name: Schema}enable_stats: 是否啟用統計資訊stats: 資料集統計(DatasetsStats)
Schema
表格層級配置:
from petsard.metadater import Schema, Attribute
schema = Schema(
id="users",
attributes={
'user_id': Attribute(name='user_id', type='int'),
'email': Attribute(name='email', type='str'),
}
)主要屬性:
id: 表格識別碼attributes: 欄位屬性字典{field_name: Attribute}primary_key: 主鍵欄位列表enable_stats: 是否啟用統計stats: 表格統計(TableStats)
Attribute
欄位層級配置:
from petsard.metadater import Attribute
attribute = Attribute(
name="age",
type="int",
type_attr={
"nullable": True,
"category": False,
}
)主要屬性:
name: 欄位名稱type: 資料型別(int,float,str,date,datetime)type_attr: 型別屬性字典nullable: 是否允許空值category: 是否為類別資料precision: 數值精度format: 日期時間格式width: 字串寬度
logical_type: 邏輯型別(email,phone,url等)enable_stats: 是否啟用統計is_constant: 所有值都相同的欄位
操作類別
Metadater
多表格操作的類別方法:
建立方法
from_data(data, enable_stats=False):從資料推斷並建立 Metadatafrom_dict(config):從配置字典建立 Metadatafrom_metadata(metadata):複製 Metadata
操作方法
diff(metadata, data):比較差異align(metadata, data, strategy=None):對齊資料get(metadata, name):取得指定 Schemaadd(metadata, schema):新增 Schemaupdate(metadata, schema):更新 Schemaremove(metadata, name):移除 Schema
SchemaMetadater
單表格操作的類別方法:
建立方法
from_data(data, enable_stats=False, base_schema=None):從 DataFrame 建立 Schemafrom_dict(config):從配置字典建立 Schemafrom_yaml(filepath):從 YAML 載入 Schemafrom_metadata(schema):複製 Schema
操作方法
diff(schema, data):比較差異align(schema, data, strategy=None):對齊資料get(schema, name):取得欄位屬性add(schema, attribute):新增欄位update(schema, attribute):更新欄位remove(schema, name):移除欄位
AttributeMetadater
單欄位操作的類別方法:
建立方法
from_data(data, enable_stats=True, base_attribute=None):從 Series 建立欄位屬性from_dict(config):從配置字典建立欄位屬性from_metadata(attribute):複製欄位屬性
操作方法
diff(attribute, data):比較差異align(attribute, data, strategy=None):對齊資料validate(attribute, data):驗證資料cast(attribute, data):轉換資料型別
資料抽象類別
Datasets
多表格資料集抽象:
from petsard.metadater import Datasets
datasets = Datasets.create(
data={'users': df},
metadata=metadata
)
# 基本操作
table = datasets.get_table('users')
is_valid, errors = datasets.validate()
aligned_data = datasets.align()主要屬性:
table_count: 表格數量table_names: 表格名稱列表
主要方法:
get_table(name): 取得表格get_tables(): 取得所有表格validate(): 驗證資料align(): 對齊資料diff(): 比較差異
Table
單一表格抽象:
from petsard.metadater import Table
table = Table.create(data=df, schema=schema)
# 基本操作
field = table.get_field('age')
is_valid, errors = table.validate()主要屬性:
row_count: 列數column_count: 欄數columns: 欄位名稱
主要方法:
get_field(name): 取得欄位get_fields(): 取得所有欄位validate(): 驗證資料align(): 對齊資料
Field
單一欄位抽象:
from petsard.metadater import Field
field = Field.create(data=series, attribute=attribute)
# 基本資訊
print(field.dtype, field.null_count, field.unique_count)主要屬性:
name: 欄位名稱dtype: 資料型別expected_type: 期望型別null_count: 空值數量unique_count: 唯一值數量
主要方法:
is_valid: 驗證狀態get_validation_errors(): 取得錯誤align(): 對齊資料
Schema 推斷工具
SchemaInferencer
推斷 Processor 轉換後的 Schema:
from petsard.metadater import SchemaInferencer
inferencer = SchemaInferencer()
# 推斷 Preprocessor 輸出
output_schema = inferencer.infer_preprocessor_output(
input_schema=loader_schema,
processor_config=preprocessor_config
)
# 推斷管線 Schema 變化
pipeline_schemas = inferencer.infer_pipeline_schemas(
loader_schema=loader_schema,
pipeline_config=pipeline_config
)ProcessorTransformRules
定義 Processor 的轉換規則:
from petsard.metadater import ProcessorTransformRules
# 取得轉換規則
rule = ProcessorTransformRules.get_rule('encoder_label')
# 應用規則
transformed_attr = ProcessorTransformRules.apply_rule(attribute, rule)型別系統
基本型別
int:整數float:浮點數str:字串date:日期datetime:日期時間
邏輯型別
選填的語義型別:
email,phone,urlencoded_categorical,onehot_encodedstandardized,normalized
型別屬性
type_attr 包含額外的型別資訊:
nullable: 是否允許空值category: 是否為類別資料precision: 數值精度(小數位數)format: 日期時間格式width: 字串寬度(前導零)
注意事項
- 內部使用為主:主要供 PETsARD 內部模組使用,一般使用者透過 Loader 即可
- 類別方法設計:所有方法都是類別方法,無需實例化
- 不可變設計:配置物件修改時返回新物件
- 自動推斷:
from_data()會自動推斷型別、空值和統計資訊 - 統計啟用:設定
enable_stats=True啟用詳細統計