TrBn17
clean repo without secrets
9bc522a
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
import pickle
import pandas as pd
import numpy as np
import random
# Define the model pipeline class
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))
# Load model function
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()
# Service to auto-generate store_id and product_id
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}"
# Request model (simplified)
class SalesRequest(BaseModel):
category: str
region: str
inventory_level: float
units_ordered: int
demand_forecast: float
# Response model
class SalesResponse(BaseModel):
prediction: float
status: str
auto_generated_store_id: str = None
auto_generated_product_id: str = None
# Create router
router = APIRouter()
# Global model variable
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:
# Initialize model if needed
model = initialize_prediction_model()
# Auto-generate store_id and product_id
store_id = IDGeneratorService.generate_store_id()
product_id = IDGeneratorService.generate_product_id()
# Create DataFrame from request with auto-generated values
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
}])
# Make prediction
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)}")