kr4phy's picture
Sync from GitHub
cff6ac7
Raw
History Blame Contribute Delete
5.65 kB
"""
Pydantic ์š”์ฒญ/์‘๋‹ต ์Šคํ‚ค๋งˆ ์ •์˜.
๋ชจ๋“  API ์—”๋“œํฌ์ธํŠธ์˜ ์ž…์ถœ๋ ฅ ํƒ€์ž…์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
"""
from __future__ import annotations
from typing import Any
from pydantic import BaseModel, Field
# โ”€โ”€ ๊ณตํ†ต โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
class ErrorResponse(BaseModel):
"""ํ‘œ์ค€ ์—๋Ÿฌ ์‘๋‹ต."""
code: str = Field(..., description="์—๋Ÿฌ ์ฝ”๋“œ (์˜ˆ: NOT_FOUND)")
message: str = Field(..., description="ํ•œ๊ตญ์–ด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€")
detail: str | None = Field(None, description="์ƒ์„ธ ์›์ธ (์„ ํƒ)")
# โ”€โ”€ ํ•™๊ต ๊ธฐ๋ณธ ์ •๋ณด โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
class SchoolInfoResponse(BaseModel):
"""ํ•™๊ต ๊ธฐ๋ณธ ์ •๋ณด ์‘๋‹ต."""
sd_schul_code: str
school_name: str
sido_code: str | None = None
sido_name: str | None = None
school_kind: str | None = None
location_name: str | None = None
founding_type: str | None = None
road_address: str | None = None
coedu_type: str | None = None
day_night: str | None = None
school_course: str | None = None
is_closed: bool | None = None
homepage_url: str | None = None
established_date: str | None = None
# โ”€โ”€ ์˜ˆ์ธก โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
class PredictionRequest(BaseModel):
"""์˜ˆ์ธก ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ."""
horizon_years: int = Field(
default=5,
ge=1,
le=10,
description="์˜ˆ์ธก ๊ธฐ๊ฐ„ (๋…„, 1~10)",
)
target_col: str = Field(
default="student_count",
description="์˜ˆ์ธก ๋Œ€์ƒ ์ปฌ๋Ÿผ (์˜ˆ: student_count)",
)
class ForecastResponse(BaseModel):
"""์‹œ๊ณ„์—ด ์˜ˆ์ธก ์‘๋‹ต."""
schul_code: str
target_col: str
forecast_years: list[int]
point_forecast: list[float]
lower_bound: list[float]
upper_bound: list[float]
model_version: str
context_years: list[int]
context_values: list[float]
# โ”€โ”€ ์ง„๋‹จ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
class ShapValueItem(BaseModel):
"""SHAP ๊ธฐ์—ฌ ์š”์ธ ๋‹จ์ผ ํ•ญ๋ชฉ."""
feature: str
feature_kr: str
shap_value: float
feature_value: float
class ShapResultResponse(BaseModel):
"""SHAP ๋ถ„์„ ์‘๋‹ต."""
schul_code: str
status_label: str
status_code: int
shap_values: dict[str, float]
top_factors: list[ShapValueItem]
base_value: float
model_accuracy: float | None = None
class SustainabilityScoreResponse(BaseModel):
"""์ง€์† ๊ฐ€๋Šฅ์„ฑ ์ ์ˆ˜ ์‘๋‹ต."""
schul_code: str
total_score: float
curriculum_score: float
personnel_score: float
facility_score: float
community_score: float
sub_scores: dict[str, float]
warnings: list[str]
class SimulationResult(BaseModel):
"""์ •์ฑ… ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋‹จ์ผ ๊ฒฐ๊ณผ."""
label: str
description: str
base_total_score: float
sim_total_score: float
delta_score: float
sim_curriculum_score: float | None = None
sim_personnel_score: float | None = None
sim_facility_score: float | None = None
sim_community_score: float | None = None
error: str | None = None
class DiagnosticsResponse(BaseModel):
"""์ข…ํ•ฉ ์ง„๋‹จ ์‘๋‹ต."""
schul_code: str
school_name: str
status_label: str
status_code: int
sustainability_score: float
forecast: ForecastResponse
shap_result: ShapResultResponse
score_detail: SustainabilityScoreResponse
simulations: dict[str, SimulationResult]
metadata: dict[str, Any]
# โ”€โ”€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์š”์ฒญ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
class SimulationRequest(BaseModel):
"""
์‚ฌ์šฉ์ž ์ •์˜ ์ •์ฑ… ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์š”์ฒญ.
school_data_overrides ์— ๋ณ€๊ฒฝํ•  ์ง€ํ‘œ๋ฅผ ์ง€์ •ํ•˜๋ฉด
ํ•ด๋‹น ๊ฐ’์„ ์ ์šฉํ•œ ์ง€์† ๊ฐ€๋Šฅ์„ฑ ์ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
"""
school_data_overrides: dict[str, float] = Field(
...,
description="๋ฎ์–ด์“ธ ํ•™๊ต ์ง€ํ‘œ ๋”•์…”๋„ˆ๋ฆฌ (์˜ˆ: {\"teacher_count\": 7})",
)
scenario_label: str = Field(
default="์‚ฌ์šฉ์ž ์ •์˜ ์‹œ๋‚˜๋ฆฌ์˜ค",
description="์‹œ๋‚˜๋ฆฌ์˜ค ์ด๋ฆ„",
)
# โ”€โ”€ ์ง€์—ญ ์œ„ํ—˜์ง€๋„ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
class RegionRiskItem(BaseModel):
"""์ง€์—ญ ๋‚ด ๋‹จ์ผ ํ•™๊ต ์œ„ํ—˜ ์ •๋ณด."""
sd_schul_code: str
school_name: str
status_label: str
status_code: int
sustainability_score: float
student_count: float | None = None
lat: float | None = None
lng: float | None = None
class RegionRiskResponse(BaseModel):
"""์ง€์—ญ ์œ„ํ—˜์ง€๋„ ์‘๋‹ต."""
region_code: str
region_name: str | None = None
schools: list[RegionRiskItem]
summary: dict[str, int] = Field(
default_factory=dict,
description="์ƒํƒœ๋ณ„ ํ•™๊ต ์ˆ˜ ์ง‘๊ณ„ (์ •์ƒ/์ฃผ์˜/์œ„ํ—˜/๊ณ ์œ„ํ—˜)",
)