import gradio as gr import pandas as pd import numpy as np from sklearn.ensemble import RandomForestClassifier import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime # Synthetic Dataset Creation def create_synthetic_dataset(): # Districts of Andhra Pradesh districts = [ 'Anantapur', 'Chittoor', 'East Godavari', 'Guntur', 'Krishna', 'Kurnool', 'Nellore', 'Prakasam', 'Srikakulam', 'Visakhapatnam', 'Vizianagaram', 'West Godavari', 'YSR Kadapa' ] # Common crops in Andhra Pradesh (including new crops) crops = [ 'Rice', 'Maize', 'Corn', 'Cotton', 'Groundnut', 'Red Gram (Toor Dal)', 'Green Gram (Moong Dal)', 'Black Gram (Urad Dal)', 'Sugarcane', 'Chilli', 'Pepper', 'Turmeric', 'Tobacco', 'Sweet Potato', 'Mango', 'Banana', 'Coconut', 'Cashew', 'Soybean', 'Sunflower', 'Jowar (Sorghum)', 'Bajra (Pearl Millet)' ] # Months months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] # Create synthetic data np.random.seed(42) num_samples = 5000 data = { 'District': np.random.choice(districts, num_samples), 'Month': np.random.choice(months, num_samples), 'Temperature': np.random.uniform(20, 40, num_samples), 'Rainfall': np.random.uniform(0, 300, num_samples), 'Soil_Type': np.random.choice(['Black', 'Red', 'Alluvial', 'Laterite'], num_samples), 'Crop': np.random.choice(crops, num_samples), 'Suitability': np.random.choice([0, 1], num_samples, p=[0.3, 0.7]) } # Add some logical patterns based on real-world knowledge for i in range(num_samples): district = data['District'][i] month = data['Month'][i] # Adjust temperature based on month if month in ['December', 'January', 'February']: data['Temperature'][i] = np.random.uniform(15, 28) elif month in ['March', 'April', 'May']: data['Temperature'][i] = np.random.uniform(28, 42) else: data['Temperature'][i] = np.random.uniform(25, 35) # Adjust rainfall based on district and month if district in ['Visakhapatnam', 'Srikakulam', 'Vizianagaram']: if month in ['July', 'August', 'September']: data['Rainfall'][i] = np.random.uniform(150, 300) else: data['Rainfall'][i] = np.random.uniform(50, 150) elif district in ['Anantapur', 'Kurnool', 'YSR Kadapa']: data['Rainfall'][i] = np.random.uniform(0, 100) else: if month in ['July', 'August', 'September']: data['Rainfall'][i] = np.random.uniform(100, 250) else: data['Rainfall'][i] = np.random.uniform(20, 100) # Adjust suitability based on some logical conditions crop = data['Crop'][i] # Rice needs more water if crop == 'Rice' and data['Rainfall'][i] < 100: data['Suitability'][i] = 0 # Corn needs moderate water and warm temperature if crop == 'Corn' and (data['Rainfall'][i] < 50 or data['Temperature'][i] < 20): data['Suitability'][i] = 0 # Pepper needs warm, humid conditions if crop == 'Pepper' and (data['Temperature'][i] < 20 or data['Rainfall'][i] < 100): data['Suitability'][i] = 0 # Sweet Potato grows well in warm conditions with moderate rainfall if crop == 'Sweet Potato' and (data['Temperature'][i] < 20 or data['Rainfall'][i] > 250): data['Suitability'][i] = 0 # Groundnut grows well in Anantapur if crop == 'Groundnut' and district == 'Anantapur': data['Suitability'][i] = 1 # Coconut grows well in coastal areas if crop == 'Coconut' and district in ['East Godavari', 'West Godavari', 'Visakhapatnam']: data['Suitability'][i] = 1 # Chilli grows well in Guntur if crop == 'Chilli' and district == 'Guntur': data['Suitability'][i] = 1 # Corn grows well in Krishna and Guntur if crop == 'Corn' and district in ['Krishna', 'Guntur', 'West Godavari']: data['Suitability'][i] = 1 # Pepper grows well in coastal and hilly areas if crop == 'Pepper' and district in ['Visakhapatnam', 'Srikakulam', 'Vizianagaram']: data['Suitability'][i] = 1 # Sweet Potato grows well in various districts if crop == 'Sweet Potato' and district in ['East Godavari', 'West Godavari', 'Krishna']: data['Suitability'][i] = 1 df = pd.DataFrame(data) return df, crops, districts, months # Create dataset df, crops, districts, months = create_synthetic_dataset() # Train machine learning model def train_model(df): # Convert categorical variables to numerical df_encoded = pd.get_dummies(df, columns=['District', 'Month', 'Soil_Type', 'Crop']) X = df_encoded.drop('Suitability', axis=1) y = df_encoded['Suitability'] model = RandomForestClassifier(n_estimators=100, random_state=42) model.fit(X, y) return model model = train_model(df) # Crop information and precautions (updated with new crops) crop_info = { 'Rice': { 'description': 'Staple food crop requiring abundant water', 'precautions': [ 'Ensure proper water management (5-10 cm standing water)', 'Use certified seeds for better yield', 'Control weeds in early stages', 'Monitor for pests like stem borers and leaf folders' ] }, 'Maize': { 'description': 'Versatile cereal crop grown in diverse conditions', 'precautions': [ 'Plant in well-drained soil', 'Maintain proper spacing (60x20 cm)', 'Apply nitrogen in split doses', 'Watch for fall armyworm infestation' ] }, 'Corn': { 'description': 'Sweet corn variety popular for direct consumption', 'precautions': [ 'Plant in well-drained loamy soil', 'Maintain spacing of 60x25 cm', 'Harvest when silks turn brown and dry', 'Control corn earworm and aphids', 'Irrigate regularly during grain filling stage' ] }, 'Cotton': { 'description': 'Important cash crop known as "white gold"', 'precautions': [ 'Use Bt cotton seeds for pest resistance', 'Monitor for pink bollworm', 'Practice crop rotation to prevent soil depletion', 'Avoid waterlogging in fields' ] }, 'Groundnut': { 'description': 'Oilseed crop important for protein and oil', 'precautions': [ 'Plant in well-drained sandy loam soil', 'Apply gypsum at flowering stage', 'Harvest at proper maturity to avoid aflatoxin', 'Store in dry conditions' ] }, 'Red Gram (Toor Dal)': { 'description': 'Important pulse crop rich in protein', 'precautions': [ 'Drought resistant but needs irrigation at flowering', 'Treat seeds with rhizobium culture', 'Control pod borer with recommended pesticides', 'Harvest when 80% pods are mature' ] }, 'Green Gram (Moong Dal)': { 'description': 'Short duration pulse crop', 'precautions': [ 'Grows well in well-drained soils', 'Short duration (60-70 days)', 'Susceptible to yellow mosaic virus - use resistant varieties', 'Harvest when 80% pods are mature' ] }, 'Black Gram (Urad Dal)': { 'description': 'Important pulse crop for protein', 'precautions': [ 'Grows well in black cotton soils', 'Treat seeds with rhizobium culture', 'Control leaf spot diseases', 'Harvest when pods turn black' ] }, 'Sugarcane': { 'description': 'Important cash crop for sugar production', 'precautions': [ 'Requires heavy irrigation', 'Use disease-free setts for planting', 'Control early shoot borer', 'Harvest at proper maturity (10-12 months)' ] }, 'Chilli': { 'description': 'Important spice crop with high value', 'precautions': [ 'Requires well-drained fertile soil', 'Irrigate carefully to avoid flower drop', 'Control fruit borer and mites', 'Harvest at color break stage' ] }, 'Pepper': { 'description': 'Black pepper, important spice crop', 'precautions': [ 'Plant in well-drained red loamy soil', 'Provide support with standards or trellis', 'Control quick wilt and pollu beetle', 'Harvest when berries turn orange-red', 'Provide shade during initial growth' ] }, 'Turmeric': { 'description': 'Important spice crop with medicinal value', 'precautions': [ 'Plant in well-drained fertile soil', 'Treat seed rhizomes with fungicide', 'Control leaf spot diseases', 'Harvest after 8-9 months when leaves dry' ] }, 'Tobacco': { 'description': 'Commercial crop mainly for export', 'precautions': [ 'Requires well-drained sandy loam soils', 'Needs careful curing after harvest', 'Follow government regulations', 'Practice crop rotation' ] }, 'Sweet Potato': { 'description': 'Nutritious root vegetable rich in vitamins', 'precautions': [ 'Plant in well-drained sandy loam soil', 'Use vine cuttings for propagation', 'Control sweet potato weevil', 'Harvest when leaves turn yellow', 'Cure properly before storage' ] }, 'Mango': { 'description': 'Important fruit crop of Andhra Pradesh', 'precautions': [ 'Plant in well-drained deep soils', 'Prune for proper canopy management', 'Control mango hopper and fruit fly', 'Harvest at proper maturity' ] }, 'Banana': { 'description': 'Important fruit crop with high yield', 'precautions': [ 'Requires heavy irrigation and fertilization', 'Plant disease-free tissue culture plants', 'Control sigatoka leaf spot disease', 'Support plants during fruiting' ] }, 'Coconut': { 'description': 'Important plantation crop of coastal areas', 'precautions': [ 'Plant in coastal sandy soils', 'Apply balanced fertilizers regularly', 'Control rhinoceros beetle', 'Intercrop with cocoa or pepper' ] }, 'Cashew': { 'description': 'Important plantation crop for export', 'precautions': [ 'Plant in well-drained sandy soils', 'Prune for proper shape', 'Control tea mosquito bug', 'Harvest nuts when apple turns pink' ] }, 'Soybean': { 'description': 'Oilseed crop rich in protein', 'precautions': [ 'Plant in well-drained soils', 'Inoculate seeds with rhizobium', 'Control yellow mosaic virus', 'Harvest when leaves yellow and drop' ] }, 'Sunflower': { 'description': 'Important oilseed crop', 'precautions': [ 'Plant in well-drained soils', 'Provide support if needed', 'Control head borer', 'Harvest when back of head turns yellow' ] }, 'Jowar (Sorghum)': { 'description': 'Traditional millet crop', 'precautions': [ 'Drought resistant crop', 'Control shoot fly in early stages', 'Harvest when grains are hard' ] }, 'Bajra (Pearl Millet)': { 'description': 'Traditional drought-resistant crop', 'precautions': [ 'Grows well in poor soils', 'Control downy mildew', 'Harvest when grains are hard' ] } } # District-wise climate information (unchanged) district_climate = { 'Anantapur': { 'description': 'Hot and dry climate with low rainfall', 'soil': 'Red sandy loam soils', 'avg_temp': '28-40°C', 'avg_rainfall': '500-600 mm' }, 'Chittoor': { 'description': 'Moderate climate with some hilly areas', 'soil': 'Red soils and black cotton soils', 'avg_temp': '22-38°C', 'avg_rainfall': '900-1000 mm' }, 'East Godavari': { 'description': 'Coastal district with high humidity', 'soil': 'Alluvial and deltaic soils', 'avg_temp': '24-36°C', 'avg_rainfall': '1000-1100 mm' }, 'Guntur': { 'description': 'Coastal plains with hot climate', 'soil': 'Black cotton soils', 'avg_temp': '25-38°C', 'avg_rainfall': '800-900 mm' }, 'Krishna': { 'description': 'Coastal district with fertile delta', 'soil': 'Alluvial and black soils', 'avg_temp': '24-36°C', 'avg_rainfall': '900-1000 mm' }, 'Kurnool': { 'description': 'Semi-arid climate with low rainfall', 'soil': 'Red soils and black soils', 'avg_temp': '26-40°C', 'avg_rainfall': '600-700 mm' }, 'Nellore': { 'description': 'Coastal district with moderate rainfall', 'soil': 'Red soils and sandy loams', 'avg_temp': '24-36°C', 'avg_rainfall': '1000-1100 mm' }, 'Prakasam': { 'description': 'Mixed coastal and dry climate', 'soil': 'Red soils and sandy loams', 'avg_temp': '25-38°C', 'avg_rainfall': '800-900 mm' }, 'Srikakulam': { 'description': 'Northern coastal district with good rainfall', 'soil': 'Red and alluvial soils', 'avg_temp': '22-34°C', 'avg_rainfall': '1100-1200 mm' }, 'Visakhapatnam': { 'description': 'Coastal district with hilly terrain', 'soil': 'Red and laterite soils', 'avg_temp': '22-33°C', 'avg_rainfall': '1000-1100 mm' }, 'Vizianagaram': { 'description': 'Coastal district with moderate climate', 'soil': 'Red and alluvial soils', 'avg_temp': '23-35°C', 'avg_rainfall': '1000-1100 mm' }, 'West Godavari': { 'description': 'Fertile delta region with high humidity', 'soil': 'Alluvial and black soils', 'avg_temp': '24-36°C', 'avg_rainfall': '1000-1100 mm' }, 'YSR Kadapa': { 'description': 'Hot and dry climate with low rainfall', 'soil': 'Red soils and black soils', 'avg_temp': '27-40°C', 'avg_rainfall': '600-700 mm' } } # Prediction function (unchanged) def predict_crop(district, month, crop_choice=None): # Get current temperature and rainfall based on district and month temp = df[(df['District'] == district) & (df['Month'] == month)]['Temperature'].mean() rainfall = df[(df['District'] == district) & (df['Month'] == month)]['Rainfall'].mean() soil_type = df[df['District'] == district]['Soil_Type'].mode()[0] # Prepare input for model input_data = { 'District': district, 'Month': month, 'Temperature': temp, 'Rainfall': rainfall, 'Soil_Type': soil_type } # If user has selected a crop if crop_choice and crop_choice != "I don't know": input_data['Crop'] = crop_choice input_df = pd.DataFrame([input_data]) input_encoded = pd.get_dummies(input_df, columns=['District', 'Month', 'Soil_Type', 'Crop']) # Ensure all columns are present (add missing with 0) train_columns = pd.get_dummies(df, columns=['District', 'Month', 'Soil_Type', 'Crop']).columns.drop('Suitability') for col in train_columns: if col not in input_encoded.columns: input_encoded[col] = 0 input_encoded = input_encoded[train_columns] prediction = model.predict(input_encoded)[0] if prediction == 1: result = f"✅ {crop_choice} is suitable to grow in {district} during {month}." precautions = crop_info[crop_choice]['precautions'] precautions_text = "\n".join([f"• {precaution}" for precaution in precautions]) output = f"{result}\n\n📌 Precautions:\n{precautions_text}" else: alternatives = get_alternative_crops(district, month) alt_text = "\n".join([f"• {crop}" for crop in alternatives[:3]]) output = f"❌ {crop_choice} is not recommended for {district} in {month}.\n\n🌱 Better alternatives:\n{alt_text}" else: # Recommend best crops recommended_crops = get_alternative_crops(district, month) rec_text = "\n".join([f"• {crop}" for crop in recommended_crops[:5]]) # Get climate info climate = district_climate[district] climate_text = ( f"🌡️ Avg Temperature: {climate['avg_temp']}\n" f"🌧️ Avg Rainfall: {climate['avg_rainfall']}\n" f"🌱 Soil Type: {climate['soil']}" ) output = ( f"🌾 Recommended crops for {district} in {month}:\n\n{rec_text}\n\n" f"📌 District Climate Info:\n{climate_text}" ) return output def get_alternative_crops(district, month): # Get current temperature and rainfall based on district and month temp = df[(df['District'] == district) & (df['Month'] == month)]['Temperature'].mean() rainfall = df[(df['District'] == district) & (df['Month'] == month)]['Rainfall'].mean() soil_type = df[df['District'] == district]['Soil_Type'].mode()[0] # Test all crops and get suitability scores crop_scores = [] for crop in crops: input_data = { 'District': district, 'Month': month, 'Temperature': temp, 'Rainfall': rainfall, 'Soil_Type': soil_type, 'Crop': crop } input_df = pd.DataFrame([input_data]) input_encoded = pd.get_dummies(input_df, columns=['District', 'Month', 'Soil_Type', 'Crop']) # Ensure all columns are present (add missing with 0) train_columns = pd.get_dummies(df, columns=['District', 'Month', 'Soil_Type', 'Crop']).columns.drop('Suitability') for col in train_columns: if col not in input_encoded.columns: input_encoded[col] = 0 input_encoded = input_encoded[train_columns] # Get probability instead of binary prediction proba = model.predict_proba(input_encoded)[0][1] crop_scores.append((crop, proba)) # Sort by probability crop_scores.sort(key=lambda x: x[1], reverse=True) return [crop for crop, score in crop_scores if score > 0.7] # Custom CSS for styling (unchanged) css = """ .gradio-container { font-family: 'Poppins', sans-serif; background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); } .title { text-align: center; color: #2c3e50; font-size: 28px; font-weight: 600; margin-bottom: 20px; background: linear-gradient(90deg, #4b6cb7 0%, #182848 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .description { text-align: center; color: #4a5568; margin-bottom: 30px; font-size: 16px; } .input-section { background: white; padding: 20px; border-radius: 10px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); margin-bottom: 20px; } .input-label { font-weight: 500; color: #2d3748; margin-bottom: 8px; display: block; } .output-section { background: white; padding: 25px; border-radius: 10px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); min-height: 200px; font-size: 16px; line-height: 1.6; white-space: pre-wrap; } .output-title { color: #2c3e50; font-weight: 600; margin-bottom: 15px; font-size: 20px; border-bottom: 2px solid #e2e8f0; padding-bottom: 8px; } .btn-primary { background: linear-gradient(90deg, #4b6cb7 0%, #182848 100%); border: none; color: white; padding: 12px 24px; border-radius: 8px; font-weight: 500; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 7px 14px rgba(0, 0, 0, 0.1); } .select-dropdown, .text-input { width: 100%; padding: 12px; border: 1px solid #e2e8f0; border-radius: 8px; font-size: 16px; transition: all 0.3s ease; } .select-dropdown:focus, .text-input:focus { border-color: #4b6cb7; box-shadow: 0 0 0 3px rgba(75, 108, 183, 0.2); outline: none; } .footer { text-align: center; margin-top: 30px; color: #718096; font-size: 14px; } .success { color: #2e7d32; } .warning { color: #d32f2f; } .recommendation { background: #f0f4f8; padding: 15px; border-radius: 8px; margin-top: 15px; border-left: 4px solid #4b6cb7; } .crop-image { max-width: 100%; border-radius: 8px; margin-top: 15px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } """ # Gradio Interface with gr.Blocks(css=css) as demo: gr.Markdown("""