FlightDelay-API / main.py
Mahmoud-Bayoumi0's picture
Update main.py
af23096 verified
# from fastapi import FastAPI, HTTPException
# from pydantic import BaseModel
# import joblib
# import numpy as np
# app = FastAPI()
# model = joblib.load("RF_InFlight.joblib")
# le_airports = joblib.load("le_airports.joblib")
# class FlightInput(BaseModel):
# Year: int
# Quarter: int
# Month: int
# DayofMonth: int
# Origin: str
# Dest: str
# DepTime: float
# DepDelayMinutes: float
# DepDel15: int
# CRSDepTime: float
# tempF: float
# WindChillF: float
# humidity: float
# windspeedKmph: float
# WindGustKmph: float
# winddirDegree: float
# weatherCode: float
# visibility: float
# pressure: float
# cloudcover: float
# DewPointF: float
# time: int
# @app.post("/predict")
# def predict(data: FlightInput):
# try:
# origin_encoded = int(le_airports.transform([data.Origin])[0])
# except ValueError:
# raise HTTPException(
# status_code=422,
# detail=f"Origin '{data.Origin}' غير موجود. المطارات المتاحة: {le_airports.classes_.tolist()}"
# )
# try:
# dest_encoded = int(le_airports.transform([data.Dest])[0])
# except ValueError:
# raise HTTPException(
# status_code=422,
# detail=f"Dest '{data.Dest}' غير موجود. المطارات المتاحة: {le_airports.classes_.tolist()}"
# )
# features = np.array([[
# data.Year, data.Quarter, data.Month, data.DayofMonth,
# origin_encoded, dest_encoded,
# data.DepTime, data.DepDelayMinutes, data.DepDel15,
# data.CRSDepTime, data.tempF, data.WindChillF,
# data.humidity, data.windspeedKmph, data.WindGustKmph,
# data.winddirDegree, data.weatherCode, data.visibility,
# data.pressure, data.cloudcover, data.DewPointF, data.time
# ]])
# prediction = model.predict(features)[0]
# return {
# "predicted_delay_minutes": round(float(prediction), 2)
# }
# @app.get("/airports")
# def get_airports():
# airports = le_airports.classes_.tolist()
# return {"airports": airports}
# @app.get("/health")
# def health():
# return {"status": "ok"}
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import joblib
import numpy as np
app = FastAPI()
# إعدادات الـ CORS للسماح للواجهات الأمامية بالاتصال بالـ API
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # يسمح باستقبال الطلبات من أي مكان. يمكنك تغييرها لرابط موقعك لاحقاً للحماية.
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# تحميل الموديل ومشفر البيانات مرة واحدة عند تشغيل السيرفر
model = joblib.load("GradientBoostingRegressor-WithoutPrecipMM.joblib")
le_airports = joblib.load("le_airports.joblib")
class FlightInput(BaseModel):
Year: int
Quarter: int
Month: int
DayofMonth: int
Origin: str
Dest: str
DepTime: float
DepDelayMinutes: float
DepDel15: int
CRSDepTime: float
tempF: float
WindChillF: float
humidity: float
windspeedKmph: float
WindGustKmph: float
winddirDegree: float
weatherCode: float
visibility: float
pressure: float
cloudcover: float
DewPointF: float
time: int
# مسار ترحيبي للـ Hugging Face Space
@app.get("/")
def read_root():
return {
"message": "Flight Delay Prediction API is running perfectly! ✈️",
"health_check": "/health",
"airports_list": "/airports",
"prediction_endpoint": "/predict"
}
@app.post("/predict")
def predict(data: FlightInput):
try:
origin_encoded = int(le_airports.transform([data.Origin])[0])
except ValueError:
raise HTTPException(
status_code=422,
detail=f"Origin '{data.Origin}' غير موجود. المطارات المتاحة: {le_airports.classes_.tolist()}"
)
try:
dest_encoded = int(le_airports.transform([data.Dest])[0])
except ValueError:
raise HTTPException(
status_code=422,
detail=f"Dest '{data.Dest}' غير موجود. المطارات المتاحة: {le_airports.classes_.tolist()}"
)
features = np.array([[
data.Year, data.Quarter, data.Month, data.DayofMonth,
origin_encoded, dest_encoded,
data.DepTime, data.DepDelayMinutes, data.DepDel15,
data.CRSDepTime, data.tempF, data.WindChillF,
data.humidity, data.windspeedKmph, data.WindGustKmph,
data.winddirDegree, data.weatherCode, data.visibility,
data.pressure, data.cloudcover, data.DewPointF, data.time
]])
prediction = model.predict(features)[0]
return {
"predicted_delay_minutes": round(float(prediction), 2)
}
@app.get("/airports")
def get_airports():
airports = le_airports.classes_.tolist()
return {"airports": airports}
@app.get("/health")
def health():
return {"status": "ok"}