import gradio as gr import pandas as pd import numpy as np import joblib # ----------------------------- # 1️⃣ Load model and data # ----------------------------- MODEL_PATH = "linear_model.pkl" EXCEL_PATH = "excel sheet of plant 2.xlsx" linear_model = joblib.load(MODEL_PATH) df = pd.read_excel(EXCEL_PATH) df.columns = df.columns.str.strip() # Strains and rows strain_names = df['pea plant strain'].unique().tolist() row_options = ["None, Enter Manually"] + [str(i) for i in range(len(df))] #-------------- To be commented -------------------- # ----------------------------- # 2️⃣ Autofill function # ----------------------------- # def autofill_fields(row_index): # if row_index == "None, Enter Manually": # return [None]*11 # row = df.iloc[int(row_index)] # return ( # row['Dose (g/pot)'], row['Soil N (ppm)'], row['Soil P (ppm)'], # row['Soil K (ppm)'], row['pH'], row['Chlorophyll (SPAD)'], # row['Shoot Length (cm)'], row['Root Length (cm)'], row['Shoot Wt (g)'], # row['Root Wt (g)'], row['Yield (g/pot)'] # ) # ----------------------------- # 3️⃣ Prediction function # ----------------------------- def predict_linear(strain, dose, soil_n, soil_p, soil_k, ph, chlorophyll, shoot_len, root_len, shoot_wt, root_wt, yield_gp): logs = [] # ----------------------------- # 🧩 Convert textbox inputs to floats (or None if blank) # ----------------------------- # def to_float(x): # try: # return float(x) # except (TypeError, ValueError): # return None # dose = to_float(dose) # soil_n = to_float(soil_n) # soil_p = to_float(soil_p) # soil_k = to_float(soil_k) # ph = to_float(ph) # # ----------------------------- required = [dose, soil_n, soil_p, soil_k, ph] if any(v is None for v in required): logs.append("[DEBUG] Missing numeric inputs!") return pd.DataFrame(), "\n⚠️ Fill all required inputs", "\n".join(logs) logs.append("[DEBUG] Inputs received.") # Prepare DataFrame for model X_input = pd.DataFrame([{ 'pea plant strain': strain, 'Dose (g/pot)': dose, 'Soil N (ppm)': soil_n, 'Soil P (ppm)': soil_p, 'Soil K (ppm)': soil_k, 'pH': ph }]) logs.append(f"[DEBUG] Input DataFrame:\n{X_input}") y_pred = linear_model.predict(X_input)[0] logs.append(f"[DEBUG] Predicted values:\n{y_pred}") # Actuals and errors actuals = [chlorophyll, shoot_len, root_len, shoot_wt, root_wt, yield_gp] abs_errors = [ round(abs(p - a), 2) if a is not None else "N/A" for p, a in zip(y_pred[:6], actuals) ] target_cols = ['Chlorophyll (SPAD)', 'Shoot Length (cm)', 'Root Length (cm)', 'Shoot Wt (g)', 'Root Wt (g)', 'Yield (g/pot)', 'Relative Yield (%)'] # Build table DataFrame data = { "Output Metric": target_cols, # "Actual Value": actuals + ["N/A"], "Predicted Value": [round(v, 2) for v in y_pred], # "Absolute Error": abs_errors + ["N/A"] } result_df = pd.DataFrame(data) return result_df, "Prediction complete!", "\n".join(logs) # ----------------------------- # Clear Inputs Function # ----------------------------- def clear_inputs(): # Reset all input fields to None return [None] * 11 # same number of numeric input fields # ----------------------------- # 4️⃣ Gradio Interface (Green Theme) # ----------------------------- invalid_strains = ["Strains", "strain1", "strain2", ""] valid_strain = next( (s for s in strain_names if pd.notna(s) and s not in invalid_strains), strain_names[0] ) with gr.Blocks( title="Linear Regression Plant Predictor", theme=gr.themes.Soft( primary_hue="green", secondary_hue="green", neutral_hue="green" ) ) as demo: gr.Markdown("

Linear Regression, Plant Yield Predictor

") strain_names = ["Tetradesmus nigardi", "Clostroprosis acicularis"] with gr.Row(): with gr.Column(scale=1): gr.Markdown("### Plant & Strain") strain_input = gr.Dropdown( strain_names, label="Select Strain", value=strain_names[0] # default: Tetradesmus nigardi ) # row_selector = gr.Dropdown(row_options, label="Select Row", value="None, Enter Manually") gr.Markdown("### Input Parameters") dose = gr.Number(label="Dose (g/pot)",placeholder="Enter value") # ,placeholder="Enter value" soil_n = gr.Number(label="Soil N (ppm)",placeholder="Enter value") soil_p = gr.Number(label="Soil P (ppm)",placeholder="Enter value") soil_k = gr.Number(label="Soil K (ppm)",placeholder="Enter value") ph = gr.Number(label="pH") # gr.Markdown("### Autofilled Actual Metrics (from Excel)") # chlorophyll = gr.Number(label="Chlorophyll (SPAD)") # shoot_len = gr.Number(label="Shoot Length (cm)") # root_len = gr.Number(label="Root Length (cm)") # shoot_wt = gr.Number(label="Shoot Wt (g)") # root_wt = gr.Number(label="Root Wt (g)") # yield_gp = gr.Number(label="Yield (g/pot)") # Hidden placeholders for metrics chlorophyll = gr.State(None) shoot_len = gr.State(None) root_len = gr.State(None) shoot_wt = gr.State(None) root_wt = gr.State(None) yield_gp = gr.State(None) with gr.Row(): predict_btn = gr.Button(" Predict", variant="primary") clear_btn = gr.Button("🧹 Clear Inputs", variant="secondary") with gr.Column(scale=1): gr.Markdown("### Prediction Results Table") result_table = gr.DataFrame( headers=["Output Metric", "Predicted Value"], #"Actual Value", "Absolute Error" label="Results Comparison", interactive=False ) status_box = gr.Markdown("") log_box = gr.Textbox(label="Debug Logs", lines=15) gr.Markdown( """ ### Input Tips: - Select the **plant strain** you want to analyze. - Provide all essential input parameters: **Dose (g/pot), Soil N, Soil P, Soil K, and pH**. - Click **“Predict”** to generate the model’s predictions. ### Output Tips:

Prediction Table: Displays model predictions for all plant growth metrics.

Debug Logs: Provides detailed trace of model inputs and internal calculations.

""" ) # #Autofill callback # row_selector.change( # fn=autofill_fields, # inputs=[row_selector], # outputs=[dose, soil_n, soil_p, soil_k, ph, # chlorophyll, shoot_len, root_len, # shoot_wt, root_wt, yield_gp] # ) # Prediction callback predict_btn.click( fn=predict_linear, inputs=[strain_input, dose, soil_n, soil_p, soil_k, ph, chlorophyll, shoot_len, root_len, shoot_wt, root_wt, yield_gp], outputs=[result_table, status_box, log_box] ) # Clear button callback clear_btn.click( fn=clear_inputs, inputs=[], outputs=[dose, soil_n, soil_p, soil_k, ph, chlorophyll, shoot_len, root_len, shoot_wt, root_wt, yield_gp] ) # ----------------------------- # 5️⃣ Launch # ----------------------------- if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)