| import os, requests, joblib, logging, pandas as pd |
| from fastapi import FastAPI, HTTPException |
| from pydantic import BaseModel |
| from dotenv import load_dotenv |
|
|
| load_dotenv() |
| logging.basicConfig(level=logging.INFO) |
| logger = logging.getLogger("WaterAPI") |
|
|
| app = FastAPI(title="Water Requirement API") |
|
|
| CROP_MAP = {"BANANA": 0, "BEAN": 1, "CABBAGE": 2, "CITRUS": 3, "COTTON": 4, "MAIZE": 5, "MELON": 6, "MUSTARD": 7, "ONION": 8, "OTHER": 9, "POTATO": 10, "RICE": 11, "SOYABEAN": 12, "SUGARCANE": 13, "TOMATO": 14, "WHEAT": 15} |
| SOIL_MAP = {"DRY": 0, "HUMID": 1, "WET": 2} |
| WEATHER_MAP = {"SUNNY": 0, "RAINY": 1, "WINDY": 2, "NORMAL": 3} |
|
|
| MODEL = None |
| try: |
| MODEL = joblib.load("svm_poly_model.pkl") |
| logger.info("✅ SVM Model Loaded") |
| except Exception as e: |
| logger.error(f"❌ Model load fail: {e}") |
|
|
| class WaterRequest(BaseModel): |
| crop_type: str |
| soil_type: str |
| city: str |
| capacity: float = 10.0 |
| farm_size_hectares: float = 1.0 |
|
|
| @app.post("/predict") |
| def predict(req: WaterRequest): |
| key = os.getenv("OPENWEATHERMAP_API_KEY") |
| w = {"temp": 25, "cond": "NORMAL"} |
| if key: |
| try: |
| r = requests.get(f"https://api.openweathermap.org/data/2.5/weather?q={req.city}&appid={key}&units=metric").json() |
| w["temp"] = r['main']['temp'] |
| main = r['weather'][0]['main'].lower() |
| w["cond"] = "SUNNY" if 'clear' in main else "RAINY" if 'rain' in main else "WINDY" if 'wind' in main else "NORMAL" |
| except: pass |
|
|
| crop, soil = req.crop_type.upper(), req.soil_type.upper() |
| if crop not in CROP_MAP: crop = "OTHER" |
| if soil not in SOIL_MAP: soil = "DRY" |
| |
| if not MODEL: raise HTTPException(503, "Model unavailable") |
| |
| df = pd.DataFrame([{"CROP TYPE": CROP_MAP[crop], "SOIL TYPE": SOIL_MAP[soil], "TEMPERATURE": w["temp"], "WEATHER CONDITION": WEATHER_MAP[w["cond"]]}]) |
| water_mm = float(MODEL.predict(df)[0]) |
| water_m3_per_sqm = water_mm / 1000 |
| |
| |
| total_water_m3 = water_m3_per_sqm * 10000 * req.farm_size_hectares |
| |
| irrigation_minutes = (total_water_m3 / req.capacity) * 60 |
| |
| return { |
| "water_mm": round(water_mm, 2), |
| "water_m3_sqm": round(water_m3_per_sqm, 4), |
| "total_water_m3": round(total_water_m3, 2), |
| "irrigation_minutes": round(irrigation_minutes, 2), |
| "weather": w |
| } |
|
|
| if __name__ == "__main__": |
| import uvicorn |
| uvicorn.run(app, host="0.0.0.0", port=8002) |
|
|