暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. from flask import Flask, render_template, send_file, request, redirect, Response
  2. import os
  3. import pandas as pd
  4. import warnings
  5. import json
  6. import requests
  7. from urllib.request import urlopen
  8. warnings.filterwarnings("ignore")
  9. app = Flask(__name__)
  10. @app.route("/", methods=["GET"])
  11. def home():
  12. return 'forcasting app running'
  13. ######################################################################################################################
  14. list_output=[]
  15. def day(Num,df):
  16. #url='https://qa.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/getitemdata'
  17. url='https://test.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/getitemdata'
  18. response = urlopen(url)
  19. data_json = json.loads(response.read())
  20. headers = {
  21. 'Authorization':'stat 27e6b51b278d444aa0b70ed60419b04c',
  22. #'Authorization':'stat 873f2e6f70b3483e983972f96fbf5ea4',#qa
  23. 'Content-Type': 'application/json'
  24. }
  25. response = requests.request("GET", url, headers=headers, data=data_json)
  26. #print("##############################################################")
  27. a=response.text
  28. # print(response.text)
  29. import pandas as pd
  30. df2 = pd.read_json(response.text, orient ='index')
  31. df2=df2.reset_index()
  32. df2.columns = ['key','value']
  33. #print(df2)
  34. a=df2['value'][0]
  35. j=json.loads(a)
  36. userdata = pd.DataFrame(j)
  37. #df1
  38. itemid=userdata[['itemname','itemid']]
  39. itemid.columns = ['ItemName', 'ItemId']
  40. #df1=pd.read_csv(r'./upload/' + name)
  41. #df1=df1[df1['obdate']!='01/01/0001']
  42. userdata.columns = ['journaldate','sum','itemname','itemid']
  43. # import pandas as pd
  44. # userdata = pd.read_csv(r'C:\Users\Bizga\Desktop\forcast\5yearsitems.csv')
  45. # itemid = userdata[['itemname', 'itemid']]
  46. #userdata['journaldate'] = pd.to_datetime(userdata['journaldate'])
  47. userdata["journaldate"] = userdata["journaldate"].astype(str)
  48. userdata[["year", "month", "day"]] = userdata["journaldate"].str.split("/", expand = True)
  49. #userdata['Month-Year']=userdata['year'].astype(str)+'-'+userdata['month'].astype(str)
  50. item_unique_name = userdata['itemname'].unique()
  51. #df=pd.read_csv("C:\\Users\\Bizgaze\\2021_2022.csv")
  52. # Group the DataFrame by the 'item' column
  53. grouped = userdata.groupby('itemname')
  54. # Print the unique items in the 'item' column
  55. #print(grouped.groups.keys())
  56. # Iterate over the unique items and print the group data
  57. for item, userdata in grouped:
  58. print("itemname: ", item)
  59. item_id = userdata.iloc[-1]['itemid']
  60. print(item_id)
  61. userdata= userdata.groupby('journaldate').sum()
  62. userdata= userdata.reset_index()
  63. #print(userdata)
  64. fulldata=userdata[['journaldate','sum']]
  65. fulldata.columns = ["Dates","SALES"]
  66. #************************************************************************************************************************
  67. ## Use Techniques Differencing
  68. import pandas as pd
  69. from pandas import DataFrame
  70. # userdata=pd.read_csv(r"C:\Users\Bizgaze\ipynb files\TS forcasting\working\139470.csv")
  71. userdata.columns = ['Date', 'sales','sku']
  72. from statsmodels.tsa.stattools import adfuller
  73. DATE=[]
  74. SALES=[]
  75. def adf_test(series,userdata):
  76. result=adfuller(series)
  77. print('ADF Statistics: {}'.format(result[0]))
  78. print('p- value: {}'.format(result[1]))
  79. if result[1] <= 0.05:
  80. print("strong evidence against the null hypothesis, reject the null hypothesis. Data has no unit root and is stationary")
  81. else:
  82. #print(userdata)
  83. print(stationary_test(userdata))
  84. print("weak evidence against null hypothesis, time series has a unit root, indicating it is non-stationary ")
  85. #********************************************* stationary or non-stationary **********************************************************
  86. def stationary_test(userdata):
  87. data=pd.DataFrame(userdata)
  88. for i in range(1,13):
  89. print(i)
  90. sales_data=DataFrame()
  91. data['sales']=data['sales'].shift(i)
  92. data.dropna(inplace=True)
  93. #print( userdata['sales'])
  94. try:
  95. X=adf_test(data["sales"],userdata="nothing")
  96. if "non-stationary" in str(X):
  97. print("non-stationary")
  98. else:
  99. print("stationary")
  100. #print(userdata[["Date","sales"]])
  101. #df_sale=pd.DataFrame(userdata)
  102. DATE.append(data["Date"])
  103. SALES.append(data["sales"])
  104. #df4 = pd.concat([data, sales_data], axis=1)
  105. return "done"
  106. break
  107. except ValueError:
  108. pass
  109. try:
  110. adf_test(userdata["sales"],userdata)
  111. except ValueError:
  112. pass
  113. sales=pd.DataFrame(SALES).T
  114. dates=pd.DataFrame(DATE).T
  115. try:
  116. df4 = pd.concat([dates["Date"],sales["sales"]], axis=1)
  117. df4=df4.dropna()
  118. print(df4)
  119. except KeyError:
  120. df4=userdata[['Date','sales']]
  121. df4=df4.dropna()
  122. print(df4)
  123. pass
  124. #####################################################################################################################
  125. userdata=df4
  126. a = userdata.iloc[-1]['Date']
  127. userdata['Date'] = pd.to_datetime(userdata['Date'])
  128. userdata["Date"] = userdata["Date"].astype(str)
  129. userdata[["year", "month", "day"]] = userdata["Date"].str.split("-", expand = True)
  130. #userdata[["year", "month"]] = userdata["Month"].str.split("-", expand=True)
  131. #userdata = userdata[["year","month",'sum']]
  132. userdata["year"] = userdata["year"].astype(int)
  133. userdata["month"] = userdata["month"].astype(int)
  134. userdata["day"] = userdata["day"].astype(int)
  135. #####################################################################################################################
  136. list_dates=[]
  137. import datetime
  138. days=int(Num)+1
  139. import pandas as pd
  140. base_date=pd.to_datetime(a)
  141. for x in range(1,days):
  142. dates=(base_date + datetime.timedelta(days=x))
  143. dates=str(dates).replace(" 00:00:00","")
  144. #print(dates)
  145. list_dates.append(dates)
  146. fut_date = pd.DataFrame(list_dates)
  147. fut_date.columns = ["Dates"]
  148. future_dates=pd.DataFrame(list_dates)
  149. future_dates.columns=["Dates"]
  150. future_dates[["year", "month", "day"]] = future_dates["Dates"].str.split("-", expand=True)
  151. future_dates.drop(['Dates'], axis=1, inplace=True)
  152. future_dates["year"] = future_dates["year"].astype(int)
  153. future_dates["month"] = future_dates["month"].astype(int)
  154. future_dates["day"] = future_dates["day"].astype(int)
  155. #print(future_dates)
  156. ###############################################################################
  157. userdata['sales']=userdata["sales"].astype(float)
  158. dependent = userdata[['year','month','day']]
  159. independent = userdata['sales']
  160. import numpy as np
  161. import pandas as pd
  162. import xgboost
  163. from sklearn.model_selection import train_test_split
  164. from sklearn.model_selection import GridSearchCV
  165. from sklearn.metrics import roc_auc_score
  166. import matplotlib.pyplot as plt
  167. #model = xgboost.XGBRegressor()
  168. from sklearn.ensemble import RandomForestRegressor
  169. model = RandomForestRegressor(random_state=1,n_jobs=-1)
  170. #model.fit(dependent, independent)
  171. model.fit(dependent, independent)
  172. #future=pd.read_csv('future_dates.csv')
  173. future_prediction = model.predict(future_dates)
  174. #print(future_prediction)
  175. df=pd.DataFrame(future_prediction)
  176. df.columns = ["SALES"]
  177. frames = [fut_date, df]
  178. result = pd.concat(frames,axis=1)
  179. result['itemname'] = item
  180. result['itemid'] =item_id
  181. result.columns = ['Date','Predict','ItemName','ItemId']
  182. #result['Predict']=result["Predict"].astype(int)
  183. result['UpperLimit']=result["Predict"].mean()+result['Predict'].std()*3
  184. result['LowerLimit']=result['Predict'].mean()-result['Predict'].std()*3
  185. print(result)
  186. result.to_json('forcast.json', orient="records")
  187. # result['ItemName'] = item
  188. # result['ItemId'] =item_id
  189. # print(result)
  190. # frames = [fulldata, result]
  191. # final = pd.concat(frames)
  192. # print('********************************************************')
  193. # final['itemname'] = item
  194. # final['itemid'] =item_id
  195. # final.columns = ['Date','Predict','ItemName','ItemId']
  196. # print(final)
  197. # final.to_json('forcast.json', orient="records")
  198. with open('forcast.json', 'r') as json_file:
  199. json_load = json.load(json_file)
  200. #url = "https://demo.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/saveforecast/List"
  201. url='https://qa.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/saveforecast/List'
  202. payload = json.dumps(json_load)#.replace("]", "").replace("[", "")
  203. print(payload)
  204. headers = {
  205. #'Authorization': 'stat 263162e61f084d3392f162eb7ec39b2c',#demo
  206. 'Authorization': 'stat 873f2e6f70b3483e983972f96fbf5ea4',#test
  207. 'Content-Type': 'application/json'
  208. }
  209. response = requests.request("POST", url, headers=headers, data=payload)
  210. print("##############################################################")
  211. print(response.text)
  212. import time
  213. time.sleep(1)
  214. #############################################################################################################################################################
  215. def month(Num,df):
  216. # #url='https://qa.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/getitemdata'
  217. # url='https://test.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/getitemdata'
  218. # response = urlopen(url)
  219. # data_json = json.loads(response.read())
  220. # headers = {
  221. # 'Authorization':'stat 27e6b51b278d444aa0b70ed60419b04c',
  222. # #'Authorization':'stat 873f2e6f70b3483e983972f96fbf5ea4',#qa
  223. # 'Content-Type': 'application/json'
  224. # }
  225. # response = requests.request("GET", url, headers=headers, data=data_json)
  226. # #print("##############################################################")
  227. # a=response.text
  228. # import pandas as pd
  229. # df2 = pd.read_json(response.text, orient ='index')
  230. # df2=df2.reset_index()
  231. # df2.columns = ['key','value']
  232. # #print(df2)
  233. # a=df2['value'][0]
  234. # j=json.loads(a)
  235. # userdata = pd.DataFrame(j)
  236. # #df1
  237. filePath='path.csv'
  238. if os.path.exists(filePath):
  239. print('file exist')
  240. os.remove('path.csv')
  241. else:
  242. print("file doesn't exists")
  243. pass
  244. userdata=df
  245. itemid=userdata[['itemname','itemid']]
  246. itemid.columns = ['ItemName', 'ItemId']
  247. #df1=pd.read_csv(r'./upload/' + name)
  248. #df1=df1[df1['obdate']!='01/01/0001']
  249. #userdata.columns = ['itemname','sum','journaldate','itemid']
  250. userdata.columns = ['journaldate','sum','itemid','itemname']
  251. # import pandas as pd
  252. # userdata = pd.read_csv(r'C:\Users\Bizga\Desktop\forcast\5yearsitems.csv')
  253. # itemid = userdata[['itemname', 'itemid']]
  254. #userdata['journaldate'] = pd.to_datetime(userdata['journaldate'])
  255. userdata["journaldate"] = userdata["journaldate"].astype(str)
  256. userdata[["day","month","year"]] = userdata["journaldate"].str.split("-", expand = True)
  257. userdata['Month-Year']=userdata['year'].astype(str)+'-'+userdata['month'].astype(str)
  258. item_unique_name = userdata['itemname'].unique()
  259. #df=pd.read_csv("C:\\Users\\Bizgaze\\2021_2022.csv")
  260. # Group the DataFrame by the 'item' column
  261. grouped = userdata.groupby('itemname')
  262. # Print the unique items in the 'item' column
  263. #print(grouped.groups.keys())
  264. # Iterate over the unique items and print the group data
  265. for item, userdata in grouped:
  266. print("itemname: ", item)
  267. item_id = userdata.iloc[-1]['itemid']
  268. print(item_id)
  269. userdata= userdata.groupby('Month-Year').sum()
  270. userdata= userdata.reset_index()
  271. fulldata=userdata[['Month-Year','sum']]
  272. fulldata.columns = ["Dates","SALES"]
  273. #************************************************************************************************************************
  274. ## Use Techniques Differencing
  275. import pandas as pd
  276. from pandas import DataFrame
  277. # userdata=pd.read_csv(r"C:\Users\Bizgaze\ipynb files\TS forcasting\working\139470.csv")
  278. userdata=userdata[['Month-Year','sum','itemid']]
  279. userdata.columns = ['Month', 'sales','sku']
  280. from statsmodels.tsa.stattools import adfuller
  281. DATE=[]
  282. SALES=[]
  283. def adf_test(series,userdata):
  284. result=adfuller(series)
  285. print('ADF Statistics: {}'.format(result[0]))
  286. print('p- value: {}'.format(result[1]))
  287. if result[1] <= 0.05:
  288. print("strong evidence against the null hypothesis, reject the null hypothesis. Data has no unit root and is stationary")
  289. else:
  290. #print(userdata)
  291. print(stationary_test(userdata))
  292. print("weak evidence against null hypothesis, time series has a unit root, indicating it is non-stationary ")
  293. #********************************************* stationary or non-stationary **********************************************************
  294. def stationary_test(userdata):
  295. data=pd.DataFrame(userdata)
  296. for i in range(1,13):
  297. print(i)
  298. sales_data=DataFrame()
  299. data['sales']=data['sales'].shift(i)
  300. data.dropna(inplace=True)
  301. #print( userdata['sales'])
  302. try:
  303. X=adf_test(data["sales"],userdata="nothing")
  304. if "non-stationary" in str(X):
  305. print("non-stationary")
  306. else:
  307. print("stationary")
  308. #print(userdata[["Month","sales"]])
  309. #df_sale=pd.DataFrame(userdata)
  310. DATE.append(data["Month"])
  311. SALES.append(data["sales"])
  312. #df4 = pd.concat([data, sales_data], axis=1)
  313. return "done"
  314. break
  315. except ValueError:
  316. pass
  317. try:
  318. adf_test(userdata["sales"],userdata)
  319. except ValueError:
  320. pass
  321. sales=pd.DataFrame(SALES).T
  322. dates=pd.DataFrame(DATE).T
  323. try:
  324. df4 = pd.concat([dates["Month"],sales["sales"]], axis=1)
  325. df4=df4.dropna()
  326. print(df4)
  327. except KeyError:
  328. df4=userdata[['Month','sales']]
  329. df4=df4.dropna()
  330. print(df4)
  331. pass
  332. #####################################################################################################################
  333. userdata=df4
  334. a = userdata.iloc[-1]['Month']
  335. userdata[["year", "month"]] = userdata["Month"].str.split("-", expand=True)
  336. #userdata = userdata[["year","month",'sum']]
  337. userdata["year"] = userdata["year"].astype(int)
  338. userdata["month"] = userdata["month"].astype(int)
  339. #####################################################################################################################
  340. #a = userdata.iloc[-1]['Month-Year']
  341. from datetime import datetime
  342. from dateutil.relativedelta import relativedelta
  343. import pandas as pd
  344. months_value = int(Num)+1
  345. base_month = pd.to_datetime(a)
  346. list_months = []
  347. def months(MD):
  348. date_after_month = ((base_month + relativedelta(months=MD)).strftime('%Y-%m'))
  349. # print
  350. list_months.append(date_after_month)
  351. for i in range(1, months_value):
  352. months(i)
  353. future_dates = pd.DataFrame(list_months)
  354. future_dates.columns = ["Dates"]
  355. fut_date = pd.DataFrame(list_months)
  356. fut_date.columns = ["Dates"]
  357. future_dates[["year", "month"]] = future_dates["Dates"].str.split("-", expand=True)
  358. future_dates.drop(['Dates'], axis=1, inplace=True)
  359. future_dates["year"] = future_dates["year"].astype(int)
  360. future_dates["month"] = future_dates["month"].astype(int)
  361. ###############################################################################
  362. userdata['sales']=userdata["sales"].astype(float)
  363. dependent = userdata[['year','month']]
  364. independent = userdata['sales']
  365. import numpy as np
  366. import pandas as pd
  367. import xgboost
  368. from sklearn.model_selection import train_test_split
  369. from sklearn.model_selection import GridSearchCV
  370. from sklearn.metrics import roc_auc_score
  371. import matplotlib.pyplot as plt
  372. #model = xgboost.XGBRegressor()
  373. from sklearn.ensemble import RandomForestRegressor
  374. model = RandomForestRegressor(random_state=1,n_jobs=-1)
  375. model.fit(dependent, independent)
  376. #future=pd.read_csv('future_dates.csv')
  377. future_prediction = model.predict(future_dates)
  378. #print(future_prediction)
  379. df=pd.DataFrame(future_prediction)
  380. df.columns = ["SALES"]
  381. frames = [fut_date, df]
  382. result = pd.concat(frames,axis=1)
  383. result['itemname'] = item
  384. result['itemid'] =item_id
  385. result.columns = ['Date','Predict','ItemName','ItemId']
  386. #result['Predict']=result["Predict"].astype(int)
  387. result['UpperLimit']=result["Predict"].mean()+result['Predict'].std()*3
  388. result['LowerLimit']=result['Predict'].mean()-result['Predict'].std()*3
  389. result["LowerLimit"][result["LowerLimit"] < 0] = 0
  390. print(result)
  391. # frames = [fulldata, result]
  392. # final = pd.concat(frames)
  393. # print('********************************************************')
  394. # final['itemname'] = item
  395. # final['itemid'] =item_id
  396. # final.columns = ['Date','Predict','ItemName','ItemId']
  397. # final['upper_limit']=final["Predict"]+final['Predict']*0.2
  398. # # final['lower_limit']=final['Predict']-final['Predict']*0.2
  399. # # print(final)
  400. # # final.to_json('forcast.json', orient="records")
  401. # with open('forcast.json', 'r') as json_file:
  402. # json_load = json.load(json_file)
  403. # #url = "https://demo.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/saveforecast/List"
  404. # url='https://qa.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/saveforecast/List'
  405. # payload = json.dumps(json_load)#.replace("]", "").replace("[", "")
  406. # print(payload)
  407. # headers = {
  408. # #'Authorization': 'stat 263162e61f084d3392f162eb7ec39b2c',#demo
  409. # 'Authorization': 'stat 873f2e6f70b3483e983972f96fbf5ea4',#test
  410. # 'Content-Type': 'application/json'
  411. # }
  412. # response = requests.request("POST", url, headers=headers, data=payload)
  413. # print("##############################################################")
  414. # print(response.text)
  415. filePath='path.csv'
  416. if os.path.exists(filePath):
  417. print('file exist')
  418. #userdata = pd.DataFrame(data)
  419. result.to_csv('path.csv', mode='a',index=False, header=False)
  420. else:
  421. print("file as it doesn't exists")
  422. #result = pd.DataFrame(data)
  423. result.to_csv('path.csv', index=False)
  424. result=pd.read_csv('path.csv')
  425. result.to_json('forcast.json', orient="records")
  426. import json
  427. # open the JSON file and read its contents
  428. with open(r'forcast.json', 'r') as f:
  429. json_data = json.load(f)
  430. # print the JSON data
  431. #print(json_data)
  432. #output={"response":"success","result":json_data}
  433. #print(output)
  434. return json_data
  435. # frames = [fulldata, result]
  436. # final = pd.concat(frames)
  437. # print('********************************************************')
  438. # final['itemname'] = item
  439. # final['itemid'] =item_id
  440. # final.columns = ['Date','Predict','ItemName','ItemId']
  441. # final['upper_limit']=final["Predict"]+final['Predict']*0.2
  442. # # final['lower_limit']=final['Predict']-final['Predict']*0.2
  443. # # print(final)
  444. # # final.to_json('forcast.json', orient="records")
  445. # with open('forcast.json', 'r') as json_file:
  446. # json_load = json.load(json_file)
  447. # #url = "https://demo.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/saveforecast/List"
  448. # url='https://qa.bizgaze.app/apis/v4/bizgaze/integrations/demandforecast/saveforecast/List'
  449. # payload = json.dumps(json_load)#.replace("]", "").replace("[", "")
  450. # print(payload)
  451. # headers = {
  452. # #'Authorization': 'stat 263162e61f084d3392f162eb7ec39b2c',#demo
  453. # 'Authorization': 'stat 873f2e6f70b3483e983972f96fbf5ea4',#test
  454. # 'Content-Type': 'application/json'
  455. # }
  456. # response = requests.request("POST", url, headers=headers, data=payload)
  457. # print("##############################################################")
  458. # print(response.text)
  459. # import time
  460. # time.sleep(1)
  461. ###############################################################################################################################################################
  462. #####################################################################################################################
  463. @app.route("/sales_forcast", methods=["GET", "POST"])
  464. def sales_forcast():
  465. #wise= request.args.get('wise').replace('{','').replace('}','')
  466. #Num= request.args.get('value').replace('{','').replace('}','')
  467. #print(wise)
  468. #print(Num)
  469. Dataset = request.get_json()
  470. #print(Dataset)
  471. import pandas as pd
  472. df=pd.DataFrame(Dataset)
  473. #df=pd.read_csv('ItemWiseQuantity_STC.csv')
  474. print(df)
  475. # a = Dataset
  476. #x = a['wise']
  477. # cmd = "python C:\\Users\\Bizga\\Desktop\\forcast\\XGdaywise.py"
  478. # os.system(cmd)
  479. #split=wise
  480. wise='month'
  481. Num=5
  482. if wise=='days':
  483. print('daywise groupby')
  484. day(Num,df)
  485. # cmd = "python C:\\Users\\Bizga\\Desktop\\forcast\\XGdaywise.py"+" "+ Num
  486. # os.system(cmd)
  487. else:
  488. print('monthwise groupby')
  489. output=month(Num,df)
  490. payload = json.dumps(output)
  491. payload_list="["+payload+"]"
  492. #payload_list.append(payload)
  493. # print(payload)
  494. # cmd = "python C:\\Users\\Bizga\\Desktop\\forcast\\xgmonthwise.py"+" "+ Num
  495. # os.system(cmd)
  496. # import json
  497. # a={"status":"success"}
  498. # payload123 = json.dumps(a)
  499. return "done"
  500. if __name__ == "__main__":
  501. app.run(host='0.0.0.0', port=8082)