Upload files to 'Demand_forcasting'

Esse commit está contido em:
2024-01-11 12:57:41 +00:00
commit dc60c8ac5f
+571
Ver Arquivo
@@ -0,0 +1,571 @@
from flask import Flask, render_template, send_file, request, redirect, Response
import os
import pandas as pd
import warnings
import json
import requests
from urllib.request import urlopen
warnings.filterwarnings("ignore")
app = Flask(__name__)
@app.route("/", methods=["GET"])
def home():
return 'forcasting app running'
######################################################################################################################
list_output=[]
def day(Num,df):
#url='https://qa.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/getitemdata'
url= get_url
response = urlopen(url)
data_json = json.loads(response.read())
headers = {
'Authorization':get_url_token,
#'Authorization':'stat 873f2e6f70b3483e983972f96fbf5ea4',#qa
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=data_json)
#print("##############################################################")
a=response.text
# print(response.text)
import pandas as pd
df2 = pd.read_json(response.text, orient ='index')
df2=df2.reset_index()
df2.columns = ['key','value']
#print(df2)
a=df2['value'][0]
j=json.loads(a)
userdata = pd.DataFrame(j)
#df1
itemid=userdata[['itemname','itemid']]
itemid.columns = ['ItemName', 'ItemId']
#df1=pd.read_csv(r'./upload/' + name)
#df1=df1[df1['obdate']!='01/01/0001']
userdata.columns = ['journaldate','sum','itemname','itemid']
# import pandas as pd
# userdata = pd.read_csv(r'C:\Users\Bizga\Desktop\forcast\5yearsitems.csv')
# itemid = userdata[['itemname', 'itemid']]
#userdata['journaldate'] = pd.to_datetime(userdata['journaldate'])
userdata["journaldate"] = userdata["journaldate"].astype(str)
userdata[["year", "month", "day"]] = userdata["journaldate"].str.split("/", expand = True)
#userdata['Month-Year']=userdata['year'].astype(str)+'-'+userdata['month'].astype(str)
item_unique_name = userdata['itemname'].unique()
#df=pd.read_csv("C:\\Users\\Bizgaze\\2021_2022.csv")
# Group the DataFrame by the 'item' column
grouped = userdata.groupby('itemname')
# Print the unique items in the 'item' column
#print(grouped.groups.keys())
# Iterate over the unique items and print the group data
for item, userdata in grouped:
print("itemname: ", item)
item_id = userdata.iloc[-1]['itemid']
print(item_id)
userdata= userdata.groupby('journaldate').sum()
userdata= userdata.reset_index()
#print(userdata)
fulldata=userdata[['journaldate','sum']]
fulldata.columns = ["Dates","SALES"]
#************************************************************************************************************************
## Use Techniques Differencing
import pandas as pd
from pandas import DataFrame
# userdata=pd.read_csv(r"C:\Users\Bizgaze\ipynb files\TS forcasting\working\139470.csv")
userdata.columns = ['Date', 'sales','sku']
from statsmodels.tsa.stattools import adfuller
DATE=[]
SALES=[]
def adf_test(series,userdata):
result=adfuller(series)
print('ADF Statistics: {}'.format(result[0]))
print('p- value: {}'.format(result[1]))
if result[1] <= 0.05:
print("strong evidence against the null hypothesis, reject the null hypothesis. Data has no unit root and is stationary")
else:
#print(userdata)
print(stationary_test(userdata))
print("weak evidence against null hypothesis, time series has a unit root, indicating it is non-stationary ")
#********************************************* stationary or non-stationary **********************************************************
def stationary_test(userdata):
data=pd.DataFrame(userdata)
for i in range(1,13):
print(i)
sales_data=DataFrame()
data['sales']=data['sales'].shift(i)
data.dropna(inplace=True)
#print( userdata['sales'])
try:
X=adf_test(data["sales"],userdata="nothing")
if "non-stationary" in str(X):
print("non-stationary")
else:
print("stationary")
#print(userdata[["Date","sales"]])
#df_sale=pd.DataFrame(userdata)
DATE.append(data["Date"])
SALES.append(data["sales"])
#df4 = pd.concat([data, sales_data], axis=1)
return "done"
break
except ValueError:
pass
try:
adf_test(userdata["sales"],userdata)
except ValueError:
pass
sales=pd.DataFrame(SALES).T
dates=pd.DataFrame(DATE).T
try:
df4 = pd.concat([dates["Date"],sales["sales"]], axis=1)
df4=df4.dropna()
print(df4)
except KeyError:
df4=userdata[['Date','sales']]
df4=df4.dropna()
print(df4)
pass
#####################################################################################################################
userdata=df4
a = userdata.iloc[-1]['Date']
userdata['Date'] = pd.to_datetime(userdata['Date'])
userdata["Date"] = userdata["Date"].astype(str)
userdata[["year", "month", "day"]] = userdata["Date"].str.split("-", expand = True)
#userdata[["year", "month"]] = userdata["Month"].str.split("-", expand=True)
#userdata = userdata[["year","month",'sum']]
userdata["year"] = userdata["year"].astype(int)
userdata["month"] = userdata["month"].astype(int)
userdata["day"] = userdata["day"].astype(int)
#####################################################################################################################
list_dates=[]
import datetime
days=int(Num)+1
import pandas as pd
base_date=pd.to_datetime(a)
for x in range(1,days):
dates=(base_date + datetime.timedelta(days=x))
dates=str(dates).replace(" 00:00:00","")
#print(dates)
list_dates.append(dates)
fut_date = pd.DataFrame(list_dates)
fut_date.columns = ["Dates"]
future_dates=pd.DataFrame(list_dates)
future_dates.columns=["Dates"]
future_dates[["year", "month", "day"]] = future_dates["Dates"].str.split("-", expand=True)
future_dates.drop(['Dates'], axis=1, inplace=True)
future_dates["year"] = future_dates["year"].astype(int)
future_dates["month"] = future_dates["month"].astype(int)
future_dates["day"] = future_dates["day"].astype(int)
#print(future_dates)
###############################################################################
userdata['sales']=userdata["sales"].astype(float)
dependent = userdata[['year','month','day']]
independent = userdata['sales']
import numpy as np
import pandas as pd
import xgboost
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import roc_auc_score
import matplotlib.pyplot as plt
#model = xgboost.XGBRegressor()
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(random_state=1,n_jobs=-1)
#model.fit(dependent, independent)
model.fit(dependent, independent)
#future=pd.read_csv('future_dates.csv')
future_prediction = model.predict(future_dates)
#print(future_prediction)
df=pd.DataFrame(future_prediction)
df.columns = ["SALES"]
frames = [fut_date, df]
result = pd.concat(frames,axis=1)
result['itemname'] = item
result['itemid'] =item_id
result.columns = ['Date','Predict','ItemName','ItemId']
#result['Predict']=result["Predict"].astype(int)
result['UpperLimit']=result["Predict"].mean()+result['Predict'].std()*3
result['LowerLimit']=result['Predict'].mean()-result['Predict'].std()*3
print(result)
result.to_json('forcast.json', orient="records")
with open('forcast.json', 'r') as json_file:
json_load = json.load(json_file)
#url = "https://demo.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/saveforecast/List"
url=post_url
payload = json.dumps(json_load)#.replace("]", "").replace("[", "")
print(payload)
headers = {
#'Authorization': 'stat 263162e61f084d3392f162eb7ec39b2c',#demo
'Authorization': post_url_token,#test
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print("##############################################################")
print(response.text)
return 'done'
#############################################################################################################################################################
def month(Num,df):
#url='https://qa.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/getitemdata'
url= get_url
response = urlopen(url)
data_json = json.loads(response.read())
headers = {
'Authorization':get_url_token,
#'Authorization':'stat 873f2e6f70b3483e983972f96fbf5ea4',#qa
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=data_json)
#print("##############################################################")
a=response.text
# print(response.text)
import pandas as pd
df2 = pd.read_json(response.text, orient ='index')
df2=df2.reset_index()
df2.columns = ['key','value']
#print(df2)
a=df2['value'][0]
j=json.loads(a)
userdata = pd.DataFrame(j)
#filePath='path.csv'
# if os.path.exists(filePath):
# print('file exist')
# os.remove('path.csv')
# else:
# print("file doesn't exists")
# pass
#userdata=df
itemid=userdata[['itemname','itemid']]
itemid.columns = ['ItemName', 'ItemId']
#df1=pd.read_csv(r'./upload/' + name)
#df1=df1[df1['obdate']!='01/01/0001']
userdata.columns = ['journaldate','sum','itemname','itemid']
# import pandas as pd
# userdata = pd.read_csv(r'C:\Users\Bizga\Desktop\forcast\5yearsitems.csv')
# itemid = userdata[['itemname', 'itemid']]
#userdata['journaldate'] = pd.to_datetime(userdata['journaldate'])
userdata["journaldate"] = userdata["journaldate"].astype(str)
userdata[["year", "month", "day"]] = userdata["journaldate"].str.split("-", expand = True)
userdata['Month-Year']=userdata['year'].astype(str)+'-'+userdata['month'].astype(str)
item_unique_name = userdata['itemname'].unique()
#df=pd.read_csv("C:\\Users\\Bizgaze\\2021_2022.csv")
# Group the DataFrame by the 'item' column
grouped = userdata.groupby('itemname')
# Print the unique items in the 'item' column
#print(grouped.groups.keys())
# Iterate over the unique items and print the group data
for item, userdata in grouped:
print("itemname: ", item)
item_id = userdata.iloc[-1]['itemid']
print(item_id)
userdata= userdata.groupby('Month-Year').sum()
userdata= userdata.reset_index()
fulldata=userdata[['Month-Year','sum']]
fulldata.columns = ["Dates","SALES"]
#************************************************************************************************************************
## Use Techniques Differencing
import pandas as pd
from pandas import DataFrame
# userdata=pd.read_csv(r"C:\Users\Bizgaze\ipynb files\TS forcasting\working\139470.csv")
userdata=userdata[['Month-Year','sum','itemid']]
userdata.columns = ['Month', 'sales','sku']
from statsmodels.tsa.stattools import adfuller
DATE=[]
SALES=[]
def adf_test(series,userdata):
result=adfuller(series)
print('ADF Statistics: {}'.format(result[0]))
print('p- value: {}'.format(result[1]))
if result[1] <= 0.05:
print("strong evidence against the null hypothesis, reject the null hypothesis. Data has no unit root and is stationary")
else:
#print(userdata)
print(stationary_test(userdata))
print("weak evidence against null hypothesis, time series has a unit root, indicating it is non-stationary ")
#********************************************* stationary or non-stationary **********************************************************
def stationary_test(userdata):
data=pd.DataFrame(userdata)
for i in range(1,13):
print(i)
sales_data=DataFrame()
data['sales']=data['sales'].shift(i)
data.dropna(inplace=True)
#print( userdata['sales'])
try:
X=adf_test(data["sales"],userdata="nothing")
if "non-stationary" in str(X):
print("non-stationary")
else:
print("stationary")
#print(userdata[["Month","sales"]])
#df_sale=pd.DataFrame(userdata)
DATE.append(data["Month"])
SALES.append(data["sales"])
#df4 = pd.concat([data, sales_data], axis=1)
return "done"
break
except ValueError:
pass
try:
adf_test(userdata["sales"],userdata)
except ValueError:
pass
sales=pd.DataFrame(SALES).T
dates=pd.DataFrame(DATE).T
try:
df4 = pd.concat([dates["Month"],sales["sales"]], axis=1)
df4=df4.dropna()
print(df4)
except KeyError:
df4=userdata[['Month','sales']]
df4=df4.dropna()
print(df4)
pass
#####################################################################################################################
userdata=df4
a = userdata.iloc[-1]['Month']
userdata[["year", "month"]] = userdata["Month"].str.split("-", expand=True)
#userdata = userdata[["year","month",'sum']]
userdata["year"] = userdata["year"].astype(int)
userdata["month"] = userdata["month"].astype(int)
#####################################################################################################################
#a = userdata.iloc[-1]['Month-Year']
from datetime import datetime
from dateutil.relativedelta import relativedelta
import pandas as pd
months_value = int(Num)+1
base_month = pd.to_datetime(a)
list_months = []
def months(MD):
date_after_month = ((base_month + relativedelta(months=MD)).strftime('%Y-%m'))
# print
list_months.append(date_after_month)
for i in range(1, months_value):
months(i)
future_dates = pd.DataFrame(list_months)
future_dates.columns = ["Dates"]
fut_date = pd.DataFrame(list_months)
fut_date.columns = ["Dates"]
future_dates[["year", "month"]] = future_dates["Dates"].str.split("-", expand=True)
future_dates.drop(['Dates'], axis=1, inplace=True)
future_dates["year"] = future_dates["year"].astype(int)
future_dates["month"] = future_dates["month"].astype(int)
###############################################################################
userdata['sales']=userdata["sales"].astype(float)
dependent = userdata[['year','month']]
independent = userdata['sales']
import numpy as np
import pandas as pd
import xgboost
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import roc_auc_score
import matplotlib.pyplot as plt
#model = xgboost.XGBRegressor()
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(random_state=1,n_jobs=-1)
model.fit(dependent, independent)
#future=pd.read_csv('future_dates.csv')
future_prediction = model.predict(future_dates)
#print(future_prediction)
df=pd.DataFrame(future_prediction)
df.columns = ["SALES"]
frames = [fut_date, df]
result = pd.concat(frames,axis=1)
result['itemname'] = item
result['itemid'] =item_id
result.columns = ['Date','Predict','ItemName','ItemId']
#result['Predict']=result["Predict"].astype(int)
result['UpperLimit']=result["Predict"].mean()+result['Predict'].std()*3
result['LowerLimit']=result['Predict'].mean()-result['Predict'].std()*3
result["LowerLimit"][result["LowerLimit"] < 0] = 0
print(result)
result.to_json('forcast.json', orient="records")
with open('forcast.json', 'r') as json_file:
json_load = json.load(json_file)
#url = "https://demo.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/saveforecast/List"
url=post_url
payload = json.dumps(json_load)#.replace("]", "").replace("[", "")
print(payload)
headers = {
#'Authorization': 'stat 263162e61f084d3392f162eb7ec39b2c',#demo
'Authorization': post_url_token,#test
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print("##############################################################")
print(response.text)
# filePath='path.csv'
# if os.path.exists(filePath):
# print('file exist')
# #userdata = pd.DataFrame(data)
# result.to_csv('path.csv', mode='a',index=False, header=False)
# else:
# print("file as it doesn't exists")
# #result = pd.DataFrame(data)
# result.to_csv('path.csv', index=False)
# result=pd.read_csv('path.csv')
# result.to_json('forcast.json', orient="records")
# import json
# # open the JSON file and read its contents
# with open(r'forcast.json', 'r') as f:
# json_data = json.load(f)
# print the JSON data
#print(json_data)
#output={"response":"success","result":json_data}
#print(output)
return 'done'
###############################################################################################################################################################
#####################################################################################################################
@app.route("/sales_forcast", methods=["GET", "POST"])
def sales_forcast():
#wise= request.args.get('wise').replace('{','').replace('}','')
#Num= request.args.get('value').replace('{','').replace('}','')
#print(wise)
#print(Num)
Dataset = request.get_json()
a = url_list
wise = a['wise']
# print(x)
Num = a['future_dates']
get_url = a['get_url']
get_url_token = a['get_url_token']
post_url = a['post_url']
post_url_token = a['post_url_token']
#print(Dataset)
import pandas as pd
df=pd.DataFrame(Dataset)
print(df)
# a = Dataset
#x = a['wise']
# cmd = "python C:\\Users\\Bizga\\Desktop\\forcast\\XGdaywise.py"
# os.system(cmd)
#split=wise
# wise='month'
# Num=5
if wise=='days':
print('daywise groupby')
output=day(Num)
# cmd = "python C:\\Users\\Bizga\\Desktop\\forcast\\XGdaywise.py"+" "+ Num
# os.system(cmd)
else:
print('monthwise groupby')
output=month(Num)
# payload = json.dumps(output)
# payload_list="["+payload+"]"
return output
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8082)