├── .gitignore ├── .vscode └── settings.json ├── Procfile ├── README.md ├── Streamlit_Version ├── Turbine-Model.sav ├── app.py ├── index.html ├── lilo_model.sav ├── result.html └── style.css ├── __pycache__ ├── fitting.cpython-312.pyc ├── pipe.cpython-312.pyc └── preproccess.cpython-312.pyc ├── app.py ├── best_model.pkl ├── best_pipeline.pkl ├── one_hot_model.pkl ├── one_hot_pipeline.pkl ├── pipe.py ├── requirements.txt ├── static ├── css │ └── style.css ├── images │ ├── bg-1.jpg │ ├── bg-2.jpg │ ├── bg-3.jpg │ ├── bg-4.jpg │ ├── bg-5.jpg │ ├── contact.jpg │ ├── logo.jpg │ ├── m-1.jpg │ ├── m-4.jpg │ ├── m-5.jpg │ ├── m-6.jpg │ ├── m2.jpeg │ ├── m3.jpg │ ├── m7.jpg │ ├── m8.jpg │ ├── result-img-1.jpg │ ├── result-img-2.jpg │ ├── result-img-3.jpg │ ├── result-img-4.jpg │ └── result-img-5.jpg └── js │ ├── manifest.json │ ├── script.js │ └── service-worker.js └── templates ├── index.html └── result.html /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | __pycache__ -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "liveServer.settings.port": 5502 3 | } 4 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: python app.py 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Wind Turbine Power Predictor 2 | This project involves the development of a machine learning model deployed on a web application to predict the power output of a wind turbine. The model utilizes real-time environmental and operational data sourced from a wind turbine's Supervisory Control and Data Acquisition (SCADA) system in Turkey. Features such as wind speed, wind direction, and theoretical power curve are analyzed to optimize wind turbine performance and enhance energy production efficiency. By integrating the model into a web application, users can access predictions and insights remotely, facilitating informed decision-making and promoting the sustainable utilization of renewable energy resources. 3 | 4 |
5 | 6 | **Used Technologies:** Python - Flask Framework - JSON - JavaScript - HTML/HTML5 - CSS/CSS3 - PWA - Python Libraries (pandas - numpy - matplotlib - seaborn - sklearn - catboost - xgboost) - ML Algorithms (GradientBoostingRegressor - SVR - RandomForestRegressor - LinearRegression - ExtraTreesRegressor - AdaBoostRegressor - DecisionTreeRegressor - XGBRegressor - XGBRFRegressor - CatBoostRegressor) 7 |

8 | **Demo (Live Preview):** https://mlwindturbine.pythonanywhere.com/ 9 |

10 | **Jupyter Notebook (ML Code):** https://www.kaggle.com/code/ahmedmaheralgohary/wind-turbine-eda-and-modeling 11 |

12 | **To install the mobile app version:** from here 13 | 14 |
15 | 16 | ## Key Features: 17 | - Machine Learning Model: Utilizes advanced algorithms to predict wind turbine power output. 18 | - Real-Time Data Analysis: Incorporates live data from SCADA systems for accurate predictions. 19 | - Web Application: serves as the primary platform for accessing predictions and insights generated by our machine learning model. Users can conveniently access these resources remotely, empowering informed decision-making regarding wind turbine operations. 20 | - Enhanced Decision-Making: Empowers users with actionable insights to optimize turbine operations. 21 | - Promotes Sustainability: Encourages the eco-friendly use of renewable energy resources. 22 | 23 |
24 | 25 | ## Web Application Features: 26 | - Responsive Design: Seamlessly accessible across various devices. 27 | - High Performance: Utilizing optimal code structure and lazy loading for images to ensure lightning-fast speed and responsiveness. 28 | - Accessibility: Our platform caters to users with special needs, ensuring compatibility with screen readers and enabling access for individuals with disabilities. 29 | - High SEO: Implementing meta tags, titles for images, alternative texts, and semantic elements to enhance search engine visibility. 30 | - Clean Code and Best Practices: Prioritizing code clarity, organization, and utilization of modern technologies to ensure browser compatibility and incorporate the latest features and techniques. 31 | - Simple Animations: Enhancing user experience with subtle yet effective animations. 32 | - High-Quality UX: Prioritizing user experience with high contrast colors, clear fonts, easy navigation, and smooth interactions. 33 | - Progressive Web App (PWA): Our web application is installable on various devices, offering the convenience of a mobile app across multiple platforms. 34 | - Dark/Light Mode: Enhance user experience with the option to switch between dark and light modes, providing flexibility and reducing eye strain, while accessing predictions and insights for informed decision-making regarding wind turbine operations. 35 | - Email Integration: Automatically sends an email after the form is submitted, using EmailJS, to streamline communication with users. 36 | - Form Validation: Ensures all required fields are filled out and inputs are correctly formatted before submission. This includes validation for email format and other user inputs. 37 | 38 |
39 | 40 | ## Contributors: 41 | - Ahmed Maher Algohary (Me)   Go To LinkedIn LinkedIn 42 | - Ahmed Waheed   Go To LinkedIn LinkedIn 43 | - Youssif Qzamel   Go To LinkedIn LinkedIn 44 | - Mohamed Ehab   Go To LinkedIn LinkedIn 45 | - Mina Farid   Go To LinkedIn LinkedIn 46 | - Mohamed Khedr   Go To LinkedIn LinkedIn 47 | - Peter Nabil   Go To LinkedIn LinkedIn 48 | - Mahmoud Elspaiy 49 | -------------------------------------------------------------------------------- /Streamlit_Version/Turbine-Model.sav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/Streamlit_Version/Turbine-Model.sav -------------------------------------------------------------------------------- /Streamlit_Version/app.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import streamlit as st 3 | import pandas as pd 4 | 5 | # Load the model 6 | with open('lilo_model.sav', 'rb') as f: 7 | model = pickle.load(f) 8 | 9 | # Define the title and description 10 | st.title('Wind Turbine Power Prediction Web Application') 11 | st.write("Harnessing Renewable Energy with **Machine Learning**") 12 | 13 | # Text input fields for user input 14 | wind_speed = st.text_input('Wind Speed (m/s)', placeholder="Enter wind speed") 15 | theoretical_power_curve = st.text_input('Theoretical Power Curve (KWh)', placeholder="Enter theoretical power curve") 16 | wind_direction = st.text_input('Wind Direction (°)', placeholder="Enter wind direction") 17 | month = st.number_input('Month', min_value=1, max_value=12, step=1, format='%d', help="Enter month number (1-12)") 18 | 19 | # Button to confirm and trigger prediction 20 | con = st.button('Confirm') 21 | if con: 22 | # Create a DataFrame with user inputs 23 | df = pd.DataFrame({'Wind Speed (m/s)': [wind_speed], 24 | 'Theoretical Power Curve (KWh)': [theoretical_power_curve], 25 | 'Wind Direction (°)': [wind_direction], 26 | 'Month': [month]}) 27 | 28 | # Convert input data to float 29 | df = df.astype(float) 30 | 31 | # Make prediction using the model 32 | result = model.predict(df) 33 | 34 | # Display the prediction result 35 | st.write(f"Predicted Wind Turbine Power (Low Voltage Active Power): **{result[0]:.2f} kW**") 36 | -------------------------------------------------------------------------------- /Streamlit_Version/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Wind Turbine Power Prediction 7 | 8 | 9 |

Wind Turbine Power Prediction

10 |
11 | 12 |

13 | 14 | 15 |

16 | 17 | 18 |

19 | 20 | 21 |

22 | 23 | 24 |
25 | 26 | -------------------------------------------------------------------------------- /Streamlit_Version/lilo_model.sav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/Streamlit_Version/lilo_model.sav -------------------------------------------------------------------------------- /Streamlit_Version/result.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Prediction Result 7 | 8 | 9 |

Prediction Result

10 |

The predicted power production is: {{ prediction }}

11 | 12 | 13 | -------------------------------------------------------------------------------- /Streamlit_Version/style.css: -------------------------------------------------------------------------------- 1 | /* Variables */ 2 | :root { 3 | --trans-2: 0.2s 4 | } 5 | /* Container */ 6 | /* .stApp.stAppEmbeddingId-sckf5v6iphqm.st-emotion-cache-1r4qj8v.erw9t6i1 { 7 | /* .block-container.st-emotion-cache-1y4p8pa.ea3mdgi5 { 8 | width: 100%; 9 | max-width: 100%; 10 | } */ 11 | body { 12 | min-height: 700px; 13 | } 14 | .block-container.st-emotion-cache-1y4p8pa.ea3mdgi5 { 15 | padding: 60px 0 0; 16 | } 17 | .row-widget, 18 | .element-container.st-emotion-cache-1dy3zdg.e1f1d6gn4, 19 | .row-widget.stButton { 20 | width: 46rem !important; 21 | max-width: 92% !important; 22 | margin: auto; 23 | } 24 | /* Page Title */ 25 | .st-emotion-cache-1629p8f h1 { 26 | padding: 0 0 10px; 27 | padding-bottom: 0; 28 | } 29 | div.st-emotion-cache-eqffof { 30 | text-align: center; 31 | color: #000 32 | } 33 | 34 | #powered-by-machine-learning { 35 | padding-top: 0; 36 | } 37 | div.st-emotion-cache-eqffof p { 38 | font-size: 18px; 39 | color: #6d6464; 40 | } 41 | .st-emotion-cache-eqffof p:not(.stAlert p) { 42 | margin-bottom: 60px 43 | } 44 | /* Input Fields */ 45 | .st-emotion-cache-l9bjmx > p { 46 | font-size: 18px; 47 | } 48 | /* Confirm Button */ 49 | .stButton { 50 | display: flex; 51 | justify-content: end; 52 | } 53 | button.st-emotion-cache-7ym5gk.ef3psqc12{ 54 | padding: 7px 18px; 55 | background-color: #1976D2; 56 | color: #fff; 57 | border-color: #1976D2; 58 | margin-bottom: 45px; 59 | border-radius: 7px; 60 | transition: var(--trans-2, 0.3s); 61 | } 62 | button.st-emotion-cache-7ym5gk:hover { 63 | background-color: transparent; 64 | color: #1976D2; 65 | } 66 | /* Footer */ 67 | div.st-emotion-cache-eqffof p a { 68 | font-weight: bold; 69 | color: rgb(0, 119, 255); 70 | font-size: 21px; 71 | transition-duration: var(--trans-2, 0.3s); 72 | margin-left: 5px; 73 | } 74 | div.st-emotion-cache-eqffof p a:hover { 75 | color: #00878c; 76 | position: relative; 77 | transition-duration: var(--trans-2, 0.3s); 78 | } 79 | div.st-emotion-cache-eqffof p a:hover::before { 80 | content: "Click Here To Get In Touch"; 81 | position: absolute; 82 | top: -44px; 83 | left: -55px; 84 | width: 259px; 85 | padding: 5px 10px; 86 | font-weight: 100; 87 | font-size: 18px; 88 | border-radius: 7px; 89 | background-color: rgb(90 106 115); 90 | color: #fff; 91 | } 92 | div.st-emotion-cache-eqffof p a:hover::after { 93 | content: ""; 94 | position: absolute; 95 | top: -9px; 96 | left: 56px; 97 | border: 9px solid transparent; 98 | border-top-color: rgb(90 106 115); 99 | } 100 | .st-emotion-cache-10fz3ls p { 101 | font-size: 1.2rem; 102 | } 103 | .st-emotion-cache-1kyxreq.e115fcil2 { 104 | justify-content: center; 105 | margin-bottom: 30px; 106 | } 107 | /* .element-container.st-emotion-cache-i7xwqo.e1f1d6gn4:last-of-type { 108 | width: 100% !important; 109 | position: fixed !important; 110 | bottom: 0 !important; 111 | left: 0 !important; 112 | } */ -------------------------------------------------------------------------------- /__pycache__/fitting.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/__pycache__/fitting.cpython-312.pyc -------------------------------------------------------------------------------- /__pycache__/pipe.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/__pycache__/pipe.cpython-312.pyc -------------------------------------------------------------------------------- /__pycache__/preproccess.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/__pycache__/preproccess.cpython-312.pyc -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, request, render_template 2 | import pandas as pd 3 | from datetime import datetime 4 | import joblib 5 | from pipe import FullPipeline1, LabelEncodeColumns, CustomOneHotEncoder, DropColumnsTransformer, OutlierThresholdTransformer, DateExtractor, DataFrameImputer, StandardScaleTransform 6 | 7 | app = Flask(__name__) 8 | 9 | # Load the trained model 10 | model = joblib.load('one_hot_model.pkl') 11 | 12 | # Load the preprocessing pipeline 13 | pipeline = joblib.load('one_hot_pipeline.pkl') 14 | 15 | # Route for the home page 16 | @app.route('/') 17 | def index(): 18 | return render_template('index.html') 19 | 20 | # Route for the form submission and prediction 21 | @app.route('/result', methods=['POST']) 22 | def predict(): 23 | # Get data from the form 24 | date_time = request.form['date_time'] 25 | wind_speed = float(request.form['wind_speed']) 26 | theoretical_power = float(request.form['theoretical_power']) 27 | wind_direction = float(request.form['wind_direction']) 28 | 29 | # Convert date/time to the desired format 30 | original_datetime = datetime.strptime(date_time, "%Y-%m-%dT%H:%M") 31 | formatted_datetime_str = original_datetime.strftime("%d %m %Y %H:%M") 32 | 33 | # Create a DataFrame with the form data 34 | data = pd.DataFrame({'Date/Time': [formatted_datetime_str], 35 | 'Wind Speed (m/s)': [wind_speed], 36 | 'Theoretical_Power_Curve (KWh)': [theoretical_power], 37 | 'Wind Direction (°)': [wind_direction] 38 | }) 39 | 40 | # Preprocess data using the pipeline 41 | transformed_data = pipeline.transform(data) 42 | # Predict LV Active Power using the model 43 | lv_active_power = model.predict(transformed_data) 44 | 45 | return render_template('result.html', lv_active_power=lv_active_power) 46 | 47 | if __name__ == '__main__': 48 | app.run(debug=True) 49 | -------------------------------------------------------------------------------- /best_model.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/best_model.pkl -------------------------------------------------------------------------------- /best_pipeline.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/best_pipeline.pkl -------------------------------------------------------------------------------- /one_hot_model.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/one_hot_model.pkl -------------------------------------------------------------------------------- /one_hot_pipeline.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/one_hot_pipeline.pkl -------------------------------------------------------------------------------- /pipe.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | from sklearn.base import BaseEstimator, TransformerMixin 3 | from sklearn.calibration import LabelEncoder 4 | from sklearn.discriminant_analysis import StandardScaler 5 | from sklearn.impute import KNNImputer, SimpleImputer 6 | from sklearn.pipeline import Pipeline 7 | 8 | class FullPipeline1: 9 | def __init__(self) : 10 | # Define columns based on their types 11 | self.date_cols=['Date/Time'] 12 | self.numerical_cols=['Wind Speed (m/s)', 'Theoretical_Power_Curve (KWh)', 'Wind Direction (°)','Week','Month','Hour','Day'] 13 | self.MLE_cols=['Season'] 14 | 15 | # Define the full preprocessing pipeline 16 | self.full_pipeline=Pipeline([ 17 | ('extract_date',DateExtractor(date_cols=self.date_cols)), 18 | ('impute_num',DataFrameImputer(knn_cols=self.numerical_cols)), 19 | ('remove_outlier',OutlierThresholdTransformer(column=self.numerical_cols)), 20 | ('scale', StandardScaleTransform(cols=self.numerical_cols)), 21 | ('one_hot_encode', CustomOneHotEncoder(columns=self.MLE_cols)), 22 | ('drop', DropColumnsTransformer(columns=self.date_cols)), 23 | ]) 24 | 25 | def fit_transform(self, X_train): 26 | # Fit and transform the training data 27 | X_train = self.full_pipeline.fit_transform(X_train) 28 | return X_train 29 | 30 | def transform(self, X_test): 31 | # Transform the testing data 32 | X_test = self.full_pipeline.transform(X_test) 33 | return X_test 34 | 35 | # Custom Transformer to Label Encode Categorical Columns 36 | class LabelEncodeColumns(BaseEstimator, TransformerMixin): 37 | def __init__(self, columns): 38 | self.columns = columns 39 | self.encoders_ = {} 40 | 41 | def fit(self, X, y=None): 42 | for col in self.columns: 43 | encoder = LabelEncoder() 44 | encoder.fit(X[col]) 45 | self.encoders_[col] = encoder 46 | return self 47 | 48 | def transform(self, X): 49 | X_copy = X.copy() 50 | for col, encoder in self.encoders_.items(): 51 | X_copy[col] = encoder.transform(X_copy[col]) 52 | return X_copy 53 | 54 | def fit_transform(self, X, y=None): 55 | self.fit(X, y) 56 | return self.transform(X) 57 | 58 | # Custom Transformer to apply One-Hot Encoding 59 | class CustomOneHotEncoder(BaseEstimator, TransformerMixin): 60 | def __init__(self, columns=None): 61 | self.columns = columns 62 | self.unique_values = {} 63 | self.feature_names_ = None 64 | 65 | def fit(self, X, y=None): 66 | if self.columns is None: 67 | self.columns = X.columns.tolist() 68 | self.unique_values = {col: X[col].unique() for col in self.columns} 69 | self.feature_names_ = self._get_feature_names() 70 | return self 71 | 72 | def _get_feature_names(self): 73 | feature_names = [] 74 | for col in self.columns: 75 | for value in self.unique_values[col]: 76 | feature_names.append(f"{col}_{value}") 77 | return feature_names 78 | 79 | def transform(self, X): 80 | X_transformed = pd.DataFrame(index=X[self.columns].index) 81 | for col in self.columns: 82 | for value in self.unique_values[col]: 83 | X_transformed[f"{col}_{value}"] = (X[col] == value).astype(int) 84 | 85 | X = pd.concat([X, X_transformed], axis=1) 86 | return X.drop(columns=['Season']) 87 | 88 | def fit_transform(self, X, y=None): 89 | self.fit(X) 90 | return self.transform(X) 91 | 92 | # Custom Transformer to Drop Columns 93 | class DropColumnsTransformer(BaseEstimator, TransformerMixin): 94 | def __init__(self, columns=None): 95 | self.columns = columns 96 | 97 | def fit(self, X, y=None): 98 | return self 99 | 100 | def transform(self, X): 101 | if self.columns is None: 102 | return X 103 | else: 104 | return X.drop(self.columns, axis=1) 105 | 106 | # Custom Transformer to Remove Outliers 107 | class OutlierThresholdTransformer(BaseEstimator, TransformerMixin): 108 | def __init__(self, column, q1=0.25, q3=0.75): 109 | self.column = column 110 | self.q1 = q1 111 | self.q3 = q3 112 | 113 | def outlier_threshhold(self, dataframe, column): 114 | Q1 = dataframe[column].quantile(self.q1) 115 | Q3 = dataframe[column].quantile(self.q3) 116 | iqr = Q3 - Q1 117 | up_limit = Q3 + 1.5 * iqr 118 | low_limit = Q1 - 1.5 * iqr 119 | return low_limit, up_limit 120 | 121 | def fit(self, X, y=None): 122 | return self 123 | 124 | def transform(self, X): 125 | X_copy = X.copy() 126 | for col in self.column: 127 | low_limit, up_limit = self.outlier_threshhold(X_copy, col) 128 | X_copy.loc[(X_copy[col] < low_limit), col] = low_limit 129 | X_copy.loc[(X_copy[col] > up_limit), col] = up_limit 130 | return X_copy 131 | 132 | def fit_transform(self, X, y=None): 133 | return self.transform(X) 134 | 135 | # Custom Transformer to Extract Date Features 136 | class DateExtractor(BaseEstimator, TransformerMixin): 137 | def __init__(self, date_cols): 138 | self.date_cols = date_cols 139 | 140 | 141 | def fit(self, X, y=None): 142 | return self 143 | 144 | def transform(self, X): 145 | extracted_features = [] 146 | for col in self.date_cols: 147 | dates = pd.to_datetime(X[col], format='%d %m %Y %H:%M') 148 | for date in dates: 149 | month_val = date.month 150 | week_val = date.day // 7 + 1 151 | day_val = date.day 152 | hour_val = date.hour + 1 153 | 154 | # Determining season based on month 155 | if month_val in [3, 4, 5]: 156 | season_val = 'Spring' 157 | elif month_val in [6, 7, 8]: 158 | season_val = 'Summer' 159 | elif month_val in [9, 10, 11]: 160 | season_val = 'Autumn' 161 | else: 162 | season_val = 'Winter' 163 | 164 | extracted_features.append([month_val, week_val, day_val, season_val, hour_val]) 165 | 166 | # Convert the extracted features list to a DataFrame 167 | X_date = pd.DataFrame(extracted_features, columns=['Month', 'Week', 'Day', 'Season', 'Hour']) 168 | X_new=pd.concat([X.reset_index(drop=True),X_date],axis=1) 169 | return X_new 170 | 171 | def fit_transform(self, X, y=None): 172 | self.fit(X) 173 | return self.transform(X) 174 | 175 | # Custom Transformer to Impute Missing Values in DataFrame 176 | class DataFrameImputer(TransformerMixin, BaseEstimator): 177 | def __init__(self, median_cols=None, knn_cols=None): 178 | self.median_cols = median_cols 179 | self.knn_cols = knn_cols 180 | 181 | def fit(self, X, y=None): 182 | self.median_imputer = SimpleImputer(strategy='median') 183 | self.knn_imputer = KNNImputer() 184 | 185 | if self.median_cols is not None: 186 | self.median_imputer.fit(X[self.median_cols]) 187 | if self.knn_cols is not None: 188 | self.knn_imputer.fit(X[self.knn_cols]) 189 | return self 190 | 191 | def transform(self, X): 192 | X_imputed = X.copy() 193 | if self.median_cols is not None: 194 | X_median = pd.DataFrame(self.median_imputer.transform(X[self.median_cols]), 195 | columns=self.median_cols, index=X.index) 196 | X_imputed = pd.concat([X_imputed.drop(self.median_cols, axis=1), X_median], axis=1) 197 | if self.knn_cols is not None: 198 | X_knn = pd.DataFrame(self.knn_imputer.transform(X[self.knn_cols]), 199 | columns=self.knn_cols, index=X.index) 200 | X_imputed = pd.concat([X_imputed.drop(self.knn_cols, axis=1), X_knn], axis=1) 201 | return X_imputed 202 | 203 | def fit_transform(self, X, y=None): 204 | self.fit(X) 205 | return self.transform(X) 206 | 207 | # Custom Transformer to Standardize Numerical Columns 208 | class StandardScaleTransform(BaseEstimator, TransformerMixin): 209 | def __init__(self, cols): 210 | self.cols = cols 211 | self.scaler_ = None 212 | 213 | def fit(self, X, y=None): 214 | self.scaler_ = StandardScaler().fit(X.loc[:, self.cols]) 215 | return self 216 | 217 | def transform(self, X): 218 | X_copy = X.copy() 219 | X_copy.loc[:, self.cols] = self.scaler_.transform(X_copy.loc[:, self.cols]) 220 | return X_copy 221 | 222 | def fit_transform(self, X, y=None): 223 | self.scaler_ = StandardScaler().fit(X.loc[:, self.cols]) 224 | return self.transform(X) 225 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Flask 2 | pandas 3 | datetime 4 | joblib 5 | scikit-learn 6 | gunicorn 7 | catboost 8 | -------------------------------------------------------------------------------- /static/css/style.css: -------------------------------------------------------------------------------- 1 | /* Reset */ 2 | * { 3 | -webkit-box-sizing: border-box; 4 | -moz-box-sizing: border-box; 5 | box-sizing: border-box; 6 | margin: 0; 7 | padding: 0; 8 | } 9 | 10 | /* Global */ 11 | :root { 12 | --mainColor: #222831; 13 | --secondary-color: #76ABAE; 14 | --bgColor: #f0f2f5; 15 | --tran3: 0.3s; 16 | --whiteColor: #fff; 17 | --grayColor: #6d6464; 18 | --greenColor: #09a53a; 19 | scroll-behavior: smooth; 20 | } 21 | body { 22 | font-family: "Cairo", sans-serif; 23 | color: var(--mainColor); 24 | position: relative 25 | } 26 | body.nav-active::before { 27 | background-color: #f0f2f5; 28 | } 29 | ::-webkit-scrollbar { 30 | width: 4px; 31 | height: 4px 32 | } 33 | ::-webkit-scrollbar-track { 34 | background-color: #dedadca8; 35 | } 36 | ::-webkit-scrollbar-thumb { 37 | background-color: rgba(143, 141, 141, 0.659); 38 | } 39 | a { 40 | text-decoration: none; 41 | } 42 | ul { 43 | list-style: none 44 | } 45 | .heading { 46 | width: fit-content; 47 | margin: 0 auto 65px; 48 | line-height: 30px; 49 | text-align: center; 50 | } 51 | .heading h2 { 52 | position: relative; 53 | width: 80%; 54 | margin: auto; 55 | } 56 | .heading .lines { 57 | width: 30px; 58 | height: 15px; 59 | position: absolute; 60 | top: 50%; 61 | transform: translateY(-50%); 62 | } 63 | .heading:hover .lines li { 64 | background-color: var(--greenColor) 65 | } 66 | .heading .lines.left { 67 | direction: rtl; 68 | left: -45px; 69 | } 70 | .heading .lines.right { 71 | right: -45px; 72 | } 73 | .heading .lines li { 74 | height: 0.5px; 75 | width: 100%; 76 | position: absolute; 77 | background-color: var(--mainColor); 78 | } 79 | .heading .line-1:first-of-type { 80 | top: 0%; 81 | width: 30%; 82 | } 83 | .heading .line-2:nth-of-type(2) { 84 | top: 7px; 85 | width: 60%; 86 | } 87 | .heading .line-3:last-of-type { 88 | bottom: 0%; 89 | } 90 | 91 | /* Header */ 92 | #header { 93 | position: sticky; 94 | top: 0; 95 | z-index: 99; 96 | background-color: var(--bgColor); 97 | transition: var(--tran3); 98 | 99 | } 100 | #header .container { 101 | display: flex; 102 | justify-content: space-between; 103 | align-items: center; 104 | padding-top: 5px; 105 | padding-bottom: 5px; 106 | font-size: 1.5rem; 107 | } 108 | #header .container > a { 109 | color: var(--mainColor); 110 | font-weight: bold; 111 | transition: var(--tran3) 112 | } 113 | #header .container > a:hover { 114 | color: var(--secondary-color); 115 | } 116 | #header .container > a span { 117 | color: var(--secondary-color); 118 | transition: var(--tran3) 119 | } 120 | #header .container > a:hover span { 121 | color: var(--mainColor); 122 | } 123 | #header nav { 124 | margin-bottom: -5px 125 | } 126 | #header nav > i { 127 | font-size: 1.8rem; 128 | cursor: pointer; 129 | transition: var(--tran3) 130 | } 131 | #header nav > i:hover { 132 | color: var(--secondary-color) 133 | } 134 | /* Drop Down Menu */ 135 | #header nav ul { 136 | height: 0px; 137 | text-align: center; 138 | width: 100%; 139 | position: absolute; 140 | left: 0; 141 | top: 0; 142 | z-index: 100; 143 | background-color: #222831eb; 144 | backdrop-filter: blur(8px);; 145 | overflow: hidden; 146 | transition: var(--tran3) 147 | } 148 | #header nav ul.nav-active { 149 | height: 408.6px; 150 | transition: var(--tran3) 151 | } 152 | #header nav ul > i { 153 | color: #f4511edb; 154 | padding: 20px 20px 8px; 155 | font-size: 2.2rem; 156 | cursor: pointer; 157 | transition: var(--tran3); 158 | } 159 | #header nav ul > i:hover { 160 | color: #f00; 161 | } 162 | #header nav ul a { 163 | font-size: 1.2rem; 164 | color: var(--whiteColor); 165 | display: block; 166 | padding: 10px 0; 167 | transition: var(--tran3) 168 | } 169 | #header li:last-of-type { 170 | font-size: 1rem; 171 | padding: 25px 0 10px; 172 | color: #9d9d9d; 173 | } 174 | #header nav ul a:hover, 175 | #header nav ul a.active-link { 176 | background-color: var(--secondary-color) 177 | } 178 | 179 | /* Home Section */ 180 | #home { 181 | height: calc(100vh - 55px); 182 | min-height: calc(700px - 55px); 183 | max-height: calc(900px); 184 | } 185 | .slider, 186 | .slider .imgs-container, 187 | .slider .imgs-container figure, 188 | .slider figure > img { 189 | width: 100%; 190 | height: 100%; 191 | } 192 | .slider { 193 | position: relative; 194 | overflow: hidden; 195 | } 196 | .slider .imgs-container { 197 | display: flex; 198 | filter: brightness(0.5); 199 | } 200 | .slider .imgs-container figure { 201 | min-width: 100%; 202 | transition: var(--tran3) 203 | } 204 | .slider .imgs-container img { 205 | object-fit: cover; 206 | } 207 | .slider .text { 208 | width: 100%; 209 | position: absolute; 210 | top: 50%; 211 | transform: translateY(-50%); 212 | padding: 0 50px; 213 | text-align: center; 214 | letter-spacing: 0.7px; 215 | color: var(--whiteColor); 216 | } 217 | .slider .text h1 { 218 | font-size: 1.6rem; 219 | line-height: 30px; 220 | margin-bottom: 20px; 221 | } 222 | .slider .text p { 223 | line-height: 20px; 224 | color: #e1e1e1; 225 | } 226 | .slider .text b { 227 | color: var(--whiteColor); 228 | } 229 | .slider > i { 230 | position: absolute; 231 | top: 50%; 232 | transform: translateY(-50%); 233 | color: var(--whiteColor); 234 | font-size: 1.7rem; 235 | padding: 15px 10px; 236 | transition: var(--tran3); 237 | cursor: pointer; 238 | display: none 239 | } 240 | .slider > i:hover { 241 | background: #22283178; 242 | } 243 | .slider > i.fa-chevron-right { 244 | right: 0px 245 | } 246 | .slider > i.fa-chevron-left { 247 | left: 0px 248 | } 249 | .slider .dots { 250 | width: 100%; 251 | display: flex; 252 | justify-content: center; 253 | gap: 10px; 254 | position: absolute; 255 | bottom: 20px 256 | } 257 | .slider .dots li { 258 | width: 10px; 259 | height: 10px; 260 | border: 1px solid var(--whiteColor); 261 | background-color: var(--whiteColor); 262 | border-radius: 50%; 263 | cursor: pointer; 264 | transition: var(--tran3) 265 | } 266 | .slider .dots li.active-dot { 267 | background-color: var(--secondary-color); 268 | width: 22px; 269 | border-radius: 7px; 270 | } 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | /* Prediction Model Section */ 283 | #model { 284 | padding: 60px 0; 285 | background-color: var(--bgColor); 286 | overflow: hidden; 287 | } 288 | .container { 289 | padding-left: 15px; 290 | padding-right: 15px; 291 | margin-left: auto; 292 | margin-right: auto; 293 | } 294 | h1 { 295 | font-size: 1.6rem; 296 | line-height: 30px; 297 | margin-bottom: 10px; 298 | } 299 | p { 300 | color: var(--grayColor); 301 | } 302 | p, 303 | footer p button { 304 | font-size: 1rem; 305 | } 306 | 307 | /* Form */ 308 | #model form { 309 | display: grid; 310 | grid-template-columns: 1fr; 311 | gap: 68px 45px; 312 | } 313 | #model form, #contact form { 314 | max-width: 1050px; 315 | margin: 50px auto 0; 316 | padding: 30px 20px 19px; 317 | border-radius: 6px; 318 | box-shadow: 0px 0px 17px 2px #dbdbdb99; 319 | background-color: var(--whiteColor); 320 | } 321 | label { 322 | font-weight: 600; 323 | } 324 | input:not([type="submit"]), 325 | textarea { 326 | width: 100%; 327 | padding: 12px 8px; 328 | margin-top: 5px; 329 | border: 0.5px solid #6d64645e; 330 | outline: none; 331 | border-radius: 4px; 332 | transition-duration: 0.2s; 333 | font-size: 1rem; 334 | color: #504d4d; 335 | } 336 | input:not([type="submit"]):focus, 337 | textarea:focus { 338 | border-color: #09a53a; 339 | border-style: dashed; 340 | } 341 | input::placeholder, 342 | textarea::placeholder { 343 | font-size: 0.9rem; 344 | color: #9c9b9b; 345 | } 346 | .from-button { 347 | width: 130px; 348 | font-size: 1.2rem; 349 | background-color: #09a53a; 350 | color: var(--whiteColor); 351 | margin-left: auto; 352 | border: none; 353 | padding: 13px 0; 354 | border-radius: 5px; 355 | cursor: pointer; 356 | position: relative; 357 | cursor: pointer; 358 | overflow: hidden; 359 | z-index: 5; 360 | } 361 | .from-button::before { 362 | content: ""; 363 | position: absolute; 364 | left: 50%; 365 | top: 50%; 366 | transform: translate(-50%, -50%); 367 | width: 0; 368 | height: 0; 369 | background-color: #0f7f32; 370 | z-index: -1; 371 | clip-path: circle(50%); 372 | transition-duration: 0.3s; 373 | } 374 | .from-button:hover::before { 375 | width: 300px; 376 | height: 100px; 377 | } 378 | .from-button i { 379 | margin-left: 5px; 380 | } 381 | .from-button:hover i { 382 | animation: rotateIcon 0.4s infinite linear; 383 | } 384 | .from-button:hover p { 385 | display: none; 386 | } 387 | @keyframes rotateIcon { 388 | 50% { 389 | transform: rotate(110deg); 390 | } 391 | 50% { 392 | transform: rotate(90deg); 393 | } 394 | 100% { 395 | transform: rotate(70deg); 396 | } 397 | } 398 | 399 | 400 | /* About Dataset Section */ 401 | #dataset { 402 | padding: 60px 0; 403 | } 404 | #dataset main { 405 | padding-left: 25px; 406 | position: relative; 407 | } 408 | #dataset main::before { 409 | content: ""; 410 | content: ""; 411 | position: absolute; 412 | left: 0; 413 | top: 12px; 414 | width: 0.5px; 415 | height: 96.5%; 416 | background-color: var(--grayColor); 417 | } 418 | #dataset h4 { 419 | font-size: 1.3rem; 420 | margin-bottom: 5px; 421 | } 422 | #dataset .context { 423 | margin-bottom: 45px; 424 | } 425 | #dataset .context, 426 | #dataset .content { 427 | position: relative; 428 | } 429 | #dataset .context:hover::before, 430 | #dataset .content:hover::before { 431 | color: var(--greenColor); 432 | } 433 | #dataset .context::before, 434 | #dataset .content::before { 435 | position: absolute; 436 | content: "\f058"; 437 | font-family: "Font Awesome 5 Free"; 438 | font-size: 24px; 439 | color: var(--mainColor); 440 | left: -36px; 441 | top: 7px; 442 | background: var(--whiteColor); 443 | border-radius: 22px; 444 | font-weight: bold; 445 | transition: var(--tran3) 446 | } 447 | #dataset .context p { 448 | padding-left: 20px; 449 | } 450 | #dataset .content ul { 451 | list-style: disc; 452 | } 453 | #dataset .context p, 454 | #dataset .content ul li { 455 | line-height: 25px; 456 | } 457 | #dataset .content ul li { 458 | margin-left: 50px; 459 | } 460 | .tableContainer { 461 | text-align: center; 462 | } 463 | .table { 464 | height: 500px; 465 | overflow: scroll; 466 | border-radius: 5px; 467 | } 468 | #dataset .tableContainer h4 { 469 | margin-top: 50px; 470 | } 471 | table { 472 | border: thin solid #d7d7d7; 473 | border-collapse: collapse; 474 | width: 100%; 475 | margin-top: 7px 476 | } 477 | .table th, .table td { 478 | border: thin solid #b2b2b2eb; 479 | padding: 3px; 480 | font-size: 0.9rem; 481 | } 482 | .table tr:first-of-type { 483 | position: sticky; 484 | top: -0.5px; 485 | background-color: #d7d7d7; 486 | font-weight: 700; 487 | } 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | /* Team Members Section */ 498 | #members { 499 | padding: 60px 0; 500 | background-color: var(--bgColor); 501 | } 502 | #members .heading { 503 | margin-bottom: 190px; 504 | } 505 | #members main { 506 | display: flex; 507 | justify-content: center; 508 | flex-wrap: wrap; 509 | gap: 130px 30px; 510 | } 511 | #members .card { 512 | width: 100%; 513 | max-width: 350px; 514 | background-color: var(--whiteColor); 515 | border-radius: 10px; 516 | text-align: center; 517 | padding: 100px 0 20px; 518 | position: relative; 519 | transition: 0.5s 520 | } 521 | #members .card:hover { 522 | box-shadow: -1px 3px 15px 0px #6d646452; 523 | } 524 | #members .card img { 525 | width: 160px; 526 | height: 160px; 527 | border-radius: 50%; 528 | border: 8px solid var(--bgColor); 529 | position: absolute; 530 | left: 50%; 531 | top: 0; 532 | transform: translate(-50%, -50%); 533 | outline: 1px dashed var(--mainColor); 534 | object-fit: cover; 535 | } 536 | #members .card h4 { 537 | font-size: 1.4rem 538 | 539 | } 540 | #members .card p { 541 | margin-bottom: 30px; 542 | } 543 | #members .card a { 544 | background-color: #2f5899; 545 | color: var(--whiteColor); 546 | border-radius: 50%; 547 | padding: 1px 12px; 548 | font-size: 1.2rem; 549 | margin-top: 20px; 550 | border: 1px solid #2f5899; 551 | transition: var(--tran3) 552 | } 553 | #members .card a i { 554 | transition: 0.2s 555 | } 556 | #members .card a:hover { 557 | border-color: var(--mainColor); 558 | background-color: transparent; 559 | color: var(--mainColor); 560 | } 561 | #members .card a:hover i { 562 | transform: rotate(360deg) 563 | } 564 | /* Contact Section */ 565 | #contact { 566 | position: relative; 567 | padding-top: 160px; 568 | } 569 | #contact header { 570 | position: relative; 571 | top: -124px 572 | } 573 | #contact img { 574 | width: 45%; 575 | min-width: 250px; 576 | max-width: 500px; 577 | position: absolute; 578 | top: 165px; 579 | left: 50%; 580 | transform: translateX(-50%); 581 | } 582 | #contact form { 583 | display: flex; 584 | flex-wrap: wrap; 585 | gap: 20px; 586 | padding-top: 125px; 587 | } 588 | #contact form input, 589 | #contact form textarea { 590 | width: 100%; 591 | } 592 | 593 | 594 | 595 | 596 | 597 | /* Start Footer */ 598 | footer { 599 | text-align: center; 600 | color: var(--grayColor); 601 | font-size: 1rem; 602 | overflow-x: clip; 603 | padding: 30px 0 15px 0; 604 | } 605 | footer p span, 606 | footer p button { 607 | color: var(--main-color); 608 | font-weight: bold; 609 | } 610 | footer p button { 611 | display: inline-block; 612 | background-color: transparent; 613 | border: none; 614 | outline: none; 615 | margin-left: 8px; 616 | transition: 0.3s linear; 617 | position: relative; 618 | cursor: pointer; 619 | } 620 | footer p button:hover { 621 | color: rgb(0, 213, 255); 622 | } 623 | footer p button::before, 624 | footer p button::after { 625 | position: absolute; 626 | display: none; 627 | z-index: 99; 628 | } 629 | footer p button::before { 630 | content: attr(title); 631 | width: 110px; 632 | height: 25px; 633 | line-height: 25px; 634 | text-align: center; 635 | padding: 5px 0; 636 | border-radius: 5px; 637 | background-color: #000000; 638 | color: var(--whiteColor); 639 | font-weight: normal; 640 | font-size: 1rem; 641 | left: 0; 642 | top: -51px; 643 | } 644 | footer button:last-of-type:before { 645 | width: 150px; 646 | } 647 | footer p button::after { 648 | content: ""; 649 | border: 10px solid transparent; 650 | border-top-color: #000000; 651 | right: 10px; 652 | top: -17px; 653 | } 654 | footer p button:hover::before, 655 | footer p button:hover::after { 656 | display: block; 657 | } 658 | 659 | /* Dark Mode */ 660 | .dark { 661 | position: fixed; 662 | color: var(--mainColor); 663 | right: 62px; 664 | top: 6.3px; 665 | z-index: 9999; 666 | transition: var(--tran3); 667 | } 668 | .dark i { 669 | border-radius: 50%; 670 | cursor: pointer; 671 | background-color: #ffffff96; 672 | padding: 8px 13px; 673 | font-size: 30px; 674 | transition: var(--tran3); 675 | 676 | } 677 | .dark i.fa-sun { 678 | display: none; 679 | } 680 | 681 | 682 | /* Medium devices (tablets, 768px and up) */ 683 | @media (min-width: 768px) { 684 | .container { 685 | width: 750px; 686 | } 687 | .heading h2 { 688 | font-size: 1.7rem; 689 | width: 100% 690 | } 691 | .heading h2:not(#model .heading h2) { 692 | font-size: 2rem; 693 | } 694 | #home h1 { 695 | font-size: 1.8rem; 696 | } 697 | #home p { 698 | font-size: 1.1rem; 699 | } 700 | footer p button { 701 | font-size: 1.1rem; 702 | } 703 | footer p button::after { 704 | right: 50%; 705 | } 706 | form { 707 | grid-template-columns: 1fr 1fr; 708 | grid-template-areas: 709 | "speed speed" 710 | "curve curve" 711 | "dir dir" 712 | "date date" 713 | "btn btn"; 714 | padding: 25px; 715 | } 716 | .form-speed { 717 | grid-area: speed; 718 | } 719 | .form-curve { 720 | grid-area: curve; 721 | } 722 | .form-direction { 723 | grid-area: dir; 724 | } 725 | .form-date { 726 | grid-area: date; 727 | } 728 | .from-button { 729 | grid-area: btn; 730 | } 731 | label { 732 | font-size: 1.1rem; 733 | } 734 | .slider > i { 735 | display: block 736 | } 737 | #dataset .tableContainer h4 { 738 | font-size: 1.5rem; 739 | } 740 | /* Contact Section */ 741 | #contact header { 742 | top: -130px 743 | } 744 | #contact img { 745 | top: 60px; 746 | } 747 | /* Footer */ 748 | footer p button::before, 749 | footer p button::after { 750 | left: 50%; 751 | transform: translateX(-50%); 752 | } 753 | /* Dark Mode */ 754 | .dark { 755 | right: 168px; 756 | } 757 | } 758 | 759 | /* Large devices (laptops, 992px and up) */ 760 | @media (min-width: 992px) { 761 | .container { 762 | width: 970px; 763 | } 764 | /* Header */ 765 | #header .container { 766 | padding-top: 0px; 767 | padding-bottom: 0px; 768 | } 769 | #header nav { 770 | margin-bottom: 0 771 | } 772 | #header nav ul.nav-active { 773 | height: fit-content; 774 | } 775 | #header nav ul > i, 776 | #header nav > i, 777 | #header li:last-of-type { 778 | display: none; 779 | } 780 | #header nav ul { 781 | height: fit-content; 782 | display: flex; 783 | width: fit-content; 784 | position: static; 785 | background-color: transparent; 786 | backdrop-filter: blur(0px); 787 | } 788 | #header nav ul a { 789 | font-size: 1.1rem; 790 | color: var(--mainColor); 791 | padding: 10px; 792 | position: relative; 793 | } 794 | #header nav ul a::before, 795 | #header nav ul a.active-link::before { 796 | content: ""; 797 | position: absolute; 798 | left: 50%; 799 | bottom: 0; 800 | transform: translateX(-50%); 801 | width: 0; 802 | height: 2px; 803 | background-color: var(--secondary-color); 804 | transition: var(--tran3) 805 | } 806 | #header nav ul a:hover, 807 | #header nav ul a.active-link { 808 | background-color: transparent; 809 | color: var(--secondary-color); 810 | } 811 | #header nav ul a:hover::before, 812 | #header nav ul a.active-link::before { 813 | width: 50%; 814 | } 815 | /* Home Section */ 816 | #home { 817 | height: calc(100vh - 53px); 818 | min-height: calc(700px - 53px); 819 | max-height: calc(900px - 53px); 820 | } 821 | /* Landing Section */ 822 | h1 { 823 | font-size: 1.9rem; 824 | } 825 | p, 826 | footer p button { 827 | font-size: 1.2rem; 828 | } 829 | form { 830 | grid-template-columns: 1fr 1fr; 831 | grid-template-areas: 832 | "speed curve" 833 | "dir date" 834 | "btn btn"; 835 | padding: 30px; 836 | } 837 | .table th, .table td { 838 | padding: 6px; 839 | font-size: 1rem; 840 | } 841 | /* Contact Section */ 842 | #contact { 843 | padding-top: 230px; 844 | } 845 | #contact header { 846 | top: -185px 847 | } 848 | #contact form input { 849 | width: calc(50% - (20px / 2)) 850 | } 851 | footer p button::after { 852 | border-width: 12px; 853 | transform: translateX(-50%); 854 | } 855 | #contact img { 856 | top: 81px; 857 | } 858 | /* Dark Mode */ 859 | .dark { 860 | color: #000; 861 | top: 75.3px; 862 | right: 0px; 863 | background: #dadada; 864 | padding: 5px 21px 5px 5px; 865 | border-radius: 31px; 866 | border-top-right-radius: 0; 867 | border-bottom-right-radius: 0; 868 | } 869 | } 870 | 871 | /* X-Large devices (desktops, 1200px and up) */ 872 | @media (min-width: 1200px) { 873 | .container { 874 | width: 1170px; 875 | } 876 | /* Header */ 877 | #header nav ul a { 878 | padding: 10px 15px; 879 | } 880 | /* Home Section */ 881 | #home h1 { 882 | font-size: 2.1rem; 883 | margin-bottom: 35px 884 | } 885 | #home p { 886 | font-size: 1.3rem; 887 | } 888 | footer p button { 889 | font-size: 1.2rem; 890 | } 891 | .from-button { 892 | font-size: 1.1rem; 893 | padding: 12px 0; 894 | } 895 | label { 896 | font-size: 1.2rem; 897 | } 898 | .heading h2 { 899 | font-size: 2rem; 900 | } 901 | .heading h2:not(#model .heading h2) { 902 | font-size: 2.3rem; 903 | } 904 | } 905 | 906 | /* XX-Large devices (larger desktops, 1400px and up) */ 907 | @media (min-width: 1400px) { 908 | .container { 909 | width: 1370px; 910 | } 911 | /* Home Section */ 912 | #home h1 { 913 | font-size: 2.4rem; 914 | } 915 | #home p { 916 | font-size: 1.4rem; 917 | } 918 | .heading h2 { 919 | font-size: 2.2rem; 920 | } 921 | } 922 | 923 | 924 | 925 | 926 | 927 | :root.dark-active { 928 | --mainColor: #ffffff; 929 | --secondary-color: #76ABAE; 930 | --bgColor: #000; 931 | --tran3: 0.3s; 932 | --whiteColor: #000; 933 | --grayColor: #b6b6b6; 934 | --greenColor: #09a53a; 935 | } 936 | :root.dark-active .dark { 937 | /* top: 5.3px; */ 938 | } 939 | :root.dark-active .dark i { 940 | background-color: transparent; 941 | } 942 | :root.dark-active .fa-sun { 943 | display: block; 944 | } 945 | :root.dark-active .fa-moon { 946 | display: none; 947 | } 948 | :root.dark-active #header nav ul a { 949 | color: #fff; 950 | } 951 | :root.dark-active .heading { 952 | color: var(--mainColor) 953 | } 954 | :root.dark-active form { 955 | box-shadow: 0px 0px 17px 2px #1b1b1b !important; 956 | } 957 | :root.dark-active input:not([type="submit"]), 958 | :root.dark-active textarea { 959 | background: #171717; 960 | color: var(--mainColor) 961 | } 962 | :root.dark-active .from-button { 963 | color: var(--mainColor) 964 | } 965 | :root.dark-active #model, 966 | :root.dark-active #members, 967 | :root.dark-active footer { 968 | background: #000000e0; 969 | transition: var(--tran3); 970 | } 971 | :root.dark-active #members .card img { 972 | border: 8px solid #212121; 973 | } 974 | :root.dark-active #members .card a { 975 | color: var(--mainColor); 976 | } 977 | :root.dark-active h1, 978 | :root.dark-active .slider .text b, 979 | :root.dark-active #home i{ 980 | color: var(--mainColor) 981 | } 982 | :root.dark-active .slider .dots li:not(.active-dot) { 983 | background-color: var(--mainColor) 984 | } 985 | :root.dark-active #dataset, 986 | :root.dark-active #contact { 987 | background-color: #000; 988 | transition: var(--tran3); 989 | } 990 | :root.dark-active #contact { 991 | padding-top: 80px; 992 | padding-bottom: 56px; 993 | } 994 | :root.dark-active #contact header { 995 | top: -16px; 996 | } 997 | :root.dark-active #contact img { 998 | display: none; 999 | } 1000 | :root.dark-active #contact form { 1001 | padding-top: 30px; 1002 | background-color: #424242 1003 | } 1004 | :root.dark-active .table tr:first-of-type { 1005 | background-color: #4f4f4f; 1006 | } 1007 | :root.dark-active button:hover::before, 1008 | :root.dark-active footer p button:hover::after { 1009 | color: var(--mainColor) 1010 | } -------------------------------------------------------------------------------- /static/images/bg-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/bg-1.jpg -------------------------------------------------------------------------------- /static/images/bg-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/bg-2.jpg -------------------------------------------------------------------------------- /static/images/bg-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/bg-3.jpg -------------------------------------------------------------------------------- /static/images/bg-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/bg-4.jpg -------------------------------------------------------------------------------- /static/images/bg-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/bg-5.jpg -------------------------------------------------------------------------------- /static/images/contact.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/contact.jpg -------------------------------------------------------------------------------- /static/images/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/logo.jpg -------------------------------------------------------------------------------- /static/images/m-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/m-1.jpg -------------------------------------------------------------------------------- /static/images/m-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/m-4.jpg -------------------------------------------------------------------------------- /static/images/m-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/m-5.jpg -------------------------------------------------------------------------------- /static/images/m-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/m-6.jpg -------------------------------------------------------------------------------- /static/images/m2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/m2.jpeg -------------------------------------------------------------------------------- /static/images/m3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/m3.jpg -------------------------------------------------------------------------------- /static/images/m7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/m7.jpg -------------------------------------------------------------------------------- /static/images/m8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/m8.jpg -------------------------------------------------------------------------------- /static/images/result-img-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/result-img-1.jpg -------------------------------------------------------------------------------- /static/images/result-img-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/result-img-2.jpg -------------------------------------------------------------------------------- /static/images/result-img-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/result-img-3.jpg -------------------------------------------------------------------------------- /static/images/result-img-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/result-img-4.jpg -------------------------------------------------------------------------------- /static/images/result-img-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ahmed-Maher77/Wind-Turbine-Power-Prediction-App-using-Machine-Learning/323f32ef7dc243504c50e42641e834b5a42f4034/static/images/result-img-5.jpg -------------------------------------------------------------------------------- /static/js/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Wind Turbine Power Prediction APP", 3 | "short_name": "Wind Turbine APP", 4 | "start_url": "index.html", 5 | "display": "standalone", 6 | "background_color": "#fdfdfd", 7 | "theme_color": "#db4938", 8 | "orientation": "portrait-primary", 9 | "icons": [ 10 | { 11 | "src": "../images/logo.jpg", 12 | "type": "image/png", 13 | "sizes": "72x72" 14 | }, 15 | { 16 | "src": "../images/logo.jpg", 17 | "type": "image/png", 18 | "sizes": "96x96" 19 | }, 20 | { 21 | "src": "../images/logo.jpg", 22 | "type": "image/png", 23 | "sizes": "128x128" 24 | }, 25 | { 26 | "src": "../images/logo.jpg", 27 | "type": "image/png", 28 | "sizes": "144x144" 29 | } 30 | ] 31 | } -------------------------------------------------------------------------------- /static/js/script.js: -------------------------------------------------------------------------------- 1 | // Prediction Function 2 | function predict() { 3 | // Gather form data 4 | const windSpeed = document.getElementById("wind_speed").value; 5 | const theoreticalPower = document.getElementById("theoretical_power").value; 6 | const windDirection = document.getElementById("wind_direction").value; 7 | const dateTime = document.getElementById("date_time").value; 8 | 9 | // Send form data to Flask endpoint 10 | fetch("/predict", { 11 | method: "POST", 12 | body: JSON.stringify({ 13 | "Wind speed": windSpeed, 14 | "Theoretical power": theoreticalPower, 15 | "Wind direction": windDirection, 16 | "Date/time": dateTime, 17 | }), 18 | headers: { 19 | "Content-Type": "application/json", 20 | }, 21 | }) 22 | .then((response) => response.json()) 23 | .then((data) => { 24 | // Display prediction result 25 | document.getElementById( 26 | "result" 27 | ).innerText = `Prediction: ${data.lv_active_power}`; 28 | }) 29 | .catch((error) => console.error("Error:", error)); 30 | } 31 | 32 | // Navigation and Menu functionality 33 | const burgerIcon = document.querySelector("#header nav > i"), 34 | menuList = document.querySelector("#header nav > i + ul"), 35 | closeMenuBtn = document.querySelector("#header ul > i"), 36 | anchors = document.querySelectorAll("#header li > a"); 37 | 38 | // Toggle menu visibility 39 | document.onclick = function (e) { 40 | if (e.target === burgerIcon) { 41 | menuList.classList.add("nav-active"); 42 | darkDiv.style.display = 'none' 43 | } else if (e.target === closeMenuBtn || e.target !== menuList) { 44 | menuList.classList.remove("nav-active"); 45 | darkDiv.style.display = 'block' 46 | } else { 47 | anchors.forEach((a) => 48 | a === e.target ? menuList.classList.remove("nav-active") : null 49 | ); 50 | } 51 | }; 52 | 53 | // Set active link 54 | anchors.forEach( 55 | (a, i, arr) => 56 | (a.onclick = function () { 57 | arr.forEach((a) => a.classList.remove("active-link")); 58 | a.classList.add("active-link"); 59 | }) 60 | ); 61 | 62 | /* Image Slider functionality */ 63 | const imgs = document.querySelectorAll("#home .imgs-container figure"), 64 | dotsContainer = document.querySelector(".slider .dots"), 65 | dots = document.querySelectorAll(".slider .dots li"); 66 | let activeIndex = 0, 67 | imgsLength = imgs.length, 68 | intervalId; 69 | 70 | // Change image based on index 71 | function changeImage(n = 1) { 72 | if (n > 0 && activeIndex === imgsLength - 1) { 73 | activeIndex = 0; 74 | } else if (n < 0 && activeIndex === 0) { 75 | activeIndex = imgsLength - 1; 76 | } else { 77 | activeIndex += n; 78 | } 79 | updateSlider(); 80 | resetInterval(); 81 | } 82 | 83 | // Function to handle slider navigation via dots 84 | dotsContainer.onclick = function (event) { 85 | dots.forEach((dot, index) => { 86 | if (event.target === dot) { 87 | activeIndex = index; // Set activeIndex to the clicked dot's index 88 | updateSlider(); // Update the slider to the selected image 89 | resetInterval(); 90 | } 91 | }); 92 | }; 93 | 94 | // Update the display of images and active dot 95 | function updateSlider() { 96 | imgs.forEach((pic, index) => { 97 | pic.style.display = activeIndex === index ? "block" : "none"; 98 | }); 99 | dots.forEach((dot, index) => { 100 | dot.classList.toggle("active-dot", activeIndex === index); 101 | }); 102 | } 103 | 104 | // Reset the interval after a manual action 105 | function resetInterval() { 106 | clearInterval(intervalId); 107 | intervalId = setInterval(changeImage, 3000); 108 | } 109 | 110 | // Initial interval setup 111 | intervalId = setInterval(changeImage, 3000); 112 | 113 | // Initial call to display the first image and set the first dot as active 114 | updateSlider(); 115 | 116 | 117 | 118 | // Send email from Javascript 119 | function sendEmail() { 120 | var templateParams = { 121 | name: document.getElementById("name").value, 122 | email: document.getElementById("email").value, 123 | message: document.getElementById("msg").value, 124 | website_url: window.location.href, 125 | }; 126 | const serviceId = "service_unqcncb", 127 | templateId = "template_c2ic16k"; 128 | emailjs.send(serviceId, templateId, templateParams).then( 129 | (response) => { 130 | alert("Your message sent successfully!"); 131 | }, 132 | (error) => { 133 | console.log("FAILED...", error); 134 | } 135 | ); 136 | } 137 | 138 | // Dark Mode 139 | var darkDiv = document.querySelector('.dark'), 140 | darkBtns = document.querySelectorAll('.dark i'), 141 | sunBtn = document.querySelector('.dark .fa-sun'), 142 | moonBtn = document.querySelector('.dark .fa-moon'); 143 | darkDiv.onclick = function(e) { 144 | darkBtns.forEach(btn => { 145 | if (e.target === btn) 146 | if (btn === moonBtn) { 147 | document.documentElement.classList.add('dark-active') 148 | } else if (btn === sunBtn) { 149 | document.documentElement.classList.remove('dark-active') 150 | } 151 | }) 152 | } 153 | 154 | // PWA 155 | if ("serviceWorker" in navigator) { 156 | window.addEventListener("load", function () { 157 | navigator.serviceWorker 158 | .register("/serviceWorker.js") 159 | .then((res) => console.log("service worker registered")) 160 | .catch((err) => console.log("service worker not registered", err)); 161 | }); 162 | } -------------------------------------------------------------------------------- /static/js/service-worker.js: -------------------------------------------------------------------------------- 1 | const windTurbine = "wind-turbine-app-v1"; 2 | const assets = ["/", "/index.html"]; 3 | 4 | self.addEventListener("install", (installEvent) => { 5 | installEvent.waitUntil( 6 | caches.open(windTurbine).then((cache) => { 7 | cache.addAll(assets); 8 | }) 9 | ); 10 | }); 11 | 12 | self.addEventListener("fetch", (fetchEvent) => { 13 | fetchEvent.respondWith( 14 | caches.match(fetchEvent.request).then((res) => { 15 | return res || fetch(fetchEvent.request); 16 | }) 17 | ); 18 | }); 19 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | Predicting Actual Power Generated By Wind Turbines 11 | 12 | 13 | 14 | 20 | 21 | 22 | 23 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | 42 | 43 |
44 | 45 | 62 | 63 | 64 |
65 |
66 |
67 |
68 | Background Image 1 69 |
70 |
71 | Background Image 2 72 |
73 |
74 | Background Image 3 75 |
76 |
77 | Background Image 4 78 |
79 |
80 | Background Image 5 81 |
82 |
83 |
84 |

Predicting Actual Power Generated By Wind Turbines

85 |

Harnessing Renewable Energy with Machine Learning

86 |
87 | 88 | 89 | 96 |
97 |
98 | 99 | 100 |
101 |
102 |
103 |

104 | Predicting Actual Power Generated By Wind Turbines 105 | 110 | 115 |

116 |
117 |
118 |
119 | 120 | 126 |
127 |
128 | 129 | 135 |
136 |
137 | 138 | 144 |
145 |
146 | 147 | 153 |
154 | 157 |
158 |
159 |
160 | 161 | 162 |
163 |
164 |
165 |

166 | About Dataset 167 | 172 | 177 |

178 |
179 |
180 |
181 |

Context:

182 |

In Wind Turbines, Scada Systems measure and save data's like wind speed, wind direction, generated power etc. for 10 minutes intervals. This file was taken from a wind turbine's scada system that is working and generating power in Turkey.

183 |
184 |
185 |

Content:

186 |
    187 | The data's in the file are: 188 |
  • Date/Time (for 10 minutes intervals).
  • 189 |
  • LV ActivePower (kW): The power generated by the turbine for that moment Wind Speed (m/s): The wind speed at the hub height of the turbine (the wind speed that turbine use for electricity generation).
  • 190 |
  • Theoretical Power Curve (kWh): The theoretical power values that the turbine generates with that wind speed which is given by the turbine manufacturer.
  • 191 |
  • Wind Direction (°): The wind direction at the hub height of the turbine (wind turbines turn to this direction automaticly).
  • 192 |
193 |
194 |
195 |
196 |

Examples of Data:

197 |
198 |
Date/TimeLV ActivePower (kW)Wind Speed (m/s)Theoretical_Power_Curve (KWh)Wind Direction (°)
01 01 2018 00:00380.04779055.31133604416.3289078259.9949036
01 01 2018 00:10453.76919565.672166824519.9175111268.6411133
01 01 2018 00:20306.37658695.216036797390.9000158272.5647888
01 01 2018 00:30419.64590455.659674168516.127569271.2580872
01 01 2018 00:40380.65069585.577940941491.702972265.6742859
01 01 2018 00:50402.39199835.604052067499.436385264.5786133
01 01 2018 01:00447.60571295.793007851557.3723633266.1636047
01 01 2018 01:10387.24218755.306049824414.8981788257.9494934
01 01 2018 01:20463.65121465.584629059493.6776521253.4806976
01 01 2018 01:30439.7257085.523228168475.7067828258.7237854
01 01 2018 01:40498.18170175.724115849535.841397251.8509979
01 01 2018 01:50526.81622315.934198856603.0140765265.5046997
01 01 2018 02:00710.58728036.547413826824.6625136274.2329102
01 01 2018 02:10655.19427496.199746132693.4726411266.7331848
01 01 2018 02:20754.76251226.505383015808.0981385266.7604065
01 01 2018 02:30790.17327886.634116173859.4590208270.4931946
01 01 2018 02:40742.98529056.378912926759.4345366266.5932922
01 01 2018 02:50748.22961436.446652889785.2810099265.5718079
01 01 2018 03:00736.64782716.415082932773.1728635261.1586914
01 01 2018 03:10787.24621586.437530994781.7712157257.5602112
01 01 2018 03:20722.86407476.220024109700.7646999255.9264984
01 01 2018 03:30935.03338626.89802599970.7366269250.0128937
01 01 2018 03:401220.6090097.609711171315.048928255.9857025
01 01 2018 03:501053.7719737.2883558271151.265744255.4445953
01 01 2018 04:001493.8079837.9431018831497.583724256.4074097
01 01 2018 04:101724.4880378.3761615751752.199662252.4125977
01 01 2018 04:201636.9350598.236957551668.470707247.9794006
01 01 2018 04:301385.4880377.8795909881461.815791238.6096039
01 01 2018 04:401098.9320077.1013760571062.285034245.0955963
01 01 2018 04:501021.4580086.955307007995.9958546245.410202
01 01 2018 05:001164.8929447.0982980731060.859712235.2279053
01 01 2018 05:101073.3320316.953630924995.2509608242.8726959
01 01 2018 05:201165.3079837.2495779991132.416861244.8356934
01 01 2018 05:301177.989997.2946910861154.365305242.4815979
01 01 2018 05:401170.5360117.3763699531194.843099247.9772034
01 01 2018 05:501145.5360117.4485540391231.430706249.6829987
01 01 2018 06:001114.0269787.239252091127.433206248.401001
01 01 2018 06:101153.1850597.3292112351171.355044244.6217041
01 01 2018 06:201125.3310557.1397051811080.139085244.6318054
01 01 2018 06:301228.7320567.4742288591244.633534245.7859955
01 01 2018 06:401021.793037.0331740381030.992686248.6522064
01 01 2018 06:50957.37817386.886455059965.6833344244.6116943
01 01 2018 07:00909.88781746.887821198966.2791049235.8482971
01 01 2018 07:101000.9539797.2164320951116.471899232.8426971
01 01 2018 07:201024.4780277.0685977941047.170231229.933197
01 01 2018 07:301009.5339976.938295841988.4519407230.1367035
01 01 2018 07:40899.4929816.536687851820.4166586234.9338074
01 01 2018 07:50725.11010746.180624962686.6369422232.8379059
01 01 2018 08:00585.25939945.816825867564.9276595240.3287964
01 01 2018 08:10443.91390995.450150967454.7735871238.126297
01 01 2018 08:20565.25378425.81814909565.3490932235.800293
01 01 2018 08:30644.03778086.130272865668.8235693224.9586945
01 01 2018 08:40712.05889896.347077847747.4606734216.803894
01 01 2018 08:50737.39477546.347436905747.5951091205.7852936
01 01 2018 09:00725.8681036.194368839691.5463343199.8484955
01 01 2018 09:10408.9974064.977198124330.4176304207.9978027
01 01 2018 09:20628.43682865.959111214611.2838365210.954895
01 01 2018 09:30716.10058596.21137619697.6494744215.6940002
01 01 2018 09:40711.49560556.111453056662.235163220.8426056
01 01 2018 09:50838.15191656.456322193789.0114224237.0653076
01 01 2018 10:00881.06207286.666657925872.7396259235.6674957
01 01 2018 10:10663.7031256.16287899680.3278917229.3296967
01 01 2018 10:20578.26159676.013167858628.4425608234.9006042
01 01 2018 10:30465.62008675.561203003486.7795676230.4228058
01 01 2018 10:40311.05090334.960731983326.4110254229.5375061
01 01 2018 10:50230.05549624.60387516244.3162442231.7984924
01 01 2018 11:00233.99060064.554533958233.6327805234.1056061
01 01 2018 11:10175.59219364.26362896173.5736631228.7767029
01 01 2018 11:20118.13310243.894139051108.5712211227.9389954
01 01 2018 11:30142.20249944.038761139130.2299896224.4649963
01 01 2018 11:40212.56619264.505650997223.1967841224.9505005
01 01 2018 11:50222.61000064.543397903231.2425073229.127594
01 01 2018 12:00194.18119814.323760986185.5984796227.0399933
01 01 2018 12:1082.640747073.63443708468.5028198230.3146057
01 01 2018 12:2075.89521793.70551204778.39616535233.9532928
01 01 2018 12:3041.947238923.25396829.28695563233.0659027
01 01 2018 12:40118.53459933.77513694888.87136533227.7534943
01 01 2018 12:50250.75590524.693500996264.1192574229.8966064
01 01 2018 13:00346.86441045.002939224336.7219982235.2794952
01 01 2018 13:10416.41790775.364749908430.921089235.5852966
01 01 2018 13:20331.94149785.016181946339.9849402229.9429016
01 01 2018 13:30583.47991945.970407963615.0556308235.6952972
01 01 2018 13:40776.55267336.655520916868.1808449241.4573975
01 01 2018 13:50752.72637946.600903988846.0294095242.7821045
01 01 2018 14:00589.07312015.981378078618.7314427234.9844055
01 01 2018 14:101109.1280527.4245939251219.199787235.1472931
01 01 2018 14:201482.4599618.1864519121638.508909238.4790955
01 01 2018 14:301523.4300548.274931691.147039237.0332031
01 01 2018 14:401572.1700448.4492025381796.76309238.3323975
01 01 2018 14:501698.9399418.5759744641875.047197235.6414032
01 01 2018 15:001616.8459478.2822599411695.538777236.4613953
01 01 2018 15:101796.8239758.7345523831974.4758234.3547974
01 01 2018 15:201885.8609628.7641038891993.170712231.0016022
01 01 2018 15:302327.5119639.6694316862568.827129227.6000977
01 01 2018 15:402499.16210910.141090392876.753616227.7315979
01 01 2018 15:502820.51293910.772419933186.029883225.2763977
01 01 2018 16:002812.27905310.647520073133.259224224.680603
01 01 2018 16:102530.4470219.9826612472781.274041225.5195007
01 01 2018 16:202399.1210949.8743858342711.492458227.2738037
01 01 2018 16:302335.5878919.7854795462651.341009229.2554932
01 01 2018 16:402341.1330579.6142320632527.945451230.7368927
01 01 2018 16:502391.84799.6185045242531.14794229.490799
01 01 2018 17:002118.3898939.0986833572207.79282223.960907
01 01 2018 17:101866.8459478.6774253851938.478601219.7937012
01 01 2018 17:201865.6190198.7748985292000.011716219.0449066
01 01 2018 17:301862.4479988.6899814611946.373955215.3352051
01 01 2018 17:401884.1190198.6310739521909.416256216.2799988
01 01 2018 17:501855.7769788.6145696641899.100734214.5290985
01 01 2018 18:001958.1330579.218843462285.917032212.1799011
01 01 2018 18:102228.2429210.049519542822.50949210.3085938
01 01 2018 18:202529.29101610.318710332974.866796210.5881042
01 01 2018 18:302788.2570810.766759873183.72246207.4813995
01 01 2018 18:402692.92993210.558250433093.110672208.5518951
01 01 2018 18:502535.35302710.250720022938.394607208.0106964
01 01 2018 19:002584.66503910.464770323048.823833205.7528992
01 01 2018 19:102960.18310511.390780453393.645541200.6542969
01 01 2018 19:203062.97802711.565540313437.597135198.1242981
01 01 2018 19:303024.3920911.28024963362.668742198.5381927
01 01 2018 19:403187.972911.336779593378.826271200.4904022
01 01 2018 19:503387.22802711.804639823488.248491199.2469025
01 01 2018 20:003209.01806611.36353973386.244486199.8054962
01 01 2018 20:103272.66503911.632590293452.881108198.2677002
01 01 2018 20:203209.69897511.444760323407.867876195.6320038
01 01 2018 20:303134.51806611.271900183360.225775196.6611023
01 01 2018 20:402977.82495111.059009553292.880925196.5158997
01 01 2018 20:503431.77294912.103779793537.173706198.2570038
01 01 2018 21:003604.20996112.928139693597.469467201.5825958
01 01 2018 21:103601.32788113.319419863600201.9421997
01 01 2018 21:203604.42602513.121520043600203.5077972
01 01 2018 21:303604.39111313.235449793600202.6929932
01 01 2018 21:403604.33789113.235899933600202.9362946
01 01 2018 21:503554.68798813.029560093600201.2539063
01 01 2018 22:003479.40795912.963939673597.794635201.3408966
01 01 2018 22:103472.33300812.902950293597.13106200.9795074
01 01 2018 22:203491.51098612.766340263593.704942200.9960022
01 01 2018 22:303536.98901412.898349763597.059449200.5142059
01 01 2018 22:403528.65893612.742110253592.814313202.8952942
01 01 2018 22:503581.54003912.318260193562.990095202.841095
01 01 2018 23:003570.07910212.418809893572.556143202.4118042
01 01 2018 23:103597.60400412.542989733582.204643201.6253052
01 01 2018 23:203441.02587912.675999643589.945634199.3220978
01 01 2018 23:303373.96997113.003049853600197.1307068
01 01 2018 23:403369.81298813.297670363600196.4936066
01 01 2018 23:503375.90307612.844059943595.984792195.3150024
2/1/183377.64990212.705389983591.300461196.0422058
2/1/183374.42309612.18336013547.627655197.7438965
2/1/183401.08105512.205140113550.307222196.8088074
2/1/183469.41210912.601880073585.959181193.8157043
2/1/183511.80908212.844550133595.996394194.3466034
2/1/183536.75903312.497059823578.911555196.009201
2/1/183467.80810512.096070293536.105139197.9526978
2/1/183460.67700212.196120263549.206917201.330307
2/1/183589.44311512.550350193582.702554201.1882019
2/1/183527.71899412.61567023586.762967202.6235962
2/1/183561.2670913.102780343600201.7666016
2/1/183604.06811513.687749863600199.0195007
2/1/183604.17602514.102419853600196.2552032
2/1/183593.20092814.393309593600195.8798981
2/1/183493.82104514.079549793600197.6403046
2/1/183470.70190414.054400443600197.2447968
2/1/183436.61010713.512470253600195.9954071
2/1/183401.45507813.710049633600192.4197998
2/1/183395.2329113.74232963600191.0137024
2/1/183417.50390613.141860013600192.2046967
2/1/183465.10888712.867710113596.50506192.771698
2/1/183467.41796912.847270013596.060138192.4705048
2/1/183522.40698212.732110023592.421666192.5679016
2/1/183510.1079112.516200073580.322941194.9992065
2/1/183513.84497112.598660473585.767414196.0422974
2/1/183564.00805713.230319983600196.4087982
2/1/183475.27807613.09467033600198.5249939
2/1/183561.99096712.916879653597.329407198.0101013
2/1/183521.55493212.633549693587.762741197.6634979
2/1/183493.6079112.825670243595.524457201.1040955
2/1/183555.30493212.541620253582.111096200.3634033
2/1/183377.1279312.104969983537.337786196.9826965
2/1/183479.62695312.362500193567.394707199.798996
2/1/183539.11206112.603910453586.079315201.2702942
2/1/183430.43603512.212220193551.161616198.9846039
2/1/183301.91796911.987620353520.011831202.5711975
2/1/183235.54394511.679329873463.031603200.7035065
2/1/183519.02294912.469719893576.798254197.8733978
2/1/183469.53710912.494899753578.748756201.1011047
2/1/183296.18603511.789830213485.417643200.3565979
2/1/183045.5100110.903550153237.314957199.4629059
2/1/183444.74194312.188079833548.214895202.7460022
2/1/183417.74609411.978130343518.508247199.4022064
2/1/182807.61303710.674469953144.977295197.2297058
2/1/182493.3930669.696646692588.59196200.3191986
2/1/183215.19604511.417590143400.782508200.488205
2/1/183589.59008812.689270023590.573175199.5281067
2/1/183599.14990213.058600433600200.6078033
2/1/183375.17700211.520819663426.922472195.8547058
2/1/183346.98095711.512310033424.84719197.7467041
2/1/183567.96704112.416299823572.336603199.1638031
2/1/183519.26489312.160149573544.686608198.3968964
2/1/183485.19189511.671079643461.269666194.6569977
2/1/183145.56298811.145859723321.545696195.8325043
2/1/182978.31005910.772899633186.225079193.1703949
2/1/183179.00805710.929759983247.07462195.0997009
2/1/183461.58105512.140060423542.069502198.2947998
2/1/183082.54907211.195560463337.205225200.7570038
2/1/183493.65795912.948690413597.678446204.0805969
2/1/183601.04589814.879429823600197.5942993
2/1/183597.56494115.124059683600196.3455963
2/1/183602.17211916.293670653600196.8367004
2/1/183601.9929216.123979573600192.2306061
2/1/183600.79101615.274600033600190.949295
2/1/183590.7513.566720013600192.9456024
2/1/183601.84594715.367799763600194.7528076
2/1/183601.87011715.861749653600195.0402985
2/1/183591.65502914.920510293600197.9895935
2/1/183579.02490213.608530043600201.4945068
2/1/183598.13110414.463859563600200.4884033
2/1/183525.33300812.688289643590.527705202.2259979
2/1/183560.69995113.556900023600202.153595
2/1/183537.67602513.322810173600203.2893982
2/1/183491.29101612.607009893586.261512201.0937042
2/1/183530.76611312.314760213562.628404197.5440979
2/1/182915.83911110.38018993006.71767200.9197998
2/1/182178.6589369.117029192219.691985201.0245056
2/1/182244.4121099.2531909942308.322526198.9759979
2/1/181278.895029.0723066332190.704763198.2364044
2/1/182832.93408210.344630242988.424599196.6472015
2/1/183205.972911.103309633307.71074200.1464996
2/1/183149.28491211.069109923296.300642198.8968048
2/1/183273.65600611.325810433375.742901201.1446075
2/1/183114.09912111.015139583277.761152204.9272003
2/1/183111.06005910.907259943238.706158204.813797
2/1/183361.01196311.769410133481.44923209.778595
2/1/183421.41992211.874830253501.130346209.6006012
2/1/183520.14892612.169260033545.851555208.3181
2/1/183589.42700212.820619583595.389466211.1817932
2/1/183495.11596712.571619993584.095307209.4647064
2/1/183298.76196311.399299623395.929165205.625
2/1/182894.44091810.545430183087.174334200.6107025
2/1/183486.62890612.309329993562.063389202.0561981
2/1/183455.2470712.16831973545.731948203.7207031
2/1/183556.78588912.287079813559.699203204.6085968
2/1/183375.58203112.013190273523.986209201.7415009
2/1/183493.97900412.213529593551.318734201.7156067
2/1/183549.14794912.937740333597.57459199.9685059
2/1/183483.31591813.669420243600203.870697
2/1/183589.85888713.697859763600204.8023071
2/1/183584.23510712.758359913593.421089202.6508026
2/1/183599.00805712.765179633593.664238201.2570953
2/1/183602.63793913.077219963600203.4407043
2/1/183550.56396512.593409543585.451317205.1535034
2/1/183552.78295912.513669973580.139581205.008194
2/1/183585.01098612.534399993581.613183204.1203003
2/1/183421.17602511.964429863516.3102201.9989014
2/1/183406.04003911.945770263513.264349194.3786926
2/1/183515.61010712.207079893550.542117189.5238037
2/1/183515.96508812.27515033558.399068190.5794983
2/1/183475.41894512.722640043592.036307187.6125031
2/1/183471.15698212.265370373557.31619189.4371948
2/1/183281.75488311.703689583468.159913192.2619019
2/1/182955.1149910.963529593259.412905190.4571991
2/1/183061.73510711.297969823367.805139192.8582001
2/1/182679.11010710.665949823141.292611194.0843964
2/1/182721.08105510.83329013210.350601195.2017975
2/1/182649.13696310.578370093102.339998195.3432007
2/1/182707.7429210.388540273010.962279201.797699
2/1/182508.83203110.080419542841.099422204.2073975
2/1/182316.6479499.8387384412687.688082199.747406
2/1/183081.54296911.439999583406.637064200.2402954
2/1/183397.63891611.944029813512.977172201.1663971
2/1/183391.71606411.859290123498.353994201.7106018
2/1/183587.51098612.811479573595.135782201.3484955
2/1/183603.11206112.913539893597.284381201.6768951
2/1/183591.09301812.728320123592.269026202.4132996
2/1/183221.04492211.663579943459.656972202.6618958
2/1/182887.73388711.09523013305.038612204.061203
2/1/182364.53491210.160949712888.183469203.3379059
2/1/181935.8470469.2024154662275.211448197.8013
2/1/181549.4809578.5392847061852.273851195.5061035
2/1/181625.7559818.8091411592021.754239187.4846039
2/1/181994.2220469.6084604262523.60898188.0238953
2/1/1823629.8449239732691.848533190.6604004
2/1/182097.7719739.3386707312364.198743196.7335968
2/1/181564.5909428.4249162671781.899877197.0158997
2/1/181107.4749767.6562337881339.713949188.6903992
2/1/181303.1169438.1445817951613.847713181.6596069
2/1/181561.1820078.547137261857.140175173.5366974
2/1/181544.9990238.3818044661755.627598171.3834076
2/1/181456.7380377.8504490851445.553534179.8197937
2/1/181795.6440438.6565513611925.374082188.2382965
2/1/182773.29101610.923119543244.617174179.039093
3/1/182782.56811510.40511993019.332696176.9255981
3/1/182446.4240729.4981307982468.761378174.677002
3/1/183412.3920911.930250173510.684928180.6725006
3/1/183255.33789111.076290133298.717792183.8755035
3/1/182796.87695310.457880023045.466801192.1911011
3/1/182467.9541029.7911491392655.255241197.104599
3/1/181278.8869637.6264867781323.911052202.940506
3/1/181042.5379647.2876358031150.913828207.3871002
3/1/18609.07617196.228209019703.7205269216.9989014
3/1/18175.44070434.47162199216.0170723222.5090942
3/1/18112.11090094.127829075147.1041396215.4514008
3/1/18271.91711435.032844067344.1094784202.5102997
3/1/18737.44879156.267045021717.8434981211.2003021
3/1/181375.5799567.7633371351397.52319193.6107025
3/1/181520.8900158.219552041658.119112172.135498
3/1/181349.1120617.9748888021515.649475168.3569031
3/1/18889.12982186.794364929926.0444806171.1295013
3/1/18412.1155095.536108017479.4472407162.7037964
3/1/18444.60360725.491714954466.6197137150.2816925
3/1/18655.73071296.076754093650.187023149.6408997
3/1/18882.56542976.69093895882.7282325152.2225037
3/1/18998.38458256.848011971949.0116113157.1643066
3/1/181193.3959967.7593841551395.364787152.699707
3/1/181122.7120367.4176268581215.659509152.076004
3/1/181214.1259777.4722261431243.600054154.7837982
3/1/181086.3070077.0807728771052.768027160.2183075
3/1/181060.6030277.0537219051040.356847165.8153992
3/1/181451.7139897.7663149831399.150382170.8444977
3/1/181361.4599617.8332462311435.998878173.0240936
3/1/181490.5699467.9593009951506.776853173.9763947
3/1/181153.1390387.2837429051149.012424176.7931976
3/1/18953.97601327.0012521741016.552582178.0930023
3/1/18799.08569346.758135796910.7282546174.0330048
3/1/18616.25482186.179992199686.4114027167.9960022
3/1/18646.92449956.301719189730.5901706168.8119965
3/1/181323.6820077.5177769661267.134969184.7017975
3/1/181568.8859868.0942029951584.395551194.0092926
3/1/181580.9029547.8549537661448.061049197.8014984
3/1/181495.1800547.7194681171373.675076191.2086945
3/1/182063.8688968.8479013442046.438946195.0639038
3/1/182368.760019.6310195922540.491731198.074707
3/1/182516.4199229.7676649092638.971731191.838501
3/1/182108.7709969.1850042342263.873095190.0070038
3/1/182568.1110849.9276504522746.29034179.3226929
3/1/183445.21997112.032759673526.952507175.9355011
3/1/182994.10693410.873089793225.769174180.7583008
3/1/182594.93701210.380610473006.931915177.4212036
3/1/182326.82592810.343020442987.588083164.6313934
3/1/181941.4639899.2837915422328.307526157.3659973
3/1/181581.4870618.2639513021684.577838151.1777039
3/1/181013.2869877.1610770231090.179344144.4230042
3/1/18375.61761475.502151966469.6191644145.3318024
3/1/18198.15119934.645584106253.4672425155.7653046
3/1/1887.440452583.847867012100.642022162.271698
3/1/18189.13780214.553710938233.4558636148.0536041
3/1/18434.43179325.735952854539.5070619136.6712036
3/1/18336.50079355.057969093350.3694191139.4640045
3/1/18296.61010744.922440052317.1718028141.7938995
3/1/1892.92400363.82135009896.25248176148.5747986
3/1/1885.702301033.58084106461.57702143165.8957062
3/1/18309.51141364.716145039269.2057367187.6051941
3/1/18381.17260745.080855846356.114453188.4362946
3/1/18417.26629645.343267918425.0226087202.2389984
3/1/18446.3438115.452712059455.4989836201.0330963
3/1/18206.60209664.29698801180.2207304191.4851074
3/1/18251.37570194.736260891273.7530825183.4333954
3/1/18275.01361084.780562878283.8646662187.9405975
3/1/18314.27441414.894141197310.4131199180.8480072
3/1/18238.78230294.487487793219.355975185.8578033
3/1/18409.02648935.314783096417.2631565180.8168945
3/1/18506.47030645.711400986531.9193571186.1788025
3/1/18427.95669565.374886036433.7182755196.3742065
3/1/18952.26757816.895505905969.6346499193.9367065
3/1/181019.9050297.2409210211128.237686187.7236023
3/1/181015.3579716.709988117890.6123118185.273407
3/1/18979.72290046.851963043950.7168123183.7971039
3/1/18379.40789795.078312874355.4740901185.1383972
3/1/18841.59777836.521288872814.34348189.263504
3/1/18672.61877446.171179771683.2747912189.2765045
3/1/18452.07861335.449243069454.5165791190.636795
3/1/18558.99792485.851128101575.9105762196.9326935
3/1/18331.71929935.094088078359.454764193.4658051
3/1/18212.10069274.598594189243.1654974197.9337006
3/1/1879.721023563.62970209167.87244481199.7156067
3/1/18183.01280214.472650051216.232972205.3706055
3/1/18279.19601444.918616772316.2552558204.3323059
3/1/18460.21661385.625835896505.9378767209.3771057
3/1/18647.71112066.316774845736.1652234211.6537018
3/1/18685.07800296.237164974706.9630418212.0509033
3/1/18709.83398446.449378014786.3313199211.607605
3/1/18493.35559085.782717228554.1258994212.3511047
3/1/18366.07931525.346119881425.803377216.8318024
3/1/18183.03790284.379333019196.8860292220.0410004
3/1/187.3476791383.01137089716.3742125238.6905975
3/1/1803.74330711483.98626485245.0682068
3/1/1812.344200133.2462520628.73127208238.0765076
3/1/18-0.3930675982.1858880520238.4102936
3/1/1802.1420159340234.7624054
3/1/1802.5014059540223.3088074
3/1/1802.6685779090226.0516968
3/1/1803.03400301917.18059304221.0865021
199 |
200 |
201 |
202 |
203 | 204 | 205 |
206 |
207 |
208 |

209 | Team Members 210 | 215 | 220 |

221 |
222 |
223 |
224 | Front-End Developer 225 | 226 |

Ahmed Maher

227 |

Front-End Developer

228 | 229 | 230 | 231 |
232 |
233 |
234 | ML Ops/Data Engineer 235 | 236 |

Youssif Shaaban

237 |

ML Ops/Data Engineer

238 | 239 | 240 | 241 |
242 |
243 |
244 | Data Scientist 245 | 246 |

Ahmed Waheed

247 |

Data Scientist

248 | 249 | 250 | 251 |
252 |
253 |
254 | Data Scientist 255 | 256 |

Mohamed Ehab

257 |

Data Scientist

258 | 259 | 260 | 261 |
262 |
263 |
264 | AI Engineer 265 | 266 |

Mina Farid

267 |

AI Engineer

268 | 269 | 270 | 271 |
272 |
273 |
274 | Front End Developer 275 | 276 |

Peter Nabil

277 |

Software Developer

278 | 279 | 280 | 281 |
282 |
283 |
284 | Back-End Engineer 285 | 286 |

Mahmoud Elspaiy

287 |

Software Developer

288 | 289 | 290 | 291 |
292 |
293 |
294 | Embedded Software Engineer 295 | 296 |

Mohamed Khedr

297 |

Embedded Software Engineer

298 | 299 | 300 | 301 |
302 |
303 |
304 |
305 |
306 | 307 | 308 |
309 |
310 |
311 |

312 | Get In Touch 313 | 318 | 323 |

324 |
325 | Contact 326 |
327 | 328 | 329 | 330 | 331 |
332 |
333 |
334 | 335 | 336 | 343 | 344 | 345 | 348 | 355 | 356 | 357 | 358 | 359 | -------------------------------------------------------------------------------- /templates/result.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 14 | Wind Power Prediction Result 15 | 16 | 17 | 18 | 24 | 135 | 136 | 137 |
138 |
139 | Wind Turbine 1 143 | Wind Turbine 2 147 | Wind Turbine 3 151 | Wind Turbine 4 155 | Wind Turbine 5 159 |
160 |
161 |
162 | 166 |

Wind Power Prediction Result

167 |

LV Active Power is: {{ lv_active_power }}

168 |
169 | 170 | 182 | 183 | 184 | --------------------------------------------------------------------------------