Abrar20 commited on
Commit
e210869
·
verified ·
1 Parent(s): ab317bb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +110 -108
app.py CHANGED
@@ -1,125 +1,127 @@
1
- import gradio as gr
2
  import numpy as np
3
  import pandas as pd
4
  import folium
5
- import joblib
6
- from io import BytesIO
7
- import base64
8
-
9
- # Load the saved model
10
- def load_model():
11
- return joblib.load('cyclone_model.pkl')
12
-
13
- # Predict the next 6 rows based on input
14
- def predict_next_6_rows(lat_present, lon_present, dist2land_present, storm_speed_present,
15
- year_present, month_present, day_present, hour_present,
16
- lat_prev, lon_prev, dist2land_prev, storm_speed_prev):
17
-
18
- # Construct the current and previous data as feature arrays
19
- current_data = [lat_present, lon_present, dist2land_present, storm_speed_present, year_present, month_present, day_present, hour_present]
20
- previous_data = [lat_prev, lon_prev, dist2land_prev, storm_speed_prev, year_present, month_present, day_present, hour_present - 3]
21
-
22
- # Adjust for negative hours
23
- if previous_data[-1] < 0:
24
- previous_data[-1] += 24
25
- previous_data[6] -= 1 # Adjust day
26
-
27
- # Preprocess the input into the required shape (2 rows, 8 columns)
28
- input_data = [previous_data, current_data]
29
- input_data = np.array(input_data).reshape(1, 2, 8)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
- # Flatten the input to match the model's input shape
32
- input_data_flat = input_data.reshape(1, -1)
33
-
34
- # Load the model and make predictions
35
- loaded_model = load_model()
36
- predictions = loaded_model.predict(input_data_flat)
37
-
38
- # Reshape the predictions back to (6, 4) format
39
- predictions_reshaped = predictions.reshape(6, 4)
40
-
41
- # Create a DataFrame for the predictions
42
- columns = ['LAT', 'LON', 'DIST2LAND', 'STORM_SPEED']
43
- df_predictions = pd.DataFrame(predictions_reshaped, columns=columns)
44
-
45
- # Add the 'Hour' column, incrementing by 3 hours from the present time
46
- df_predictions['Hour'] = [(hour_present + (i + 1) * 3) % 24 for i in range(6)] # Ensure the hour wraps around 24
47
-
48
  return df_predictions
49
 
50
- # Plot predictions on a folium map and return an HTML iframe
51
  def plot_predictions_on_map(df_predictions):
52
- # Extract LAT and LON from the predictions
53
  latitudes = df_predictions['LAT'].tolist()
54
  longitudes = df_predictions['LON'].tolist()
55
 
56
- # Create a folium map centered at the first predicted point
57
  m = folium.Map(location=[latitudes[0], longitudes[0]], zoom_start=6)
58
-
59
- # Add the predicted points to the map and connect them with a polyline
60
  locations = list(zip(latitudes, longitudes))
61
 
62
- # Add the points to the map
63
  for lat, lon in locations:
64
  folium.Marker([lat, lon]).add_to(m)
65
 
66
- # Add a polyline to connect the points
67
  folium.PolyLine(locations, color='blue', weight=2.5, opacity=0.7).add_to(m)
68
-
69
- # Save map as HTML in a BytesIO object
70
- map_html = BytesIO()
71
- m.save(map_html)
72
- map_html.seek(0)
73
- map_base64 = base64.b64encode(map_html.getvalue()).decode('utf-8')
74
-
75
- return f'<iframe src="data:text/html;base64,{map_base64}" width="100%" height="400"></iframe>'
76
-
77
- # Gradio interface setup
78
- def main_interface(lat_present, lon_present, dist2land_present, storm_speed_present,
79
- year_present, month_present, day_present, hour_present,
80
- lat_prev, lon_prev, dist2land_prev, storm_speed_prev):
81
-
82
- # Get the DataFrame prediction
83
- df_predictions = predict_next_6_rows(lat_present, lon_present, dist2land_present, storm_speed_present,
84
- year_present, month_present, day_present, hour_present,
85
- lat_prev, lon_prev, dist2land_prev, storm_speed_prev)
86
-
87
- # Generate map
88
- map_html = plot_predictions_on_map(df_predictions)
89
-
90
- return df_predictions, map_html
91
-
92
- # Gradio app
93
- with gr.Blocks() as cyclone_predictor:
94
- gr.Markdown("# Cyclone Path Prediction")
95
-
96
- # Input fields
97
- lat_present = gr.Number(label="Current Latitude")
98
- lon_present = gr.Number(label="Current Longitude")
99
- dist2land_present = gr.Number(label="Current DIST2LAND")
100
- storm_speed_present = gr.Number(label="Current STORM_SPEED")
101
- year_present = gr.Number(label="Current Year")
102
- month_present = gr.Number(label="Current Month")
103
- day_present = gr.Number(label="Current Day")
104
- hour_present = gr.Number(label="Current Hour")
105
-
106
- lat_prev = gr.Number(label="Previous Latitude")
107
- lon_prev = gr.Number(label="Previous Longitude")
108
- dist2land_prev = gr.Number(label="Previous DIST2LAND")
109
- storm_speed_prev = gr.Number(label="Previous STORM_SPEED")
110
-
111
- # Prediction and map output
112
- prediction_output = gr.Dataframe(label="Predicted DataFrame")
113
- map_output = gr.HTML(label="Predicted Path Map")
114
-
115
- # Button to trigger prediction
116
- predict_button = gr.Button("Predict")
117
- predict_button.click(
118
- main_interface,
119
- inputs=[lat_present, lon_present, dist2land_present, storm_speed_present,
120
- year_present, month_present, day_present, hour_present,
121
- lat_prev, lon_prev, dist2land_prev, storm_speed_prev],
122
- outputs=[prediction_output, map_output]
123
- )
124
-
125
- cyclone_predictor.launch()
 
1
+ import joblib
2
  import numpy as np
3
  import pandas as pd
4
  import folium
5
+ import streamlit as st
6
+ from streamlit_folium import folium_static
7
+ import warnings
8
+ warnings.filterwarnings("ignore")
9
+
10
+ # Define model paths
11
+ model_paths = {
12
+ 'Path': {
13
+ '3 hours': 'lr_3H_lat_lon.pkl',
14
+ '6 hours': 'lr_6H_lat_lon.pkl',
15
+ '9 hours': 'lr_9H_lat_lon.pkl',
16
+ '12 hours': 'lr_12H_lat_lon.pkl',
17
+ '15 hours': 'lr_15H_lat_lon.pkl',
18
+ '18 hours': 'lr_18H_lat_lon.pkl',
19
+ '21 hours': 'lr_21H_lat_lon.pkl',
20
+ '24 hours': 'lr_24H_lat_lon.pkl',
21
+ '27 hours': 'lr_27H_lat_lon.pkl',
22
+ '30 hours': 'lr_30H_lat_lon.pkl',
23
+ '33 hours': 'lr_33H_lat_lon.pkl',
24
+ '36 hours': 'lr_36H_lat_lon.pkl'
25
+ }
26
+ }
27
+
28
+ # Define scaler paths
29
+ scaler_paths = {
30
+ 'Path': {
31
+ '3 hours': 'lr_3H_lat_lon_scaler.pkl',
32
+ '6 hours': 'lr_6H_lat_lon_scaler.pkl',
33
+ '9 hours': 'lr_9H_lat_lon_scaler.pkl',
34
+ '12 hours': 'lr_12H_lat_lon_scaler.pkl',
35
+ '15 hours': 'lr_15H_lat_lon_scaler.pkl',
36
+ '18 hours': 'lr_18H_lat_lon_scaler.pkl',
37
+ '24 hours': 'lr_24H_lat_lon_scaler.pkl',
38
+ '27 hours': 'lr_27H_lat_lon_scaler.pkl',
39
+ '30 hours': 'lr_30H_lat_lon_scaler.pkl',
40
+ '33 hours': 'lr_33H_lat_lon_scaler.pkl',
41
+ '36 hours': 'lr_36H_lat_lon_scaler.pkl'
42
+ }
43
+ }
44
+
45
+ # Load model and scaler based on time interval
46
+ def load_model(time_interval):
47
+ model = joblib.load(model_paths['Path'][time_interval])
48
+ scaler = joblib.load(scaler_paths['Path'][time_interval])
49
+ return model, scaler
50
+
51
+ def process_input(input_data, scaler):
52
+ input_data = np.array(input_data).reshape(-1, 7)
53
+ processed_data = input_data[:2].reshape(1, -1)
54
+ processed_data = scaler.transform(processed_data)
55
+ return processed_data
56
+
57
+ def predict_path(time_interval, input_data):
58
+ model, scaler = load_model(time_interval)
59
+ processed_data = process_input(input_data, scaler)
60
+ prediction = model.predict(processed_data)
61
 
62
+ # Create DataFrame for predictions
63
+ df_predictions = pd.DataFrame(prediction, columns=['LAT', 'LON'])
64
+ df_predictions['Time'] = [time_interval]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  return df_predictions
66
 
67
+ # Function to plot predictions on a folium map and return the HTML representation
68
  def plot_predictions_on_map(df_predictions):
 
69
  latitudes = df_predictions['LAT'].tolist()
70
  longitudes = df_predictions['LON'].tolist()
71
 
 
72
  m = folium.Map(location=[latitudes[0], longitudes[0]], zoom_start=6)
 
 
73
  locations = list(zip(latitudes, longitudes))
74
 
 
75
  for lat, lon in locations:
76
  folium.Marker([lat, lon]).add_to(m)
77
 
 
78
  folium.PolyLine(locations, color='blue', weight=2.5, opacity=0.7).add_to(m)
79
+ return m
80
+
81
+ # Streamlit App
82
+ def main():
83
+ st.title("Cyclone Path Prediction")
84
+ st.write("Input current and previous cyclone data to predict the path and visualize it on a map.")
85
+
86
+ # User inputs
87
+ time_interval = st.selectbox("Select Prediction Time Interval", [
88
+ '3 hours', '6 hours', '9 hours', '12 hours', '15 hours', '18 hours',
89
+ '21 hours', '24 hours', '27 hours', '30 hours', '33 hours', '36 hours'
90
+ ])
91
+
92
+ previous_lat = st.number_input("Previous Latitude", format="%f")
93
+ previous_lon = st.number_input("Previous Longitude", format="%f")
94
+ previous_speed = st.number_input("Previous Speed", format="%f")
95
+ previous_year = st.number_input("Previous Year", format="%d")
96
+ previous_month = st.number_input("Previous Month", format="%d")
97
+ previous_day = st.number_input("Previous Day", format="%d")
98
+ previous_hour = st.number_input("Previous Hour", format="%d")
99
+
100
+ present_lat = st.number_input("Present Latitude", format="%f")
101
+ present_lon = st.number_input("Present Longitude", format="%f")
102
+ present_speed = st.number_input("Present Speed", format="%f")
103
+ present_year = st.number_input("Present Year", format="%d")
104
+ present_month = st.number_input("Present Month", format="%d")
105
+ present_day = st.number_input("Present Day", format="%d")
106
+ present_hour = st.number_input("Present Hour", format="%d")
107
+
108
+ if st.button("Predict"):
109
+ # Process input into array format
110
+ previous_data = [previous_lat, previous_lon, previous_speed, previous_year, previous_month, previous_day, previous_hour]
111
+ present_data = [present_lat, present_lon, present_speed, present_year, present_month, present_day, present_hour]
112
+ input_data = [previous_data, present_data]
113
+
114
+ # Predict path
115
+ df_predictions = predict_path(time_interval, input_data)
116
+
117
+ # Display predicted path DataFrame
118
+ st.write("Predicted Path DataFrame:")
119
+ st.write(df_predictions)
120
+
121
+ # Plot map with predictions
122
+ st.write("Cyclone Path Map:")
123
+ map_ = plot_predictions_on_map(df_predictions)
124
+ folium_static(map_)
125
+
126
+ if __name__ == "__main__":
127
+ main()