60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
"""
|
|
Pydantic Schemas untuk Clustering
|
|
"""
|
|
|
|
from pydantic import BaseModel, Field
|
|
from typing import List, Optional
|
|
from datetime import datetime
|
|
|
|
|
|
class ClusteringRequest(BaseModel):
|
|
"""Request untuk clustering"""
|
|
n_clusters: int = Field(default=3, ge=2, le=10, description="Jumlah cluster")
|
|
auto_k: bool = Field(default=False, description="Auto-detect jumlah cluster optimal")
|
|
tahun: Optional[List[str]] = Field(default=None, description="Filter tahun (opsional)")
|
|
|
|
|
|
class AlumniInput(BaseModel):
|
|
"""Data alumni untuk clustering"""
|
|
nama: str
|
|
nim: Optional[str] = None
|
|
perusahaan: str
|
|
jabatan: str
|
|
|
|
|
|
class ClusterResult(BaseModel):
|
|
"""Hasil clustering untuk satu alumni"""
|
|
nama: str
|
|
nim: Optional[str] = None
|
|
perusahaan: str
|
|
jabatan: str
|
|
cluster: int
|
|
cluster_label: str
|
|
|
|
|
|
class ClusteringResponse(BaseModel):
|
|
"""Response dari clustering"""
|
|
status: str
|
|
message: Optional[str] = None
|
|
total_records: int
|
|
n_clusters: int
|
|
distribution: dict
|
|
summary: Optional[dict] = None
|
|
top_features: Optional[dict] = None
|
|
data: List[ClusterResult]
|
|
|
|
|
|
class StandardizeRequest(BaseModel):
|
|
"""Request untuk standarisasi data"""
|
|
files: List[str] = Field(description="List filename yang diupload")
|
|
tahun: List[str] = Field(description="List tahun untuk setiap file")
|
|
|
|
|
|
class StandardizeResponse(BaseModel):
|
|
"""Response dari standarisasi"""
|
|
status: str
|
|
message: Optional[str] = None
|
|
total_records: int
|
|
years_processed: List[str]
|
|
data: Optional[List[AlumniInput]] = None
|