Predicting Actual Power Generated By Wind Turbines
85 |Harnessing Renewable Energy with Machine Learning
86 |├── .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) LinkedIn
42 | - Ahmed Waheed
LinkedIn
43 | - Youssif Qzamel
LinkedIn
44 | - Mohamed Ehab
LinkedIn
45 | - Mina Farid
LinkedIn
46 | - Mohamed Khedr
LinkedIn
47 | - Peter Nabil
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 |
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 |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 |Date/Time | LV ActivePower (kW) | Wind Speed (m/s) | Theoretical_Power_Curve (KWh) | Wind Direction (°) |
01 01 2018 00:00 | 380.0477905 | 5.31133604 | 416.3289078 | 259.9949036 |
01 01 2018 00:10 | 453.7691956 | 5.672166824 | 519.9175111 | 268.6411133 |
01 01 2018 00:20 | 306.3765869 | 5.216036797 | 390.9000158 | 272.5647888 |
01 01 2018 00:30 | 419.6459045 | 5.659674168 | 516.127569 | 271.2580872 |
01 01 2018 00:40 | 380.6506958 | 5.577940941 | 491.702972 | 265.6742859 |
01 01 2018 00:50 | 402.3919983 | 5.604052067 | 499.436385 | 264.5786133 |
01 01 2018 01:00 | 447.6057129 | 5.793007851 | 557.3723633 | 266.1636047 |
01 01 2018 01:10 | 387.2421875 | 5.306049824 | 414.8981788 | 257.9494934 |
01 01 2018 01:20 | 463.6512146 | 5.584629059 | 493.6776521 | 253.4806976 |
01 01 2018 01:30 | 439.725708 | 5.523228168 | 475.7067828 | 258.7237854 |
01 01 2018 01:40 | 498.1817017 | 5.724115849 | 535.841397 | 251.8509979 |
01 01 2018 01:50 | 526.8162231 | 5.934198856 | 603.0140765 | 265.5046997 |
01 01 2018 02:00 | 710.5872803 | 6.547413826 | 824.6625136 | 274.2329102 |
01 01 2018 02:10 | 655.1942749 | 6.199746132 | 693.4726411 | 266.7331848 |
01 01 2018 02:20 | 754.7625122 | 6.505383015 | 808.0981385 | 266.7604065 |
01 01 2018 02:30 | 790.1732788 | 6.634116173 | 859.4590208 | 270.4931946 |
01 01 2018 02:40 | 742.9852905 | 6.378912926 | 759.4345366 | 266.5932922 |
01 01 2018 02:50 | 748.2296143 | 6.446652889 | 785.2810099 | 265.5718079 |
01 01 2018 03:00 | 736.6478271 | 6.415082932 | 773.1728635 | 261.1586914 |
01 01 2018 03:10 | 787.2462158 | 6.437530994 | 781.7712157 | 257.5602112 |
01 01 2018 03:20 | 722.8640747 | 6.220024109 | 700.7646999 | 255.9264984 |
01 01 2018 03:30 | 935.0333862 | 6.89802599 | 970.7366269 | 250.0128937 |
01 01 2018 03:40 | 1220.609009 | 7.60971117 | 1315.048928 | 255.9857025 |
01 01 2018 03:50 | 1053.771973 | 7.288355827 | 1151.265744 | 255.4445953 |
01 01 2018 04:00 | 1493.807983 | 7.943101883 | 1497.583724 | 256.4074097 |
01 01 2018 04:10 | 1724.488037 | 8.376161575 | 1752.199662 | 252.4125977 |
01 01 2018 04:20 | 1636.935059 | 8.23695755 | 1668.470707 | 247.9794006 |
01 01 2018 04:30 | 1385.488037 | 7.879590988 | 1461.815791 | 238.6096039 |
01 01 2018 04:40 | 1098.932007 | 7.101376057 | 1062.285034 | 245.0955963 |
01 01 2018 04:50 | 1021.458008 | 6.955307007 | 995.9958546 | 245.410202 |
01 01 2018 05:00 | 1164.892944 | 7.098298073 | 1060.859712 | 235.2279053 |
01 01 2018 05:10 | 1073.332031 | 6.953630924 | 995.2509608 | 242.8726959 |
01 01 2018 05:20 | 1165.307983 | 7.249577999 | 1132.416861 | 244.8356934 |
01 01 2018 05:30 | 1177.98999 | 7.294691086 | 1154.365305 | 242.4815979 |
01 01 2018 05:40 | 1170.536011 | 7.376369953 | 1194.843099 | 247.9772034 |
01 01 2018 05:50 | 1145.536011 | 7.448554039 | 1231.430706 | 249.6829987 |
01 01 2018 06:00 | 1114.026978 | 7.23925209 | 1127.433206 | 248.401001 |
01 01 2018 06:10 | 1153.185059 | 7.329211235 | 1171.355044 | 244.6217041 |
01 01 2018 06:20 | 1125.331055 | 7.139705181 | 1080.139085 | 244.6318054 |
01 01 2018 06:30 | 1228.732056 | 7.474228859 | 1244.633534 | 245.7859955 |
01 01 2018 06:40 | 1021.79303 | 7.033174038 | 1030.992686 | 248.6522064 |
01 01 2018 06:50 | 957.3781738 | 6.886455059 | 965.6833344 | 244.6116943 |
01 01 2018 07:00 | 909.8878174 | 6.887821198 | 966.2791049 | 235.8482971 |
01 01 2018 07:10 | 1000.953979 | 7.216432095 | 1116.471899 | 232.8426971 |
01 01 2018 07:20 | 1024.478027 | 7.068597794 | 1047.170231 | 229.933197 |
01 01 2018 07:30 | 1009.533997 | 6.938295841 | 988.4519407 | 230.1367035 |
01 01 2018 07:40 | 899.492981 | 6.536687851 | 820.4166586 | 234.9338074 |
01 01 2018 07:50 | 725.1101074 | 6.180624962 | 686.6369422 | 232.8379059 |
01 01 2018 08:00 | 585.2593994 | 5.816825867 | 564.9276595 | 240.3287964 |
01 01 2018 08:10 | 443.9139099 | 5.450150967 | 454.7735871 | 238.126297 |
01 01 2018 08:20 | 565.2537842 | 5.81814909 | 565.3490932 | 235.800293 |
01 01 2018 08:30 | 644.0377808 | 6.130272865 | 668.8235693 | 224.9586945 |
01 01 2018 08:40 | 712.0588989 | 6.347077847 | 747.4606734 | 216.803894 |
01 01 2018 08:50 | 737.3947754 | 6.347436905 | 747.5951091 | 205.7852936 |
01 01 2018 09:00 | 725.868103 | 6.194368839 | 691.5463343 | 199.8484955 |
01 01 2018 09:10 | 408.997406 | 4.977198124 | 330.4176304 | 207.9978027 |
01 01 2018 09:20 | 628.4368286 | 5.959111214 | 611.2838365 | 210.954895 |
01 01 2018 09:30 | 716.1005859 | 6.21137619 | 697.6494744 | 215.6940002 |
01 01 2018 09:40 | 711.4956055 | 6.111453056 | 662.235163 | 220.8426056 |
01 01 2018 09:50 | 838.1519165 | 6.456322193 | 789.0114224 | 237.0653076 |
01 01 2018 10:00 | 881.0620728 | 6.666657925 | 872.7396259 | 235.6674957 |
01 01 2018 10:10 | 663.703125 | 6.16287899 | 680.3278917 | 229.3296967 |
01 01 2018 10:20 | 578.2615967 | 6.013167858 | 628.4425608 | 234.9006042 |
01 01 2018 10:30 | 465.6200867 | 5.561203003 | 486.7795676 | 230.4228058 |
01 01 2018 10:40 | 311.0509033 | 4.960731983 | 326.4110254 | 229.5375061 |
01 01 2018 10:50 | 230.0554962 | 4.60387516 | 244.3162442 | 231.7984924 |
01 01 2018 11:00 | 233.9906006 | 4.554533958 | 233.6327805 | 234.1056061 |
01 01 2018 11:10 | 175.5921936 | 4.26362896 | 173.5736631 | 228.7767029 |
01 01 2018 11:20 | 118.1331024 | 3.894139051 | 108.5712211 | 227.9389954 |
01 01 2018 11:30 | 142.2024994 | 4.038761139 | 130.2299896 | 224.4649963 |
01 01 2018 11:40 | 212.5661926 | 4.505650997 | 223.1967841 | 224.9505005 |
01 01 2018 11:50 | 222.6100006 | 4.543397903 | 231.2425073 | 229.127594 |
01 01 2018 12:00 | 194.1811981 | 4.323760986 | 185.5984796 | 227.0399933 |
01 01 2018 12:10 | 82.64074707 | 3.634437084 | 68.5028198 | 230.3146057 |
01 01 2018 12:20 | 75.8952179 | 3.705512047 | 78.39616535 | 233.9532928 |
01 01 2018 12:30 | 41.94723892 | 3.253968 | 29.28695563 | 233.0659027 |
01 01 2018 12:40 | 118.5345993 | 3.775136948 | 88.87136533 | 227.7534943 |
01 01 2018 12:50 | 250.7559052 | 4.693500996 | 264.1192574 | 229.8966064 |
01 01 2018 13:00 | 346.8644104 | 5.002939224 | 336.7219982 | 235.2794952 |
01 01 2018 13:10 | 416.4179077 | 5.364749908 | 430.921089 | 235.5852966 |
01 01 2018 13:20 | 331.9414978 | 5.016181946 | 339.9849402 | 229.9429016 |
01 01 2018 13:30 | 583.4799194 | 5.970407963 | 615.0556308 | 235.6952972 |
01 01 2018 13:40 | 776.5526733 | 6.655520916 | 868.1808449 | 241.4573975 |
01 01 2018 13:50 | 752.7263794 | 6.600903988 | 846.0294095 | 242.7821045 |
01 01 2018 14:00 | 589.0731201 | 5.981378078 | 618.7314427 | 234.9844055 |
01 01 2018 14:10 | 1109.128052 | 7.424593925 | 1219.199787 | 235.1472931 |
01 01 2018 14:20 | 1482.459961 | 8.186451912 | 1638.508909 | 238.4790955 |
01 01 2018 14:30 | 1523.430054 | 8.27493 | 1691.147039 | 237.0332031 |
01 01 2018 14:40 | 1572.170044 | 8.449202538 | 1796.76309 | 238.3323975 |
01 01 2018 14:50 | 1698.939941 | 8.575974464 | 1875.047197 | 235.6414032 |
01 01 2018 15:00 | 1616.845947 | 8.282259941 | 1695.538777 | 236.4613953 |
01 01 2018 15:10 | 1796.823975 | 8.734552383 | 1974.4758 | 234.3547974 |
01 01 2018 15:20 | 1885.860962 | 8.764103889 | 1993.170712 | 231.0016022 |
01 01 2018 15:30 | 2327.511963 | 9.669431686 | 2568.827129 | 227.6000977 |
01 01 2018 15:40 | 2499.162109 | 10.14109039 | 2876.753616 | 227.7315979 |
01 01 2018 15:50 | 2820.512939 | 10.77241993 | 3186.029883 | 225.2763977 |
01 01 2018 16:00 | 2812.279053 | 10.64752007 | 3133.259224 | 224.680603 |
01 01 2018 16:10 | 2530.447021 | 9.982661247 | 2781.274041 | 225.5195007 |
01 01 2018 16:20 | 2399.121094 | 9.874385834 | 2711.492458 | 227.2738037 |
01 01 2018 16:30 | 2335.587891 | 9.785479546 | 2651.341009 | 229.2554932 |
01 01 2018 16:40 | 2341.133057 | 9.614232063 | 2527.945451 | 230.7368927 |
01 01 2018 16:50 | 2391.8479 | 9.618504524 | 2531.14794 | 229.490799 |
01 01 2018 17:00 | 2118.389893 | 9.098683357 | 2207.79282 | 223.960907 |
01 01 2018 17:10 | 1866.845947 | 8.677425385 | 1938.478601 | 219.7937012 |
01 01 2018 17:20 | 1865.619019 | 8.774898529 | 2000.011716 | 219.0449066 |
01 01 2018 17:30 | 1862.447998 | 8.689981461 | 1946.373955 | 215.3352051 |
01 01 2018 17:40 | 1884.119019 | 8.631073952 | 1909.416256 | 216.2799988 |
01 01 2018 17:50 | 1855.776978 | 8.614569664 | 1899.100734 | 214.5290985 |
01 01 2018 18:00 | 1958.133057 | 9.21884346 | 2285.917032 | 212.1799011 |
01 01 2018 18:10 | 2228.24292 | 10.04951954 | 2822.50949 | 210.3085938 |
01 01 2018 18:20 | 2529.291016 | 10.31871033 | 2974.866796 | 210.5881042 |
01 01 2018 18:30 | 2788.25708 | 10.76675987 | 3183.72246 | 207.4813995 |
01 01 2018 18:40 | 2692.929932 | 10.55825043 | 3093.110672 | 208.5518951 |
01 01 2018 18:50 | 2535.353027 | 10.25072002 | 2938.394607 | 208.0106964 |
01 01 2018 19:00 | 2584.665039 | 10.46477032 | 3048.823833 | 205.7528992 |
01 01 2018 19:10 | 2960.183105 | 11.39078045 | 3393.645541 | 200.6542969 |
01 01 2018 19:20 | 3062.978027 | 11.56554031 | 3437.597135 | 198.1242981 |
01 01 2018 19:30 | 3024.39209 | 11.2802496 | 3362.668742 | 198.5381927 |
01 01 2018 19:40 | 3187.9729 | 11.33677959 | 3378.826271 | 200.4904022 |
01 01 2018 19:50 | 3387.228027 | 11.80463982 | 3488.248491 | 199.2469025 |
01 01 2018 20:00 | 3209.018066 | 11.3635397 | 3386.244486 | 199.8054962 |
01 01 2018 20:10 | 3272.665039 | 11.63259029 | 3452.881108 | 198.2677002 |
01 01 2018 20:20 | 3209.698975 | 11.44476032 | 3407.867876 | 195.6320038 |
01 01 2018 20:30 | 3134.518066 | 11.27190018 | 3360.225775 | 196.6611023 |
01 01 2018 20:40 | 2977.824951 | 11.05900955 | 3292.880925 | 196.5158997 |
01 01 2018 20:50 | 3431.772949 | 12.10377979 | 3537.173706 | 198.2570038 |
01 01 2018 21:00 | 3604.209961 | 12.92813969 | 3597.469467 | 201.5825958 |
01 01 2018 21:10 | 3601.327881 | 13.31941986 | 3600 | 201.9421997 |
01 01 2018 21:20 | 3604.426025 | 13.12152004 | 3600 | 203.5077972 |
01 01 2018 21:30 | 3604.391113 | 13.23544979 | 3600 | 202.6929932 |
01 01 2018 21:40 | 3604.337891 | 13.23589993 | 3600 | 202.9362946 |
01 01 2018 21:50 | 3554.687988 | 13.02956009 | 3600 | 201.2539063 |
01 01 2018 22:00 | 3479.407959 | 12.96393967 | 3597.794635 | 201.3408966 |
01 01 2018 22:10 | 3472.333008 | 12.90295029 | 3597.13106 | 200.9795074 |
01 01 2018 22:20 | 3491.510986 | 12.76634026 | 3593.704942 | 200.9960022 |
01 01 2018 22:30 | 3536.989014 | 12.89834976 | 3597.059449 | 200.5142059 |
01 01 2018 22:40 | 3528.658936 | 12.74211025 | 3592.814313 | 202.8952942 |
01 01 2018 22:50 | 3581.540039 | 12.31826019 | 3562.990095 | 202.841095 |
01 01 2018 23:00 | 3570.079102 | 12.41880989 | 3572.556143 | 202.4118042 |
01 01 2018 23:10 | 3597.604004 | 12.54298973 | 3582.204643 | 201.6253052 |
01 01 2018 23:20 | 3441.025879 | 12.67599964 | 3589.945634 | 199.3220978 |
01 01 2018 23:30 | 3373.969971 | 13.00304985 | 3600 | 197.1307068 |
01 01 2018 23:40 | 3369.812988 | 13.29767036 | 3600 | 196.4936066 |
01 01 2018 23:50 | 3375.903076 | 12.84405994 | 3595.984792 | 195.3150024 |
2/1/18 | 3377.649902 | 12.70538998 | 3591.300461 | 196.0422058 |
2/1/18 | 3374.423096 | 12.1833601 | 3547.627655 | 197.7438965 |
2/1/18 | 3401.081055 | 12.20514011 | 3550.307222 | 196.8088074 |
2/1/18 | 3469.412109 | 12.60188007 | 3585.959181 | 193.8157043 |
2/1/18 | 3511.809082 | 12.84455013 | 3595.996394 | 194.3466034 |
2/1/18 | 3536.759033 | 12.49705982 | 3578.911555 | 196.009201 |
2/1/18 | 3467.808105 | 12.09607029 | 3536.105139 | 197.9526978 |
2/1/18 | 3460.677002 | 12.19612026 | 3549.206917 | 201.330307 |
2/1/18 | 3589.443115 | 12.55035019 | 3582.702554 | 201.1882019 |
2/1/18 | 3527.718994 | 12.6156702 | 3586.762967 | 202.6235962 |
2/1/18 | 3561.26709 | 13.10278034 | 3600 | 201.7666016 |
2/1/18 | 3604.068115 | 13.68774986 | 3600 | 199.0195007 |
2/1/18 | 3604.176025 | 14.10241985 | 3600 | 196.2552032 |
2/1/18 | 3593.200928 | 14.39330959 | 3600 | 195.8798981 |
2/1/18 | 3493.821045 | 14.07954979 | 3600 | 197.6403046 |
2/1/18 | 3470.701904 | 14.05440044 | 3600 | 197.2447968 |
2/1/18 | 3436.610107 | 13.51247025 | 3600 | 195.9954071 |
2/1/18 | 3401.455078 | 13.71004963 | 3600 | 192.4197998 |
2/1/18 | 3395.23291 | 13.7423296 | 3600 | 191.0137024 |
2/1/18 | 3417.503906 | 13.14186001 | 3600 | 192.2046967 |
2/1/18 | 3465.108887 | 12.86771011 | 3596.50506 | 192.771698 |
2/1/18 | 3467.417969 | 12.84727001 | 3596.060138 | 192.4705048 |
2/1/18 | 3522.406982 | 12.73211002 | 3592.421666 | 192.5679016 |
2/1/18 | 3510.10791 | 12.51620007 | 3580.322941 | 194.9992065 |
2/1/18 | 3513.844971 | 12.59866047 | 3585.767414 | 196.0422974 |
2/1/18 | 3564.008057 | 13.23031998 | 3600 | 196.4087982 |
2/1/18 | 3475.278076 | 13.0946703 | 3600 | 198.5249939 |
2/1/18 | 3561.990967 | 12.91687965 | 3597.329407 | 198.0101013 |
2/1/18 | 3521.554932 | 12.63354969 | 3587.762741 | 197.6634979 |
2/1/18 | 3493.60791 | 12.82567024 | 3595.524457 | 201.1040955 |
2/1/18 | 3555.304932 | 12.54162025 | 3582.111096 | 200.3634033 |
2/1/18 | 3377.12793 | 12.10496998 | 3537.337786 | 196.9826965 |
2/1/18 | 3479.626953 | 12.36250019 | 3567.394707 | 199.798996 |
2/1/18 | 3539.112061 | 12.60391045 | 3586.079315 | 201.2702942 |
2/1/18 | 3430.436035 | 12.21222019 | 3551.161616 | 198.9846039 |
2/1/18 | 3301.917969 | 11.98762035 | 3520.011831 | 202.5711975 |
2/1/18 | 3235.543945 | 11.67932987 | 3463.031603 | 200.7035065 |
2/1/18 | 3519.022949 | 12.46971989 | 3576.798254 | 197.8733978 |
2/1/18 | 3469.537109 | 12.49489975 | 3578.748756 | 201.1011047 |
2/1/18 | 3296.186035 | 11.78983021 | 3485.417643 | 200.3565979 |
2/1/18 | 3045.51001 | 10.90355015 | 3237.314957 | 199.4629059 |
2/1/18 | 3444.741943 | 12.18807983 | 3548.214895 | 202.7460022 |
2/1/18 | 3417.746094 | 11.97813034 | 3518.508247 | 199.4022064 |
2/1/18 | 2807.613037 | 10.67446995 | 3144.977295 | 197.2297058 |
2/1/18 | 2493.393066 | 9.69664669 | 2588.59196 | 200.3191986 |
2/1/18 | 3215.196045 | 11.41759014 | 3400.782508 | 200.488205 |
2/1/18 | 3589.590088 | 12.68927002 | 3590.573175 | 199.5281067 |
2/1/18 | 3599.149902 | 13.05860043 | 3600 | 200.6078033 |
2/1/18 | 3375.177002 | 11.52081966 | 3426.922472 | 195.8547058 |
2/1/18 | 3346.980957 | 11.51231003 | 3424.84719 | 197.7467041 |
2/1/18 | 3567.967041 | 12.41629982 | 3572.336603 | 199.1638031 |
2/1/18 | 3519.264893 | 12.16014957 | 3544.686608 | 198.3968964 |
2/1/18 | 3485.191895 | 11.67107964 | 3461.269666 | 194.6569977 |
2/1/18 | 3145.562988 | 11.14585972 | 3321.545696 | 195.8325043 |
2/1/18 | 2978.310059 | 10.77289963 | 3186.225079 | 193.1703949 |
2/1/18 | 3179.008057 | 10.92975998 | 3247.07462 | 195.0997009 |
2/1/18 | 3461.581055 | 12.14006042 | 3542.069502 | 198.2947998 |
2/1/18 | 3082.549072 | 11.19556046 | 3337.205225 | 200.7570038 |
2/1/18 | 3493.657959 | 12.94869041 | 3597.678446 | 204.0805969 |
2/1/18 | 3601.045898 | 14.87942982 | 3600 | 197.5942993 |
2/1/18 | 3597.564941 | 15.12405968 | 3600 | 196.3455963 |
2/1/18 | 3602.172119 | 16.29367065 | 3600 | 196.8367004 |
2/1/18 | 3601.99292 | 16.12397957 | 3600 | 192.2306061 |
2/1/18 | 3600.791016 | 15.27460003 | 3600 | 190.949295 |
2/1/18 | 3590.75 | 13.56672001 | 3600 | 192.9456024 |
2/1/18 | 3601.845947 | 15.36779976 | 3600 | 194.7528076 |
2/1/18 | 3601.870117 | 15.86174965 | 3600 | 195.0402985 |
2/1/18 | 3591.655029 | 14.92051029 | 3600 | 197.9895935 |
2/1/18 | 3579.024902 | 13.60853004 | 3600 | 201.4945068 |
2/1/18 | 3598.131104 | 14.46385956 | 3600 | 200.4884033 |
2/1/18 | 3525.333008 | 12.68828964 | 3590.527705 | 202.2259979 |
2/1/18 | 3560.699951 | 13.55690002 | 3600 | 202.153595 |
2/1/18 | 3537.676025 | 13.32281017 | 3600 | 203.2893982 |
2/1/18 | 3491.291016 | 12.60700989 | 3586.261512 | 201.0937042 |
2/1/18 | 3530.766113 | 12.31476021 | 3562.628404 | 197.5440979 |
2/1/18 | 2915.839111 | 10.3801899 | 3006.71767 | 200.9197998 |
2/1/18 | 2178.658936 | 9.11702919 | 2219.691985 | 201.0245056 |
2/1/18 | 2244.412109 | 9.253190994 | 2308.322526 | 198.9759979 |
2/1/18 | 1278.89502 | 9.072306633 | 2190.704763 | 198.2364044 |
2/1/18 | 2832.934082 | 10.34463024 | 2988.424599 | 196.6472015 |
2/1/18 | 3205.9729 | 11.10330963 | 3307.71074 | 200.1464996 |
2/1/18 | 3149.284912 | 11.06910992 | 3296.300642 | 198.8968048 |
2/1/18 | 3273.656006 | 11.32581043 | 3375.742901 | 201.1446075 |
2/1/18 | 3114.099121 | 11.01513958 | 3277.761152 | 204.9272003 |
2/1/18 | 3111.060059 | 10.90725994 | 3238.706158 | 204.813797 |
2/1/18 | 3361.011963 | 11.76941013 | 3481.44923 | 209.778595 |
2/1/18 | 3421.419922 | 11.87483025 | 3501.130346 | 209.6006012 |
2/1/18 | 3520.148926 | 12.16926003 | 3545.851555 | 208.3181 |
2/1/18 | 3589.427002 | 12.82061958 | 3595.389466 | 211.1817932 |
2/1/18 | 3495.115967 | 12.57161999 | 3584.095307 | 209.4647064 |
2/1/18 | 3298.761963 | 11.39929962 | 3395.929165 | 205.625 |
2/1/18 | 2894.440918 | 10.54543018 | 3087.174334 | 200.6107025 |
2/1/18 | 3486.628906 | 12.30932999 | 3562.063389 | 202.0561981 |
2/1/18 | 3455.24707 | 12.1683197 | 3545.731948 | 203.7207031 |
2/1/18 | 3556.785889 | 12.28707981 | 3559.699203 | 204.6085968 |
2/1/18 | 3375.582031 | 12.01319027 | 3523.986209 | 201.7415009 |
2/1/18 | 3493.979004 | 12.21352959 | 3551.318734 | 201.7156067 |
2/1/18 | 3549.147949 | 12.93774033 | 3597.57459 | 199.9685059 |
2/1/18 | 3483.315918 | 13.66942024 | 3600 | 203.870697 |
2/1/18 | 3589.858887 | 13.69785976 | 3600 | 204.8023071 |
2/1/18 | 3584.235107 | 12.75835991 | 3593.421089 | 202.6508026 |
2/1/18 | 3599.008057 | 12.76517963 | 3593.664238 | 201.2570953 |
2/1/18 | 3602.637939 | 13.07721996 | 3600 | 203.4407043 |
2/1/18 | 3550.563965 | 12.59340954 | 3585.451317 | 205.1535034 |
2/1/18 | 3552.782959 | 12.51366997 | 3580.139581 | 205.008194 |
2/1/18 | 3585.010986 | 12.53439999 | 3581.613183 | 204.1203003 |
2/1/18 | 3421.176025 | 11.96442986 | 3516.3102 | 201.9989014 |
2/1/18 | 3406.040039 | 11.94577026 | 3513.264349 | 194.3786926 |
2/1/18 | 3515.610107 | 12.20707989 | 3550.542117 | 189.5238037 |
2/1/18 | 3515.965088 | 12.2751503 | 3558.399068 | 190.5794983 |
2/1/18 | 3475.418945 | 12.72264004 | 3592.036307 | 187.6125031 |
2/1/18 | 3471.156982 | 12.26537037 | 3557.31619 | 189.4371948 |
2/1/18 | 3281.754883 | 11.70368958 | 3468.159913 | 192.2619019 |
2/1/18 | 2955.11499 | 10.96352959 | 3259.412905 | 190.4571991 |
2/1/18 | 3061.735107 | 11.29796982 | 3367.805139 | 192.8582001 |
2/1/18 | 2679.110107 | 10.66594982 | 3141.292611 | 194.0843964 |
2/1/18 | 2721.081055 | 10.8332901 | 3210.350601 | 195.2017975 |
2/1/18 | 2649.136963 | 10.57837009 | 3102.339998 | 195.3432007 |
2/1/18 | 2707.74292 | 10.38854027 | 3010.962279 | 201.797699 |
2/1/18 | 2508.832031 | 10.08041954 | 2841.099422 | 204.2073975 |
2/1/18 | 2316.647949 | 9.838738441 | 2687.688082 | 199.747406 |
2/1/18 | 3081.542969 | 11.43999958 | 3406.637064 | 200.2402954 |
2/1/18 | 3397.638916 | 11.94402981 | 3512.977172 | 201.1663971 |
2/1/18 | 3391.716064 | 11.85929012 | 3498.353994 | 201.7106018 |
2/1/18 | 3587.510986 | 12.81147957 | 3595.135782 | 201.3484955 |
2/1/18 | 3603.112061 | 12.91353989 | 3597.284381 | 201.6768951 |
2/1/18 | 3591.093018 | 12.72832012 | 3592.269026 | 202.4132996 |
2/1/18 | 3221.044922 | 11.66357994 | 3459.656972 | 202.6618958 |
2/1/18 | 2887.733887 | 11.0952301 | 3305.038612 | 204.061203 |
2/1/18 | 2364.534912 | 10.16094971 | 2888.183469 | 203.3379059 |
2/1/18 | 1935.847046 | 9.202415466 | 2275.211448 | 197.8013 |
2/1/18 | 1549.480957 | 8.539284706 | 1852.273851 | 195.5061035 |
2/1/18 | 1625.755981 | 8.809141159 | 2021.754239 | 187.4846039 |
2/1/18 | 1994.222046 | 9.608460426 | 2523.60898 | 188.0238953 |
2/1/18 | 2362 | 9.844923973 | 2691.848533 | 190.6604004 |
2/1/18 | 2097.771973 | 9.338670731 | 2364.198743 | 196.7335968 |
2/1/18 | 1564.590942 | 8.424916267 | 1781.899877 | 197.0158997 |
2/1/18 | 1107.474976 | 7.656233788 | 1339.713949 | 188.6903992 |
2/1/18 | 1303.116943 | 8.144581795 | 1613.847713 | 181.6596069 |
2/1/18 | 1561.182007 | 8.54713726 | 1857.140175 | 173.5366974 |
2/1/18 | 1544.999023 | 8.381804466 | 1755.627598 | 171.3834076 |
2/1/18 | 1456.738037 | 7.850449085 | 1445.553534 | 179.8197937 |
2/1/18 | 1795.644043 | 8.656551361 | 1925.374082 | 188.2382965 |
2/1/18 | 2773.291016 | 10.92311954 | 3244.617174 | 179.039093 |
3/1/18 | 2782.568115 | 10.4051199 | 3019.332696 | 176.9255981 |
3/1/18 | 2446.424072 | 9.498130798 | 2468.761378 | 174.677002 |
3/1/18 | 3412.39209 | 11.93025017 | 3510.684928 | 180.6725006 |
3/1/18 | 3255.337891 | 11.07629013 | 3298.717792 | 183.8755035 |
3/1/18 | 2796.876953 | 10.45788002 | 3045.466801 | 192.1911011 |
3/1/18 | 2467.954102 | 9.791149139 | 2655.255241 | 197.104599 |
3/1/18 | 1278.886963 | 7.626486778 | 1323.911052 | 202.940506 |
3/1/18 | 1042.537964 | 7.287635803 | 1150.913828 | 207.3871002 |
3/1/18 | 609.0761719 | 6.228209019 | 703.7205269 | 216.9989014 |
3/1/18 | 175.4407043 | 4.47162199 | 216.0170723 | 222.5090942 |
3/1/18 | 112.1109009 | 4.127829075 | 147.1041396 | 215.4514008 |
3/1/18 | 271.9171143 | 5.032844067 | 344.1094784 | 202.5102997 |
3/1/18 | 737.4487915 | 6.267045021 | 717.8434981 | 211.2003021 |
3/1/18 | 1375.579956 | 7.763337135 | 1397.52319 | 193.6107025 |
3/1/18 | 1520.890015 | 8.21955204 | 1658.119112 | 172.135498 |
3/1/18 | 1349.112061 | 7.974888802 | 1515.649475 | 168.3569031 |
3/1/18 | 889.1298218 | 6.794364929 | 926.0444806 | 171.1295013 |
3/1/18 | 412.115509 | 5.536108017 | 479.4472407 | 162.7037964 |
3/1/18 | 444.6036072 | 5.491714954 | 466.6197137 | 150.2816925 |
3/1/18 | 655.7307129 | 6.076754093 | 650.187023 | 149.6408997 |
3/1/18 | 882.5654297 | 6.69093895 | 882.7282325 | 152.2225037 |
3/1/18 | 998.3845825 | 6.848011971 | 949.0116113 | 157.1643066 |
3/1/18 | 1193.395996 | 7.759384155 | 1395.364787 | 152.699707 |
3/1/18 | 1122.712036 | 7.417626858 | 1215.659509 | 152.076004 |
3/1/18 | 1214.125977 | 7.472226143 | 1243.600054 | 154.7837982 |
3/1/18 | 1086.307007 | 7.080772877 | 1052.768027 | 160.2183075 |
3/1/18 | 1060.603027 | 7.053721905 | 1040.356847 | 165.8153992 |
3/1/18 | 1451.713989 | 7.766314983 | 1399.150382 | 170.8444977 |
3/1/18 | 1361.459961 | 7.833246231 | 1435.998878 | 173.0240936 |
3/1/18 | 1490.569946 | 7.959300995 | 1506.776853 | 173.9763947 |
3/1/18 | 1153.139038 | 7.283742905 | 1149.012424 | 176.7931976 |
3/1/18 | 953.9760132 | 7.001252174 | 1016.552582 | 178.0930023 |
3/1/18 | 799.0856934 | 6.758135796 | 910.7282546 | 174.0330048 |
3/1/18 | 616.2548218 | 6.179992199 | 686.4114027 | 167.9960022 |
3/1/18 | 646.9244995 | 6.301719189 | 730.5901706 | 168.8119965 |
3/1/18 | 1323.682007 | 7.517776966 | 1267.134969 | 184.7017975 |
3/1/18 | 1568.885986 | 8.094202995 | 1584.395551 | 194.0092926 |
3/1/18 | 1580.902954 | 7.854953766 | 1448.061049 | 197.8014984 |
3/1/18 | 1495.180054 | 7.719468117 | 1373.675076 | 191.2086945 |
3/1/18 | 2063.868896 | 8.847901344 | 2046.438946 | 195.0639038 |
3/1/18 | 2368.76001 | 9.631019592 | 2540.491731 | 198.074707 |
3/1/18 | 2516.419922 | 9.767664909 | 2638.971731 | 191.838501 |
3/1/18 | 2108.770996 | 9.185004234 | 2263.873095 | 190.0070038 |
3/1/18 | 2568.111084 | 9.927650452 | 2746.29034 | 179.3226929 |
3/1/18 | 3445.219971 | 12.03275967 | 3526.952507 | 175.9355011 |
3/1/18 | 2994.106934 | 10.87308979 | 3225.769174 | 180.7583008 |
3/1/18 | 2594.937012 | 10.38061047 | 3006.931915 | 177.4212036 |
3/1/18 | 2326.825928 | 10.34302044 | 2987.588083 | 164.6313934 |
3/1/18 | 1941.463989 | 9.283791542 | 2328.307526 | 157.3659973 |
3/1/18 | 1581.487061 | 8.263951302 | 1684.577838 | 151.1777039 |
3/1/18 | 1013.286987 | 7.161077023 | 1090.179344 | 144.4230042 |
3/1/18 | 375.6176147 | 5.502151966 | 469.6191644 | 145.3318024 |
3/1/18 | 198.1511993 | 4.645584106 | 253.4672425 | 155.7653046 |
3/1/18 | 87.44045258 | 3.847867012 | 100.642022 | 162.271698 |
3/1/18 | 189.1378021 | 4.553710938 | 233.4558636 | 148.0536041 |
3/1/18 | 434.4317932 | 5.735952854 | 539.5070619 | 136.6712036 |
3/1/18 | 336.5007935 | 5.057969093 | 350.3694191 | 139.4640045 |
3/1/18 | 296.6101074 | 4.922440052 | 317.1718028 | 141.7938995 |
3/1/18 | 92.9240036 | 3.821350098 | 96.25248176 | 148.5747986 |
3/1/18 | 85.70230103 | 3.580841064 | 61.57702143 | 165.8957062 |
3/1/18 | 309.5114136 | 4.716145039 | 269.2057367 | 187.6051941 |
3/1/18 | 381.1726074 | 5.080855846 | 356.114453 | 188.4362946 |
3/1/18 | 417.2662964 | 5.343267918 | 425.0226087 | 202.2389984 |
3/1/18 | 446.343811 | 5.452712059 | 455.4989836 | 201.0330963 |
3/1/18 | 206.6020966 | 4.29698801 | 180.2207304 | 191.4851074 |
3/1/18 | 251.3757019 | 4.736260891 | 273.7530825 | 183.4333954 |
3/1/18 | 275.0136108 | 4.780562878 | 283.8646662 | 187.9405975 |
3/1/18 | 314.2744141 | 4.894141197 | 310.4131199 | 180.8480072 |
3/1/18 | 238.7823029 | 4.487487793 | 219.355975 | 185.8578033 |
3/1/18 | 409.0264893 | 5.314783096 | 417.2631565 | 180.8168945 |
3/1/18 | 506.4703064 | 5.711400986 | 531.9193571 | 186.1788025 |
3/1/18 | 427.9566956 | 5.374886036 | 433.7182755 | 196.3742065 |
3/1/18 | 952.2675781 | 6.895505905 | 969.6346499 | 193.9367065 |
3/1/18 | 1019.905029 | 7.240921021 | 1128.237686 | 187.7236023 |
3/1/18 | 1015.357971 | 6.709988117 | 890.6123118 | 185.273407 |
3/1/18 | 979.7229004 | 6.851963043 | 950.7168123 | 183.7971039 |
3/1/18 | 379.4078979 | 5.078312874 | 355.4740901 | 185.1383972 |
3/1/18 | 841.5977783 | 6.521288872 | 814.34348 | 189.263504 |
3/1/18 | 672.6187744 | 6.171179771 | 683.2747912 | 189.2765045 |
3/1/18 | 452.0786133 | 5.449243069 | 454.5165791 | 190.636795 |
3/1/18 | 558.9979248 | 5.851128101 | 575.9105762 | 196.9326935 |
3/1/18 | 331.7192993 | 5.094088078 | 359.454764 | 193.4658051 |
3/1/18 | 212.1006927 | 4.598594189 | 243.1654974 | 197.9337006 |
3/1/18 | 79.72102356 | 3.629702091 | 67.87244481 | 199.7156067 |
3/1/18 | 183.0128021 | 4.472650051 | 216.232972 | 205.3706055 |
3/1/18 | 279.1960144 | 4.918616772 | 316.2552558 | 204.3323059 |
3/1/18 | 460.2166138 | 5.625835896 | 505.9378767 | 209.3771057 |
3/1/18 | 647.7111206 | 6.316774845 | 736.1652234 | 211.6537018 |
3/1/18 | 685.0780029 | 6.237164974 | 706.9630418 | 212.0509033 |
3/1/18 | 709.8339844 | 6.449378014 | 786.3313199 | 211.607605 |
3/1/18 | 493.3555908 | 5.782717228 | 554.1258994 | 212.3511047 |
3/1/18 | 366.0793152 | 5.346119881 | 425.803377 | 216.8318024 |
3/1/18 | 183.0379028 | 4.379333019 | 196.8860292 | 220.0410004 |
3/1/18 | 7.347679138 | 3.011370897 | 16.3742125 | 238.6905975 |
3/1/18 | 0 | 3.743307114 | 83.98626485 | 245.0682068 |
3/1/18 | 12.34420013 | 3.24625206 | 28.73127208 | 238.0765076 |
3/1/18 | -0.393067598 | 2.185888052 | 0 | 238.4102936 |
3/1/18 | 0 | 2.142015934 | 0 | 234.7624054 |
3/1/18 | 0 | 2.501405954 | 0 | 223.3088074 |
3/1/18 | 0 | 2.668577909 | 0 | 226.0516968 |
3/1/18 | 0 | 3.034003019 | 17.18059304 | 221.0865021 |
Front-End Developer
228 | 229 | 230 | 231 |ML Ops/Data Engineer
238 | 239 | 240 | 241 |Data Scientist
248 | 249 | 250 | 251 |Data Scientist
258 | 259 | 260 | 261 |AI Engineer
268 | 269 | 270 | 271 |Software Developer
278 | 279 | 280 | 281 |Software Developer
288 | 289 | 290 | 291 |Embedded Software Engineer
298 | 299 | 300 | 301 |LV Active Power is: {{ lv_active_power }}
168 |