Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -492,9 +492,89 @@ def perform_sustainability_analysis(state):
|
|
492 |
except Exception as e:
|
493 |
return f"β Error in sustainability analysis: {str(e)}", None, "Analysis failed"
|
494 |
|
495 |
-
def
|
496 |
-
|
497 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
498 |
if state.freight_model is None:
|
499 |
return "Error: Freight prediction model not loaded"
|
500 |
|
@@ -717,10 +797,13 @@ def run_analyses(state, choices, sales_file, supplier_file, text_data):
|
|
717 |
return combined_results, final_figure, combined_status
|
718 |
|
719 |
def predict_and_store_freight(state, *args):
|
720 |
-
|
721 |
-
|
722 |
-
state
|
723 |
-
|
|
|
|
|
|
|
724 |
|
725 |
def create_interface():
|
726 |
state = SupplyChainState()
|
@@ -812,15 +895,15 @@ def create_interface():
|
|
812 |
|
813 |
# Cost Prediction Tab
|
814 |
with gr.Tab("π° Cost Prediction", elem_classes="tab-content"):
|
815 |
-
with gr.Row():
|
816 |
-
shipment_mode = gr.Dropdown(
|
817 |
-
choices=["βοΈ Air", "π’ Ocean", "π Truck"],
|
818 |
-
label="Transport Mode",
|
819 |
-
value="βοΈ Air"
|
820 |
-
)
|
821 |
-
|
822 |
with gr.Row():
|
823 |
with gr.Column():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
824 |
weight = gr.Slider(
|
825 |
label="π¦ Weight (kg)",
|
826 |
minimum=1,
|
@@ -828,7 +911,6 @@ def create_interface():
|
|
828 |
step=1,
|
829 |
value=1000
|
830 |
)
|
831 |
-
with gr.Column():
|
832 |
line_item_value = gr.Slider(
|
833 |
label="π΅ Item Value (USD)",
|
834 |
minimum=1,
|
@@ -836,16 +918,86 @@ def create_interface():
|
|
836 |
step=1,
|
837 |
value=10000
|
838 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
839 |
|
840 |
predict_button = gr.Button(
|
841 |
-
"π Calculate Cost",
|
842 |
variant="primary",
|
843 |
elem_classes="action-button"
|
844 |
)
|
845 |
-
|
846 |
-
|
847 |
-
|
848 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
849 |
|
850 |
# Chat Tab
|
851 |
with gr.Tab("π¬ Chat", elem_classes="tab-content"):
|
@@ -902,15 +1054,27 @@ def create_interface():
|
|
902 |
)
|
903 |
|
904 |
predict_button.click(
|
905 |
-
fn=lambda
|
906 |
-
state,
|
907 |
-
|
908 |
-
|
909 |
-
|
910 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
911 |
),
|
912 |
-
inputs=[
|
913 |
-
|
|
|
|
|
|
|
|
|
914 |
)
|
915 |
|
916 |
chat_button.click(
|
|
|
492 |
except Exception as e:
|
493 |
return f"β Error in sustainability analysis: {str(e)}", None, "Analysis failed"
|
494 |
|
495 |
+
def calculate_shipping_cost(base_cost, params):
|
496 |
+
"""Calculate total shipping cost with all factors"""
|
497 |
+
total_cost = base_cost
|
498 |
+
|
499 |
+
# Fuel surcharge
|
500 |
+
fuel_charge = base_cost * (params['fuel_surcharge'] / 100)
|
501 |
+
|
502 |
+
# Insurance
|
503 |
+
insurance = params['line_item_value'] * (params['insurance_rate'] / 100)
|
504 |
+
|
505 |
+
# Customs duty
|
506 |
+
duty = params['line_item_value'] * (params['customs_duty'] / 100)
|
507 |
+
|
508 |
+
# Special handling charges
|
509 |
+
handling_charges = 0
|
510 |
+
handling_rates = {
|
511 |
+
"Temperature Controlled": 0.15,
|
512 |
+
"Hazardous Materials": 0.25,
|
513 |
+
"Fragile Items": 0.10,
|
514 |
+
"Express Delivery": 0.20,
|
515 |
+
"Door-to-Door Service": 0.15
|
516 |
+
}
|
517 |
+
|
518 |
+
for requirement in params['special_handling']:
|
519 |
+
if requirement in handling_rates:
|
520 |
+
handling_charges += base_cost * handling_rates[requirement]
|
521 |
+
|
522 |
+
# Distance-based charge
|
523 |
+
distance_rate = {
|
524 |
+
"Air": 0.1,
|
525 |
+
"Ocean": 0.05,
|
526 |
+
"Truck": 0.15
|
527 |
+
}
|
528 |
+
distance_charge = params['distance'] * distance_rate[params['shipment_mode']]
|
529 |
+
|
530 |
+
# Time-based charge
|
531 |
+
transit_charge = params['transit_time'] * (base_cost * 0.01)
|
532 |
+
|
533 |
+
total_cost = base_cost + fuel_charge + insurance + duty + handling_charges + distance_charge + transit_charge
|
534 |
+
|
535 |
+
return {
|
536 |
+
'base_cost': round(base_cost, 2),
|
537 |
+
'fuel_charge': round(fuel_charge, 2),
|
538 |
+
'insurance': round(insurance, 2),
|
539 |
+
'customs_duty': round(duty, 2),
|
540 |
+
'handling_charges': round(handling_charges, 2),
|
541 |
+
'distance_charge': round(distance_charge, 2),
|
542 |
+
'transit_charge': round(transit_charge, 2),
|
543 |
+
'total_cost': round(total_cost, 2)
|
544 |
+
}
|
545 |
+
|
546 |
+
def predict_freight_cost(state, params):
|
547 |
+
"""Predict freight cost with enhanced parameters"""
|
548 |
+
if state.freight_model is None:
|
549 |
+
return "Error: Freight prediction model not loaded"
|
550 |
+
|
551 |
+
try:
|
552 |
+
# Clean shipment mode string
|
553 |
+
mode = params['shipment_mode'].replace("βοΈ ", "").replace("π’ ", "").replace("π ", "")
|
554 |
+
|
555 |
+
# Prepare features for the model
|
556 |
+
features = {
|
557 |
+
'weight (kilograms)': params['weight'],
|
558 |
+
'line item value': params['line_item_value'],
|
559 |
+
'cost per kilogram': params['cost_per_kg'],
|
560 |
+
'shipment mode_Air Charter_weight': params['weight'] if mode == "Air" else 0,
|
561 |
+
'shipment mode_Ocean_weight': params['weight'] if mode == "Ocean" else 0,
|
562 |
+
'shipment mode_Truck_weight': params['weight'] if mode == "Truck" else 0,
|
563 |
+
'shipment mode_Air Charter_line_item_value': params['line_item_value'] if mode == "Air" else 0,
|
564 |
+
'shipment mode_Ocean_line_item_value': params['line_item_value'] if mode == "Ocean" else 0,
|
565 |
+
'shipment mode_Truck_line_item_value': params['line_item_value'] if mode == "Truck" else 0
|
566 |
+
}
|
567 |
+
|
568 |
+
input_data = pd.DataFrame([features])
|
569 |
+
base_prediction = state.freight_model.predict(input_data)[0]
|
570 |
+
|
571 |
+
# Calculate total cost with all factors
|
572 |
+
cost_breakdown = calculate_shipping_cost(base_prediction, params)
|
573 |
+
|
574 |
+
return cost_breakdown
|
575 |
+
|
576 |
+
except Exception as e:
|
577 |
+
return f"Error making prediction: {str(e)}"
|
578 |
if state.freight_model is None:
|
579 |
return "Error: Freight prediction model not loaded"
|
580 |
|
|
|
797 |
return combined_results, final_figure, combined_status
|
798 |
|
799 |
def predict_and_store_freight(state, *args):
|
800 |
+
if len(args) >= 3:
|
801 |
+
weight, line_item_value, shipment_mode = args[:3]
|
802 |
+
result = predict_freight_cost(state, weight, line_item_value, 50, shipment_mode)
|
803 |
+
if isinstance(result, (int, float)):
|
804 |
+
state.freight_predictions.append(result)
|
805 |
+
return result
|
806 |
+
return "Error: Invalid parameters"
|
807 |
|
808 |
def create_interface():
|
809 |
state = SupplyChainState()
|
|
|
895 |
|
896 |
# Cost Prediction Tab
|
897 |
with gr.Tab("π° Cost Prediction", elem_classes="tab-content"):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
898 |
with gr.Row():
|
899 |
with gr.Column():
|
900 |
+
shipment_mode = gr.Dropdown(
|
901 |
+
choices=["βοΈ Air", "π’ Ocean", "π Truck"],
|
902 |
+
label="Transport Mode",
|
903 |
+
value="βοΈ Air"
|
904 |
+
)
|
905 |
+
|
906 |
+
# Basic Parameters
|
907 |
weight = gr.Slider(
|
908 |
label="π¦ Weight (kg)",
|
909 |
minimum=1,
|
|
|
911 |
step=1,
|
912 |
value=1000
|
913 |
)
|
|
|
914 |
line_item_value = gr.Slider(
|
915 |
label="π΅ Item Value (USD)",
|
916 |
minimum=1,
|
|
|
918 |
step=1,
|
919 |
value=10000
|
920 |
)
|
921 |
+
cost_per_kg = gr.Slider(
|
922 |
+
label="π² Base Cost per kg (USD)",
|
923 |
+
minimum=1,
|
924 |
+
maximum=500,
|
925 |
+
step=1,
|
926 |
+
value=50
|
927 |
+
)
|
928 |
+
|
929 |
+
# Advanced Parameters
|
930 |
+
gr.Markdown("### Advanced Parameters")
|
931 |
+
transit_time = gr.Slider(
|
932 |
+
label="π Transit Time (Days)",
|
933 |
+
minimum=1,
|
934 |
+
maximum=60,
|
935 |
+
step=1,
|
936 |
+
value=7
|
937 |
+
)
|
938 |
+
distance = gr.Slider(
|
939 |
+
label="π Distance (km)",
|
940 |
+
minimum=100,
|
941 |
+
maximum=20000,
|
942 |
+
step=100,
|
943 |
+
value=1000
|
944 |
+
)
|
945 |
+
fuel_surcharge = gr.Slider(
|
946 |
+
label="β½ Fuel Surcharge (%)",
|
947 |
+
minimum=0,
|
948 |
+
maximum=50,
|
949 |
+
step=0.5,
|
950 |
+
value=5
|
951 |
+
)
|
952 |
+
|
953 |
+
# Risk Factors
|
954 |
+
gr.Markdown("### Risk Factors")
|
955 |
+
insurance_rate = gr.Slider(
|
956 |
+
label="π‘οΈ Insurance Rate (%)",
|
957 |
+
minimum=0.1,
|
958 |
+
maximum=10,
|
959 |
+
step=0.1,
|
960 |
+
value=1
|
961 |
+
)
|
962 |
+
customs_duty = gr.Slider(
|
963 |
+
label="ποΈ Customs Duty (%)",
|
964 |
+
minimum=0,
|
965 |
+
maximum=40,
|
966 |
+
step=0.5,
|
967 |
+
value=5
|
968 |
+
)
|
969 |
+
|
970 |
+
# Special Handling
|
971 |
+
gr.Markdown("### Special Handling")
|
972 |
+
special_handling = gr.CheckboxGroup(
|
973 |
+
choices=[
|
974 |
+
"Temperature Controlled",
|
975 |
+
"Hazardous Materials",
|
976 |
+
"Fragile Items",
|
977 |
+
"Express Delivery",
|
978 |
+
"Door-to-Door Service"
|
979 |
+
],
|
980 |
+
label="Special Requirements"
|
981 |
+
)
|
982 |
|
983 |
predict_button = gr.Button(
|
984 |
+
"π Calculate Total Cost",
|
985 |
variant="primary",
|
986 |
elem_classes="action-button"
|
987 |
)
|
988 |
+
with gr.Row():
|
989 |
+
freight_result = gr.Number(
|
990 |
+
label="Base Freight Cost (USD)",
|
991 |
+
elem_classes="result-box"
|
992 |
+
)
|
993 |
+
total_cost = gr.Number(
|
994 |
+
label="Total Cost Including All Charges (USD)",
|
995 |
+
elem_classes="result-box"
|
996 |
+
)
|
997 |
+
cost_breakdown = gr.JSON(
|
998 |
+
label="Cost Breakdown",
|
999 |
+
elem_classes="result-box"
|
1000 |
+
)
|
1001 |
|
1002 |
# Chat Tab
|
1003 |
with gr.Tab("π¬ Chat", elem_classes="tab-content"):
|
|
|
1054 |
)
|
1055 |
|
1056 |
predict_button.click(
|
1057 |
+
fn=lambda mode, w, val, cost, time, dist, fuel, ins, duty, special: predict_and_store_freight(
|
1058 |
+
state,
|
1059 |
+
{
|
1060 |
+
'shipment_mode': mode,
|
1061 |
+
'weight': w,
|
1062 |
+
'line_item_value': val,
|
1063 |
+
'cost_per_kg': cost,
|
1064 |
+
'transit_time': time,
|
1065 |
+
'distance': dist,
|
1066 |
+
'fuel_surcharge': fuel,
|
1067 |
+
'insurance_rate': ins,
|
1068 |
+
'customs_duty': duty,
|
1069 |
+
'special_handling': special
|
1070 |
+
}
|
1071 |
),
|
1072 |
+
inputs=[
|
1073 |
+
shipment_mode, weight, line_item_value, cost_per_kg,
|
1074 |
+
transit_time, distance, fuel_surcharge,
|
1075 |
+
insurance_rate, customs_duty, special_handling
|
1076 |
+
],
|
1077 |
+
outputs=[freight_result, total_cost, cost_breakdown]
|
1078 |
)
|
1079 |
|
1080 |
chat_button.click(
|