Mahmoud-Bayoumi0 commited on
Commit
f033ac0
·
verified ·
1 Parent(s): 2b91c1a

Upload 5 files

Browse files
Files changed (5) hide show
  1. Dockerfile +18 -0
  2. RF_InFlight_compressed.joblib +3 -0
  3. le_airports.joblib +3 -0
  4. main.py +175 -0
  5. requirements.txt +6 -0
Dockerfile ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # استخدام نسخة بايثون خفيفة ومستقرة
2
+ FROM python:3.9-slim
3
+
4
+ # تحديد مكان العمل داخل السيرفر
5
+ WORKDIR /code
6
+
7
+ # نسخ ملف المكتبات أولاً لتسريع عملية البناء (Caching)
8
+ COPY ./requirements.txt /code/requirements.txt
9
+
10
+ # تثبيت المكتبات المطلوبة
11
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
12
+
13
+ # نسخ باقي ملفات المشروع (الموديل، الكود، إلخ) إلى السيرفر
14
+ COPY . .
15
+
16
+ # تشغيل الـ FastAPI باستخدام uvicorn
17
+ # ملاحظة: Hugging Face يتطلب العمل على بورت 7860 حصراً
18
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
RF_InFlight_compressed.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5f80d76b69991771367ef0b0a24a1c80f347b202c34d425dabdef30d1a98e462
3
+ size 825740882
le_airports.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c2e099baa3a08eaf180739e5d18f909821a2fa0a4f2f19280cab159110e78f0b
3
+ size 563
main.py ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # from fastapi import FastAPI, HTTPException
2
+ # from pydantic import BaseModel
3
+ # import joblib
4
+ # import numpy as np
5
+
6
+ # app = FastAPI()
7
+
8
+ # model = joblib.load("RF_InFlight.joblib")
9
+ # le_airports = joblib.load("le_airports.joblib")
10
+
11
+ # class FlightInput(BaseModel):
12
+ # Year: int
13
+ # Quarter: int
14
+ # Month: int
15
+ # DayofMonth: int
16
+ # Origin: str
17
+ # Dest: str
18
+ # DepTime: float
19
+ # DepDelayMinutes: float
20
+ # DepDel15: int
21
+ # CRSDepTime: float
22
+ # tempF: float
23
+ # WindChillF: float
24
+ # humidity: float
25
+ # windspeedKmph: float
26
+ # WindGustKmph: float
27
+ # winddirDegree: float
28
+ # weatherCode: float
29
+ # visibility: float
30
+ # pressure: float
31
+ # cloudcover: float
32
+ # DewPointF: float
33
+ # time: int
34
+
35
+ # @app.post("/predict")
36
+ # def predict(data: FlightInput):
37
+ # try:
38
+ # origin_encoded = int(le_airports.transform([data.Origin])[0])
39
+ # except ValueError:
40
+ # raise HTTPException(
41
+ # status_code=422,
42
+ # detail=f"Origin '{data.Origin}' غير موجود. المطارات المتاحة: {le_airports.classes_.tolist()}"
43
+ # )
44
+
45
+ # try:
46
+ # dest_encoded = int(le_airports.transform([data.Dest])[0])
47
+ # except ValueError:
48
+ # raise HTTPException(
49
+ # status_code=422,
50
+ # detail=f"Dest '{data.Dest}' غير موجود. المطارات المتاحة: {le_airports.classes_.tolist()}"
51
+ # )
52
+
53
+ # features = np.array([[
54
+ # data.Year, data.Quarter, data.Month, data.DayofMonth,
55
+ # origin_encoded, dest_encoded,
56
+ # data.DepTime, data.DepDelayMinutes, data.DepDel15,
57
+ # data.CRSDepTime, data.tempF, data.WindChillF,
58
+ # data.humidity, data.windspeedKmph, data.WindGustKmph,
59
+ # data.winddirDegree, data.weatherCode, data.visibility,
60
+ # data.pressure, data.cloudcover, data.DewPointF, data.time
61
+ # ]])
62
+
63
+ # prediction = model.predict(features)[0]
64
+
65
+ # return {
66
+ # "predicted_delay_minutes": round(float(prediction), 2)
67
+ # }
68
+
69
+ # @app.get("/airports")
70
+ # def get_airports():
71
+ # airports = le_airports.classes_.tolist()
72
+ # return {"airports": airports}
73
+
74
+ # @app.get("/health")
75
+ # def health():
76
+ # return {"status": "ok"}
77
+
78
+
79
+ from fastapi import FastAPI, HTTPException
80
+ from fastapi.middleware.cors import CORSMiddleware
81
+ from pydantic import BaseModel
82
+ import joblib
83
+ import numpy as np
84
+
85
+ app = FastAPI()
86
+
87
+ # إعدادات الـ CORS للسماح للواجهات الأمامية بالاتصال بالـ API
88
+ app.add_middleware(
89
+ CORSMiddleware,
90
+ allow_origins=["*"], # يسمح باستقبال الطلبات من أي مكان. يمكنك تغييرها لرابط موقعك لاحقاً للحماية.
91
+ allow_credentials=True,
92
+ allow_methods=["*"],
93
+ allow_headers=["*"],
94
+ )
95
+
96
+ # تحميل الموديل ومشفر البيانات مرة واحدة عند تشغيل السيرفر
97
+ model = joblib.load("RF_InFlight_compressed.joblib")
98
+ le_airports = joblib.load("le_airports.joblib")
99
+
100
+ class FlightInput(BaseModel):
101
+ Year: int
102
+ Quarter: int
103
+ Month: int
104
+ DayofMonth: int
105
+ Origin: str
106
+ Dest: str
107
+ DepTime: float
108
+ DepDelayMinutes: float
109
+ DepDel15: int
110
+ CRSDepTime: float
111
+ tempF: float
112
+ WindChillF: float
113
+ humidity: float
114
+ windspeedKmph: float
115
+ WindGustKmph: float
116
+ winddirDegree: float
117
+ weatherCode: float
118
+ visibility: float
119
+ pressure: float
120
+ cloudcover: float
121
+ DewPointF: float
122
+ time: int
123
+
124
+ # مسار ترحيبي للـ Hugging Face Space
125
+ @app.get("/")
126
+ def read_root():
127
+ return {
128
+ "message": "Flight Delay Prediction API is running perfectly! ✈️",
129
+ "health_check": "/health",
130
+ "airports_list": "/airports",
131
+ "prediction_endpoint": "/predict"
132
+ }
133
+
134
+ @app.post("/predict")
135
+ def predict(data: FlightInput):
136
+ try:
137
+ origin_encoded = int(le_airports.transform([data.Origin])[0])
138
+ except ValueError:
139
+ raise HTTPException(
140
+ status_code=422,
141
+ detail=f"Origin '{data.Origin}' غير موجود. المطارات المتاحة: {le_airports.classes_.tolist()}"
142
+ )
143
+
144
+ try:
145
+ dest_encoded = int(le_airports.transform([data.Dest])[0])
146
+ except ValueError:
147
+ raise HTTPException(
148
+ status_code=422,
149
+ detail=f"Dest '{data.Dest}' غير موجود. المطارات المتاحة: {le_airports.classes_.tolist()}"
150
+ )
151
+
152
+ features = np.array([[
153
+ data.Year, data.Quarter, data.Month, data.DayofMonth,
154
+ origin_encoded, dest_encoded,
155
+ data.DepTime, data.DepDelayMinutes, data.DepDel15,
156
+ data.CRSDepTime, data.tempF, data.WindChillF,
157
+ data.humidity, data.windspeedKmph, data.WindGustKmph,
158
+ data.winddirDegree, data.weatherCode, data.visibility,
159
+ data.pressure, data.cloudcover, data.DewPointF, data.time
160
+ ]])
161
+
162
+ prediction = model.predict(features)[0]
163
+
164
+ return {
165
+ "predicted_delay_minutes": round(float(prediction), 2)
166
+ }
167
+
168
+ @app.get("/airports")
169
+ def get_airports():
170
+ airports = le_airports.classes_.tolist()
171
+ return {"airports": airports}
172
+
173
+ @app.get("/health")
174
+ def health():
175
+ return {"status": "ok"}
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ pydantic
4
+ joblib
5
+ numpy
6
+ scikit-learn