import pandas as pd
import numpy as np
!ls
1510001_agr.csv ZX10208_agr.csv second_notebook.ipynb 1510002_agr.csv conc_df.csv sku_dict.csv 1510003_agr.csv promo_1510002.csv
sku_dict= pd.read_csv('sku_dict.csv')
sku_dict.head()
| sku_id | fincode | ui1_code | ui2_code | ui3_code | vendor | brand_code | creation_date | expiration_date | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 43207 | A1 | A10 | A1000 | A1000001 | A10001 | A1000001 | 2018-01-01 | 2200-01-01 00:00:00 |
| 1 | 87209 | UA | UA1 | UA100 | UA10000 | BLW9FG | 484JDFU5 | 2019-09-05 | 2200-01-01 00:00:00 |
| 2 | 33513 | G9 | G91 | G9100 | G910003 | 7I77VL | MMC2P4Y3 | 2018-07-21 | 2200-01-01 00:00:00 |
| 3 | 47505 | AQ | AQ1 | AQ100 | AQ10000 | 4HJSP5 | 8FYENEWM | 2018-03-26 | 2200-01-01 00:00:00 |
| 4 | 53350 | 6L | 6L1 | 6L100 | 6L10005 | JSOSD5 | YTE7JS4H | 2018-11-30 | 2200-01-01 00:00:00 |
sku_dict.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 10000 entries, 0 to 9999 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 sku_id 10000 non-null int64 1 fincode 10000 non-null object 2 ui1_code 10000 non-null object 3 ui2_code 10000 non-null object 4 ui3_code 10000 non-null object 5 vendor 10000 non-null object 6 brand_code 10000 non-null object 7 creation_date 10000 non-null object 8 expiration_date 10000 non-null object dtypes: int64(1), object(8) memory usage: 703.2+ KB
for col in sku_dict.columns:
print(col,sku_dict['{}'.format(col)].nunique())
sku_id 10000 fincode 31 ui1_code 46 ui2_code 109 ui3_code 804 vendor 25 brand_code 63 creation_date 669 expiration_date 582
sku_dict.fincode.unique()
array(['A1', 'UA', 'G9', 'AQ', '6L', '4W', 'ZR', '15', 'SI', 'BY', '70',
'BJ', 'RI', 'MB', 'YT', 'K9', 'FE', 'Z8', 'GY', 'M2', 'XG', 'LT',
'EH', 'ZX', 'H7', '8J', 'AG', 'B1', 'Q5', 'GV', 'B0'], dtype=object)
sku_dict.ui1_code.unique()
array(['A10', 'UA1', 'G91', 'AQ1', '6L1', '4W1', 'ZR1', '151', 'SI1',
'BY1', '701', 'BJ1', 'RI1', 'MB1', 'YT1', 'K91', 'FE1', 'Z81',
'GY1', 'M21', 'XG1', 'LT1', 'EH1', 'ZX1', 'H71', '8J1', 'AG1',
'B11', 'Q51', 'GV1', 'B01', 'EH0', '700', 'M20', 'K90', 'GV0',
'ZX0', 'B00', 'G90', 'SI0', 'BJ0', 'RI0', 'UA0', 'YT0', 'Z80',
'4W0'], dtype=object)
sku_dict.ui2_code.unique()
array(['A1000', 'UA100', 'G9100', 'AQ100', '6L100', '4W100', 'ZR101',
'15100', 'SI100', 'BY100', '70102', 'BJ100', 'G9101', 'RI100',
'MB100', 'YT102', 'MB101', 'K9102', 'FE100', 'Z8100', 'GY100',
'UA102', 'M2100', 'XG100', 'LT102', '70101', 'EH100', 'BY101',
'LT100', 'ZX101', 'H7100', 'XG102', '4W102', 'ZR100', '8J100',
'AG100', 'AG101', 'K9100', 'Z8101', 'MB102', 'B1100', '6L102',
'Q5100', 'GV102', 'B0100', 'AQ101', 'GV100', '70100', 'ZR102',
'UA101', 'GV101', 'M2102', 'LT101', 'GY101', 'YT100', 'AG102',
'H7101', '6L101', 'SI101', 'B1102', '8J102', 'RI101', 'B1101',
'BJ102', 'RI102', 'AQ102', 'GY102', 'EH102', 'Q5102', 'EH101',
'4W101', 'BJ101', 'BY102', 'FE101', 'G9102', 'M2101', '15101',
'B0102', 'XG101', 'ZX100', 'SI102', 'B0101', '15102', '8J101',
'K9101', 'Q5101', 'EH000', 'YT101', 'H7102', 'ZX102', 'FE102',
'Z8102', '70000', 'M2000', 'K9000', 'EH002', 'GV000', 'ZX001',
'B0000', 'G9001', 'SI000', 'BJ000', 'G9000', 'RI000', 'UA000',
'YT001', 'Z8000', 'SI001', '4W000'], dtype=object)
sku_dict.ui3_code.unique()
array(['A1000001', 'UA10000', 'G910003', 'AQ10000', '6L10005', '4W10000',
'ZR10100', 'AQ10008', '1510004', 'SI10006', 'AQ10005', 'BY10001',
'7010200', 'AQ10001', 'BJ10001', 'G910100', 'RI10007', 'MB10006',
'YT10204', 'MB10101', 'K910201', 'FE10002', 'Z810000', 'GY10000',
'UA10200', 'M210008', 'UA10005', 'XG10002', 'LT10200', 'YT10200',
'7010100', 'EH10000', 'BY10106', 'LT10007', 'ZX10102', 'H710000',
'XG10207', 'XG10004', 'BY10000', '4W10207', 'ZR10000', '8J10004',
'H710005', 'AG10002', 'Z810005', 'AG10100', 'K910005', 'UA10203',
'EH10007', 'G910007', 'G910000', 'Z810100', '8J10003', 'ZR10005',
'MB10201', 'LT10000', 'SI10005', 'B110000', '6L10207', 'BJ10000',
'Q510000', 'GV10200', 'B010000', 'LT10207', 'AQ10105', 'EH10004',
'M210000', 'GV10000', 'K910200', '7010000', 'ZR10208', 'UA10100',
'ZX10104', 'GV10100', 'ZR10006', 'XG10000', '7010203', '1510007',
'AG10000', '1510000', 'RI10000', 'LT10006', 'M210200', '6L10203',
'LT10106', 'ZX10100', 'LT10208', '8J10000', 'AG10006', 'GY10100',
'FE10004', 'RI10008', 'YT10000', 'MB10000', 'AG10200', 'FE10001',
'H710100', '6L10100', 'LT10008', 'K910000', 'BY10105', '4W10006',
'M210201', 'B110003', 'AQ10007', 'SI10105', 'FE10000', 'Q510007',
'B110200', 'K910002', '8J10202', 'BJ10007', 'GY10003', 'B110002',
'LT10206', 'RI10102', '4W10002', 'B110103', 'FE10008', 'AG10001',
'SI10000', 'MB10102', 'BJ10200', 'GV10102', 'G910002', 'G910005',
'GV10007', 'RI10200', '8J10002', 'RI10006', 'GY10106', 'AQ10206',
'GY10200', 'SI10007', '6L10208', 'EH10200', 'Q510200', 'EH10100',
'6L10000', '4W10100', 'EH10008', 'BJ10100', 'BY10200', 'H710007',
'M210006', 'AG10005', 'GV10006', 'AG10004', 'FE10100', 'AG10105',
'YT10003', 'G910200', 'SI10003', 'MB10005', 'FE10006', 'AQ10004',
'LT10100', 'B010002', 'XG10203', '8J10200', 'M210100', 'EH10106',
'SI10100', 'H710001', 'EH10101', 'AQ10205', '7010201', '8J10008',
'ZR10001', '7010005', 'Q510207', 'XG10001', 'B110008', '1510100',
'B010200', 'XG10102', 'M210002', 'XG10206', '1510006', 'K910006',
'UA10205', 'ZX10005', 'SI10108', 'Q510006', 'H710003', 'RI10002',
'SI10200', 'EH10003', 'M210207', 'MB10200', 'B010101', '4W10001',
'8J10005', 'B010100', 'K910007', '7010001', 'MB10002', 'XG10003',
'ZX10002', 'XG10006', '7010004', 'B110004', 'G910008', 'ZX10000',
'SI10008', '1510200', 'ZR10200', 'UA10007', 'Q510003', '1510105',
'4W10004', 'ZR10008', '4W10005', 'BJ10002', 'GY10007', 'XG10106',
'4W10205', 'RI10004', 'Z810006', '8J10104', '4W10200', 'Q510004',
'RI10100', 'RI10203', 'K910104', 'GV10001', 'MB10003', 'K910008',
'6L10006', 'ZX10006', 'BY10007', '8J10100', '1510001', 'AG10107',
'B110100', 'SI10002', 'GY10105', 'BJ10104', 'SI10004', 'AQ10003',
'EH10202', 'Q510100', 'EH10002', '8J10007', 'GV10005', 'B010106',
'Q510005', 'B010005', 'LT10004', 'ZX10008', 'EH00004', 'UA10006',
'RI10206', 'YT10004', '8J10001', 'GY10108', 'BY10004', 'M210208',
'YT10107', 'BY10005', 'BJ10008', 'Z810007', '6L10200', 'Q510205',
'UA10008', 'AQ10006', '1510002', 'YT10100', 'K910100', '7010106',
'UA10004', 'M210003', 'RI10106', 'AQ10100', 'AQ10208', 'H710200',
'AG10007', 'ZX10205', 'GV10008', 'K910103', 'LT10201', 'GY10002',
'M210102', '7010102', 'BJ10005', 'M210007', '7010208', 'ZR10203',
'RI10001', 'G910203', '8J10006', 'H710002', '7010007', '6L10105',
'GV10106', 'LT10002', 'EH10001', '4W10003', 'B010007', 'YT10102',
'7010107', 'K910003', 'GY10004', 'EH10006', '7010207', 'BY10204',
'YT10008', 'BY10100', '4W10102', 'FE10207', 'K910108', 'FE10202',
'AG10003', 'Z810003', 'ZR10102', 'ZX10007', 'LT10105', 'XG10007',
'XG10100', '4W10101', 'FE10200', '1510003', 'GV10205', 'MB10207',
'7010002', 'K910001', 'ZR10004', '6L10004', 'SI10106', 'B110102',
'B010001', 'YT10104', 'UA10002', '4W10008', 'BY10006', 'XG10200',
'Z810200', 'MB10008', '6L10007', 'YT10101', 'M210001', 'FE10003',
'AQ10108', 'XG10204', 'SI10001', 'AG10204', 'BY10003', 'AG10202',
'YT10006', 'FE10203', '6L10001', 'Z810002', 'G910104', 'GY10008',
'GV10201', 'H710107', '6L10008', 'GY10001', '1510103', 'K910206',
'FE10208', '8J10204', 'G910006', 'GY10005', 'RI10005', 'XG10103',
'Z810008', 'EH10005', 'BY10208', 'ZR10202', 'MB10106', 'ZX10204',
'GV10103', 'AQ10200', 'UA10106', 'YT10005', 'Z810105', '6L10205',
'BY10008', 'BY10102', 'MB10007', 'B010201', 'G910208', 'B110205',
'XG10202', 'GV10002', 'B010008', 'XG10105', 'M210105', 'BJ10006',
'UA10003', 'FE10005', 'LT10203', 'M210005', 'ZR10104', 'AG10207',
'G910107', 'FE10107', 'B110007', 'ZX10200', 'BJ10202', 'Q510108',
'MB10001', 'RI10204', 'GY10006', '6L10002', '4W10105', 'B110001',
'ZR10107', 'GV10104', '8J10101', 'BY10002', 'B110206', 'ZX10001',
'XG10005', 'GY10107', 'LT10001', 'B110207', 'H710203', 'MB10105',
'YT10002', 'YT10205', 'GY10204', 'FE10204', 'G910004', 'RI10104',
'AG10008', 'LT10005', '1510206', 'YT10202', 'XG10205', 'ZR10002',
'7000005', 'FE10105', 'B010003', 'ZX10004', 'GY10205', 'Q510001',
'1510201', 'K910004', 'XG10008', 'B010204', 'UA10208', 'ZR10106',
'ZX10203', 'H710206', '8J10102', 'BJ10204', 'ZR10007', 'B010103',
'AG10208', 'FE10108', 'SI10101', 'H710205', 'B010205', 'MB10100',
'Z810004', 'ZX10208', 'BJ10003', 'K910202', '8J10203', '7010006',
'BJ10004', 'G910201', '6L10103', 'M210106', 'UA10207', 'H710103',
'XG10201', 'UA10102', '7010206', 'B010206', 'M210004', '4W10106',
'FE10106', '1510008', 'BY10201', '7010204', '7010003', '8J10207',
'Q510204', 'MB10203', 'Q510103', 'LT10108', 'M210103', '6L10003',
'H710207', 'Z810001', 'EH10102', 'ZR10101', 'G910204', '4W10007',
'4W10206', 'GY10203', 'LT10107', 'SI10206', 'G910103', 'Q510106',
'GV10004', '6L10202', 'YT10106', 'XG10107', 'K910106', 'UA10107',
'YT10203', 'YT10001', '7010108', 'Q510206', 'GV10003', 'EH10206',
'GV10105', 'M210206', 'GY10202', 'G910001', 'Z810201', 'Z810207',
'UA10202', 'FE10206', 'Q510008', 'M200004', 'UA10108', 'EH10201',
'H710008', 'Z810108', 'BJ10106', 'RI10003', 'FE10102', '6L10101',
'AG10206', 'ZR10205', 'BJ10201', 'MB10202', 'EH10207', 'BY10203',
'ZR10201', 'B010107', 'ZX10105', 'BY10205', '7010008', '4W10202',
'G910102', 'BY10101', 'K900002', 'Z810102', '7010101', 'H710104',
'Q510104', '4W10208', 'YT10207', 'FE10007', 'MB10004', 'EH10108',
'LT10003', '4W10104', 'YT10007', '1510005', 'AQ10203', 'B010004',
'EH00200', 'GV10101', 'M210101', 'YT10105', 'BJ10207', 'GY10201',
'B010105', 'UA10104', '8J10206', 'ZX10003', '7010104', 'B110006',
'Q510002', '1510108', 'K910204', 'GV10203', 'UA10001', 'AQ10201',
'4W10203', 'ZX10202', 'B110005', 'G910205', '4W10204', 'MB10206',
'GV00000', 'BJ10102', 'B010102', 'SI10202', 'MB10205', 'GY10103',
'SI10201', 'ZR10204', 'G910202', 'H710006', 'GY10101', 'FE10101',
'ZR10003', 'XG10108', 'EH00000', 'AG10108', '4W10108', '6L10107',
'AQ10107', 'Z810103', 'RI10208', 'Q510202', 'SI10107', 'ZR10206',
'SI10207', 'RI10105', 'K910208', 'M210107', 'EH10204', 'M210203',
'YT10103', 'H710004', 'GV10202', '6L10106', 'B010207', 'SI10203',
'EH10103', 'RI10201', 'ZX00100', 'B000000', 'GY10208', 'BY10108',
'SI10102', 'ZR10103', 'XG10208', 'YT10201', 'ZX10103', 'YT10108',
'MB10107', 'EH10205', '8J10201', 'BJ10205', 'LT10205', '1510203',
'4W10201', '8J10208', 'GV10206', 'UA10103', '7010205', 'ZX10108',
'Q510105', 'RI10202', 'LT10202', 'M210202', '4W10103', 'G900107',
'MB10104', 'M210204', 'AQ10202', 'GV10108', 'H710106', 'AQ10204',
'LT10204', 'XG10101', 'AQ10106', '6L10102', 'M210205', 'FE10103',
'B010108', 'LT10103', 'BJ10101', 'Z810104', 'SI10104', 'ZR10105',
'B010208', 'MB10204', 'BY10107', 'BY10202', 'GY10102', 'MB10108',
'EH10104', 'B110106', 'RI10101', 'B010006', '6L10204', '6L10201',
'AG10205', 'SI10103', 'K910207', 'AQ10102', '7010105', 'H710202',
'B110107', 'AQ10002', 'BY10103', '8J10107', '1510208', '1510102',
'BY10207', 'SI00000', 'GY10104', 'Z810202', 'LT10101', '8J10108',
'G910206', 'GY10207', '6L10206', 'ZX10107', 'B110101', 'H710201',
'BJ10208', '4W10107', '6L10108', 'ZX10106', 'AQ10103', '7010202',
'Q510102', 'YT10208', 'SI10204', 'Z810204', 'M210108', '1510104',
'AG10103', 'G910207', 'K910105', 'GV10208', 'ZX10101', 'BJ10108',
'H710108', 'G910101', '6L10104', 'AQ10104', 'UA10101', 'EH10203',
'GY10206', 'MB10103', 'BJ00005', 'B110201', '8J10106', 'BJ10206',
'B110108', 'RI10108', 'K910205', 'GV00007', 'UA10105', 'Z810208',
'EH10208', 'G900006', '1510107', 'FE10205', 'K910102', '7010103',
'SI10205', 'UA10201', 'LT10102', 'AQ10101', 'ZR10207', 'G910105',
'G910106', 'BJ10203', 'RI00004', 'B010104', 'UA10204', 'UA00000',
'SI10208', 'K910101', 'AG10104', '8J10105', 'BJ10107', 'ZR10108',
'Q510101', 'H710204', 'B110203', 'ZX10207', 'Z810206', 'LT10104',
'RI10103', 'RI10107', 'Z810101', '1510207', '1510205', 'Q510208',
'H710208', 'RI10205', 'GV10204', 'BJ10105', '8J10205', '1510106',
'BY10104', 'Q510107', 'GV10207', 'H710105', 'AG10101', 'ZX10206',
'BJ10103', 'XG10104', 'M210104', 'AQ10207', 'UA10206', 'M200003',
'YT00100', 'Z800004', 'RI10207', 'SI00100', 'GV10107', 'K910107',
'ZX10201', 'Z810107', 'BY10206', '4W00008', 'AG10106', 'G900000'],
dtype=object)
sku_dict.brand_code.value_counts()
4WL34OA2 459
8FYENEWM 439
THSTSG81 384
02Q78ADY 304
MMC2P4Y3 294
...
SKXXW8V9 59
JK4UKBI2 52
74CKJ9XQ 51
H1BWFJRN 33
A1000001 1
Name: brand_code, Length: 63, dtype: int64
sku_dict.vendor.value_counts()
UEYMBB 458 TJYT3A 447 71SM2O 445 7I77VL 440 LDLJFP 435 T9BUA7 434 2CI2A8 432 UH2WWF 430 SJP384 425 AWD3XQ 425 4HJSP5 419 BLW9FG 418 B4TA32 411 3GFIMK 411 SHL570 408 AO59EQ 403 VWHZMG 400 VZ44WY 399 H2OK0Z 399 FI3ASO 398 JSOSD5 398 GVL335 391 4O4WSH 390 CHQKSO 383 A10001 1 Name: vendor, dtype: int64
sku_dict.groupby(['fincode', 'ui1_code']).sku_id.agg('count').reset_index().sort_values('fincode')
| fincode | ui1_code | sku_id | |
|---|---|---|---|
| 0 | 15 | 151 | 326 |
| 1 | 4W | 4W0 | 1 |
| 2 | 4W | 4W1 | 345 |
| 3 | 6L | 6L1 | 305 |
| 4 | 70 | 700 | 1 |
| 5 | 70 | 701 | 305 |
| 6 | 8J | 8J1 | 322 |
| 7 | A1 | A10 | 1 |
| 8 | AG | AG1 | 309 |
| 9 | AQ | AQ1 | 347 |
| 11 | B0 | B01 | 320 |
| 10 | B0 | B00 | 1 |
| 12 | B1 | B11 | 293 |
| 13 | BJ | BJ0 | 1 |
| 14 | BJ | BJ1 | 341 |
| 15 | BY | BY1 | 316 |
| 16 | EH | EH0 | 3 |
| 17 | EH | EH1 | 310 |
| 18 | FE | FE1 | 299 |
| 19 | G9 | G90 | 3 |
| 20 | G9 | G91 | 336 |
| 22 | GV | GV1 | 344 |
| 21 | GV | GV0 | 2 |
| 23 | GY | GY1 | 619 |
| 24 | H7 | H71 | 327 |
| 25 | K9 | K90 | 1 |
| 26 | K9 | K91 | 326 |
| 27 | LT | LT1 | 347 |
| 28 | M2 | M20 | 2 |
| 29 | M2 | M21 | 311 |
| 30 | MB | MB1 | 305 |
| 31 | Q5 | Q51 | 337 |
| 33 | RI | RI1 | 328 |
| 32 | RI | RI0 | 1 |
| 34 | SI | SI0 | 2 |
| 35 | SI | SI1 | 314 |
| 36 | UA | UA0 | 1 |
| 37 | UA | UA1 | 344 |
| 38 | XG | XG1 | 343 |
| 39 | YT | YT0 | 1 |
| 40 | YT | YT1 | 332 |
| 41 | Z8 | Z80 | 1 |
| 42 | Z8 | Z81 | 293 |
| 43 | ZR | ZR1 | 326 |
| 44 | ZX | ZX0 | 1 |
| 45 | ZX | ZX1 | 307 |
sku_dict.groupby(['ui1_code', 'ui3_code']).sku_id.agg('count').reset_index().sort_values('ui1_code')
| ui1_code | ui3_code | sku_id | |
|---|---|---|---|
| 0 | 151 | 1510000 | 123 |
| 23 | 151 | 1510208 | 4 |
| 22 | 151 | 1510207 | 2 |
| 21 | 151 | 1510206 | 2 |
| 20 | 151 | 1510205 | 1 |
| ... | ... | ... | ... |
| 778 | ZX1 | ZX10001 | 11 |
| 777 | ZX1 | ZX10000 | 112 |
| 802 | ZX1 | ZX10207 | 1 |
| 789 | ZX1 | ZX10103 | 1 |
| 803 | ZX1 | ZX10208 | 2 |
804 rows × 3 columns
ZX10208_df = pd.read_csv('ZX10208_agr.csv')
ZX10208_df.head()
| dates | SKU | price_per_sku | num_purchases | |
|---|---|---|---|---|
| 0 | 2018-04-20 | 59567 | 169.19 | 3 |
| 1 | 2018-04-24 | 59567 | 171.71 | 3 |
| 2 | 2018-04-27 | 59567 | 174.04 | 3 |
| 3 | 2018-04-30 | 59567 | NaN | 1 |
| 4 | 2018-05-03 | 59567 | 176.38 | 2 |
ZX10208_df.SKU.unique()
array([59567, 82947])
sku_dict[sku_dict.sku_id.isin(ZX10208_df.SKU.unique())]
| sku_id | fincode | ui1_code | ui2_code | ui3_code | vendor | brand_code | creation_date | expiration_date | |
|---|---|---|---|---|---|---|---|---|---|
| 1484 | 59567 | ZX | ZX1 | ZX102 | ZX10208 | SJP384 | 3FAIRJ4W | 2018-04-16 | 2019-04-21 00:00:00 |
| 4048 | 82947 | ZX | ZX1 | ZX102 | ZX10208 | TJYT3A | 3FAIRJ4W | 2018-09-26 | 2200-01-01 00:00:00 |
ZX10208_df.dates = pd.to_datetime(ZX10208_df.dates)
ZX10208_df[ZX10208_df.SKU == 82947].dates.describe()
/Users/sgafarov/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: Treating datetime data as categorical rather than numeric in `.describe` is deprecated and will be removed in a future version of pandas. Specify `datetime_is_numeric=True` to silence this warning and adopt the future behavior now. """Entry point for launching an IPython kernel.
count 103 unique 103 top 2019-09-09 00:00:00 freq 1 first 2018-09-28 00:00:00 last 2019-12-28 00:00:00 Name: dates, dtype: object
#import visualization libraries
import matplotlib.pyplot as plt
import seaborn as sns
color = sns.color_palette()
%matplotlib inline
plt.figure(figsize=(12,8))
plt.scatter(x='dates', y='price_per_sku', data=ZX10208_df)
plt.ylabel('price_per_sku', fontsize=12)
plt.xlabel('dates', fontsize=12)
plt.xticks(rotation='vertical')
plt.show()
# week month and year
ZX10208_df['week_num'] = ZX10208_df.dates.dt.week
ZX10208_df['year'] = ZX10208_df.dates.dt.year
ZX10208_df['months'] = ZX10208_df.dates.dt.month
ZX10208_df['year_week'] = ZX10208_df['year'].astype(str) + '_' + ZX10208_df['week_num'].astype(str)
/Users/sgafarov/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: FutureWarning: Series.dt.weekofyear and Series.dt.week have been deprecated. Please use Series.dt.isocalendar().week instead.
ZX10208_df.head()
| dates | SKU | price_per_sku | num_purchases | week_num | year | months | year_week | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2018-04-20 | 59567 | 169.19 | 3 | 16 | 2018 | 4 | 2018_16 |
| 1 | 2018-04-24 | 59567 | 171.71 | 3 | 17 | 2018 | 4 | 2018_17 |
| 2 | 2018-04-27 | 59567 | 174.04 | 3 | 17 | 2018 | 4 | 2018_17 |
| 3 | 2018-04-30 | 59567 | NaN | 1 | 18 | 2018 | 4 | 2018_18 |
| 4 | 2018-05-03 | 59567 | 176.38 | 2 | 18 | 2018 | 5 | 2018_18 |
ZX10208_gr = ZX10208_df.groupby(['year_week','SKU']).price_per_sku.mean().reset_index()
ZX10208_gr = ZX10208_gr.rename(columns={'price_per_sku':'mean_per_week'})
ZX10208_df = ZX10208_df.merge(ZX10208_gr, how='left', on=['year_week','SKU'])
ZX10208_df
| dates | SKU | price_per_sku | num_purchases | week_num | year | months | year_week | mean_per_week | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 2018-04-20 | 59567 | 169.19 | 3 | 16 | 2018 | 4 | 2018_16 | 169.190 |
| 1 | 2018-04-24 | 59567 | 171.71 | 3 | 17 | 2018 | 4 | 2018_17 | 172.875 |
| 2 | 2018-04-27 | 59567 | 174.04 | 3 | 17 | 2018 | 4 | 2018_17 | 172.875 |
| 3 | 2018-04-30 | 59567 | NaN | 1 | 18 | 2018 | 4 | 2018_18 | 176.435 |
| 4 | 2018-05-03 | 59567 | 176.38 | 2 | 18 | 2018 | 5 | 2018_18 | 176.435 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 254 | 2019-12-23 | 82947 | NaN | 1 | 52 | 2019 | 12 | 2019_52 | 194.810 |
| 255 | 2019-12-24 | 82947 | 195.46 | 2 | 52 | 2019 | 12 | 2019_52 | 194.810 |
| 256 | 2019-12-25 | 82947 | 195.21 | 1 | 52 | 2019 | 12 | 2019_52 | 194.810 |
| 257 | 2019-12-26 | 82947 | 193.79 | 1 | 52 | 2019 | 12 | 2019_52 | 194.810 |
| 258 | 2019-12-28 | 82947 | 194.78 | 1 | 52 | 2019 | 12 | 2019_52 | 194.810 |
259 rows × 9 columns
plt.figure(figsize=(12,8))
plt.scatter(x='year_week', y='mean_per_week', data=ZX10208_df[ZX10208_df.SKU==59567].sort_values('dates'))
plt.ylabel('price mean_per_week', fontsize=12)
plt.xlabel('dates', fontsize=12)
plt.xticks(rotation='vertical')
plt.show()
pivot_t = ZX10208_df.pivot_table(index='dates',columns='SKU', values='price_per_sku')
pivot_t
| SKU | 59567 | 82947 |
|---|---|---|
| dates | ||
| 2018-04-20 | 169.19 | NaN |
| 2018-04-24 | 171.71 | NaN |
| 2018-04-27 | 174.04 | NaN |
| 2018-05-03 | 176.38 | NaN |
| 2018-05-04 | 176.49 | NaN |
| ... | ... | ... |
| 2019-12-21 | NaN | 195.96 |
| 2019-12-24 | NaN | 195.46 |
| 2019-12-25 | NaN | 195.21 |
| 2019-12-26 | NaN | 193.79 |
| 2019-12-28 | NaN | 194.78 |
181 rows × 2 columns
plt.figure(figsize=(12,8))
sns.lineplot(data =pivot_t)
<matplotlib.axes._subplots.AxesSubplot at 0x7fcc56cd5510>
df_1510001 = pd.read_csv('1510001_agr.csv')
df_1510001
| dates | SKU | price_per_sku | num_purchases | |
|---|---|---|---|---|
| 0 | 2018-08-02 | 39665 | 85.940 | 1 |
| 1 | 2018-08-03 | 39665 | 85.940 | 1 |
| 2 | 2018-08-04 | 39665 | 85.940 | 1 |
| 3 | 2018-08-05 | 39665 | 85.940 | 1 |
| 4 | 2018-08-06 | 39665 | 86.038 | 1 |
| ... | ... | ... | ... | ... |
| 3935 | 2019-12-25 | 36108 | 80.094 | 2 |
| 3936 | 2019-12-28 | 36108 | 80.094 | 2 |
| 3937 | 2019-12-29 | 36108 | 80.094 | 1 |
| 3938 | 2019-12-30 | 36108 | 76.205 | 1 |
| 3939 | 2019-12-31 | 36108 | 76.205 | 1 |
3940 rows × 4 columns
df_1510001.dates = pd.to_datetime(df_1510001.dates)
pivot_t = df_1510001.pivot_table(index='dates',columns='SKU',values='price_per_sku')
pivot_t
| SKU | 27240 | 27885 | 34130 | 36108 | 39665 | 40194 | 45164 | 48671 | 49596 | 59631 | 63995 | 70252 | 70315 | 72449 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dates | ||||||||||||||
| 2018-03-02 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 107.784 | NaN | NaN |
| 2018-03-03 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 107.784 | NaN | NaN |
| 2018-03-04 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 107.784 | NaN | NaN |
| 2018-03-05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 107.882 | NaN | NaN |
| 2018-03-06 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 107.882 | NaN | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2019-12-27 | 128.652 | NaN | 104.536 | NaN | 95.978 | 135.931 | 82.652 | 152.815 | 148.536 | NaN | 138.536 | NaN | 71.931 | 156.257 |
| 2019-12-28 | NaN | NaN | NaN | 80.094 | 95.978 | NaN | 82.652 | 152.815 | NaN | 108.536 | 138.536 | 117.815 | 71.931 | 156.257 |
| 2019-12-29 | 128.652 | NaN | 104.536 | 80.094 | 95.978 | 135.931 | 82.652 | NaN | 148.536 | NaN | 138.536 | NaN | 71.931 | 156.257 |
| 2019-12-30 | NaN | NaN | NaN | 76.205 | 87.015 | 133.475 | 79.840 | 148.205 | NaN | NaN | 132.110 | NaN | 68.015 | NaN |
| 2019-12-31 | NaN | NaN | 98.840 | 76.205 | 87.015 | 133.475 | NaN | 148.205 | 142.475 | NaN | 132.110 | 112.475 | 68.015 | 149.110 |
650 rows × 14 columns
plt.figure(figsize=(12,8))
sns.lineplot(data=pivot_t,dashes=False)
<matplotlib.axes._subplots.AxesSubplot at 0x7fcc5726dfd0>
df_1510001.SKU.nunique()
14
df_1510001.SKU.unique()
array([39665, 63995, 70252, 34130, 70315, 27885, 59631, 48671, 72449,
49596, 27240, 45164, 40194, 36108])
df_1510001[df_1510001.SKU == 39665].num_purchases.describe()
count 354.000000 mean 1.519774 std 0.694702 min 1.000000 25% 1.000000 50% 1.000000 75% 2.000000 max 3.000000 Name: num_purchases, dtype: float64
plt.figure(figsize=(12,8))
sns.lineplot(x =df_1510001[df_1510001.SKU == 39665].num_purchases , y = df_1510001[df_1510001.SKU == 39665].price_per_sku)
<matplotlib.axes._subplots.AxesSubplot at 0x7fcc52723fd0>
df_1510002 = pd.read_csv('1510002_agr.csv')
df_1510002.dates = pd.to_datetime(df_1510002.dates)
pivot_t = df_1510002.pivot_table(index='dates',columns='SKU',values='num_purchases')
pivot_t
| SKU | 10334 | 17812 | 36096 | 38767 | 43678 | 57561 | 64619 | 68211 | 69997 | 72784 | 83329 | 90611 | 98255 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dates | |||||||||||||
| 2018-01-24 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 9.0 | NaN | NaN | NaN |
| 2018-01-25 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 9.0 | NaN | NaN | NaN |
| 2018-01-27 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 7.0 | NaN | NaN | NaN |
| 2018-01-28 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 7.0 | NaN | NaN | NaN |
| 2018-01-29 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 9.0 | NaN | NaN | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2019-12-27 | 9.0 | 3.0 | 13.0 | NaN | 9.0 | NaN | 4.0 | NaN | NaN | 7.0 | 9.0 | NaN | NaN |
| 2019-12-28 | 9.0 | 4.0 | 13.0 | 8.0 | 10.0 | NaN | NaN | NaN | NaN | NaN | NaN | 4.0 | NaN |
| 2019-12-29 | 8.0 | NaN | 14.0 | 9.0 | NaN | NaN | 4.0 | NaN | NaN | NaN | 9.0 | 5.0 | NaN |
| 2019-12-30 | 8.0 | 3.0 | NaN | 8.0 | 9.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 2019-12-31 | 9.0 | 3.0 | NaN | 8.0 | 9.0 | NaN | NaN | NaN | NaN | NaN | 10.0 | 6.0 | NaN |
702 rows × 13 columns
plt.figure(figsize=(12,8))
sns.lineplot(data=pivot_t,dashes=False)
<matplotlib.axes._subplots.AxesSubplot at 0x7fcc56af5c50>
promo_df = pd.read_csv('promo_1510002.csv')
promo_df
| year | week_num | SKU | discount | |
|---|---|---|---|---|
| 0 | 2019 | 1 | 90611 | 0.10 |
| 1 | 2019 | 2 | 10334 | 0.10 |
| 2 | 2019 | 3 | 68211 | 0.10 |
| 3 | 2019 | 4 | 10334 | 0.10 |
| 4 | 2019 | 5 | 72784 | 0.20 |
| 5 | 2019 | 6 | 68211 | 0.10 |
| 6 | 2019 | 7 | 38767 | 0.10 |
| 7 | 2019 | 8 | 83329 | 0.10 |
| 8 | 2019 | 9 | 83329 | 0.05 |
| 9 | 2019 | 10 | 90611 | 0.10 |
| 10 | 2019 | 11 | 57561 | 0.05 |
| 11 | 2019 | 12 | 72784 | 0.10 |
| 12 | 2019 | 13 | 38767 | 0.05 |
| 13 | 2019 | 14 | 57561 | 0.10 |
| 14 | 2019 | 15 | 57561 | 0.20 |
| 15 | 2019 | 16 | 90611 | 0.05 |
| 16 | 2019 | 17 | 43678 | 0.20 |
| 17 | 2019 | 18 | 10334 | 0.20 |
| 18 | 2019 | 19 | 38767 | 0.05 |
| 19 | 2019 | 20 | 17812 | 0.10 |
| 20 | 2019 | 21 | 38767 | 0.05 |
| 21 | 2019 | 22 | 57561 | 0.05 |
| 22 | 2019 | 23 | 10334 | 0.05 |
| 23 | 2019 | 24 | 69997 | 0.20 |
| 24 | 2019 | 25 | 17812 | 0.10 |
| 25 | 2019 | 26 | 17812 | 0.10 |
| 26 | 2019 | 27 | 17812 | 0.05 |
| 27 | 2019 | 28 | 10334 | 0.10 |
| 28 | 2019 | 29 | 90611 | 0.05 |
| 29 | 2019 | 30 | 10334 | 0.20 |
| 30 | 2019 | 31 | 69997 | 0.20 |
| 31 | 2019 | 32 | 57561 | 0.10 |
| 32 | 2019 | 33 | 43678 | 0.10 |
| 33 | 2019 | 34 | 17812 | 0.20 |
| 34 | 2019 | 35 | 90611 | 0.20 |
| 35 | 2019 | 36 | 57561 | 0.10 |
| 36 | 2019 | 37 | 43678 | 0.10 |
| 37 | 2019 | 38 | 57561 | 0.05 |
| 38 | 2019 | 39 | 36096 | 0.10 |
| 39 | 2019 | 40 | 72784 | 0.10 |
| 40 | 2019 | 41 | 64619 | 0.05 |
| 41 | 2019 | 42 | 38767 | 0.05 |
| 42 | 2019 | 43 | 17812 | 0.05 |
| 43 | 2019 | 44 | 43678 | 0.10 |
| 44 | 2019 | 45 | 17812 | 0.10 |
| 45 | 2019 | 46 | 83329 | 0.10 |
| 46 | 2019 | 47 | 90611 | 0.20 |
| 47 | 2019 | 48 | 36096 | 0.05 |
| 48 | 2019 | 49 | 10334 | 0.05 |
| 49 | 2019 | 50 | 10334 | 0.05 |
| 50 | 2019 | 51 | 17812 | 0.10 |
| 51 | 2019 | 52 | 36096 | 0.10 |
promo_df.discount = 1 - promo_df.discount
df_1510002['year'] = df_1510002.dates.dt.year
df_1510002['week_num'] = df_1510002.dates.dt.week
df_1510002 = df_1510002[df_1510002.dates >= pd.to_datetime('2019-01-01')]
/Users/sgafarov/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: FutureWarning: Series.dt.weekofyear and Series.dt.week have been deprecated. Please use Series.dt.isocalendar().week instead.
df_72784 = df_1510002[df_1510002.SKU == 72784]
df_72784.groupby(['year','week_num']).num_purchases.max().reset_index()
| year | week_num | num_purchases | |
|---|---|---|---|
| 0 | 2019 | 1 | 8 |
| 1 | 2019 | 2 | 7 |
| 2 | 2019 | 3 | 7 |
| 3 | 2019 | 4 | 7 |
| 4 | 2019 | 5 | 11 |
| 5 | 2019 | 6 | 6 |
| 6 | 2019 | 7 | 6 |
| 7 | 2019 | 8 | 8 |
| 8 | 2019 | 9 | 8 |
| 9 | 2019 | 10 | 8 |
| 10 | 2019 | 11 | 8 |
| 11 | 2019 | 12 | 10 |
| 12 | 2019 | 13 | 6 |
| 13 | 2019 | 14 | 7 |
| 14 | 2019 | 15 | 6 |
| 15 | 2019 | 16 | 7 |
| 16 | 2019 | 17 | 8 |
| 17 | 2019 | 18 | 7 |
| 18 | 2019 | 19 | 6 |
| 19 | 2019 | 20 | 6 |
| 20 | 2019 | 21 | 8 |
| 21 | 2019 | 22 | 7 |
| 22 | 2019 | 23 | 8 |
| 23 | 2019 | 24 | 7 |
| 24 | 2019 | 25 | 8 |
| 25 | 2019 | 26 | 7 |
| 26 | 2019 | 27 | 7 |
| 27 | 2019 | 28 | 7 |
| 28 | 2019 | 29 | 6 |
| 29 | 2019 | 30 | 8 |
| 30 | 2019 | 31 | 6 |
| 31 | 2019 | 32 | 8 |
| 32 | 2019 | 33 | 8 |
| 33 | 2019 | 34 | 7 |
| 34 | 2019 | 35 | 7 |
| 35 | 2019 | 36 | 8 |
| 36 | 2019 | 37 | 8 |
| 37 | 2019 | 38 | 8 |
| 38 | 2019 | 39 | 7 |
| 39 | 2019 | 40 | 10 |
| 40 | 2019 | 41 | 8 |
| 41 | 2019 | 42 | 8 |
| 42 | 2019 | 43 | 6 |
| 43 | 2019 | 44 | 7 |
| 44 | 2019 | 45 | 8 |
| 45 | 2019 | 46 | 8 |
| 46 | 2019 | 47 | 8 |
| 47 | 2019 | 48 | 7 |
| 48 | 2019 | 49 | 8 |
| 49 | 2019 | 50 | 7 |
| 50 | 2019 | 51 | 6 |
| 51 | 2019 | 52 | 7 |
df_1510002 = df_1510002.merge(promo_df, how='left', on= ['SKU', 'year', 'week_num'])
df_1510002['real_price_per_sku'] = df_1510002.price_per_sku * (1+df_1510002.discount)
df_1510002[~df_1510002.discount.isnull()]
| dates | SKU | price_per_sku | num_purchases | year | week_num | discount | real_price_per_sku | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2019-01-01 | 90611 | 79.5420 | 7 | 2019 | 1 | 0.1 | 87.49620 |
| 13 | 2019-01-02 | 90611 | 79.5420 | 7 | 2019 | 1 | 0.1 | 87.49620 |
| 20 | 2019-01-03 | 90611 | 79.5420 | 9 | 2019 | 1 | 0.1 | 87.49620 |
| 27 | 2019-01-04 | 90611 | 79.5420 | 6 | 2019 | 1 | 0.1 | 87.49620 |
| 35 | 2019-01-05 | 90611 | 79.5420 | 6 | 2019 | 1 | 0.1 | 87.49620 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2285 | 2019-12-26 | 36096 | 119.3868 | 14 | 2019 | 52 | 0.1 | 131.32548 |
| 2298 | 2019-12-27 | 36096 | 119.3868 | 13 | 2019 | 52 | 0.1 | 131.32548 |
| 2299 | 2019-12-28 | 36096 | 119.3868 | 13 | 2019 | 52 | 0.1 | 131.32548 |
| 2305 | 2019-12-29 | 36096 | 119.3868 | 14 | 2019 | 52 | 0.1 | 131.32548 |
| 2315 | 2019-12-31 | 90611 | 79.5420 | 6 | 2019 | 1 | 0.1 | 87.49620 |
281 rows × 8 columns
df_1 = pd.read_csv('1510003_agr.csv')
df_1
| dates | SKU | price_per_sku | num_purchases | |
|---|---|---|---|---|
| 0 | 2018-11-17 | 54404 | 80.095 | 11 |
| 1 | 2018-11-18 | 54404 | 80.095 | 12 |
| 2 | 2018-11-19 | 54404 | 81.796 | 10 |
| 3 | 2018-11-20 | 54404 | 81.796 | 11 |
| 4 | 2018-11-21 | 54404 | 81.796 | 10 |
| ... | ... | ... | ... | ... |
| 2846 | 2019-12-27 | 49661 | 165.978 | 10 |
| 2847 | 2019-12-28 | 49661 | 165.978 | 9 |
| 2848 | 2019-12-29 | 49661 | 165.978 | 10 |
| 2849 | 2019-12-30 | 49661 | 159.205 | 8 |
| 2850 | 2019-12-31 | 49661 | 159.205 | 8 |
2851 rows × 4 columns
conc_df = pd.read_csv('conc_df.csv')
conc_df
| SKU | year | week_num | ret_net_code | price_per_sku | |
|---|---|---|---|---|---|
| 0 | 84395 | 2019 | 18 | 1 | 164.69400 |
| 1 | 84395 | 2019 | 18 | 2 | 164.69400 |
| 2 | 84395 | 2019 | 18 | 3 | 134.50010 |
| 3 | 84395 | 2019 | 22 | 1 | 165.19800 |
| 4 | 84395 | 2019 | 22 | 2 | 136.28835 |
| ... | ... | ... | ... | ... | ... |
| 3004 | 89272 | 2019 | 18 | 2 | 133.93820 |
| 3005 | 89272 | 2019 | 18 | 3 | 121.76200 |
| 3006 | 80308 | 2019 | 47 | 1 | 115.77984 |
| 3007 | 80308 | 2019 | 47 | 2 | 118.19192 |
| 3008 | 80308 | 2019 | 47 | 3 | 116.98588 |
3009 rows × 5 columns
df_1[df_1.SKU.isin(conc_df.SKU.unique())]
| dates | SKU | price_per_sku | num_purchases | |
|---|---|---|---|---|
| 0 | 2018-11-17 | 54404 | 80.095 | 11 |
| 1 | 2018-11-18 | 54404 | 80.095 | 12 |
| 2 | 2018-11-19 | 54404 | 81.796 | 10 |
| 3 | 2018-11-20 | 54404 | 81.796 | 11 |
| 4 | 2018-11-21 | 54404 | 81.796 | 10 |
| ... | ... | ... | ... | ... |
| 2846 | 2019-12-27 | 49661 | 165.978 | 10 |
| 2847 | 2019-12-28 | 49661 | 165.978 | 9 |
| 2848 | 2019-12-29 | 49661 | 165.978 | 10 |
| 2849 | 2019-12-30 | 49661 | 159.205 | 8 |
| 2850 | 2019-12-31 | 49661 | 159.205 | 8 |
2851 rows × 4 columns
df_1.dates = pd.to_datetime(df_1.dates)
df_1['year'] = df_1.dates.dt.year
df_1['week_num'] = df_1.dates.dt.week
/Users/sgafarov/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: FutureWarning: Series.dt.weekofyear and Series.dt.week have been deprecated. Please use Series.dt.isocalendar().week instead.
conc_aggr = conc_df.groupby(['SKU', 'year', 'week_num']).price_per_sku.agg(['min', 'max']).reset_index()
df_1 = df_1.merge(conc_aggr, how='left', on=['SKU','year', 'week_num'])
df_80308 = df_1[df_1.SKU == 80308]
df_80308
| dates | SKU | price_per_sku | num_purchases | year | week_num | min | max | |
|---|---|---|---|---|---|---|---|---|
| 853 | 2018-07-17 | 80308 | 113.940 | 8 | 2018 | 29 | NaN | NaN |
| 854 | 2018-07-18 | 80308 | 113.940 | 8 | 2018 | 29 | NaN | NaN |
| 855 | 2018-07-20 | 80308 | 113.940 | 8 | 2018 | 29 | NaN | NaN |
| 856 | 2018-07-21 | 80308 | 113.940 | 7 | 2018 | 29 | NaN | NaN |
| 857 | 2018-07-22 | 80308 | 113.940 | 8 | 2018 | 29 | NaN | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1235 | 2019-12-27 | 80308 | 122.536 | 10 | 2019 | 52 | 122.536 | 147.0432 |
| 1236 | 2019-12-28 | 80308 | 122.536 | 9 | 2019 | 52 | 122.536 | 147.0432 |
| 1237 | 2019-12-29 | 80308 | 122.536 | 9 | 2019 | 52 | 122.536 | 147.0432 |
| 1238 | 2019-12-30 | 80308 | 116.475 | 7 | 2019 | 1 | 111.816 | 128.1225 |
| 1239 | 2019-12-31 | 80308 | 116.475 | 5 | 2019 | 1 | 111.816 | 128.1225 |
387 rows × 8 columns
plt.figure(figsize=(12,8))
plt.scatter(x = df_80308[df_80308.price_per_sku >= df_80308['min']].dates, y =df_80308[df_80308.price_per_sku >= df_80308['min']].num_purchases)
plt.scatter(x =df_80308[df_80308.price_per_sku <= df_80308['min']].dates, y=df_80308[df_80308.price_per_sku <= df_80308['min']].num_purchases)
<matplotlib.collections.PathCollection at 0x7fcc5769ff10>
from statsmodels.tsa.ar_model import AutoReg
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.vector_ar.var_model import VAR
from statsmodels.tsa.statespace.varmax import VARMAX
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
from pandas.plotting import autocorrelation_plot
import warnings
warnings.filterwarnings('ignore')
ZX_df = pd.read_csv('ZX10208_agr.csv')
ZX_df['dates'] = pd.to_datetime(ZX_df.dates)
pivot_t = ZX_df.pivot_table(index='dates',columns='SKU', values='price_per_sku')
plt.figure(figsize=(12,8))
sns.lineplot(data =pivot_t)
<matplotlib.axes._subplots.AxesSubplot at 0x7fcc59408850>
ZX_df['price_per_sku'] = ZX_df.groupby('SKU').price_per_sku.ffill()
df_59567 = ZX_df[ZX_df.SKU == 59567]
train_df = df_59567[df_59567.dates <= pd.to_datetime('2019-04-01')]
test_df = df_59567[df_59567.dates > pd.to_datetime('2019-04-01')]
print(train_df.shape)
print(test_df.shape)
(145, 4) (11, 10)
plt.figure(figsize=(12,8))
autocorrelation_plot(df_59567.price_per_sku.values)
<matplotlib.axes._subplots.AxesSubplot at 0x7fcc59382850>
#1 Autoregression
AR = AutoReg(train_df.price_per_sku.values, lags=20)
AR_model = AR.fit()
AR_model.params
array([ 1.60820207e+01, 1.06938563e+00, -1.46162089e-01, -1.30899380e-01,
1.57571721e-01, 6.47218415e-02, -1.11758222e-01, 5.59600227e-02,
-3.76933446e-02, 1.47311386e-02, -6.18697944e-02, 2.73159049e-01,
-3.18091136e-01, 1.60588852e-01, -7.09107645e-02, -6.92044450e-02,
1.41846291e-01, -1.33862976e-01, 4.72945316e-02, 4.09616542e-02,
-3.34062939e-02])
AR_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1,
dynamic=False)
array([180.44857402, 180.4443652 , 180.87926656, 181.70071796,
180.70814628, 181.08981343, 181.11552473, 181.10372658,
182.38490989, 182.0267328 , 182.55686698])
test_df['AR_model_prediction'] = AR_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1,
dynamic=False)
test_df
| dates | SKU | price_per_sku | num_purchases | AR_model_prediction | |
|---|---|---|---|---|---|
| 192 | 2019-04-02 | 59567 | 181.86 | 2 | 180.448574 |
| 194 | 2019-04-06 | 59567 | 181.83 | 2 | 180.444365 |
| 195 | 2019-04-08 | 59567 | 181.83 | 1 | 180.879267 |
| 196 | 2019-04-09 | 59567 | 181.67 | 1 | 181.700718 |
| 197 | 2019-04-10 | 59567 | 180.08 | 2 | 180.708146 |
| 198 | 2019-04-11 | 59567 | 179.97 | 2 | 181.089813 |
| 199 | 2019-04-12 | 59567 | 179.03 | 1 | 181.115525 |
| 200 | 2019-04-13 | 59567 | 179.36 | 1 | 181.103727 |
| 202 | 2019-04-16 | 59567 | 178.61 | 2 | 182.384910 |
| 203 | 2019-04-18 | 59567 | 177.77 | 1 | 182.026733 |
| 204 | 2019-04-21 | 59567 | 177.77 | 1 | 182.556867 |
# Moving Avarage
MA = ARIMA(train_df.price_per_sku.values, order=(0,0,20))
MA_model = MA.fit()
MA_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1)
array([181.1411973 , 180.97153481, 181.78479433, 182.45938971,
181.10404348, 181.8960975 , 181.05864524, 181.7544814 ,
182.56178024, 181.3105422 , 182.60947083])
test_df['MA_model_prediction'] = MA_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1)
test_df
| dates | SKU | price_per_sku | num_purchases | AR_model_prediction | MA_model_prediction | |
|---|---|---|---|---|---|---|
| 192 | 2019-04-02 | 59567 | 181.86 | 2 | 180.448574 | 181.141197 |
| 194 | 2019-04-06 | 59567 | 181.83 | 2 | 180.444365 | 180.971535 |
| 195 | 2019-04-08 | 59567 | 181.83 | 1 | 180.879267 | 181.784794 |
| 196 | 2019-04-09 | 59567 | 181.67 | 1 | 181.700718 | 182.459390 |
| 197 | 2019-04-10 | 59567 | 180.08 | 2 | 180.708146 | 181.104043 |
| 198 | 2019-04-11 | 59567 | 179.97 | 2 | 181.089813 | 181.896098 |
| 199 | 2019-04-12 | 59567 | 179.03 | 1 | 181.115525 | 181.058645 |
| 200 | 2019-04-13 | 59567 | 179.36 | 1 | 181.103727 | 181.754481 |
| 202 | 2019-04-16 | 59567 | 178.61 | 2 | 182.384910 | 182.561780 |
| 203 | 2019-04-18 | 59567 | 177.77 | 1 | 182.026733 | 181.310542 |
| 204 | 2019-04-21 | 59567 | 177.77 | 1 | 182.556867 | 182.609471 |
# Autoregressive moving average(ARMA)
ARMA = ARIMA(train_df.price_per_sku.values, order=(1,0,1))
ARMA_model = ARMA.fit()
ARMA_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1)
array([179.97184905, 179.9823484 , 179.99237896, 180.00196165,
180.01111649, 180.01986255, 180.02821811, 180.0362006 ,
180.04382667, 180.05111223, 180.0580725 ])
test_df['ARMA_model_prediction'] = ARMA_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1)
# Autoregressive Integrated Moving Average
ARIMA_ = ARIMA(train_df.price_per_sku.values, order=(20,1,20))
ARIMA_model = ARIMA_.fit()
ARIMA_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1)
array([180.83419547, 180.48032031, 180.31605765, 181.11192182,
178.6975036 , 179.13991888, 177.75230121, 177.77676229,
179.94879324, 178.96750661, 180.37365968])
test_df['ARIMA_model_prediction'] = ARIMA_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1)
test_df
| dates | SKU | price_per_sku | num_purchases | AR_model_prediction | MA_model_prediction | ARMA_model_prediction | ARIMA_model_prediction | |
|---|---|---|---|---|---|---|---|---|
| 192 | 2019-04-02 | 59567 | 181.86 | 2 | 180.448574 | 181.141197 | 179.971849 | 180.834195 |
| 194 | 2019-04-06 | 59567 | 181.83 | 2 | 180.444365 | 180.971535 | 179.982348 | 180.480320 |
| 195 | 2019-04-08 | 59567 | 181.83 | 1 | 180.879267 | 181.784794 | 179.992379 | 180.316058 |
| 196 | 2019-04-09 | 59567 | 181.67 | 1 | 181.700718 | 182.459390 | 180.001962 | 181.111922 |
| 197 | 2019-04-10 | 59567 | 180.08 | 2 | 180.708146 | 181.104043 | 180.011116 | 178.697504 |
| 198 | 2019-04-11 | 59567 | 179.97 | 2 | 181.089813 | 181.896098 | 180.019863 | 179.139919 |
| 199 | 2019-04-12 | 59567 | 179.03 | 1 | 181.115525 | 181.058645 | 180.028218 | 177.752301 |
| 200 | 2019-04-13 | 59567 | 179.36 | 1 | 181.103727 | 181.754481 | 180.036201 | 177.776762 |
| 202 | 2019-04-16 | 59567 | 178.61 | 2 | 182.384910 | 182.561780 | 180.043827 | 179.948793 |
| 203 | 2019-04-18 | 59567 | 177.77 | 1 | 182.026733 | 181.310542 | 180.051112 | 178.967507 |
| 204 | 2019-04-21 | 59567 | 177.77 | 1 | 182.556867 | 182.609471 | 180.058073 | 180.373660 |
# Seasonal Autoregressive Integrated Moving-Average
SARIMA = SARIMAX(train_df.price_per_sku.values, order=(20,1,20), seasonal= (0,0,0,0))
SARIMA_model = SARIMA.fit()
SARIMA_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1)
array([180.83419547, 180.48032031, 180.31605765, 181.11192182,
178.6975036 , 179.13991888, 177.75230121, 177.77676229,
179.94879324, 178.96750661, 180.37365968])
test_df['SARIMA_model_prediction'] = SARIMA_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1)
test_df
| dates | SKU | price_per_sku | num_purchases | AR_model_prediction | MA_model_prediction | ARMA_model_prediction | ARIMA_model_prediction | SARIMA_model_prediction | |
|---|---|---|---|---|---|---|---|---|---|
| 192 | 2019-04-02 | 59567 | 181.86 | 2 | 180.448574 | 181.141197 | 179.971849 | 180.834195 | 180.834195 |
| 194 | 2019-04-06 | 59567 | 181.83 | 2 | 180.444365 | 180.971535 | 179.982348 | 180.480320 | 180.480320 |
| 195 | 2019-04-08 | 59567 | 181.83 | 1 | 180.879267 | 181.784794 | 179.992379 | 180.316058 | 180.316058 |
| 196 | 2019-04-09 | 59567 | 181.67 | 1 | 181.700718 | 182.459390 | 180.001962 | 181.111922 | 181.111922 |
| 197 | 2019-04-10 | 59567 | 180.08 | 2 | 180.708146 | 181.104043 | 180.011116 | 178.697504 | 178.697504 |
| 198 | 2019-04-11 | 59567 | 179.97 | 2 | 181.089813 | 181.896098 | 180.019863 | 179.139919 | 179.139919 |
| 199 | 2019-04-12 | 59567 | 179.03 | 1 | 181.115525 | 181.058645 | 180.028218 | 177.752301 | 177.752301 |
| 200 | 2019-04-13 | 59567 | 179.36 | 1 | 181.103727 | 181.754481 | 180.036201 | 177.776762 | 177.776762 |
| 202 | 2019-04-16 | 59567 | 178.61 | 2 | 182.384910 | 182.561780 | 180.043827 | 179.948793 | 179.948793 |
| 203 | 2019-04-18 | 59567 | 177.77 | 1 | 182.026733 | 181.310542 | 180.051112 | 178.967507 | 178.967507 |
| 204 | 2019-04-21 | 59567 | 177.77 | 1 | 182.556867 | 182.609471 | 180.058073 | 180.373660 | 180.373660 |
# Simple Exponential Smoothing
SES = SimpleExpSmoothing(train_df.price_per_sku.values)
SES_model = SES.fit()
SES_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1)
array([179.96, 179.96, 179.96, 179.96, 179.96, 179.96, 179.96, 179.96,
179.96, 179.96, 179.96])
test_df['SES_model_prediction'] = SES_model.predict(start =len(train_df), end= len(train_df) + len(test_df)-1)
test_df
| dates | SKU | price_per_sku | num_purchases | AR_model_prediction | MA_model_prediction | ARMA_model_prediction | ARIMA_model_prediction | SARIMA_model_prediction | SES_model_prediction | |
|---|---|---|---|---|---|---|---|---|---|---|
| 192 | 2019-04-02 | 59567 | 181.86 | 2 | 180.448574 | 181.141197 | 179.971849 | 180.834195 | 180.834195 | 179.96 |
| 194 | 2019-04-06 | 59567 | 181.83 | 2 | 180.444365 | 180.971535 | 179.982348 | 180.480320 | 180.480320 | 179.96 |
| 195 | 2019-04-08 | 59567 | 181.83 | 1 | 180.879267 | 181.784794 | 179.992379 | 180.316058 | 180.316058 | 179.96 |
| 196 | 2019-04-09 | 59567 | 181.67 | 1 | 181.700718 | 182.459390 | 180.001962 | 181.111922 | 181.111922 | 179.96 |
| 197 | 2019-04-10 | 59567 | 180.08 | 2 | 180.708146 | 181.104043 | 180.011116 | 178.697504 | 178.697504 | 179.96 |
| 198 | 2019-04-11 | 59567 | 179.97 | 2 | 181.089813 | 181.896098 | 180.019863 | 179.139919 | 179.139919 | 179.96 |
| 199 | 2019-04-12 | 59567 | 179.03 | 1 | 181.115525 | 181.058645 | 180.028218 | 177.752301 | 177.752301 | 179.96 |
| 200 | 2019-04-13 | 59567 | 179.36 | 1 | 181.103727 | 181.754481 | 180.036201 | 177.776762 | 177.776762 | 179.96 |
| 202 | 2019-04-16 | 59567 | 178.61 | 2 | 182.384910 | 182.561780 | 180.043827 | 179.948793 | 179.948793 | 179.96 |
| 203 | 2019-04-18 | 59567 | 177.77 | 1 | 182.026733 | 181.310542 | 180.051112 | 178.967507 | 178.967507 | 179.96 |
| 204 | 2019-04-21 | 59567 | 177.77 | 1 | 182.556867 | 182.609471 | 180.058073 | 180.373660 | 180.373660 | 179.96 |
# VAR
# VARMA
# VARMAX
import torch
from torch import nn
from torch.autograd import Variable as V
from torch import optim
import torchvision as tv
import torchvision.transforms as tf
class LSTM(nn.Module):
def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):
super().__init__()
self.hidden_layer_size = hidden_layer_size
self.lstm = nn.LSTM(input_size, hidden_layer_size)
self.linear = nn.Linear(hidden_layer_size, output_size)
self.hidden_cell = (torch.zeros(1,1,self.hidden_layer_size),
torch.zeros(1,1,self.hidden_layer_size))
def forward(self, input_seq):
lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq) ,1, -1), self.hidden_cell)
predictions = self.linear(lstm_out.view(len(input_seq), -1))
return predictions[-1]
model = LSTM()
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(-1, 1))
train_data_normalized = scaler.fit_transform(train_df.price_per_sku.values .reshape(-1, 1))
train_data_normalized = torch.FloatTensor(train_data_normalized).view(-1)
train_data_normalized
tensor([-1.0000, -0.8011, -0.6172, -0.6172, -0.4325, -0.4238, -0.4238, -0.4238,
-0.5927, -0.5927, -0.5927, -0.7680, -0.7624, -0.9116, -0.6093, -0.6030,
-0.6748, -0.6748, -0.5051, -0.6946, -0.5998, -0.5998, -0.5762, -0.5841,
-0.5841, -0.4736, -0.4736, -0.6527, -0.7285, -0.7285, -0.6938, -0.5525,
-0.4230, -0.4230, -0.4878, -0.5122, -0.5122, -0.5122, -0.6275, -0.6275,
-0.4002, 0.1902, 0.6156, 0.3236, 0.3197, 0.3197, 0.6819, 0.6819,
0.6267, 0.6685, 0.6219, 0.6219, 0.6219, 1.0000, 0.7064, 0.7064,
0.6093, 0.5122, 0.2313, 0.2313, 0.2313, 0.0892, 0.0892, -0.0426,
0.2652, 0.2652, 0.3402, 0.2163, 0.1681, 0.1681, 0.0734, 0.0245,
-0.0032, 0.0868, 0.0868, -0.0237, 0.0781, 0.0513, 0.0513, 0.0355,
0.1263, 0.1263, 0.1263, 0.1294, 0.0371, 0.1168, 0.0545, 0.0545,
0.0545, 0.2391, 0.2991, 0.2447, 0.2257, 0.2897, 0.3307, 0.3307,
0.1807, 0.2202, 0.2202, 0.2644, 0.2912, 0.3717, 0.4286, 0.4286,
0.6559, 0.7593, 0.9006, 0.9006, 0.9006, 0.3165, 0.3291, 0.3291,
0.3291, 0.3891, 0.2952, 0.2249, 0.2005, 0.2005, 0.2076, 0.1279,
0.1129, 0.2028, 0.0537, 0.0537, 0.0331, 0.0552, 0.1413, 0.0655,
0.0576, 0.2470, 0.1823, 0.1721, 0.1721, -0.0347, 0.0442, 0.0868,
0.0868, 0.1444, -0.2415, -0.3678, -0.3615, -0.3615, -0.1350, -0.1500,
-0.1500])
def create_inout_sequences(input_data, tw=11):
inout_seq = []
L = len(input_data)
for i in range(L-tw):
train_seq = input_data[i:i+tw]
train_label = input_data[i+tw:i+tw+1]
inout_seq.append((train_seq ,train_label))
return inout_seq
train_inout_seq = create_inout_sequences(train_data_normalized, tw=11)
train_inout_seq
[(tensor([-1.0000, -0.8011, -0.6172, -0.6172, -0.4325, -0.4238, -0.4238, -0.4238,
-0.5927, -0.5927, -0.5927]),
tensor([-0.7680])),
(tensor([-0.8011, -0.6172, -0.6172, -0.4325, -0.4238, -0.4238, -0.4238, -0.5927,
-0.5927, -0.5927, -0.7680]),
tensor([-0.7624])),
(tensor([-0.6172, -0.6172, -0.4325, -0.4238, -0.4238, -0.4238, -0.5927, -0.5927,
-0.5927, -0.7680, -0.7624]),
tensor([-0.9116])),
(tensor([-0.6172, -0.4325, -0.4238, -0.4238, -0.4238, -0.5927, -0.5927, -0.5927,
-0.7680, -0.7624, -0.9116]),
tensor([-0.6093])),
(tensor([-0.4325, -0.4238, -0.4238, -0.4238, -0.5927, -0.5927, -0.5927, -0.7680,
-0.7624, -0.9116, -0.6093]),
tensor([-0.6030])),
(tensor([-0.4238, -0.4238, -0.4238, -0.5927, -0.5927, -0.5927, -0.7680, -0.7624,
-0.9116, -0.6093, -0.6030]),
tensor([-0.6748])),
(tensor([-0.4238, -0.4238, -0.5927, -0.5927, -0.5927, -0.7680, -0.7624, -0.9116,
-0.6093, -0.6030, -0.6748]),
tensor([-0.6748])),
(tensor([-0.4238, -0.5927, -0.5927, -0.5927, -0.7680, -0.7624, -0.9116, -0.6093,
-0.6030, -0.6748, -0.6748]),
tensor([-0.5051])),
(tensor([-0.5927, -0.5927, -0.5927, -0.7680, -0.7624, -0.9116, -0.6093, -0.6030,
-0.6748, -0.6748, -0.5051]),
tensor([-0.6946])),
(tensor([-0.5927, -0.5927, -0.7680, -0.7624, -0.9116, -0.6093, -0.6030, -0.6748,
-0.6748, -0.5051, -0.6946]),
tensor([-0.5998])),
(tensor([-0.5927, -0.7680, -0.7624, -0.9116, -0.6093, -0.6030, -0.6748, -0.6748,
-0.5051, -0.6946, -0.5998]),
tensor([-0.5998])),
(tensor([-0.7680, -0.7624, -0.9116, -0.6093, -0.6030, -0.6748, -0.6748, -0.5051,
-0.6946, -0.5998, -0.5998]),
tensor([-0.5762])),
(tensor([-0.7624, -0.9116, -0.6093, -0.6030, -0.6748, -0.6748, -0.5051, -0.6946,
-0.5998, -0.5998, -0.5762]),
tensor([-0.5841])),
(tensor([-0.9116, -0.6093, -0.6030, -0.6748, -0.6748, -0.5051, -0.6946, -0.5998,
-0.5998, -0.5762, -0.5841]),
tensor([-0.5841])),
(tensor([-0.6093, -0.6030, -0.6748, -0.6748, -0.5051, -0.6946, -0.5998, -0.5998,
-0.5762, -0.5841, -0.5841]),
tensor([-0.4736])),
(tensor([-0.6030, -0.6748, -0.6748, -0.5051, -0.6946, -0.5998, -0.5998, -0.5762,
-0.5841, -0.5841, -0.4736]),
tensor([-0.4736])),
(tensor([-0.6748, -0.6748, -0.5051, -0.6946, -0.5998, -0.5998, -0.5762, -0.5841,
-0.5841, -0.4736, -0.4736]),
tensor([-0.6527])),
(tensor([-0.6748, -0.5051, -0.6946, -0.5998, -0.5998, -0.5762, -0.5841, -0.5841,
-0.4736, -0.4736, -0.6527]),
tensor([-0.7285])),
(tensor([-0.5051, -0.6946, -0.5998, -0.5998, -0.5762, -0.5841, -0.5841, -0.4736,
-0.4736, -0.6527, -0.7285]),
tensor([-0.7285])),
(tensor([-0.6946, -0.5998, -0.5998, -0.5762, -0.5841, -0.5841, -0.4736, -0.4736,
-0.6527, -0.7285, -0.7285]),
tensor([-0.6938])),
(tensor([-0.5998, -0.5998, -0.5762, -0.5841, -0.5841, -0.4736, -0.4736, -0.6527,
-0.7285, -0.7285, -0.6938]),
tensor([-0.5525])),
(tensor([-0.5998, -0.5762, -0.5841, -0.5841, -0.4736, -0.4736, -0.6527, -0.7285,
-0.7285, -0.6938, -0.5525]),
tensor([-0.4230])),
(tensor([-0.5762, -0.5841, -0.5841, -0.4736, -0.4736, -0.6527, -0.7285, -0.7285,
-0.6938, -0.5525, -0.4230]),
tensor([-0.4230])),
(tensor([-0.5841, -0.5841, -0.4736, -0.4736, -0.6527, -0.7285, -0.7285, -0.6938,
-0.5525, -0.4230, -0.4230]),
tensor([-0.4878])),
(tensor([-0.5841, -0.4736, -0.4736, -0.6527, -0.7285, -0.7285, -0.6938, -0.5525,
-0.4230, -0.4230, -0.4878]),
tensor([-0.5122])),
(tensor([-0.4736, -0.4736, -0.6527, -0.7285, -0.7285, -0.6938, -0.5525, -0.4230,
-0.4230, -0.4878, -0.5122]),
tensor([-0.5122])),
(tensor([-0.4736, -0.6527, -0.7285, -0.7285, -0.6938, -0.5525, -0.4230, -0.4230,
-0.4878, -0.5122, -0.5122]),
tensor([-0.5122])),
(tensor([-0.6527, -0.7285, -0.7285, -0.6938, -0.5525, -0.4230, -0.4230, -0.4878,
-0.5122, -0.5122, -0.5122]),
tensor([-0.6275])),
(tensor([-0.7285, -0.7285, -0.6938, -0.5525, -0.4230, -0.4230, -0.4878, -0.5122,
-0.5122, -0.5122, -0.6275]),
tensor([-0.6275])),
(tensor([-0.7285, -0.6938, -0.5525, -0.4230, -0.4230, -0.4878, -0.5122, -0.5122,
-0.5122, -0.6275, -0.6275]),
tensor([-0.4002])),
(tensor([-0.6938, -0.5525, -0.4230, -0.4230, -0.4878, -0.5122, -0.5122, -0.5122,
-0.6275, -0.6275, -0.4002]),
tensor([0.1902])),
(tensor([-0.5525, -0.4230, -0.4230, -0.4878, -0.5122, -0.5122, -0.5122, -0.6275,
-0.6275, -0.4002, 0.1902]),
tensor([0.6156])),
(tensor([-0.4230, -0.4230, -0.4878, -0.5122, -0.5122, -0.5122, -0.6275, -0.6275,
-0.4002, 0.1902, 0.6156]),
tensor([0.3236])),
(tensor([-0.4230, -0.4878, -0.5122, -0.5122, -0.5122, -0.6275, -0.6275, -0.4002,
0.1902, 0.6156, 0.3236]),
tensor([0.3197])),
(tensor([-0.4878, -0.5122, -0.5122, -0.5122, -0.6275, -0.6275, -0.4002, 0.1902,
0.6156, 0.3236, 0.3197]),
tensor([0.3197])),
(tensor([-0.5122, -0.5122, -0.5122, -0.6275, -0.6275, -0.4002, 0.1902, 0.6156,
0.3236, 0.3197, 0.3197]),
tensor([0.6819])),
(tensor([-0.5122, -0.5122, -0.6275, -0.6275, -0.4002, 0.1902, 0.6156, 0.3236,
0.3197, 0.3197, 0.6819]),
tensor([0.6819])),
(tensor([-0.5122, -0.6275, -0.6275, -0.4002, 0.1902, 0.6156, 0.3236, 0.3197,
0.3197, 0.6819, 0.6819]),
tensor([0.6267])),
(tensor([-0.6275, -0.6275, -0.4002, 0.1902, 0.6156, 0.3236, 0.3197, 0.3197,
0.6819, 0.6819, 0.6267]),
tensor([0.6685])),
(tensor([-0.6275, -0.4002, 0.1902, 0.6156, 0.3236, 0.3197, 0.3197, 0.6819,
0.6819, 0.6267, 0.6685]),
tensor([0.6219])),
(tensor([-0.4002, 0.1902, 0.6156, 0.3236, 0.3197, 0.3197, 0.6819, 0.6819,
0.6267, 0.6685, 0.6219]),
tensor([0.6219])),
(tensor([0.1902, 0.6156, 0.3236, 0.3197, 0.3197, 0.6819, 0.6819, 0.6267, 0.6685,
0.6219, 0.6219]),
tensor([0.6219])),
(tensor([0.6156, 0.3236, 0.3197, 0.3197, 0.6819, 0.6819, 0.6267, 0.6685, 0.6219,
0.6219, 0.6219]),
tensor([1.])),
(tensor([0.3236, 0.3197, 0.3197, 0.6819, 0.6819, 0.6267, 0.6685, 0.6219, 0.6219,
0.6219, 1.0000]),
tensor([0.7064])),
(tensor([0.3197, 0.3197, 0.6819, 0.6819, 0.6267, 0.6685, 0.6219, 0.6219, 0.6219,
1.0000, 0.7064]),
tensor([0.7064])),
(tensor([0.3197, 0.6819, 0.6819, 0.6267, 0.6685, 0.6219, 0.6219, 0.6219, 1.0000,
0.7064, 0.7064]),
tensor([0.6093])),
(tensor([0.6819, 0.6819, 0.6267, 0.6685, 0.6219, 0.6219, 0.6219, 1.0000, 0.7064,
0.7064, 0.6093]),
tensor([0.5122])),
(tensor([0.6819, 0.6267, 0.6685, 0.6219, 0.6219, 0.6219, 1.0000, 0.7064, 0.7064,
0.6093, 0.5122]),
tensor([0.2313])),
(tensor([0.6267, 0.6685, 0.6219, 0.6219, 0.6219, 1.0000, 0.7064, 0.7064, 0.6093,
0.5122, 0.2313]),
tensor([0.2313])),
(tensor([0.6685, 0.6219, 0.6219, 0.6219, 1.0000, 0.7064, 0.7064, 0.6093, 0.5122,
0.2313, 0.2313]),
tensor([0.2313])),
(tensor([0.6219, 0.6219, 0.6219, 1.0000, 0.7064, 0.7064, 0.6093, 0.5122, 0.2313,
0.2313, 0.2313]),
tensor([0.0892])),
(tensor([0.6219, 0.6219, 1.0000, 0.7064, 0.7064, 0.6093, 0.5122, 0.2313, 0.2313,
0.2313, 0.0892]),
tensor([0.0892])),
(tensor([0.6219, 1.0000, 0.7064, 0.7064, 0.6093, 0.5122, 0.2313, 0.2313, 0.2313,
0.0892, 0.0892]),
tensor([-0.0426])),
(tensor([ 1.0000, 0.7064, 0.7064, 0.6093, 0.5122, 0.2313, 0.2313, 0.2313,
0.0892, 0.0892, -0.0426]),
tensor([0.2652])),
(tensor([ 0.7064, 0.7064, 0.6093, 0.5122, 0.2313, 0.2313, 0.2313, 0.0892,
0.0892, -0.0426, 0.2652]),
tensor([0.2652])),
(tensor([ 0.7064, 0.6093, 0.5122, 0.2313, 0.2313, 0.2313, 0.0892, 0.0892,
-0.0426, 0.2652, 0.2652]),
tensor([0.3402])),
(tensor([ 0.6093, 0.5122, 0.2313, 0.2313, 0.2313, 0.0892, 0.0892, -0.0426,
0.2652, 0.2652, 0.3402]),
tensor([0.2163])),
(tensor([ 0.5122, 0.2313, 0.2313, 0.2313, 0.0892, 0.0892, -0.0426, 0.2652,
0.2652, 0.3402, 0.2163]),
tensor([0.1681])),
(tensor([ 0.2313, 0.2313, 0.2313, 0.0892, 0.0892, -0.0426, 0.2652, 0.2652,
0.3402, 0.2163, 0.1681]),
tensor([0.1681])),
(tensor([ 0.2313, 0.2313, 0.0892, 0.0892, -0.0426, 0.2652, 0.2652, 0.3402,
0.2163, 0.1681, 0.1681]),
tensor([0.0734])),
(tensor([ 0.2313, 0.0892, 0.0892, -0.0426, 0.2652, 0.2652, 0.3402, 0.2163,
0.1681, 0.1681, 0.0734]),
tensor([0.0245])),
(tensor([ 0.0892, 0.0892, -0.0426, 0.2652, 0.2652, 0.3402, 0.2163, 0.1681,
0.1681, 0.0734, 0.0245]),
tensor([-0.0032])),
(tensor([ 0.0892, -0.0426, 0.2652, 0.2652, 0.3402, 0.2163, 0.1681, 0.1681,
0.0734, 0.0245, -0.0032]),
tensor([0.0868])),
(tensor([-0.0426, 0.2652, 0.2652, 0.3402, 0.2163, 0.1681, 0.1681, 0.0734,
0.0245, -0.0032, 0.0868]),
tensor([0.0868])),
(tensor([ 0.2652, 0.2652, 0.3402, 0.2163, 0.1681, 0.1681, 0.0734, 0.0245,
-0.0032, 0.0868, 0.0868]),
tensor([-0.0237])),
(tensor([ 0.2652, 0.3402, 0.2163, 0.1681, 0.1681, 0.0734, 0.0245, -0.0032,
0.0868, 0.0868, -0.0237]),
tensor([0.0781])),
(tensor([ 0.3402, 0.2163, 0.1681, 0.1681, 0.0734, 0.0245, -0.0032, 0.0868,
0.0868, -0.0237, 0.0781]),
tensor([0.0513])),
(tensor([ 0.2163, 0.1681, 0.1681, 0.0734, 0.0245, -0.0032, 0.0868, 0.0868,
-0.0237, 0.0781, 0.0513]),
tensor([0.0513])),
(tensor([ 0.1681, 0.1681, 0.0734, 0.0245, -0.0032, 0.0868, 0.0868, -0.0237,
0.0781, 0.0513, 0.0513]),
tensor([0.0355])),
(tensor([ 0.1681, 0.0734, 0.0245, -0.0032, 0.0868, 0.0868, -0.0237, 0.0781,
0.0513, 0.0513, 0.0355]),
tensor([0.1263])),
(tensor([ 0.0734, 0.0245, -0.0032, 0.0868, 0.0868, -0.0237, 0.0781, 0.0513,
0.0513, 0.0355, 0.1263]),
tensor([0.1263])),
(tensor([ 0.0245, -0.0032, 0.0868, 0.0868, -0.0237, 0.0781, 0.0513, 0.0513,
0.0355, 0.1263, 0.1263]),
tensor([0.1263])),
(tensor([-0.0032, 0.0868, 0.0868, -0.0237, 0.0781, 0.0513, 0.0513, 0.0355,
0.1263, 0.1263, 0.1263]),
tensor([0.1294])),
(tensor([ 0.0868, 0.0868, -0.0237, 0.0781, 0.0513, 0.0513, 0.0355, 0.1263,
0.1263, 0.1263, 0.1294]),
tensor([0.0371])),
(tensor([ 0.0868, -0.0237, 0.0781, 0.0513, 0.0513, 0.0355, 0.1263, 0.1263,
0.1263, 0.1294, 0.0371]),
tensor([0.1168])),
(tensor([-0.0237, 0.0781, 0.0513, 0.0513, 0.0355, 0.1263, 0.1263, 0.1263,
0.1294, 0.0371, 0.1168]),
tensor([0.0545])),
(tensor([0.0781, 0.0513, 0.0513, 0.0355, 0.1263, 0.1263, 0.1263, 0.1294, 0.0371,
0.1168, 0.0545]),
tensor([0.0545])),
(tensor([0.0513, 0.0513, 0.0355, 0.1263, 0.1263, 0.1263, 0.1294, 0.0371, 0.1168,
0.0545, 0.0545]),
tensor([0.0545])),
(tensor([0.0513, 0.0355, 0.1263, 0.1263, 0.1263, 0.1294, 0.0371, 0.1168, 0.0545,
0.0545, 0.0545]),
tensor([0.2391])),
(tensor([0.0355, 0.1263, 0.1263, 0.1263, 0.1294, 0.0371, 0.1168, 0.0545, 0.0545,
0.0545, 0.2391]),
tensor([0.2991])),
(tensor([0.1263, 0.1263, 0.1263, 0.1294, 0.0371, 0.1168, 0.0545, 0.0545, 0.0545,
0.2391, 0.2991]),
tensor([0.2447])),
(tensor([0.1263, 0.1263, 0.1294, 0.0371, 0.1168, 0.0545, 0.0545, 0.0545, 0.2391,
0.2991, 0.2447]),
tensor([0.2257])),
(tensor([0.1263, 0.1294, 0.0371, 0.1168, 0.0545, 0.0545, 0.0545, 0.2391, 0.2991,
0.2447, 0.2257]),
tensor([0.2897])),
(tensor([0.1294, 0.0371, 0.1168, 0.0545, 0.0545, 0.0545, 0.2391, 0.2991, 0.2447,
0.2257, 0.2897]),
tensor([0.3307])),
(tensor([0.0371, 0.1168, 0.0545, 0.0545, 0.0545, 0.2391, 0.2991, 0.2447, 0.2257,
0.2897, 0.3307]),
tensor([0.3307])),
(tensor([0.1168, 0.0545, 0.0545, 0.0545, 0.2391, 0.2991, 0.2447, 0.2257, 0.2897,
0.3307, 0.3307]),
tensor([0.1807])),
(tensor([0.0545, 0.0545, 0.0545, 0.2391, 0.2991, 0.2447, 0.2257, 0.2897, 0.3307,
0.3307, 0.1807]),
tensor([0.2202])),
(tensor([0.0545, 0.0545, 0.2391, 0.2991, 0.2447, 0.2257, 0.2897, 0.3307, 0.3307,
0.1807, 0.2202]),
tensor([0.2202])),
(tensor([0.0545, 0.2391, 0.2991, 0.2447, 0.2257, 0.2897, 0.3307, 0.3307, 0.1807,
0.2202, 0.2202]),
tensor([0.2644])),
(tensor([0.2391, 0.2991, 0.2447, 0.2257, 0.2897, 0.3307, 0.3307, 0.1807, 0.2202,
0.2202, 0.2644]),
tensor([0.2912])),
(tensor([0.2991, 0.2447, 0.2257, 0.2897, 0.3307, 0.3307, 0.1807, 0.2202, 0.2202,
0.2644, 0.2912]),
tensor([0.3717])),
(tensor([0.2447, 0.2257, 0.2897, 0.3307, 0.3307, 0.1807, 0.2202, 0.2202, 0.2644,
0.2912, 0.3717]),
tensor([0.4286])),
(tensor([0.2257, 0.2897, 0.3307, 0.3307, 0.1807, 0.2202, 0.2202, 0.2644, 0.2912,
0.3717, 0.4286]),
tensor([0.4286])),
(tensor([0.2897, 0.3307, 0.3307, 0.1807, 0.2202, 0.2202, 0.2644, 0.2912, 0.3717,
0.4286, 0.4286]),
tensor([0.6559])),
(tensor([0.3307, 0.3307, 0.1807, 0.2202, 0.2202, 0.2644, 0.2912, 0.3717, 0.4286,
0.4286, 0.6559]),
tensor([0.7593])),
(tensor([0.3307, 0.1807, 0.2202, 0.2202, 0.2644, 0.2912, 0.3717, 0.4286, 0.4286,
0.6559, 0.7593]),
tensor([0.9006])),
(tensor([0.1807, 0.2202, 0.2202, 0.2644, 0.2912, 0.3717, 0.4286, 0.4286, 0.6559,
0.7593, 0.9006]),
tensor([0.9006])),
(tensor([0.2202, 0.2202, 0.2644, 0.2912, 0.3717, 0.4286, 0.4286, 0.6559, 0.7593,
0.9006, 0.9006]),
tensor([0.9006])),
(tensor([0.2202, 0.2644, 0.2912, 0.3717, 0.4286, 0.4286, 0.6559, 0.7593, 0.9006,
0.9006, 0.9006]),
tensor([0.3165])),
(tensor([0.2644, 0.2912, 0.3717, 0.4286, 0.4286, 0.6559, 0.7593, 0.9006, 0.9006,
0.9006, 0.3165]),
tensor([0.3291])),
(tensor([0.2912, 0.3717, 0.4286, 0.4286, 0.6559, 0.7593, 0.9006, 0.9006, 0.9006,
0.3165, 0.3291]),
tensor([0.3291])),
(tensor([0.3717, 0.4286, 0.4286, 0.6559, 0.7593, 0.9006, 0.9006, 0.9006, 0.3165,
0.3291, 0.3291]),
tensor([0.3291])),
(tensor([0.4286, 0.4286, 0.6559, 0.7593, 0.9006, 0.9006, 0.9006, 0.3165, 0.3291,
0.3291, 0.3291]),
tensor([0.3891])),
(tensor([0.4286, 0.6559, 0.7593, 0.9006, 0.9006, 0.9006, 0.3165, 0.3291, 0.3291,
0.3291, 0.3891]),
tensor([0.2952])),
(tensor([0.6559, 0.7593, 0.9006, 0.9006, 0.9006, 0.3165, 0.3291, 0.3291, 0.3291,
0.3891, 0.2952]),
tensor([0.2249])),
(tensor([0.7593, 0.9006, 0.9006, 0.9006, 0.3165, 0.3291, 0.3291, 0.3291, 0.3891,
0.2952, 0.2249]),
tensor([0.2005])),
(tensor([0.9006, 0.9006, 0.9006, 0.3165, 0.3291, 0.3291, 0.3291, 0.3891, 0.2952,
0.2249, 0.2005]),
tensor([0.2005])),
(tensor([0.9006, 0.9006, 0.3165, 0.3291, 0.3291, 0.3291, 0.3891, 0.2952, 0.2249,
0.2005, 0.2005]),
tensor([0.2076])),
(tensor([0.9006, 0.3165, 0.3291, 0.3291, 0.3291, 0.3891, 0.2952, 0.2249, 0.2005,
0.2005, 0.2076]),
tensor([0.1279])),
(tensor([0.3165, 0.3291, 0.3291, 0.3291, 0.3891, 0.2952, 0.2249, 0.2005, 0.2005,
0.2076, 0.1279]),
tensor([0.1129])),
(tensor([0.3291, 0.3291, 0.3291, 0.3891, 0.2952, 0.2249, 0.2005, 0.2005, 0.2076,
0.1279, 0.1129]),
tensor([0.2028])),
(tensor([0.3291, 0.3291, 0.3891, 0.2952, 0.2249, 0.2005, 0.2005, 0.2076, 0.1279,
0.1129, 0.2028]),
tensor([0.0537])),
(tensor([0.3291, 0.3891, 0.2952, 0.2249, 0.2005, 0.2005, 0.2076, 0.1279, 0.1129,
0.2028, 0.0537]),
tensor([0.0537])),
(tensor([0.3891, 0.2952, 0.2249, 0.2005, 0.2005, 0.2076, 0.1279, 0.1129, 0.2028,
0.0537, 0.0537]),
tensor([0.0331])),
(tensor([0.2952, 0.2249, 0.2005, 0.2005, 0.2076, 0.1279, 0.1129, 0.2028, 0.0537,
0.0537, 0.0331]),
tensor([0.0552])),
(tensor([0.2249, 0.2005, 0.2005, 0.2076, 0.1279, 0.1129, 0.2028, 0.0537, 0.0537,
0.0331, 0.0552]),
tensor([0.1413])),
(tensor([0.2005, 0.2005, 0.2076, 0.1279, 0.1129, 0.2028, 0.0537, 0.0537, 0.0331,
0.0552, 0.1413]),
tensor([0.0655])),
(tensor([0.2005, 0.2076, 0.1279, 0.1129, 0.2028, 0.0537, 0.0537, 0.0331, 0.0552,
0.1413, 0.0655]),
tensor([0.0576])),
(tensor([0.2076, 0.1279, 0.1129, 0.2028, 0.0537, 0.0537, 0.0331, 0.0552, 0.1413,
0.0655, 0.0576]),
tensor([0.2470])),
(tensor([0.1279, 0.1129, 0.2028, 0.0537, 0.0537, 0.0331, 0.0552, 0.1413, 0.0655,
0.0576, 0.2470]),
tensor([0.1823])),
(tensor([0.1129, 0.2028, 0.0537, 0.0537, 0.0331, 0.0552, 0.1413, 0.0655, 0.0576,
0.2470, 0.1823]),
tensor([0.1721])),
(tensor([0.2028, 0.0537, 0.0537, 0.0331, 0.0552, 0.1413, 0.0655, 0.0576, 0.2470,
0.1823, 0.1721]),
tensor([0.1721])),
(tensor([0.0537, 0.0537, 0.0331, 0.0552, 0.1413, 0.0655, 0.0576, 0.2470, 0.1823,
0.1721, 0.1721]),
tensor([-0.0347])),
(tensor([ 0.0537, 0.0331, 0.0552, 0.1413, 0.0655, 0.0576, 0.2470, 0.1823,
0.1721, 0.1721, -0.0347]),
tensor([0.0442])),
(tensor([ 0.0331, 0.0552, 0.1413, 0.0655, 0.0576, 0.2470, 0.1823, 0.1721,
0.1721, -0.0347, 0.0442]),
tensor([0.0868])),
(tensor([ 0.0552, 0.1413, 0.0655, 0.0576, 0.2470, 0.1823, 0.1721, 0.1721,
-0.0347, 0.0442, 0.0868]),
tensor([0.0868])),
(tensor([ 0.1413, 0.0655, 0.0576, 0.2470, 0.1823, 0.1721, 0.1721, -0.0347,
0.0442, 0.0868, 0.0868]),
tensor([0.1444])),
(tensor([ 0.0655, 0.0576, 0.2470, 0.1823, 0.1721, 0.1721, -0.0347, 0.0442,
0.0868, 0.0868, 0.1444]),
tensor([-0.2415])),
(tensor([ 0.0576, 0.2470, 0.1823, 0.1721, 0.1721, -0.0347, 0.0442, 0.0868,
0.0868, 0.1444, -0.2415]),
tensor([-0.3678])),
(tensor([ 0.2470, 0.1823, 0.1721, 0.1721, -0.0347, 0.0442, 0.0868, 0.0868,
0.1444, -0.2415, -0.3678]),
tensor([-0.3615])),
(tensor([ 0.1823, 0.1721, 0.1721, -0.0347, 0.0442, 0.0868, 0.0868, 0.1444,
-0.2415, -0.3678, -0.3615]),
tensor([-0.3615])),
(tensor([ 0.1721, 0.1721, -0.0347, 0.0442, 0.0868, 0.0868, 0.1444, -0.2415,
-0.3678, -0.3615, -0.3615]),
tensor([-0.1350])),
(tensor([ 0.1721, -0.0347, 0.0442, 0.0868, 0.0868, 0.1444, -0.2415, -0.3678,
-0.3615, -0.3615, -0.1350]),
tensor([-0.1500])),
(tensor([-0.0347, 0.0442, 0.0868, 0.0868, 0.1444, -0.2415, -0.3678, -0.3615,
-0.3615, -0.1350, -0.1500]),
tensor([-0.1500]))]
epochs = 80
for i in range(epochs):
for seq, labels in train_inout_seq:
optimizer.zero_grad()
model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size),
torch.zeros(1, 1, model.hidden_layer_size))
y_pred = model(seq)
single_loss = loss_function(y_pred, labels)
single_loss.backward()
optimizer.step()
if i%10 == 1:
print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')
print(f'epoch: {i:3} loss: {single_loss.item():10.10f}')
epoch: 1 loss: 0.02080892 epoch: 11 loss: 0.00310560 epoch: 21 loss: 0.00071738 epoch: 31 loss: 0.00000512 epoch: 41 loss: 0.00000000 epoch: 51 loss: 0.00047642 epoch: 61 loss: 0.00004787 epoch: 71 loss: 0.01555970 epoch: 79 loss: 0.0173519235
test_inputs = train_data_normalized[-11:].tolist()
model.eval()
for i in range(11):
seq = torch.FloatTensor(test_inputs[-11:])
with torch.no_grad():
model.hidden = (torch.zeros(1, 1, model.hidden_layer_size),
torch.zeros(1, 1, model.hidden_layer_size))
test_inputs.append(model(seq).item())
test_inputs[11:]
[-0.17209258675575256, -0.16259273886680603, -0.12296204268932343, -0.04300084710121155, 0.04384655877947807, 0.125918447971344, 0.2013656347990036, 0.27468109130859375, 0.3663773238658905, 0.45008495450019836, 0.5124920010566711]

cnt= [i for i in range(0,110,10)]
price = sorted([i for i in range(1,11)], reverse=True)
df = pd.DataFrame(zip(cnt,price), columns=['cnt', 'price'])
df
| cnt | price | |
|---|---|---|
| 0 | 0 | 10 |
| 1 | 10 | 9 |
| 2 | 20 | 8 |
| 3 | 30 | 7 |
| 4 | 40 | 6 |
| 5 | 50 | 5 |
| 6 | 60 | 4 |
| 7 | 70 | 3 |
| 8 | 80 | 2 |
| 9 | 90 | 1 |
$E_{pd} = \frac{\Delta Q}{\Delta P}*\frac{P}{Q} = \frac{(P_1+P_2)\Delta Q}{(Q_1+Q_2)\Delta P}$
df['prev_price'] = df.price.shift()
df['prev_cnt'] = df.cnt.shift()
df
| cnt | price | prev_price | prev_cnt | |
|---|---|---|---|---|
| 0 | 0 | 10 | NaN | NaN |
| 1 | 10 | 9 | 10.0 | 0.0 |
| 2 | 20 | 8 | 9.0 | 10.0 |
| 3 | 30 | 7 | 8.0 | 20.0 |
| 4 | 40 | 6 | 7.0 | 30.0 |
| 5 | 50 | 5 | 6.0 | 40.0 |
| 6 | 60 | 4 | 5.0 | 50.0 |
| 7 | 70 | 3 | 4.0 | 60.0 |
| 8 | 80 | 2 | 3.0 | 70.0 |
| 9 | 90 | 1 | 2.0 | 80.0 |
df['elasticity_coef'] = None
df.loc[~df.prev_price.isnull(), 'elasticity_coef'] = np.abs(((df.prev_price+df.price)*(df.cnt-df.prev_cnt))
/((df.cnt+df.prev_cnt)*(df.price-df.prev_price)))
df
| cnt | price | prev_price | prev_cnt | elasticity_coef | |
|---|---|---|---|---|---|
| 0 | 0 | 10 | NaN | NaN | None |
| 1 | 10 | 9 | 10.0 | 0.0 | 19.0 |
| 2 | 20 | 8 | 9.0 | 10.0 | 5.666667 |
| 3 | 30 | 7 | 8.0 | 20.0 | 3.0 |
| 4 | 40 | 6 | 7.0 | 30.0 | 1.857143 |
| 5 | 50 | 5 | 6.0 | 40.0 | 1.222222 |
| 6 | 60 | 4 | 5.0 | 50.0 | 0.818182 |
| 7 | 70 | 3 | 4.0 | 60.0 | 0.538462 |
| 8 | 80 | 2 | 3.0 | 70.0 | 0.333333 |
| 9 | 90 | 1 | 2.0 | 80.0 | 0.176471 |
plt.figure(figsize=(12,8))
sns.lineplot(x =df['cnt'], y=df['price'])
<matplotlib.axes._subplots.AxesSubplot at 0x7fbcce0a7110>
1) Выбрать товары для отдельного ценообразования
2) Для данных товаров построить модели предсказания спроса в зависимости от цены
3) Согласно выбранной стратегии компании выбрать, что именно мы будем оптимизировать
4) Корректировка цен относительно ограничений и цен конкурентов
5) Получение обратной связи по изменение спроса в зависимости от цены и возврат к пункту 2