| """ |
| 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="์ํ๋ณ ํ๊ต ์ ์ง๊ณ (์ ์/์ฃผ์/์ํ/๊ณ ์ํ)", |
| ) |
|
|