Browse Source

Upload files to 'Demand_forcasting'

SadhulaSaiKumar 2 years ago
parent
commit
4e149a3f57
1 changed files with 610 additions and 0 deletions
  1. 610
    0
      Demand_forcasting/forcasting.py

+ 610
- 0
Demand_forcasting/forcasting.py View File

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

Loading…
Cancel
Save