File size: 3,848 Bytes
64e86e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d51f4d
64e86e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
230669a
2d51f4d
64e86e0
 
 
 
 
 
 
 
2d51f4d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
import gradio as gr

# Define the mapping between user-friendly names and NASA variable names
data_mapping = {
    "Temperature": {
        "Earth Skin Temperature": "TS",
        "Temperature at 2 Meters": "T2M",
        "Wet Bulb Temperature at 2 Meters": "T2MWET"
    },
    "Moisture & Precipitation": {
        "Precipitation Average": "PRECTOTCORR",
        "Profile Soil Moisture (surface to bedrock)": "GWETPROF",
        "Root Zone Soil Wetness (surface to 100 cm below)": "GWETROOT",
        "Surface Soil Wetness (surface to 5 cm below)": "GWETTOP"
    },
    "Air & Pressure": {
        "Specific Humidity at 2 Meters": "QV2M",
        "Surface Pressure": "PS"
    },
    "Wind": {
        "Wind Direction at 10 Meters": "WD10M",
        "Wind Direction at 2 Meters": "WD2M",
        "Wind Speed at 10 Meters": "WS10M",
        "Wind Speed at 2 Meters": "WS2M"
    }
}

def load_and_prepare_data():
    data = pd.read_csv('data/preprocessed_data.csv')
    nasa_features = [var for category in data_mapping.values() for var in category.values()]
    target = 'Close_^FTSE'

    X = data[nasa_features]
    y = data[target]
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, shuffle=False)

    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)

    return X_train_scaled, X_test_scaled, y_train, y_test, scaler, nasa_features, data

def train_model(X_train_scaled, y_train):
    model = LinearRegression()
    model.fit(X_train_scaled, y_train)
    return model

def create_prediction_interface(model, scaler, features_mapping, data):
    def predict_func(*args):
        input_values = pd.DataFrame([args], columns=nasa_features)
        input_values_scaled = scaler.transform(input_values)
        prediction = model.predict(input_values_scaled)
        return f"${round(prediction[0], 2)} USD"

    with gr.Blocks(theme=gr.themes.Default()) as demo:
        gr.Markdown("### Stock Price Prediction")
        gr.Markdown("Adjust NASA POWER DAS variables to see predicted stock prices.")
        
        with gr.Row():
            with gr.Column(scale=3):
                gr.Markdown("#### Adjust Inputs")
                inputs = []
                for category, variables in features_mapping.items():
                    with gr.Accordion(category, open=False):
                        for csv_name, das_var in variables.items():
                            min_val = data[das_var].min()
                            max_val = data[das_var].max()
                            slider = gr.Slider(
                                label=csv_name,
                                minimum=min_val,
                                maximum=max_val,
                                value=(min_val + max_val) / 2,
                                step=(max_val - min_val) / 100
                            )
                            inputs.append(slider)
                predict_btn = gr.Button("Predict", variant="primary")
            
            with gr.Column(scale=1):
                gr.Markdown("#### Predicted Result", elem_id="result-header")
                output = gr.Textbox(label="Predicted Close_^FTSE", interactive=False, value="$0.00 USD")
                predict_btn.click(fn=predict_func, inputs=inputs, outputs=output)
    
    return demo

if __name__ == "__main__":
    X_train_scaled, X_test_scaled, y_train, y_test, scaler, nasa_features, data = load_and_prepare_data()
    model = train_model(X_train_scaled, y_train)
    demo = create_prediction_interface(model, scaler, data_mapping, data)
    demo.launch()