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%')