File size: 2,713 Bytes
153d4bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aee9a3f
153d4bf
afbff3e
153d4bf
 
aee9a3f
 
153d4bf
 
 
 
 
afbff3e
153d4bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import pandas as pd
from datetime import datetime
import joblib
import numpy as np
import random
import os
from keras.models import Sequential
from keras.layers import Dense, LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.tree import DecisionTreeRegressor
from statsmodels.tsa.arima.model import ARIMA
import tensorflow as tf
import utils

def predict_medicine_demand(location: str, year: int, month: int):
    results = []
    products=('Medicine_4', 'Medicine_10', 'Medicine_5', 'Medicine_7','Medicine_3', 'Medicine_2', 'Medicine_8', 'Medicine_1','Medicine_6', 'Medicine_9')
    for product in products:
        try:
            monthly_data=pd.read_csv('monthly_data.csv')

            # Get last 3 values from the data
            ts_df = monthly_data[(monthly_data['product'] == product) & (monthly_data['location'] == location)].copy()
            ts_df.set_index('date', inplace=True)
            ts_df = ts_df.sort_index()
            ts = ts_df['quantity']
            

            # Load ARIMA model
            arima_model = joblib.load(f"models/arima_{product}_{location}.pkl")
            arima_forecast = arima_model.forecast(steps=1)[0]

            # Load ANN
            ann_model = tf.keras.models.load_model(f"models/ann_{product}_{location}.h5")
            scaler_X = joblib.load(f"models/ann_scalerX_{product}_{location}.pkl")
            scaler_y = joblib.load(f"models/ann_scalerY_{product}_{location}.pkl")

            last_3 = ts[-3:].values.reshape(1, -1)
            last_scaled = scaler_X.transform(last_3)
            ann_pred_scaled = ann_model.predict(last_scaled, verbose=0)
            ann_forecast = scaler_y.inverse_transform(ann_pred_scaled)[0][0]

            # Load LSTM
            lstm_model = tf.keras.models.load_model(f"models/lstm_{product}_{location}.h5")
            lstm_scaler = joblib.load(f"models/lstm_scaler_{product}_{location}.pkl")

            series_scaled = lstm_scaler.transform(ts.values.reshape(-1, 1)).flatten()
            last_seq = series_scaled[-3:].reshape(1, 3, 1)
            lstm_pred_scaled = lstm_model.predict(last_seq, verbose=0)[0][0]
            lstm_forecast = lstm_scaler.inverse_transform([[lstm_pred_scaled]])[0][0]

            results.append({
                "Product": product,
                "ARIMA Pred": round(arima_forecast, 2),
                "ANN Pred": round(ann_forecast, 2),
                "LSTM Pred": round(lstm_forecast, 2),
                "Average Requirement":round((arima_forecast+ann_forecast+lstm_forecast)/3,2)
            })

        except Exception as e:
            print(f"Failed to predict for {product} - {location}: {e}")
    return pd.DataFrame(results)