Spaces:
Runtime error
Runtime error
| import os | |
| import gradio as gr | |
| import numpy as np | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| from model import GDPPredictor | |
| # Initialize the predictor | |
| predictor = GDPPredictor() | |
| # Check if we have models saved | |
| model_file = 'gdp_models.pkl' | |
| data_file = 'Consolidated.csv' | |
| # Initialize and train models if needed | |
| if os.path.exists(model_file): | |
| print("Loading pre-trained models...") | |
| predictor.load_models(model_file) | |
| predictor.load_data(data_file) | |
| else: | |
| print("Training new models...") | |
| predictor.load_data(data_file) | |
| predictor.train_models() | |
| predictor.save_models(model_file) | |
| # Get latest GDP for reference | |
| latest_year, latest_gdp = predictor.get_latest_gdp() | |
| # Create a dictionary of all features and their default values (current values) | |
| feature_info = predictor.get_feature_info() | |
| # Create sliders for each feature, organized by category | |
| def create_feature_inputs(): | |
| inputs = [] | |
| # For each category | |
| for category, features in feature_info.items(): | |
| # Add a label for the category | |
| inputs.append(gr.Markdown(f"## {category}")) | |
| # Add sliders for each feature in this category | |
| for feature_name, (min_val, max_val, mean_val, current_val) in features.items(): | |
| # Adjust slider range to be a bit wider than historical data | |
| slider_min = min_val * 0.9 | |
| slider_max = max_val * 1.1 | |
| # Create a slider for this feature | |
| slider = gr.Slider( | |
| minimum=slider_min, | |
| maximum=slider_max, | |
| value=current_val, # Default to current value | |
| step=(slider_max - slider_min) / 100, # 100 steps across range | |
| label=feature_name | |
| ) | |
| inputs.append(slider) | |
| return inputs | |
| def predict(*feature_values): | |
| # Get all input features as flat list | |
| flat_inputs = list(feature_values) | |
| # Map features to values | |
| feature_names = [] | |
| for category, features in feature_info.items(): | |
| for feature_name in features: | |
| feature_names.append(feature_name) | |
| # Create input dictionary | |
| input_dict = {feature_names[i]: flat_inputs[i] for i in range(len(feature_names))} | |
| # Make prediction | |
| try: | |
| predictions = predictor.predict_gdp(input_dict) | |
| # Get ensemble prediction and calculate change | |
| ensemble_pred = predictions['Ensemble'] | |
| change = ensemble_pred - latest_gdp | |
| pct_change = (change / latest_gdp) * 100 | |
| # Format results | |
| result_text = f"# GDP Prediction Results\n\n" | |
| result_text += f"## Primary Prediction\n" | |
| result_text += f"**Ensemble Model:** {ensemble_pred:.2f} USD billion\n\n" | |
| result_text += f"## Comparison with {latest_year} GDP ({latest_gdp:.2f} USD billion)\n" | |
| result_text += f"**Change:** {change:.2f} USD billion ({pct_change:.2f}%)\n\n" | |
| result_text += f"## All Model Predictions\n" | |
| # Add all individual model predictions | |
| for name, pred in sorted(predictions.items(), key=lambda x: x[1], reverse=True): | |
| if name != 'Ensemble': | |
| result_text += f"- **{name}:** {pred:.2f} USD billion\n" | |
| # Create visualization | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| # Get last 10 years data | |
| df = predictor.cleaned_df | |
| last_years = df.sort_values('Year').tail(10) | |
| ax.plot(last_years['Year'], last_years[predictor.target], 'o-', linewidth=2, label='Historical GDP') | |
| # Add prediction point | |
| pred_year = latest_year + 1 | |
| ax.scatter([pred_year], [predictions['Ensemble']], color='green', s=150, label='Prediction') | |
| # Format plot | |
| ax.set_title('GDP Prediction', fontsize=14) | |
| ax.set_xlabel('Year', fontsize=12) | |
| ax.set_ylabel('Real GDP (USD billion)', fontsize=12) | |
| ax.grid(True, alpha=0.3) | |
| ax.legend() | |
| return result_text, fig | |
| except Exception as e: | |
| return f"Error making prediction: {str(e)}", None | |
| # Create the interface | |
| with gr.Blocks(title="GDP Predictor") as demo: | |
| gr.Markdown("# GDP Prediction Model") | |
| gr.Markdown(f""" | |
| This application predicts GDP based on various economic indicators. The current dataset contains data up to the year {latest_year}. | |
| Adjust the sliders below to see how changes in different economic indicators might affect GDP. | |
| The default values are set to the most recent values from the dataset. | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| # Create input sliders from feature info | |
| inputs = create_feature_inputs() | |
| with gr.Column(scale=3): | |
| # Output components | |
| prediction_text = gr.Markdown("Adjust sliders and click 'Predict' to see results") | |
| prediction_plot = gr.Plot(label="GDP Prediction Visualization") | |
| # Predict button | |
| predict_btn = gr.Button("Predict GDP") | |
| predict_btn.click(fn=predict, inputs=inputs, outputs=[prediction_text, prediction_plot]) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| demo.launch() |