MotoPanda's picture
Update app.py
9860f2f verified
import streamlit as st
import pandas as pd
import numpy as np
import json
import random
import matplotlib.pyplot as plt
st.title('Каталог профессий IT и Продажи')
#"""Внедрение модели"""
from predict import CatBoostPredictor
# import sys
predictor = CatBoostPredictor("catboostregressor_IT_and_sales.json",
"heuristic_regressor.json")
# """Внедрение модели"""
st.sidebar.title('Выбор параметров для подбора вакансий')
with open('catalog.json', 'r') as json_file:
data_main = json.load(json_file)
df3 = pd.DataFrame(data_main)
df1 = df3[['Сфера', 'Компания', 'Должность', 'Зарплата (руб.)', 'Необходимые навыки']]
df2 = df3[['Должность', 'Необходимые навыки', 'Подходящие курсы Нетологии', 'Ссылки']]
#
# with open('main_table.json', 'r') as json_file:
# data_main = json.load(json_file)
# df1 = pd.DataFrame(data_main)
#
# with open('dop_table.json', 'r') as json_file:
# data_dop = json.load(json_file)
# df2= pd.DataFrame(data_dop)
# df1['Необходимые навыки'] = [i.lower().replace('.', '').replace('-', '') for i in df1['Необходимые навыки']]
# df2['Необходимые навыки'] = [i.lower().replace('.', '').replace('-', '') for i in df2['Необходимые навыки']]
dohod = 0
i = 0
with st.sidebar:
sphere = st.selectbox(
"Выбери сферу:", options = list(df1['Сфера'].unique()), key=1)
st.write("Выбрано:", sphere)
job = st.selectbox(
"Выбери профессию:", options=list(df1['Должность'].unique()), key=2)
st.write("Выбрано:", job)
# st.write(df.columns)
age = st.number_input(
"Введите возраст",
min_value=1, # Минимальное значение
step=1, # Шаг единицы
format='%d', # Формат для целых чисел
value=20,
# ("IT", "Продажи")
)
dohod = st.number_input(
"Введите уровень дохода",
min_value=1, # Минимальное значение
step=1, # Шаг единицы
format='%d', # Формат для целых чисел
# max_value=(df1['ЗП в вакансии'].max() - 50000)
# ("IT", "Продажи")
value=10000,
)
st.write("Выбрано:", dohod)
st.write("Введено:", age)
# df2 = df[df['ЗП в вакансии'] >= dohod]
sphere_change = st.selectbox(
"Готов ли менять сферу", options = ["Да", "Нет"], key=f"{i+1}m",
index=None,
)
st.write("Выбрано:", sphere_change)
gotov_uchitsia = st.selectbox(
"Готов ли обучаться",
options = ["Да", "Нет"], key=f"{i+1}ml",
index=None,
)
st.write("Выбрано:", gotov_uchitsia)
st.header('Выберите навыки, которые у Вас есть')
list_skills = []
for i in sorted(set(df1['Необходимые навыки'])):
# if i != '-':
skill = st.checkbox(i, key=f"{i}")
if skill:
list_skills.append(i)
# python = st.checkbox("Python", key=f"{i+1}mlr")
# sql = st.checkbox("SQL", key=f"{i+1}mlrq")
# html = st.checkbox("HTML", key=f"{i+1}mlrw")
# java = st.checkbox("Java", key=f"{i+1}mlre")
# figma = st.checkbox("Figma", key=f"{i+1}mlrr")
# power_bi = st.checkbox("Power BI", key=f"{i+1}mlrt")
# prodaji = st.checkbox("Продажи", key=f"{i+1}mlry")
# analys_prodaj = st.checkbox("Анализ продаж", key=f"{i+1}mlru")
# work_with_clients = st.checkbox("Работа с клиентами", key=f"{i+1}mlri")
# riteil = st.checkbox("Ритейл", key=f"{i+1}mlrl")
# i+=1
# but = st.button('Данные введены в полном объеме', key=f"{i+1}mlurl")
# list_skills=[]
# if but:
# if python:
# list_skills.append('Python')
# if sql:
# list_skills.append('SQL')
# if html:
# list_skills.append('HTML')
# if java:
# list_skills.append('Java')
# if figma:
# list_skills.append('Figma')
# if power_bi:
# list_skills.append('Power BI')
# if prodaji:
# list_skills.append('Продажи')
# if work_with_clients:
# list_skills.append('Работа с клиентами')
# if riteil:
# list_skills.append('ритейл')
def table(sphere: str, list_with_skills: list, dohod, sphere_change, gotov_uchitsia):
new_df = pd.merge(df1, df2, on=['Необходимые навыки', 'Должность'], how='outer')
new_df2 = new_df
new_df2['Есть_в_списке'] = new_df2['Необходимые навыки'].apply(lambda x: 1 if x in list_with_skills else 0)
result = new_df2.groupby(['Должность', 'Сфера', 'Зарплата (руб.)']).agg(
Skill=('Необходимые навыки', set),
Cours=('Подходящие курсы Нетологии', set),
Links=('Ссылки', set),
On_list=('Есть_в_списке', set)
).reset_index()
def calculate_difference(row):
cell_set = set(row['Skill']) # Преобразуем список в набор
test_set = set(list_with_skills) # Преобразуем list_test в набор
return (cell_set - test_set)
result['Недостающие навыки'] = result.apply(calculate_difference, axis=1)
result['Требуемые навыки для позиции'] = result['Skill']
result['Наименования доступных курсов'] = result['Cours']
result['Ссылки на курс'] = result['Links']
result2 = result[['Сфера', 'Должность', 'Зарплата (руб.)', 'Требуемые навыки для позиции', 'Недостающие навыки',
'Наименования доступных курсов',
'Ссылки на курс']]
return result2
df_fin = table(sphere, list_skills, dohod, sphere_change, gotov_uchitsia)
# """Внедрение модели"""
if sphere == 'ИТ':
job_sphere = 'IT'
change_sphere = 'Sales'
else:
job_sphere = 'Sales'
change_sphere = 'IT'
st.header('Рост Вашего дохода')
labels = [age, age+3]
dohod_2 = predictor.predict(dohod, float(age), str(job_sphere))
dohod_change = predictor.predict(dohod, float(age), str(change_sphere))
# 200_000.0, 25.0, "IT"
values = [dohod, dohod_2]
values_change = [dohod, dohod_change]
st.write(f"Ваш доход через 3 года составит: {round(dohod_2)} руб.")
# labels = [age, age+1, age+2, age+3, age+4, age+5, age+6, age+7, age+8, age+9]
# values = [dohod, dohod*1.05, dohod*1.1, dohod*1.11, dohod*1.12, dohod*1.13, dohod*1.14, dohod*1.14, dohod*1.14, dohod*1.14,]
fig, ax = plt.subplots()
# fig.set_size_inches(10, 5)
ax.bar(labels, values)
# , color = ['blue', 'orange', 'green'])
# ax.set_ylabel('Сумма, руб')
# ax.set_title('Сравнение доходов')
# st.pyplot(fig)
# Построение линейного графика
fig, ax = plt.subplots(figsize=(10, 5)) # Размер графика 30 на 30 дюймов
ax.plot(labels, values, marker='o', linewidth=1, color='blue', label=f'Прогноз дохода в текущей сфере') # Линейный график с маркерами
if sphere == 'Продажи':
ax.plot(labels, values_change, marker='o', linewidth=1, color='red', linestyle='--', label=f'Прогноз дохода при смене сферы на {change_sphere}') # Линейный график с маркерами
ax.set_ylabel('Сумма, руб')
ax.set_xlabel('Ваш возраст, лет')
ax.set_title('Сравнение доходов')
ax.legend()
ax.grid(True) # Добавление сетки
count_course = 3
# Отображение графика
st.pyplot(fig)
if gotov_uchitsia == "Нет":
count_course = 0
else:
count_course = 3
if sphere_change == "Да":
mask_sphere = df_fin['Сфера'] != 0
else:
mask_sphere = df_fin['Сфера'] == sphere
mask_len = df_fin['Недостающие навыки'].apply(lambda x: ((len(x) <= count_course) or (list(x)[0] == '-')))
df_fin = df_fin[mask_len][mask_sphere][df_fin['Зарплата (руб.)'] >= dohod]
df_fin_sort = df_fin.sort_values(by=['Зарплата (руб.)'], ascending=[False]).reset_index(drop=True)
st.header('Вакансии, которые вам будут интересны')
st.dataframe(df_fin_sort, width=1100, height=500)