File size: 5,339 Bytes
561c472
 
55031b9
561c472
8cdea13
be6b2fb
 
561c472
e890e86
561c472
 
 
 
 
 
 
52b2523
 
 
 
561c472
 
9ec1240
561c472
 
 
 
 
 
 
 
 
084c60c
 
 
 
 
 
55031b9
561c472
 
 
a4648d8
 
 
 
 
 
 
 
 
 
4a268ab
084c60c
 
 
 
 
a4648d8
 
 
 
 
9ec1240
 
 
52b2523
8cdea13
55031b9
8cdea13
9ec1240
52b2523
 
8cdea13
 
084c60c
 
8cdea13
 
 
084c60c
8cdea13
55031b9
8cdea13
 
55031b9
52b2523
 
633f2ac
 
 
 
 
 
 
 
 
 
 
 
52b2523
 
9ec1240
8cdea13
9ec1240
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import pandas as pd
import streamlit as st
import numpy as np

# Загрузка данных из Excel файлов
vacancy = 'vacancy_new_new.xlsx'
resume = 'resume_new_new.xlsx'
file_nkz = 'label_NKZ.xlsx'
file_skills = 'label_skills_new.xlsx'

df_vacancy = pd.read_excel(vacancy)
df_resume = pd.read_excel(resume)
df_nkz = pd.read_excel(file_nkz)
df_skills = pd.read_excel(file_skills)

# Проверка, что в файлах есть нужные колонки
required_columns = {'skills', 'name', 'NKZ', 'id'}
for df, fname in zip([df_vacancy, df_resume, df_nkz, df_skills], [vacancy, resume, file_nkz, file_skills]):
    if not required_columns.intersection(df.columns):
        raise ValueError(f"Файл {fname} должен содержать колонки {required_columns}")

# Streamlit интерфейс
st.title("Поиск совпадений по навыкам")

# Ввод текста для добавления в колонку 'name'
new_name = st.text_input("Введите название")

# Выбор из колонки 'NKZ' из файла label_NKZ
nkz_options = df_nkz['name'].unique().tolist()
selected_nkz = st.selectbox("Выберите профессию по НКЗ", nkz_options)

# Множественный выбор из колонки 'skills' из файла label_skills
if selected_nkz:
    nkz_code = df_nkz[df_nkz['name'] == selected_nkz]['NKZ'].values[0]
    skills_options = sorted(df_skills[df_skills['NKZ'] == nkz_code]['skills'].unique().tolist())
    selected_skills = st.multiselect("Выберите навыки", skills_options)
else:
    selected_skills = []

# Выбор файла для поиска совпадений
file_option = st.selectbox("Выберите тип", ("Вакансия", "Резюме"))

# Выбор файла для записи новой записи
write_option = "vacancy" if file_option == "Вакансия" else "resume"

# Кнопка для добавления новой записи
add_entry = st.button("Добавить новую запись")
if add_entry:
    if new_name and selected_skills:
        skills_ids = df_skills[df_skills['skills'].isin(selected_skills)]['id'].values
        skills_ids_str = ','.join(map(str, skills_ids))
        new_entry = pd.DataFrame({'name': [new_name], 'NKZ': [selected_nkz], 'skills': [' '.join(selected_skills)], 'arr': [skills_ids_str]})
        if write_option == "vacancy":
            df_vacancy = pd.concat([df_vacancy, new_entry], ignore_index=True)
            df_vacancy.to_excel(vacancy, index=False)
        else:
            df_resume = pd.concat([df_resume, new_entry], ignore_index=True)
            df_resume.to_excel(resume, index=False)
        st.success("Новая запись была успешно добавлена.")
    else:
        st.error("Пожалуйста, введите имя и выберите навыки для добавления записи.")

# Кнопка для поиска совпадений
if st.button("Найти совпадения"):
    if new_name and selected_skills:
        # Определение DataFrame для поиска совпадений
        df_to_search = df_vacancy if file_option == "Вакансия" else df_resume
        skills_ids = set(df_skills[df_skills['skills'].isin(selected_skills)]['id'].values)

        # Поиск совпадений по пересечению
        matching_results = []
        for index, row in df_to_search.iterrows():
            if 'arr' in row and isinstance(row['arr'], str):
                arr_values = set(map(int, row['arr'].split(',')))
                intersection = skills_ids.intersection(arr_values)
                if len(intersection) > len(selected_skills) / 2:
                    matching_skills = [df_skills[df_skills['id'] == skill_id]['skills'].values[0] for skill_id in intersection]
                    matching_results.append({
                        'Name': row['name'],
                        'Matching Skills Count': len(intersection),
                        'Matching Skills': matching_skills
                    })

        # Вывод результатов
        st.write("Результаты по найденным совпадениям:")
        if matching_results:
            for result in matching_results:
                st.markdown(
                    """
                    <div style="border: 1px solid #ddd; padding: 10px; border-radius: 5px; margin-bottom: 10px;">
                        <h4 style="margin: 0;">{}</h4>
                        <p><strong>Количество совпадающих навыков:</strong> {}</p>
                        <p><strong>Совпадающие навыки:</strong><br>
                        {}</p>
                    </div>
                    """.format(
                        result['Name'],
                        result['Matching Skills Count'],
                        '<br>'.join(['• ' + skill for skill in result['Matching Skills']])
                    ),
                    unsafe_allow_html=True
                )
        else:
            st.write("Нет совпадений.")
    else:
        st.error("Пожалуйста, введите имя и выберите навыки для сравнения.")