Commit 547148db authored by Ravindu Nethsara's avatar Ravindu Nethsara

Demand Forecast Model Added

parent 8ff30e7d
Month,CALTEX_Delo_Gold_Ultra,Price1
2012-01,380,4100
2012-02,240,4100
2012-03,324,4100
2012-04,381,4300
2012-05,246,4300
2012-06,336,4350
2012-07,282,4350
2012-08,212,4350
2012-09,222,4350
2012-10,301,4350
2012-11,264,4350
2012-12,388,4350
2013-01,354,4350
2013-02,247,4450
2013-03,221,4450
2013-04,363,4450
2013-05,240,4450
2013-06,312,4450
2013-07,233,4450
2013-08,254,4450
2013-09,198,4600
2013-10,246,4600
2013-11,310,4600
2013-12,421,4600
2014-01,313,4600
2014-02,306,4600
2014-03,247,4600
2014-04,353,4650
2014-05,237,4650
2014-06,386,4650
2014-07,260,4650
2014-08,173,4650
2014-09,328,4650
2014-10,211,4650
2014-11,294,4650
2014-12,444,4400
2015-01,388,4725
2015-02,375,4725
2015-03,218,4725
2015-04,414,4630
2015-05,252,4725
2015-06,369,4725
2015-07,313,4725
2015-08,143,4725
2015-09,349,4725
2015-10,328,4725
2015-11,314,4725
2015-12,451,4725
2016-01,422,4725
2016-02,397,4725
2016-03,354,4725
2016-04,421,4725
2016-05,347,4725
2016-06,453,4725
2016-07,365,4725
2016-08,264,4725
2016-09,302,4725
2016-10,324,4725
2016-11,358,4725
2016-12,512,4725
2017-01,416,4725
2017-02,397,4725
2017-03,410,4725
2017-04,476,4725
2017-05,268,4725
2017-06,477,4725
2017-07,125,4725
2017-08,421,4725
2017-09,322,4725
2017-10,373,4725
2017-11,303,4725
2017-12,567,4725
2018-01,239,4725
2018-02,299,4725
2018-03,340,4725
2018-04,370,4725
2018-05,227,4725
2018-06,386,4725
2018-07,317,4725
2018-08,438,4725
2018-09,321,4725
2018-10,394,4725
2018-11,281,5050
2018-12,436,4900
2019-01,334,5130
2019-02,262,5130
2019-03,286,5130
2019-04,476,5130
2019-05,410,5130
2019-06,474,5130
2019-07,343,5130
2019-08,359,5130
2019-09,251,5130
2019-10,281,5130
2019-11,357,5130
2019-12,570,5130
2020-01,348,5130
2020-02,364,5130
2020-03,477,5130
2020-04,488,5130
2020-05,418,5130
2020-06,512,6100
2020-07,429,6100
2020-08,413,6100
2020-09,377,6100
2020-10,421,6100
2020-11,302,6100
2020-12,488,6100
2021-01,424,6250
2021-02,312,6250
2021-03,383,6250
2021-04,521,6250
2021-05,288,6800
2021-06,341,6800
2021-07,324,7400
2021-08,291,7400
2021-09,330,7400
2021-10,382,7400
2021-11,421,8600
2021-12,516,8600
from django import forms
from django.contrib.auth.models import User
from django.forms import DateInput
from . import models
MODE_CHOICES = [
......@@ -8,8 +9,18 @@ MODE_CHOICES = [
('2', 'Painting')
]
MODE_DEMAND = [
('', 'Select Product'),
('1', 'CALTEX Delo Gold Ultra')
]
class DateInput(forms.DateInput):
input_type = 'date'
class MyForm4(forms.Form):
Productid = forms.IntegerField(label="Select Product", required=True, widget=forms.Select(choices=MODE_DEMAND))
inputdate = forms.DateField(widget=DateInput)
class MyForm(forms.Form):
......@@ -18,7 +29,7 @@ class MyForm(forms.Form):
class MyForm2(forms.Form):
UserName = forms.CharField(label='User Name' )
UserName = forms.CharField(label='User Name')
Password = forms.CharField(label='Password', widget=forms.PasswordInput)
......@@ -30,4 +41,14 @@ MODE_CHOICES2 = [
class MyForm3(forms.Form):
StaffID = forms.CharField(label='Enter Staff ID' )
Availability = forms.CharField(label="Select Availability", widget=forms.Select(choices=MODE_CHOICES2))
\ No newline at end of file
Availability = forms.CharField(label="Select Availability", widget=forms.Select(choices=MODE_CHOICES2))
#Demand Forecast
class RequestForm(forms.ModelForm):
class Meta:
model = models.PastData
fields = ['inputdate']
class MyFormNew(forms.Form):
inputdate = forms.DateField(widget=DateInput)
......@@ -11,5 +11,8 @@ urlpatterns = [
path('AdminLogin/', responseapp_views.AdminLogin),
path('AdminHome/', responseapp_views.AdminHome),
path('Employee_Data/', responseapp_views.Employee_Data),
path('PurchaseHistory/', responseapp_views.PurchaseHistory),
path('Forecasting/', responseapp_views.Forecasting),
path('Result/', responseapp_views.Forecasting),
path('', admin.site.urls),
]
\ No newline at end of file
......@@ -2,7 +2,7 @@ from datetime import datetime
from django.shortcuts import render, redirect, reverse
from django.template import loader
from django.http import HttpResponse
from User.forms import MyForm,MyForm2,MyForm3
from User.forms import MyForm,MyForm2,MyForm3,MyForm4
from django.contrib.auth import authenticate, login
from User import models as Umodels
from django.http import HttpResponseRedirect
......@@ -21,6 +21,11 @@ from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
# ------------------- EF
# Demand Forecast
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.arima.model import ARIMA
from pandas.tseries.offsets import DateOffset
# Start CompanyHome
def Homepage(request):
......@@ -42,6 +47,132 @@ def Employee_Data(request):
context = {'d': arr}
return render(request, 'Admin/Employee_Data.html',context);
# Demand Forecasting
def PurchaseHistory(request):
data = pd.read_csv('Data/Purchasefile.csv')
finalpt = data.head(10)
json_records = finalpt.reset_index().to_json(orient='records')
arr = []
arr = json.loads(json_records)
context = {'d': arr}
return render(request, 'Admin/PurchaseHistory.html',context);
# start Admin ML
def Forecasting(request):
if request.method == 'POST':
myForm = MyForm4(request.POST)
if myForm.is_valid():
Productid = myForm.cleaned_data['Productid']
inputdate = myForm.cleaned_data['inputdate']
ProductName = "CALTEX Delo Gold Ultra"
if (ProductName == "CALTEX Delo Gold Ultra"): # load first product budget
df = pd.read_csv('Data/Purchasefile.csv')
df.head()
df.columns = ["Month", "CALTEX Delo Gold Ultra", "Price1"]
rrr = df.head()
# Convert Month into Datetime
df['Month'] = pd.to_datetime(df['Month'])
df.set_index('Month', inplace=True)
df.describe()
test_result = adfuller(df['CALTEX Delo Gold Ultra'])
test_result2 = adfuller(df['Price1'])
def adfuller_test(Product1):
result = adfuller(Product1)
labels = ['ADF Test Statistic', 'p-value', '#Lags Used', 'Number of Observations Used']
for value, label in zip(result, labels):
print(label + ' : ' + str(value))
def adfuller_test2(Price1):
result2 = adfuller(Price1)
labels = ['ADF Test Statistic', 'p-value', '#Lags Used', 'Number of Observations Used']
for value, label in zip(result2, labels):
print(label + ' : ' + str(value))
adfuller_test(df['CALTEX Delo Gold Ultra'])
adfuller_test2(df['Price1'])
##Differencing
df['Product1 First Difference'] = df['CALTEX Delo Gold Ultra'] - df['CALTEX Delo Gold Ultra'].shift(1)
df['Product1 First Difference2'] = df['Price1'] - df['Price1'].shift(1)
# df['Sales'].shift(1)
df['Seasonal First Difference'] = df['CALTEX Delo Gold Ultra'] - df['CALTEX Delo Gold Ultra'].shift(12)
df['Seasonal First Difference2'] = df['Price1'] - df['Price1'].shift(12)
# df.head(14)
## Again test dickey fuller test
adfuller_test(df['Seasonal First Difference'].dropna())
adfuller_test2(df['Seasonal First Difference2'].dropna())
# ARIMA
model = ARIMA(df['CALTEX Delo Gold Ultra'], order=(1, 0, 0))
model2 = ARIMA(df['Price1'], order=(1, 0, 0))
model_fit = model.fit()
model_fit2 = model2.fit()
# model_fit.summary()
df['forecast'] = model_fit.predict(start=104, end=120, dynamic=True)
df['forecastPrice'] = model_fit2.predict(start=104, end=120, dynamic=True)
# df[['Product1','forecast']].plot(figsize=(12,8))
model = sm.tsa.statespace.SARIMAX(df['CALTEX Delo Gold Ultra'], order=(1, 1, 1),
seasonal_order=(1, 1, 1, 12))
model2 = sm.tsa.statespace.SARIMAX(df['Price1'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
results = model.fit()
results2 = model2.fit()
future_dates = [df.index[-1] + DateOffset(months=x) for x in range(0, 150)]
future_datest_df = pd.DataFrame(index=future_dates[1:], columns=df.columns)
# future_datest_df.tail()
future_df = pd.concat([df, future_datest_df])
inputdatex = inputdate
inputdate = datetime.strftime(inputdatex, "%m/%d/%Y")
# 10/01/2025
lastDate = '10/01/2021'
inputdate = inputdate
date_format = "%m/%d/%Y"
a = datetime.strptime(lastDate, date_format) # user input date
b = datetime.strptime(inputdate, date_format)
delta = b - a
delta2 = delta.days
# print(delta2)
forcasting_date = int(delta2 / 30)
newDate = forcasting_date + 121 # ending number
# print(forcasting_date)
forecast = future_df['forecast'] = results.predict(start=119, end=newDate, dynamic=True)
# future_df[['Sales', 'forecast']].plot(figsize=(12, 8))
forecastPrice = future_df['forecastPrice'] = results2.predict(start=119, end=newDate, dynamic=True)
# future_df[['Price1', 'forecastPrice']].plot(figsize=(12, 8))
df3 = forecast[-1]
df4 = forecastPrice[-1]
PredictedDemand = int(df3)
PredictedPrice = int(df4)
PredictedBudget = PredictedDemand * PredictedPrice
context = { 'arz': PredictedDemand , 'arz2': PredictedPrice , 'arz3': PredictedBudget , 'datagot': inputdate }
template = loader.get_template('Admin/Result.html')
return HttpResponse(template.render(context, request))
else:
form = MyForm4()
#returning form
return render(request, 'Admin/Forecasting.html', {'form':form});
# end Admin ML
def AdminLogin(request):
if request.method == 'POST':
......
No preview for this file type
{% extends 'Admin/Sidebar2.html' %}
{% block content %}
{% load widget_tweaks %}
{%load static%}
<head>
<!-- Font special for pages-->
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i" rel="stylesheet">
<!-- Main CSS-->
<link href="{% static "css/main.css" %}"rel="stylesheet" media="all">
</head>
<div class=" >
<div class="wrapper wrapper 0">
<div style="margin-left: 0px;" class="card card-5">
<br/><br/>
{% if messages %}
<div class="alert alert-danger" role="alert">
{% for message in messages %}
{% if message.tags %} {% endif %} {{ message }}
{% endfor %}
</div>
{% endif %}
<div class="card-heading">
<h2 class="title"> DEMAND BUDGET FORECASTING </h2>
</div>
<div class="card-body">
<form action="/Admin/Result/" method="post">
{% csrf_token %}
<table class="table table-light">
{{form.as_table}}
</table>
<input type="submit" value="FORECAST" class="btn btn--radius-2 btn-primary"/>
<div role="alert">
<center><h3> {{ Price_prediction }} </h3></center>
</div>
</form>
<br>
<br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br>
</div>
</div>
</div><div class="alert alert-primary" role="alert" > © SERVPORT 2022 </div>
</div>
{% endblock content %}
{% extends 'Admin/Sidebar2.html' %}
{% block content %}
{% load widget_tweaks %}
{%load static%}
<head>
<!-- Font special for pages-->
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i" rel="stylesheet">
<!-- Main CSS-->
<link href="{% static "css/main.css" %}"rel="stylesheet" media="all">
</head>
<div class=" >
<div class="wrapper wrapper 0">
<div style="margin-left: 0px;" class="card card-5">
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li {% if message.tags %} class=" {{ message.tags }} " {% endif %}> {{ message }} </li>
{% endfor %}
</ul>
{% endif %}
<div class="card-heading">
<h2 class="title"> PURCHASE HISTORY </h2>
</div>
<div id="myDiv">
<div id="div_print">
<div class="card card-body printableArea">
<div class="container" style="overflow-x:auto; scrollable">
<center>CALTEX Delo Gold Ultra DATATABLE </center>
<table class="table table-striped">
<thead>
<tr>
<th> Month </th>
<th> CALTEX Delo Gold Ultra Qty </th>
<th> CALTEX Delo Gold Ultra Price </th>
</tr>
</thead>
<tbody>
{% if d %}
{% for i in d %}
<tr>
<td>{{i.Month}}</td>
<td>{{i.CALTEX_Delo_Gold_Ultra}}</td>
<td>{{i.Price1}}</td>
</tr>
{% endfor %}
{% endif %}
</tbody>
</table>
</div>
</div>
</div></div>
<script language="javascript">
function printdiv(printpage) {
var headstr = "<html><head><title></title></head><body>";
var footstr = "</body>";
var newstr = document.all.item(printpage).innerHTML;
var oldstr = document.body.innerHTML;
document.body.innerHTML = headstr + newstr + footstr;
window.print();
document.body.innerHTML = oldstr;
location.reload();
return false;
}
</script>
<div class="card-body">
<input name="b_print" type="button" class="btn btn-primary btn-print" onClick="printdiv('div_print');" value=" Print ">
</div>
<div class="alert alert-primary" role="alert" >©SERVPORT 2022 </div>
</div>
</div>
</div>
</div>
{% endblock content %}
{% extends 'Admin/Sidebar2.html' %}
{% block content %}
{% load widget_tweaks %}
{%load static%}
<head>
<!-- Font special for pages-->
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i" rel="stylesheet">
<!-- Main CSS-->
<link href="{% static "css/main.css" %}"rel="stylesheet" media="all">
</head>
<center>
<div class=">
<div class="wrapper wrapper--w790">
<div style="margin-left: 0px;" class="card card-5">
<div class="card-heading">
<h2 class="title"> ADVANCE FORECASTING </h2>
</div>
{% autoescape off %}
<div>{{ g }}</div>
{% endautoescape %}
<div class="alert alert-danger" role="alert">
Forecasted Demand as at {{ datagot }} is : {{ arz }} Units
<br/>
Forecasted Price as at Rs: {{ datagot }} is : {{ arz2 }}
<br/>
Total Budget Rs: {{ arz3 }}
</div>
<br>
</div>
</div>
</div>
</div>
{% endblock content %}
......@@ -188,6 +188,10 @@ body{
<li><a style="text-decoration:none;" href="/Admin/Employee_Data/"><i class="fas fa-paper-plane "></i> Employee Data </a>
<li><a style="text-decoration:none;" href="#"><i class="fas fa-upload"></i> Assign Employee </a>
</li>
<li><a style="text-decoration:none;" href="/Admin/Forecasting/"><i class="fas fa-bullseye "></i> Demand Forecasting </a>
<li><a style="text-decoration:none;" href="/Admin/PurchaseHistory/"><i class="fas fa-cubes"></i> Purchase History </a>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment