KPanalyst / app.py
JimMorrison's picture
Update app.py
fab7267
Raw History Blame Contribute Delete
24.9 kB
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('Благодарим за внимание !')