Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI | |
| from fastapi.staticfiles import StaticFiles | |
| from fastapi.responses import FileResponse | |
| import pandas as pd | |
| import numpy as np | |
| from sklearn.linear_model import LinearRegression | |
| import httpx # 新增:用於呼叫政府 Open API | |
| app = FastAPI() | |
| # --- 現有的 AI 分析邏輯與數據 (保持不變) --- | |
| data_sources = { | |
| "housing": pd.DataFrame({ | |
| "year": [2018, 2019, 2020, 2021, 2022, 2023], | |
| "hk_island_avg_sqft": [16000, 16500, 16200, 16800, 15500, 15000], | |
| "kowloon_avg_sqft": [13000, 13500, 13300, 13700, 12800, 12500], | |
| "nt_avg_sqft": [11000, 11400, 11200, 11600, 10800, 10500] | |
| }), | |
| "traffic": pd.DataFrame({ | |
| "month": [1, 2, 3, 4, 5, 6], | |
| "mass_transit": [4500, 4200, 4600, 4700, 4800, 4850], | |
| "bus_co": [3800, 3500, 3900, 3950, 4000, 4100], | |
| "ferry": [120, 110, 130, 135, 140, 145] | |
| }), | |
| "population": pd.DataFrame({ | |
| "year": [2018, 2019, 2020, 2021, 2022, 2023], | |
| "total_population": [7451000, 7500700, 7481800, 7401500, 7346900, 7498100] | |
| }) | |
| } | |
| def train_model(X, y): | |
| model = LinearRegression() | |
| model.fit(X, y) | |
| return model | |
| def analyze_data(category: str): | |
| if category == "housing": | |
| df = data_sources["housing"] | |
| X = df[['year']] | |
| y = df['nt_avg_sqft'] | |
| model = train_model(X, y) | |
| pred_2024 = model.predict([[2024]])[0] | |
| return {"category": "房價分析 (地政總署數據結構)", "prediction": f"2024 年新界區預測平均呎價: ${pred_2024:.2f}", "status": "模型訓練完成 (Linear Regression)"} | |
| elif category == "traffic": | |
| df = data_sources["traffic"] | |
| X = df[['month']] | |
| y = df['mass_transit'] | |
| model = train_model(X, y) | |
| pred_next_month = model.predict([[7]])[0] | |
| return {"category": "交通流量 (運輸署數據結構)", "prediction": f"7月份集體運輸系統預測日均客流: {pred_next_month:.0f} 千人次", "status": "分析涵蓋集體運輸、巴士與渡輪清算數據"} | |
| elif category == "population": | |
| df = data_sources["population"] | |
| X = df[['year']] | |
| y = df['total_population'] | |
| model = train_model(X, y) | |
| pred_2024 = model.predict([[2024]])[0] | |
| return {"category": "人口趨勢 (統計處數據結構)", "prediction": f"2024 年預測總人口: {int(pred_2024)} 人", "status": "趨勢分析完成"} | |
| return {"error": "未知的分類"} | |
| # --- 新增:KMB 路線數據代理 API --- | |
| async def get_kmb_routes(): | |
| url = "https://data.etabus.gov.hk/v1/transport/kmb/route/" | |
| async with httpx.AsyncClient() as client: | |
| try: | |
| response = await client.get(url, timeout=10.0) | |
| return response.json() | |
| except Exception as e: | |
| return {"error": f"無法獲取開放數據: {str(e)}", "data": []} | |
| # 掛載靜態檔案 | |
| app.mount("/", StaticFiles(directory="static", html=True), name="static") |