Spaces:
Sleeping
Sleeping
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) | |