File size: 2,991 Bytes
ac23dee
 
244f9d0
ac23dee
 
244f9d0
ac23dee
 
 
 
244f9d0
 
 
 
 
932f1a8
244f9d0
 
 
 
 
 
 
 
 
 
144bb18
 
ac23dee
 
 
 
 
244f9d0
 
ac23dee
 
 
 
 
 
 
244f9d0
ac23dee
 
 
244f9d0
 
 
 
 
 
ac23dee
244f9d0
 
 
ac23dee
244f9d0
ac23dee
244f9d0
 
 
ac23dee
244f9d0
 
ac23dee
 
244f9d0
ac23dee
244f9d0
 
 
 
 
ac23dee
 
244f9d0
 
ac23dee
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import gradio as gr
import numpy as np
import joblib
from datetime import datetime, timedelta

# Load model and label encoders
model = joblib.load("best_model.pkl")
le_operation_type = joblib.load("le_operation_type.pkl")
le_operator_id = joblib.load("le_operator_id.pkl")

def predict_end_date(start_date_str, quantity, operation_type, operator_id, day_of_week):
    try:
        start_date = datetime.strptime(start_date_str, "%d-%m-%Y")
    except ValueError:
        return "Error: Start Date must be in DD-MM-YYYY format"

    # Encode categorical inputs
    try:
        operation_code = le_operation_type.transform([operation_type])[0]
    except ValueError:
        return f"Unknown Operation Type: {operation_type}"

    try:
        operator_code = le_operator_id.transform([operator_id])[0]
    except ValueError:
        return f"Unknown Operator ID: {operator_id}"

    # Feature engineering
    quantity_log = np.log1p(quantity)
    quantity_log_squared = quantity_log ** 2
    quantity_operation_interaction = quantity_log * operation_code
    quantity_operator_interaction = quantity_log * operator_code

    # Create feature vector for prediction
    X = np.array([[
        quantity_log,
        quantity_log_squared,
        quantity_operation_interaction,
        quantity_operator_interaction,
        operation_code,
        operator_code,
        day_of_week
    ]])

    pred_days = model.predict(X)[0]

    whole_days = int(pred_days)
    fractional_day = pred_days - whole_days

    total_seconds = fractional_day * 24 * 3600
    hours = int(total_seconds // 3600)
    minutes = int((total_seconds % 3600) // 60)

    est_end_datetime = start_date + timedelta(days=whole_days, hours=hours, minutes=minutes)
    est_end_date_str = est_end_datetime.strftime("%d-%m-%Y %H:%M")
    duration_str = f"{whole_days} days, {hours} hours, {minutes} minutes"

    return f"Estimated End Date & Time: {est_end_date_str}\nEstimated Duration: {duration_str}"

# Build Gradio interface
def gradio_interface(start_date, quantity, operation_type, operator_id, day_of_week):
    return predict_end_date(start_date, quantity, operation_type, operator_id, day_of_week)

operation_options = list(le_operation_type.classes_)
operator_options = list(le_operator_id.classes_)

iface = gr.Interface(
    fn=gradio_interface,
    inputs=[
        gr.Textbox(label="Start Date (DD-MM-YYYY)", value="21-07-2025"),
        gr.Number(label="Quantity", value=6000),
        gr.Dropdown(choices=operation_options, label="Operation Type", value=operation_options[0]),
        gr.Dropdown(choices=operator_options, label="Operator ID", value=operator_options[0]),
        gr.Slider(minimum=0, maximum=6, step=1, label="Day of Week (0=Monday, 6=Sunday)", value=1)
    ],
    outputs="text",
    title="Manufacturing Scheduler Prediction",
    description="Predict the estimated end date and duration of a manufacturing job based on input parameters."
)

if __name__ == "__main__":
    iface.launch()