| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| import seaborn as sns | |
| import matplotlib.pyplot as plt | |
| dataset = dataset=pd.read_excel(r'Скидка ДП 2022 _23.xlsx') | |
| dataset= dataset.loc[dataset['Тип скидки']!="Менеджер ОЦДС"] | |
| dataset.dropna() | |
| dataset['% скидки']= abs(dataset['% скидки'] *100) | |
| dataset['РТУ'] = pd.to_datetime(dataset['РТУ']) | |
| dataset['СГЦО'] = abs(1-dataset['Сумма базовая']/dataset['Сумма озвученная'])*100 | |
| dataset['Общая скидка'] = abs(1-dataset["Сумма базовая"]/dataset['Сумма итого'])*100 | |
| st.header('Аналитика АРМ-скидок') | |
| st.sidebar.title('Выберите анализируемый период') | |
| choice = st.sidebar.selectbox('Какой период вы хотите выбрать ? ',('Январь 22',"Февраль 22","Март 22","Апрель 22","Май 22","Июнь 22","Июль 22","Август 22", "Сентябрь 22", "Октябрь 22","Ноябрь 22","Декабрь 22", "Январь 23","Февраль 23")) | |
| st.sidebar.write('Вы выбрали: ', choice) | |
| jan22 = dataset.loc[dataset['РТУ']< '2022-02-01'] | |
| feb22 = dataset.loc[(dataset['РТУ']>= '2022-02-01')&(dataset['РТУ']< '2022-03-01')] | |
| march22 = dataset.loc[(dataset['РТУ']>= '2022-03-01')&(dataset['РТУ']< '2022-04-01')] | |
| apr22 = dataset.loc[(dataset['РТУ']>= '2022-04-01')&(dataset['РТУ']< '2022-05-01')] | |
| may22 = dataset.loc[(dataset['РТУ']>= '2022-05-01')&(dataset['РТУ']< '2022-06-01')] | |
| jun22 =dataset.loc[(dataset['РТУ']>= '2022-06-01')&(dataset['РТУ']< '2022-07-01')] | |
| jul22 = dataset.loc[(dataset['РТУ']>= '2022-07-01')&(dataset['РТУ']< '2022-08-01')] | |
| aug22 = dataset.loc[(dataset['РТУ']>= '2022-08-01')&(dataset['РТУ']< '2022-09-01')] | |
| sep22 = dataset.loc[(dataset['РТУ']>= '2022-09-01')&(dataset['РТУ']< '2022-10-01')] | |
| oct22 = dataset.loc[(dataset['РТУ']>= '2022-10-01')&(dataset['РТУ']< '2022-11-01')] | |
| nov22 = dataset.loc[(dataset['РТУ']>= '2022-11-01')&(dataset['РТУ']< '2022-12-01')] | |
| dec22 =dataset.loc[(dataset['РТУ']>= '2022-12-01')&(dataset['РТУ']< '2023-01-01')] | |
| jan23 = dataset.loc[(dataset['РТУ']>= '2023-01-01')&(dataset['РТУ']< '2023-02-01')] | |
| feb23 =dataset.loc[((dataset['РТУ']>= '2023-02-01'))&(dataset['РТУ']< '2023-03-01')] | |
| year_data = {} | |
| month_list = ['Январь 22',"Февраль 22","Март 22","Апрель 22","Май 22","Июнь 22","Июль 22","Август 22", "Сентябрь 22", "Октябрь 22","Ноябрь 22","Декабрь 22", "Январь 23","Февраль 23"] | |
| month_var_list = [jan22,feb22,march22,apr22,may22,jun22,jul22,aug22,sep22,oct22,nov22,dec22,jan23,feb23] | |
| for i in range(len(month_list)): | |
| year_data.update({month_list[i]:(month_var_list[i].shape[0],month_var_list[i]['Общая скидка'].median())}) | |
| correct_dict = {} | |
| pers,qnts,meds = [],[],[] | |
| for k,v in year_data.items(): | |
| pers.append(k) | |
| qnts.append(v[0]) | |
| meds.append(v[1]*10) | |
| correct_dict.update({'Период':pers,'Количество':qnts,'Медиана':meds}) | |
| df = pd.DataFrame(correct_dict) | |
| plt.figure(1) | |
| df[['Период', 'Количество', 'Медиана']].plot(x='Период', kind='bar') | |
| plt.hlines(130,0,14,colors='red') | |
| plt.savefig('QuantMed.png') | |
| st.image('QuantMed.png', caption='Сопоставление количества единиц товара в запросе и размера скидки') | |
| st.write('Красной линией обозначен максимально допустимый размер скидки 13% +- 2%. Примечание: Количество единиц - шт. Размер скидки - %') | |
| plt.clf() | |
| another_year_dict={} | |
| for i in range(len(month_list)): | |
| another_year_dict.update({month_list[i]: (month_var_list[i].loc[month_var_list[i]['Минимальный объем'] > month_var_list[i]['Количество']].shape[0], month_var_list[i].loc[month_var_list[i]['Минимальный объем'] < month_var_list[i]['Количество']].shape[0])}) | |
| ancorrect_dict = {} | |
| pers,qntsMin,qntsMax = [],[],[] | |
| for k,v in another_year_dict.items(): | |
| pers.append(k) | |
| qntsMin.append(v[0]) | |
| qntsMax.append(v[1]) | |
| ancorrect_dict.update({'Период':pers,'Количество меньше мин. объема':qnts,'Количество больше мин. объема':meds}) | |
| andf = pd.DataFrame(ancorrect_dict) | |
| andf[['Период', 'Количество меньше мин. объема', 'Количество больше мин. объема']].plot(x='Период', kind='bar') | |
| plt.savefig('MinMaxVal.png') | |
| st.image('MinMaxVal.png',caption='Соблюдение / Не соблюдение минимального объема для начисления скидки') | |
| st.write ('Условие минимального объема не соблюдается при начислении скидок. Примечание: Синий столбец - количество скидок, в которых не соблюдено условие минимального объема, оранжевый столбец - количество скидок в которых соблюдено условие минимального объема.') | |
| plt.clf() | |
| if choice == 'Январь 22': | |
| jan22 = dataset.loc[dataset['РТУ'] < '2022-02-01'] | |
| x = jan22 | |
| elif choice == "Февраль 22": | |
| feb22 = dataset.loc[(dataset['РТУ']>= '2022-02-01')&(dataset['РТУ']< '2022-03-01')] | |
| x = feb22 | |
| elif choice == "Март 22": | |
| march22 = dataset.loc[(dataset['РТУ']>= '2022-03-01')&(dataset['РТУ']< '2022-04-01')] | |
| x = march22 | |
| elif choice == "Апрель 22": | |
| apr22 = dataset.loc[(dataset['РТУ']>= '2022-04-01')&(dataset['РТУ']< '2022-05-01')] | |
| x = apr22 | |
| elif choice == "Май 22": | |
| may22 = dataset.loc[(dataset['РТУ']>= '2022-05-01')&(dataset['РТУ']< '2022-06-01')] | |
| x = may22 | |
| elif choice == "Июнь 22": | |
| jun22 =dataset.loc[(dataset['РТУ']>= '2022-06-01')&(dataset['РТУ']< '2022-07-01')] | |
| x = jun22 | |
| elif choice == "Июль 22": | |
| jul22 = dataset.loc[(dataset['РТУ']>= '2022-07-01')&(dataset['РТУ']< '2022-08-01')] | |
| x = jul22 | |
| elif choice == "Август 22": | |
| aug22 = dataset.loc[(dataset['РТУ']>= '2022-08-01')&(dataset['РТУ']< '2022-09-01')] | |
| x = aug22 | |
| elif choice == "Сентябрь 22": | |
| sep22 = dataset.loc[(dataset['РТУ']>= '2022-09-01')&(dataset['РТУ']< '2022-10-01')] | |
| x = sep22 | |
| elif choice == "Октябрь 22": | |
| oct22 = dataset.loc[(dataset['РТУ']>= '2022-10-01')&(dataset['РТУ']< '2022-11-01')] | |
| x = oct22 | |
| elif choice == "Ноябрь 22": | |
| nov22 = dataset.loc[(dataset['РТУ']>= '2022-11-01')&(dataset['РТУ']< '2022-12-01')] | |
| x = nov22 | |
| elif choice == "Декабрь 22": | |
| dec22 =dataset.loc[(dataset['РТУ']>= '2022-12-01')&(dataset['РТУ']< '2023-01-01')] | |
| x = dec22 | |
| elif choice == "Январь 23": | |
| jan23 = dataset.loc[(dataset['РТУ']>= '2023-01-01')&(dataset['РТУ']< '2023-02-01')] | |
| x = jan23 | |
| elif choice == "Февраль 23": | |
| feb23 = dataset.loc[((dataset['РТУ']>= '2023-02-01'))&(dataset['РТУ']< '2023-03-01')] | |
| x = feb23 | |
| x['СГЦО'] = abs(1-x['Сумма базовая']/x['Сумма озвученная'])*100 | |
| x['Общая скидка'] = abs(1-x["Сумма базовая"]/x['Сумма итого'])*100 | |
| zeroproc = x.loc[(x["СГЦО"]<4)] | |
| fiveproc = x.loc[(x["СГЦО"]>4)&(x["СГЦО"]<8)] | |
| tenproc = x.loc[(x['СГЦО']>=10)] | |
| SGCObar_list = ['Клиенты с СГЦО 0% ','Клиенты с СГЦО 5% ','Клиенты с СГЦО 10%'] | |
| SGCObar_vals = [zeroproc.shape[0],fiveproc.shape[0],tenproc.shape[0]] | |
| sns.set(rc={'figure.figsize':(15,10)},font_scale=1) | |
| pt = sns.barplot(y=SGCObar_vals,x = SGCObar_list) | |
| pt.bar_label(pt.containers[0]) | |
| fig = pt.get_figure() | |
| fig.savefig(f'{choice}firstdraw.png') | |
| st.image(f'{choice}firstdraw.png',caption='Разделение кол-ва скидок по группам СГЦО') | |
| choice2 = st.selectbox("Выберите группу клиентов", ("Клиенты с СГЦО 0%",'Клиенты с СГЦО 5% ','Клиенты с СГЦО 10%')) | |
| if choice2 == "Клиенты с СГЦО 0%": | |
| x1 = zeroproc | |
| elif choice2 == 'Клиенты с СГЦО 5% ': | |
| x1 = fiveproc | |
| elif choice2 =='Клиенты с СГЦО 10%': | |
| x1 = tenproc | |
| plt.clf() | |
| ex = {} | |
| for vb in x1['Тип скидки'].unique(): | |
| ex.update({vb:x1.loc[x1['Тип скидки']==f'{vb}'].shape[0]}) | |
| bar_list = list(ex.keys()) | |
| bar_vals = list(ex.values()) | |
| sns.set(rc={'figure.figsize':(15,10)},font_scale=1) | |
| pt = sns.barplot(y=bar_vals,x=bar_list,palette=['Green']) | |
| pt.bar_label(pt.containers[0]) | |
| fig = pt.get_figure() | |
| fig.savefig(f'{choice}{choice2}firstdraw.png') | |
| st.image(f'{choice}{choice2}firstdraw.png',caption='Разделение по Типу скидки ') | |
| plt.clf() | |
| pie_data = [x1.loc[x1['Минимальный объем'] > x1['Количество']].shape[0],x1.loc[x1['Минимальный объем'] < x1['Количество']].shape[0]] | |
| pie_lables = ['Количество меньше мин. объема','Количество больше мин. объема'] | |
| sns.set(rc={'figure.figsize':(15,10)},font_scale=1) | |
| colors_pie= sns.color_palette('bright')[1:5] | |
| plt.pie(pie_data,labels=pie_lables,colors=colors_pie,autopct='%.0f%%') | |
| plt.savefig(f'{choice}{choice2}piefirsttdraw.png') | |
| st.image(f'{choice}{choice2}piefirsttdraw.png', caption='Соотношение позиций в соотвествии с минимальным объемом') | |
| plt.clf() | |
| tg_array = x1['Номенклатура.Вид номенклатуры'].unique() | |
| tg_requests = {} | |
| for i in tg_array: | |
| tg_requests.update({f"{i}":x1.loc[x1['Номенклатура.Вид номенклатуры']==i].shape[0]}) | |
| tg_requests=dict(sorted(tg_requests.items(), key=lambda item: item[1])) | |
| bar_list = list(tg_requests.keys()) | |
| bar_vals = list(tg_requests.values()) | |
| sns.set(rc={'figure.figsize':(15,10)},font_scale=0.65) | |
| y = sns.barplot(y=bar_list,x=bar_vals) | |
| y.bar_label(y.containers[0]) | |
| fig = y.get_figure() | |
| fig.savefig(f'{choice}{choice2}secdraw.png') | |
| st.image(f'{choice}{choice2}secdraw.png',caption='Количество скидок по товарным группам') | |
| plt.clf() | |
| tg_array = x1['Номенклатура.Вид номенклатуры'].unique() | |
| tg_requests = {} | |
| for i in tg_array: | |
| tg_requests.update({f'{i}':x1[x1['Номенклатура.Вид номенклатуры']==i]['Общая скидка'].median()}) | |
| bar_list = list(tg_requests.keys()) | |
| bar_vals = list(tg_requests.values()) | |
| sns.set(rc={'figure.figsize':(19,10)},font_scale=0.65) | |
| y = sns.barplot(x=bar_vals,y=bar_list,palette=['blue']) | |
| y.bar_label(y.containers[0]) | |
| fig = y.get_figure() | |
| fig.savefig(f'{choice}{choice2}thirddraw.png') | |
| st.image(f'{choice}{choice2}thirddraw.png',caption='Медиана процента общей скидки по ТГ ' | |
| '(Под общей скидкой понимается СГЦО + % скидки ДП)') | |
| st.write('Для клиентов СГЦО 0% - допустимым является значение медианы в 5%. Для клиентов с СГЦО 5% - допустимое значение медианы 10% +- 1%. Для клиентов с СГЦО 10% - допустимое значение медианы 13% +- 2%') | |