import gradio as gr import pandas as pd import pickle import numpy as np # Extract unique values from the dataset df = pd.read_csv('Fertilizer Prediction.csv') # Create mapping dataframes based on your dataset soil_types = df['Soil Type'].unique().tolist() soil_type_mapping = {soil: idx+1 for idx, soil in enumerate(sorted(soil_types))} Soil_Type = pd.DataFrame({'Encoded': list(soil_type_mapping.values())}, index=soil_type_mapping.keys()) crop_types = df['Crop Type'].unique().tolist() crop_type_mapping = {crop: idx+1 for idx, crop in enumerate(sorted(crop_types))} Crop_Type = pd.DataFrame({'Encoded': list(crop_type_mapping.values())}, index=crop_type_mapping.keys()) # Use the provided fertilizer mapping fertilizer_types = ["Urea", "DAP", "14-35-14", "28-28", "17-17-17", "20-20", "10-26-26"] Fertilizer = pd.DataFrame({'Encoded': [1, 2, 3, 4, 5, 6, 7]}, index=fertilizer_types) # Load the trained model def load_model(): try: with open('Fertilizer_recommender.pkl', 'rb') as f: model = pickle.load(f) return model except FileNotFoundError: # For demonstration purposes import joblib return joblib.load('Fertilizer_recommender.pkl') model = load_model() def recommend_fertilizer(temperature, humidity, moisture, soil_type, crop_type, nitrogen, phosphorous, potassium): """ Function to recommend fertilizer based on input parameters """ # Get the encoded values for soil and crop types soil_type_encoded = Soil_Type.loc[soil_type]['Encoded'] crop_type_encoded = Crop_Type.loc[crop_type]['Encoded'] # Create input DataFrame with the exact column names used during training # Note: The CSV shows column names with exact spelling (including typo in 'Temparature') input_data = pd.DataFrame({ 'Temparature': [temperature], # Maintaining the typo as in the dataset 'Humidity ': [humidity], # Note the space after Humidity 'Moisture': [moisture], 'Soil Type': [soil_type_encoded], 'Crop Type': [crop_type_encoded], 'Nitrogen': [nitrogen], 'Potassium': [potassium], # Note: In the CSV, Potassium comes before Phosphorous 'Phosphorous': [phosphorous], }) # Make prediction prediction = model.predict(input_data)[0] # Map prediction back to fertilizer name try: fertilizer_name = Fertilizer[Fertilizer['Encoded'] == prediction].index[0] return fertilizer_name except IndexError: return f"Unknown fertilizer code: {prediction} - Please check your Fertilizer mapping." # Create Gradio interface with examples from the dataset iface = gr.Interface( fn=recommend_fertilizer, inputs=[ gr.Number(label="Temperature (°C)", value=26), gr.Number(label="Humidity (%)", value=52), gr.Number(label="Moisture (%)", value=38), gr.Dropdown(choices=sorted(soil_types), label="Soil Type", value="Black"), gr.Dropdown(choices=sorted(crop_types), label="Crop Type", value="Wheat"), gr.Number(label="Nitrogen (%)", value=37), gr.Number(label="Phosphorous (%)", value=0), gr.Number(label="Potassium (%)", value=0), ], outputs=gr.Text(label="Recommended Fertilizer"), title="Fertilizer Recommender", description="Enter the environmental and crop details to get the best fertilizer recommendation.", examples=[ # Example from your initial test case [23, 40, 60, "Black", "Wheat", 30, 40, 50], # Examples from the dataset [26, 52, 38, "Sandy", "Maize", 37, 0, 0], # Should recommend Urea [29, 52, 45, "Loamy", "Sugarcane", 12, 36, 0], # Should recommend DAP [34, 65, 62, "Black", "Cotton", 7, 30, 9], # Should recommend 14-35-14 [32, 62, 34, "Red", "Tobacco", 22, 20, 0] # Should recommend 28-28 ], api_name="/api/predict_fertilizer" ) # Launch the app iface.launch(show_error=True)