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)