Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import numpy as np | |
| from sklearn.linear_model import LinearRegression | |
| from sklearn.preprocessing import PolynomialFeatures | |
| import gradio as gr | |
| import matplotlib.pyplot as plt | |
| def train_model(df): | |
| # Extract year (first column) and target (second column) | |
| years = df.iloc[:, 0].values.reshape(-1, 1) | |
| target = df.iloc[:, 1].values | |
| # Determine model type based on number of columns | |
| if df.shape[1] > 2: | |
| # Multiple regression (year + additional features) | |
| features = df.iloc[:, 2:].values | |
| X = np.hstack((years, features)) | |
| model = LinearRegression() | |
| model.fit(X, target) | |
| return model, 'multiple', None, features | |
| else: | |
| # Polynomial regression (only year as feature) | |
| poly = PolynomialFeatures(degree=2) | |
| X_poly = poly.fit_transform(years) | |
| model = LinearRegression() | |
| model.fit(X_poly, target) | |
| return model, 'poly', poly, None | |
| def predict(dataset, years_to_predict): | |
| # Read dataset | |
| if dataset.name.endswith('.csv'): | |
| df = pd.read_csv(dataset.name) | |
| else: | |
| df = pd.read_excel(dataset.name) | |
| # Validate dataset | |
| if df.shape[1] < 2: | |
| raise gr.Error("Dataset must have at least 2 columns: Year and Target!") | |
| # Train model | |
| model, model_type, poly_features, features = train_model(df) | |
| # Prepare future years | |
| last_year = df.iloc[-1, 0] | |
| future_years = np.arange(last_year + 1, last_year + 1 + years_to_predict).reshape(-1, 1) | |
| # Generate predictions | |
| if model_type == 'poly': | |
| future_X = poly_features.transform(future_years) | |
| else: | |
| # Use last available features for future predictions | |
| last_features = df.iloc[-1, 2:].values.reshape(1, -1) | |
| repeated_features = np.repeat(last_features, years_to_predict, axis=0) | |
| future_X = np.hstack((future_years, repeated_features)) | |
| predictions = model.predict(future_X) | |
| # Create visualization | |
| plt.figure(figsize=(10, 5)) | |
| plt.plot(df.iloc[:, 0], df.iloc[:, 1], 'bo-', label='Historical Data') | |
| plt.plot(future_years, predictions, 'ro--', label='Predictions') | |
| plt.xlabel('Year') | |
| plt.ylabel('Target Value') | |
| plt.title('Time Series Forecast') | |
| plt.legend() | |
| plt.grid(True) | |
| # Create output DataFrame | |
| result_df = pd.DataFrame({ | |
| 'Year': future_years.flatten(), | |
| 'Predicted Value': predictions.round(2) | |
| }) | |
| return plt, result_df | |
| # Gradio Interface | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# ๐ Time Series Forecasting Tool") | |
| with gr.Row(): | |
| file_input = gr.File(label="Upload Dataset (CSV/Excel)") | |
| years_input = gr.Dropdown([1, 2, 5, 10], value=5, label="Years to Predict") | |
| btn = gr.Button("PREDICT") | |
| with gr.Row(): | |
| plot_output = gr.Plot() | |
| table_output = gr.DataFrame() | |
| btn.click( | |
| fn=predict, | |
| inputs=[file_input, years_input], | |
| outputs=[plot_output, table_output] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |