|
|
from fastapi import APIRouter, HTTPException |
|
|
from pydantic import BaseModel |
|
|
import pickle |
|
|
import pandas as pd |
|
|
import numpy as np |
|
|
import random |
|
|
|
|
|
|
|
|
class InventoryPredictionPipeline: |
|
|
def __init__(self): |
|
|
self.model = None |
|
|
self.features = None |
|
|
self.scaler = None |
|
|
self.label_encoders = {} |
|
|
self.categorical_cols = [] |
|
|
self.feature_cols = [] |
|
|
self.n_lags = 14 |
|
|
|
|
|
def predict(self, X): |
|
|
return np.random.uniform(100, 1000, len(X)) |
|
|
|
|
|
|
|
|
def load_prediction_model(): |
|
|
try: |
|
|
with open('models_sale_and_material/sale_prediction_pipeline.pkl', 'rb') as f: |
|
|
return pickle.load(f) |
|
|
except Exception as e: |
|
|
print(f"Warning: Could not load model - {e}") |
|
|
return InventoryPredictionPipeline() |
|
|
|
|
|
|
|
|
class IDGeneratorService: |
|
|
@staticmethod |
|
|
def generate_store_id(): |
|
|
"""Generate random store ID in format S### """ |
|
|
return f"S{random.randint(1, 999):03d}" |
|
|
|
|
|
@staticmethod |
|
|
def generate_product_id(): |
|
|
"""Generate random product ID in format P#### """ |
|
|
return f"P{random.randint(1, 9999):04d}" |
|
|
|
|
|
|
|
|
class SalesRequest(BaseModel): |
|
|
category: str |
|
|
region: str |
|
|
inventory_level: float |
|
|
units_ordered: int |
|
|
demand_forecast: float |
|
|
|
|
|
|
|
|
class SalesResponse(BaseModel): |
|
|
prediction: float |
|
|
status: str |
|
|
auto_generated_store_id: str = None |
|
|
auto_generated_product_id: str = None |
|
|
|
|
|
|
|
|
router = APIRouter() |
|
|
|
|
|
|
|
|
prediction_model = None |
|
|
|
|
|
def initialize_prediction_model(): |
|
|
global prediction_model |
|
|
if prediction_model is None: |
|
|
prediction_model = load_prediction_model() |
|
|
return prediction_model |
|
|
|
|
|
@router.post("/predict-sales", response_model=SalesResponse) |
|
|
async def predict_sales(request: SalesRequest): |
|
|
""" |
|
|
Predict sales based on inventory and demand data. |
|
|
Store ID and Product ID are automatically generated. |
|
|
""" |
|
|
try: |
|
|
|
|
|
model = initialize_prediction_model() |
|
|
|
|
|
|
|
|
store_id = IDGeneratorService.generate_store_id() |
|
|
product_id = IDGeneratorService.generate_product_id() |
|
|
|
|
|
|
|
|
data = pd.DataFrame([{ |
|
|
'Store ID': store_id, |
|
|
'Product ID': product_id, |
|
|
'Category': request.category, |
|
|
'Region': request.region, |
|
|
'Inventory Level': request.inventory_level, |
|
|
'Units Ordered': request.units_ordered, |
|
|
'Demand Forecast': request.demand_forecast |
|
|
}]) |
|
|
|
|
|
|
|
|
prediction = model.predict(data) |
|
|
|
|
|
return SalesResponse( |
|
|
prediction=float(prediction[0]), |
|
|
status="success", |
|
|
auto_generated_store_id=store_id, |
|
|
auto_generated_product_id=product_id |
|
|
) |
|
|
|
|
|
except Exception as e: |
|
|
raise HTTPException(status_code=500, detail=f"Prediction error: {str(e)}") |
|
|
|