KPanalyst / app.py
JimMorrison's picture
Update app.py
fab7267
import streamlit as st
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
st.sidebar.title('Выберите анализируемый период')
choice = st.sidebar.selectbox('Какой период вы хотите выбрать ? ', ("Февраль 2022","Февраль 2023",'Резюме'))
st.sidebar.write('Вы выбрали: ', choice)
if choice == 'Февраль 2022':
dataset=pd.read_excel(r'Feb202222.xlsx')
dataset = dataset.drop_duplicates()
dataset['Разница'] = dataset['Запрашиваемая скидка, %'] - dataset['Согласованная скидка, %']
st.header("Аналитика по КП")
st.write(f'Общее количество КП за анализируемый период - {dataset.shape[0]}')
men_array = dataset['Менеджер О.П.'].unique()
men_requests = {}
for i in men_array:
men_requests.update({f"{i}": dataset.loc[dataset["Менеджер О.П."] == i].shape[0]})
men_requests = dict(sorted(men_requests.items(), key=lambda item: item[1]))
bar_list = list(men_requests.keys())
bar_vals = list(men_requests.values())
sns.set(rc={'figure.figsize': (19, 10)}, font_scale=0.65)
y = sns.barplot(x=bar_list, y=bar_vals)
y.bar_label(y.containers[0])
fig = y.get_figure()
fig.savefig(f'{choice}firstdraw.png')
st.image(f'{choice}firstdraw.png', caption='Количество КП отправленных менеджером Отдела продаж за месяц')
plt.clf()
dataset.loc[dataset['Обратная связь от клиента'] != "Клиент позицию взял"].shape[0]
pie_data = [dataset.loc[dataset['Обратная связь от клиента'] == "Клиент позицию взял"].shape[0],
dataset.loc[dataset['Обратная связь от клиента'] != "Клиент позицию взял"].shape[0]]
pie_lables = ['Клиент взял позицию', 'Клиент не взял позицию']
colors_pie = sns.color_palette('bright')[1:5]
plt.rcParams.update({'font.size': 22})
plt.pie(pie_data, labels=pie_lables, colors=colors_pie, autopct='%.0f%%', textprops={'fontsize': 22})
plt.savefig(f'{choice}seconddraw.png')
st.image(f'{choice}seconddraw.png', caption='Реакция клиентов на КП')
plt.clf()
data_discount = dataset.loc[
(dataset['Обратная связь от клиента'] == "Клиент позицию взял") & (dataset['Согласованная скидка, %'] != 0)]
data_discount = data_discount[['Менеджер О.П.', 'Согласованная скидка, %']].groupby(
['Менеджер О.П.']).mean().dropna()
data_discount = data_discount.sort_values(by='Согласованная скидка, %', ascending=False)
data_discount = data_discount.to_dict()['Согласованная скидка, %']
discount_list = list(data_discount.keys())
discount_vals = list(data_discount.values())
x = sns.barplot(x=discount_list, y=discount_vals)
x.bar_label(x.containers[0])
thirdfig = x.get_figure()
thirdfig.savefig(f'{choice}thirddraw.png')
st.image(f'{choice}thirddraw.png', caption='Какой процент скидки в среднем запрашивает Менеджер О.П.')
plt.clf()
categories = dataset[['ТГ', "Количество в запросе, шт"]].groupby(['ТГ']).sum().sort_values(
by='Количество в запросе, шт', ascending=False)
categories = categories.to_dict()['Количество в запросе, шт']
cats_list = list(categories.keys())
cats_vals = list(categories.values())
cols = ['red' if x > 400 else 'green' for x in cats_vals]
sns.set(rc={'figure.figsize': (19, 10)}, font_scale=0.80)
z = sns.barplot(x=cats_vals, y=cats_list, estimator=np.sum, palette=cols)
z.bar_label(z.containers[0])
fourfig = z.get_figure()
fourfig.savefig(f'{choice}fourdraw.png')
st.image(f'{choice}fourdraw.png',
caption='Суммарное количество позиций, поступивших по КП. Суммарно по товарным группам')
plt.clf()
men_array = dataset['ТГ'].unique()
men_requests = {}
for i in men_array:
men_requests.update({f"{i}": dataset.loc[dataset["ТГ"] == i].shape[0]})
men_requests = dict(sorted(men_requests.items(), key=lambda item: item[1]))
bar_list = list(men_requests.keys())
bar_vals = list(men_requests.values())
sns.set(rc={'figure.figsize': (19, 10)}, font_scale=0.65)
y = sns.barplot(x=bar_vals, y=bar_list, palette=['red'])
y.bar_label(y.containers[0])
fivefig = y.get_figure()
fivefig.savefig(f'{choice}fivedraw.png')
st.image(f'{choice}fivedraw.png', caption='Количество поступивших КП по товарным группам')
plt.clf()
ex = {}
for vb in dataset['Тип согласования'].unique():
ex.update({vb: dataset.loc[dataset['Тип согласования'] == f'{vb}'].shape[0]})
bar_list = list(ex.keys())
bar_vals = list(ex.values())
q = sns.barplot(y=bar_vals, x=bar_list)
sixfig = q.get_figure()
sixfig.savefig(f'{choice}sixdraw.png')
st.image(f'{choice}sixdraw.png', caption='Типы КП на анализируемый период')
plt.clf()
dif_data = [dataset.loc[dataset['Разница'] == 0].shape[0],
dataset.shape[0] - dataset.loc[dataset['Разница'] == 0].shape[0]]
dif_lables = ['Запрашиваемая и Согласованная скидки совпадают', 'Запрашиваемая и Согласованная скидки НЕ совпадают']
other_colors_pie = sns.color_palette('bright')[0:4]
plt.rcParams.update({'font.size': 22})
plt.pie(dif_data, labels=dif_lables, colors=other_colors_pie, autopct='%.0f%%', textprops={'fontsize': 22})
plt.savefig(f'{choice}sevendraw.png')
st.image(f'{choice}sevendraw.png', caption='Совпадение/ НЕ совпадение Согласованной и Запрашиваемой скидок')
elif choice == 'Февраль 2023':
dataset = pd.read_excel(r'Feb202322.xlsx')
dataset = dataset.drop_duplicates()
dataset['Разница'] = dataset['Запрашиваемая скидка, %'] - dataset['Согласованная скидка, %']
st.header("Аналитика по КП")
st.write(f'Общее количество КП за анализируемый период - {dataset.shape[0]}')
men_array = dataset['Менеджер О.П.'].unique()
men_requests = {}
for i in men_array:
men_requests.update({f"{i}": dataset.loc[dataset["Менеджер О.П."] == i].shape[0]})
men_requests = dict(sorted(men_requests.items(), key=lambda item: item[1]))
bar_list = list(men_requests.keys())
bar_vals = list(men_requests.values())
sns.set(rc={'figure.figsize': (19, 10)}, font_scale=0.65)
y = sns.barplot(x=bar_list, y=bar_vals)
y.bar_label(y.containers[0])
fig = y.get_figure()
fig.savefig(f'{choice}firstdraw.png')
st.image(f'{choice}firstdraw.png', caption='Количество КП отправленных менеджером Отдела продаж за месяц')
plt.clf()
dataset.loc[dataset['Обратная связь от клиента'] != "Клиент позицию взял"].shape[0]
pie_data = [dataset.loc[dataset['Обратная связь от клиента'] == "Клиент позицию взял"].shape[0],
dataset.loc[dataset['Обратная связь от клиента'] != "Клиент позицию взял"].shape[0]]
pie_lables = ['Клиент взял позицию', 'Клиент не взял позицию']
colors_pie = sns.color_palette('bright')[1:5]
plt.rcParams.update({'font.size': 22})
plt.pie(pie_data, labels=pie_lables, colors=colors_pie, autopct='%.0f%%', textprops={'fontsize': 22})
plt.savefig(f'{choice}seconddraw.png')
st.image(f'{choice}seconddraw.png', caption='Реакция клиентов на КП')
plt.clf()
data_discount = dataset.loc[
(dataset['Обратная связь от клиента'] == "Клиент позицию взял") & (dataset['Согласованная скидка, %'] != 0)]
data_discount = data_discount[['Менеджер О.П.', 'Согласованная скидка, %']].groupby(
['Менеджер О.П.']).mean().dropna()
data_discount = data_discount.sort_values(by='Согласованная скидка, %', ascending=False)
data_discount = data_discount.to_dict()['Согласованная скидка, %']
discount_list = list(data_discount.keys())
discount_vals = list(data_discount.values())
x = sns.barplot(x=discount_list, y=discount_vals)
x.bar_label(x.containers[0])
thirdfig = x.get_figure()
thirdfig.savefig(f'{choice}thirddraw.png')
st.image(f'{choice}thirddraw.png', caption='Какой процент скидки в среднем запрашивает Менеджер О.П.')
plt.clf()
categories = dataset[['ТГ', "Количество в запросе, шт"]].groupby(['ТГ']).sum().sort_values(
by='Количество в запросе, шт', ascending=False)
categories = categories.to_dict()['Количество в запросе, шт']
cats_list = list(categories.keys())
cats_vals = list(categories.values())
cols = ['red' if x > 400 else 'green' for x in cats_vals]
sns.set(rc={'figure.figsize': (19, 10)}, font_scale=0.80)
z = sns.barplot(x=cats_vals, y=cats_list, estimator=np.sum, palette=cols)
z.bar_label(z.containers[0])
fourfig = z.get_figure()
fourfig.savefig(f'{choice}fourdraw.png')
st.image(f'{choice}fourdraw.png',
caption='Суммарное количество позиций, поступивших по КП. Суммарно по товарным группам')
plt.clf()
men_array = dataset['ТГ'].unique()
men_requests = {}
for i in men_array:
men_requests.update({f"{i}": dataset.loc[dataset["ТГ"] == i].shape[0]})
men_requests = dict(sorted(men_requests.items(), key=lambda item: item[1]))
bar_list = list(men_requests.keys())
bar_vals = list(men_requests.values())
sns.set(rc={'figure.figsize': (19, 10)}, font_scale=0.65)
y = sns.barplot(x=bar_vals, y=bar_list, palette=['red'])
y.bar_label(y.containers[0])
fivefig = y.get_figure()
fivefig.savefig(f'{choice}fivedraw.png')
st.image(f'{choice}fivedraw.png', caption='Количество поступивших КП по товарным группам')
plt.clf()
ex = {}
for vb in dataset['Тип согласования'].unique():
ex.update({vb: dataset.loc[dataset['Тип согласования'] == f'{vb}'].shape[0]})
bar_list = list(ex.keys())
bar_vals = list(ex.values())
q = sns.barplot(y=bar_vals, x=bar_list)
sixfig = q.get_figure()
sixfig.savefig(f'{choice}sixdraw.png')
st.image(f'{choice}sixdraw.png', caption='Типы КП на анализируемый период')
plt.clf()
dif_data = [dataset.loc[dataset['Разница'] == 0].shape[0],
dataset.shape[0] - dataset.loc[dataset['Разница'] == 0].shape[0]]
dif_lables = ['Запрашиваемая и Согласованная скидки совпадают', 'Запрашиваемая и Согласованная скидки НЕ совпадают']
other_colors_pie = sns.color_palette('bright')[0:4]
plt.rcParams.update({'font.size': 22})
plt.pie(dif_data, labels=dif_lables, colors=other_colors_pie, autopct='%.0f%%', textprops={'fontsize': 22})
plt.savefig(f'{choice}sevendraw.png')
st.image(f'{choice}sevendraw.png', caption='Совпадение/ НЕ совпадение Согласованной и Запрашиваемой скидок')
elif choice == 'Резюме':
dataset1 = pd.read_excel(r'Feb202222.xlsx')
dataset1 = dataset1.drop_duplicates()
dataset1['Разница'] = dataset1['Запрашиваемая скидка, %'] - dataset1['Согласованная скидка, %']
dataset2 = pd.read_excel(r'Feb202322.xlsx')
dataset2 = dataset2.drop_duplicates()
dataset2['Разница'] = dataset2['Запрашиваемая скидка, %'] - dataset2['Согласованная скидка, %']
st.header("Резюме Аналитики по КП")
st.text(f'Сравнение количества КП')
quant_lables = ['2022', '2023']
quant_vals = [dataset1.shape[0], dataset2.shape[0]]
quant_data = pd.DataFrame.from_dict({'names': quant_lables, 'values': quant_vals})
st.bar_chart(quant_data, x='names', y='values', height=0)
st.text('По сравнению с февралем 2022 года, количество КП в 2023 году возрасло на 70 %')
quant2_lables = ['2022', '2023']
quant2_vals = [dataset1['Количество в запросе, шт'].sum(), dataset2['Количество в запросе, шт'].sum()]
quant2_data = pd.DataFrame.from_dict({'names': quant2_lables, 'values': quant2_vals})
st.bar_chart(quant2_data, x='names', y='values', height=0)
st.text(f'Сравнение суммарного количества товаров запрошенных по КП за февраль 2022 и февраль 2023')
def top_tg_zapros():
sp = plt.subplot(121)
tg1_array = dataset1['ТГ'].unique()
tg1_requests = {}
for i in tg1_array:
tg1_requests.update({f"{i}": dataset1.loc[dataset1["ТГ"] == i].shape[0]})
tg1_requests = dict(sorted(tg1_requests.items(), key=lambda item: item[1], reverse=True))
bar1_list = list(tg1_requests.keys())[0:5]
bar_vals = list(tg1_requests.values())[0:5]
y = sns.barplot(x=bar_vals, y=bar1_list, palette=['red'])
y.bar_label(y.containers[0])
quan_tg_fig1 = y.get_figure()
quan_tg_fig1.savefig(f'{choice}quan_tg_fig1draw.png')
plt.title('2022', fontsize=15)
sp = plt.subplot(122)
tg2_array = dataset2['ТГ'].unique()
tg2_requests = {}
for i in tg2_array:
tg2_requests.update({f"{i}": dataset2.loc[dataset2["ТГ"] == i].shape[0]})
tg2_requests = dict(sorted(tg2_requests.items(), key=lambda item: item[1], reverse=True))
bar2_list = list(tg2_requests.keys())[0:5]
bar_vals = list(tg2_requests.values())[0:5]
y = sns.barplot(x=bar_vals, y=bar2_list, palette=['blue'])
y.bar_label(y.containers[0])
quan_tg_fig2 = y.get_figure()
quan_tg_fig2.savefig(f'{choice}quan_tg_fig2draw.png')
plt.title('2023', fontsize=15)
plt.savefig('Something2.png')
st.image('Something2.png', caption='ТОП-5 товарных групп по количеству КП')
return bar1_list, bar2_list
def pie_data_clientreact():
plt.clf()
sp = plt.subplot(121)
dataset1.loc[dataset1['Обратная связь от клиента'] != "Клиент позицию взял"].shape[0]
pie1_data = [dataset1.loc[dataset1['Обратная связь от клиента'] == "Клиент позицию взял"].shape[0],
dataset1.loc[dataset1['Обратная связь от клиента'] != "Клиент позицию взял"].shape[0]]
pie1_lables = ['Клиент взял позицию', 'Клиент не взял позицию']
colors_pie = sns.color_palette('bright')[1:5]
plt.rcParams.update({'font.size': 15})
plt.pie(pie1_data, labels=pie1_lables, colors=colors_pie, autopct='%.0f%%', textprops={'fontsize': 15})
plt.title('2022', fontsize=15)
sp = plt.subplot(122)
dataset2.loc[dataset2['Обратная связь от клиента'] != "Клиент позицию взял"].shape[0]
pie2_data = [dataset2.loc[dataset2['Обратная связь от клиента'] == "Клиент позицию взял"].shape[0],
dataset2.loc[dataset2['Обратная связь от клиента'] != "Клиент позицию взял"].shape[0]]
pie2_lables = ['Клиент взял позицию', 'Клиент не взял позицию']
colors_pie = sns.color_palette('bright')[1:5]
plt.rcParams.update({'font.size': 15})
plt.pie(pie2_data, labels=pie2_lables, colors=colors_pie, autopct='%.0f%%', textprops={'fontsize': 15})
plt.title('2023', fontsize=15)
plt.savefig('SOMETHIG.png')
st.image('SOMETHIG.png', caption='Реакция клиентов на КП')
def quantTG():
sp = plt.subplot(121)
new_cat1 = {}
categories1 = dataset1[['ТГ', "Количество в запросе, шт"]].groupby(['ТГ']).sum().sort_values(
by='Количество в запросе, шт', ascending=False)
categories1 = categories1.to_dict()['Количество в запросе, шт']
for key, value in categories1.items():
if key in f1:
new_cat1[key] = value
cats_list = list(new_cat1.keys())
cats_vals = list(new_cat1.values())
cols = ['red']
sns.set(rc={'figure.figsize': (19, 10)}, font_scale=0.80)
z1 = sns.barplot(x=cats_vals, y=cats_list, estimator=np.sum, palette=cols)
z1.bar_label(z1.containers[0])
plt.title('2022', fontsize=15)
sp = plt.subplot(122)
new_cat2 = {}
categories2 = dataset2[['ТГ', "Количество в запросе, шт"]].groupby(['ТГ']).sum().sort_values(
by='Количество в запросе, шт', ascending=False)
categories2 = categories2.to_dict()['Количество в запросе, шт']
for key, value in categories2.items():
if key in k2:
new_cat2[key] = value
cats_list = list(new_cat2.keys())
cats_vals = list(new_cat2.values())
cols = ['blue']
sns.set(rc={'figure.figsize': (19, 10)}, font_scale=0.80)
z = sns.barplot(x=cats_vals, y=cats_list, estimator=np.sum, palette=cols)
z.bar_label(z.containers[0])
plt.title('2022', fontsize=15)
plt.savefig('KPquanTG.png')
st.image('KPquanTG.png', caption='Количество позиций по ТОП-5 ТГ')
def TGtype():
sp = plt.subplot(121)
ex1 = {}
for vb in dataset1['Тип согласования'].unique():
ex1.update({vb: dataset1.loc[dataset1['Тип согласования'] == f'{vb}'].shape[0]})
bar1_list = list(ex1.keys())
bar1_vals = list(ex1.values())
q = sns.barplot(y=bar1_vals, x=bar1_list)
q.bar_label(q.containers[0])
plt.title('2022', fontsize=15)
sp = plt.subplot(122)
ex2 = {}
for vb in dataset2['Тип согласования'].unique():
ex2.update({vb: dataset2.loc[dataset2['Тип согласования'] == f'{vb}'].shape[0]})
bar2_list = list(ex2.keys())
bar2_vals = list(ex2.values())
q2 = sns.barplot(y=bar2_vals, x=bar2_list)
q2.bar_label(q2.containers[0])
plt.title('2023', fontsize=15)
plt.savefig('SoglType.png')
st.image('SoglType.png')
def pricesovp():
sp = plt.subplot(121)
dif1_data = [dataset1.loc[dataset1['Разница'] == 0].shape[0],
dataset1.shape[0] - dataset1.loc[dataset1['Разница'] == 0].shape[0]]
dif1_lables = ['Совпадают', 'НЕ совпадают']
other_colors_pie = sns.color_palette('bright')[0:4]
plt.rcParams.update({'font.size': 13})
plt.pie(dif1_data, labels=dif1_lables, colors=other_colors_pie, autopct='%.0f%%', textprops={'fontsize': 13})
plt.title('2022', fontsize=20)
sp = plt.subplot(122)
dif2_data = [dataset2.loc[dataset2['Разница'] == 0].shape[0],
dataset2.shape[0] - dataset2.loc[dataset2['Разница'] == 0].shape[0]]
dif2_lables = ['Совпадают', 'НЕ совпадают']
other_colors_pie = sns.color_palette('bright')[0:4]
plt.rcParams.update({'font.size': 20})
plt.pie(dif2_data, labels=dif2_lables, colors=other_colors_pie, autopct='%.0f%%', textprops={'fontsize': 13})
plt.title('2023', fontsize=20)
plt.savefig('zaprsogl.png')
st.image('zaprsogl.png')
def fivequantpi():
sp = plt.subplot(121)
dif1_data = [dataset1.loc[dataset1['Количество в запросе, шт'] <= 5 ].shape[0],
dataset1.shape[0] - dataset1.loc[dataset1['Разница'] > 5].shape[0]]
dif1_lables = ['Меньше 5 штук', 'Больше 5 штук']
other_colors_pie = sns.color_palette('bright')[0:4]
plt.rcParams.update({'font.size': 13})
plt.pie(dif1_data, labels=dif1_lables, colors=other_colors_pie, autopct='%.0f%%', textprops={'fontsize': 13})
plt.title('2022', fontsize=20)
sp = plt.subplot(122)
dif2_data = [dataset2.loc[dataset2['Количество в запросе, шт'] <= 5 ].shape[0],
dataset2.shape[0] - dataset2.loc[dataset2['Разница'] > 5].shape[0]]
dif2_lables = ['Меньше 5 штук', 'Больше 5 штук']
other_colors_pie = sns.color_palette('bright')[0:4]
plt.rcParams.update({'font.size': 20})
plt.pie(dif2_data, labels=dif2_lables, colors=other_colors_pie, autopct='%.0f%%', textprops={'fontsize': 13})
plt.title('2023', fontsize=20)
plt.savefig('fiveqiantpi.png')
st.image('fiveqiantpi.png')
f1, k2 = top_tg_zapros()
st.write(
'На графике мы можем видеть изменения в ТГ, по которым приходят КП. Можно заметить, что по состоянию на 2023 год в ТОП-5 групп выбились Накладки, Накладки Simpeco и Оптика. Стоит обратить внимание на то, что Рессоры и Барабаны Simpeco остались в ТОП-5, также как и в 2022.')
plt.clf()
quantTG()
st.write(
'На основе это графика, не трудно сделать вывод, что с ростом количества КП, растет и количество позиций, на которые запрашивается скидка. Таким образом мы можем увидеть прирост по двум совпадающим ТГ - Рессоры и Барабаны Simpeco, если конкретнее то количество по Рессорам возросло на 34%, а по барабанам Simpeco на 239%')
plt.clf()
TGtype()
st.write('Количество КП по типу "На Объем" по сравнению с февралем прошлого года возросло на 517%')
plt.clf()
fivequantpi()
st.write('Можем заметить увеличение запросов, в которых количество товаров меньше 5 штук')
plt.clf()
pricesovp()
st.write(
'Можем заметить что процент скидок в которых совпадает Цена Запрашиваемая и Цена Согласованная, увеличился. Это свидетельствует о том, что КП, которые поступают в ОЦДР, укладываются в текущую политику именно поэтому необходимо оценить поведение клиента.')
plt.clf()
pie_data_clientreact()
st.write(
'Из этого графика можем заметить, что в относительных показателях процент клиентов, которые берут позиции с учетом скидок по КП увеличился на 1%. Этот показатель является незначительным, с учетом роста количества КП, а также роста запросов по типу скидки "На объем"')
st.header('Благодарим за внимание !')