Yield-predictor / app.py
Ayesha-Majeed's picture
Update app.py
334c27d verified
raw
history blame
5.35 kB
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()
strain_names = df['pea plant strain'].unique().tolist()
row_options = ["None, Enter Manually"] + [str(i) for i in range(len(df))]
# -----------------------------
# 2️⃣ Autofill function
# -----------------------------
def autofill_fields(row_index):
if row_index == "None, Enter Manually":
return [None]*11 # Dose, Soil N, P, K, pH + 6 optional yield metrics
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,
actual_yield=None):
logs = []
# Validate required inputs
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 "⚠️ Fill all inputs", "", "", "\n".join(logs)
logs.append("[DEBUG] Inputs received.")
# Prepare DataFrame
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}")
# Predict all 7 target metrics
y_pred = linear_model.predict(X_input)[0]
logs.append(f"[DEBUG] Predicted values:\n{y_pred}")
# Optional actual_yield comparison
if actual_yield is not None:
try:
actual_val = float(actual_yield)
abs_error = np.abs(actual_val - y_pred[5]) # assuming Yield (g/pot) at index 5
logs.append(f"[DEBUG] Actual Yield: {actual_val}")
logs.append(f"[DEBUG] Absolute Error: {abs_error}")
return (f"**Predicted Metrics:** {y_pred.round(2)}",
f"**Actual Yield:** {actual_val}",
f"**Absolute Error:** {abs_error:.2f}",
"\n".join(logs))
except:
logs.append("[DEBUG] Actual yield invalid.")
return (f"**Predicted Metrics:** {y_pred.round(2)}",
"Actual Yield: Not provided",
"Absolute Error: N/A",
"\n".join(logs))
# -----------------------------
# 4️⃣ Gradio Interface
# -----------------------------
with gr.Blocks(title="Linear Regression Plant Predictor") as demo:
gr.Markdown("<h1 style='text-align:center'>Linear Regression — Plant Yield Predictor</h1>")
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])
row_selector = gr.Dropdown(row_options, label="Select Row", value="None, Enter Manually")
gr.Markdown("### Input Parameters")
dose = gr.Number(label="Dose (g/pot)")
soil_n = gr.Number(label="Soil N (ppm)")
soil_p = gr.Number(label="Soil P (ppm)")
soil_k = gr.Number(label="Soil K (ppm)")
ph = gr.Number(label="pH")
gr.Markdown("### Optional Yield Metrics")
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)")
actual_yield = gr.Number(label="Actual Yield (g/pot)")
predict_btn = gr.Button("Predict", variant="primary")
with gr.Column(scale=1):
gr.Markdown("### Inference Result")
pred_box = gr.Markdown("Awaiting prediction...")
actual_box = gr.Markdown("")
abs_box = gr.Markdown("")
log_box = gr.Textbox(label="Debug Logs", lines=15)
# 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,
actual_yield],
outputs=[pred_box, actual_box, abs_box, log_box])
# -----------------------------
# 5️⃣ Launch
# -----------------------------
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)