Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import pickle | |
| import numpy as np | |
| # Load the saved artifacts | |
| with open('random_forest_model.pkl', 'rb') as f: | |
| model = pickle.load(f) | |
| with open('scaler.pkl', 'rb') as f: | |
| scaler = pickle.load(f) | |
| with open('kmeans.pkl', 'rb') as f: | |
| kmeans = pickle.load(f) | |
| with open('df_2024_preprocessed.pkl', 'rb') as f: | |
| df_2024 = pickle.load(f) | |
| # Define feature columns (same as in training) | |
| feature_cols = [ | |
| 'ndvi_Flowering', 'ndvi_FruitDev', 'savi_FruitDev', | |
| 'era5_precipitation_FruitDev', 'era5_temperature_Flowering', 'era5_humidity_Harvest', | |
| 'smap_FruitDev', 'ndvi_FruitDev_lag1', 'precip_FruitDev_lag1', 'ndvi_precip_FruitDev', | |
| 'woreda_cluster' | |
| ] | |
| # Get unique woredas for the dropdown | |
| woredas = sorted(df_2024['woreda'].unique()) | |
| def predict_yield(woreda, farm_size): | |
| """ | |
| Predict coffee yield for a given woreda and farm size. | |
| Args: | |
| woreda (str): Selected woreda. | |
| farm_size (float): Farm size in hectares. | |
| Returns: | |
| str: Predicted yield in quintals. | |
| """ | |
| if farm_size <= 0: | |
| return "Error: Farm size must be greater than 0 hectares." | |
| # Filter df_2024 for the selected woreda | |
| df_woreda = df_2024[df_2024['woreda'] == woreda].copy() | |
| if df_woreda.empty: | |
| return f"Error: Woreda '{woreda}' not found in the dataset." | |
| # Prepare features for prediction | |
| X_woreda = df_woreda[feature_cols].copy() | |
| # Ensure no NaNs (should already be handled, but adding as a safeguard) | |
| if X_woreda.isna().any().any(): | |
| return "Error: Missing data for the selected woreda. Please contact support." | |
| # Transform features using the saved scaler | |
| X_woreda_scaled = scaler.transform(X_woreda) | |
| # Predict yield per hectare | |
| yield_per_ha = model.predict(X_woreda_scaled)[0] | |
| yield_per_ha = max(0, yield_per_ha) # Ensure non-negative prediction | |
| # Calculate total yield based on farm size | |
| total_yield = yield_per_ha * farm_size | |
| return (f"Predicted Coffee Yield for {woreda} (2025 Harvest):\n" | |
| f"- Yield per hectare: {yield_per_ha:.2f} quintals/ha\n" | |
| f"- Total yield for {farm_size:.2f} hectares: {total_yield:.2f} quintals") | |
| # Create Gradio interface | |
| interface = gr.Interface( | |
| fn=predict_yield, | |
| inputs=[ | |
| gr.Dropdown(choices=woredas, label="Select Your Woreda"), | |
| gr.Number(label="Enter Farm Size (hectares)", value=1.0) | |
| ], | |
| outputs=gr.Textbox(label="Prediction Result"), | |
| title="Coffee Yield Prediction for Sidama Region (2025 Harvest)", | |
| description=("Select your woreda and enter your farm size to predict your coffee yield for the 2025 harvest season (Oct–Dec 2025). " | |
| "Note: Predictions are based on historical data (2019–2022) and may have limitations. See the paper for details.") | |
| ) | |
| # Launch the interface (this won't work locally; deploy on Hugging Face Spaces) | |
| interface.launch() |