File size: 7,269 Bytes
643da87
 
 
 
 
 
 
 
 
 
 
c2f4f2a
 
 
643da87
 
 
 
 
 
 
c2f4f2a
 
643da87
c2f4f2a
 
 
 
643da87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c2f4f2a
 
643da87
 
 
 
 
befbb2f
 
 
 
 
643da87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c2f4f2a
643da87
 
 
 
c2f4f2a
befbb2f
 
c2f4f2a
643da87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import time

import pandas as pd
import streamlit as st
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import LabelEncoder


def New():
    progress_text = "Operación en progreso... :sunglasses: Por favor " \
                    "espere... " \
                    ":bomb:"
    my_bar = st.progress(0, text=progress_text)

    for percent_complete in range(100):
        time.sleep(0.05)
        my_bar.progress(percent_complete + 1, text=progress_text)

    st.markdown("""
            <h1>¡Descubre los proyectos más innovadores en fase Beta y 
            <strong>sé el primero</strong> en experimentar con ellos!</h1>
            <hr>
            <code>
            !Te presentamos un adelanto exclusivo de lo que viene 
            próximamente en nuestros proyectos más innovadores!
            </code>
        """, unsafe_allow_html=True)

    # Leer los datos y seleccionar las columnas necesarias
    df = pd.read_csv('./ML/ds_salaries.csv')
    df = df[['company_location', 'salary_in_usd']]

    # Codificar las ubicaciones de las empresas
    le = LabelEncoder()
    df['company_location'] = le.fit_transform(df['company_location'])

    # Decodificar las ubicaciones de las empresas
    decoded_locations = le.inverse_transform(df['company_location'].unique())

    # Separar los datos de entrada y salida
    X = df.iloc[:, :-1].values
    y = df.iloc[:, -1].values

    # Entrenar el modelo
    model = RandomForestRegressor(n_estimators=100, random_state=42)
    model.fit(X, y)

    # Obtener las ubicaciones de las empresas y sus salarios predichos
    locations = df['company_location'].unique()
    predicted_salaries = model.predict(locations.reshape(-1, 1))
    results_df = pd.DataFrame(
        {'company_location': locations, 'predicted_salary': predicted_salaries})

    # Decodificar las ubicaciones de las empresas
    results_df['company_location'] = le.inverse_transform(
        results_df['company_location'])

    # Ordenar los resultados por salario predicho
    results_df = results_df.sort_values('predicted_salary',
                                        ascending=False).reset_index(drop=True)

    # Mostrar el título y el top 5 de países mejor pagados
    st.markdown("""
            <h2>Atrae a los mejores talentos con nuestra lista precisa de los 
            países mejor pagados.</h2>
            <hr>
            """, unsafe_allow_html=True)

    # Descripción
    st.markdown("""
            <p>Como reclutador, sabes que la remuneración es un factor clave 
            para atraer a los mejores talentos. Con nuestro algoritmo 
            <strong>RandomForest</strong>, obtenemos un promedio preciso de los 
            países 
            mejor pagados en todo el mundo, lo que te permite atraer a los candidatos más talentosos. Nuestra lista está menos sesgada por outliers gracias a nuestra selección aleatoria de empresas en cada país. Únete a nuestra comunidad y toma decisiones informadas para un futuro próspero. ¡Atrae a los mejores talentos y lleva tu empresa al siguiente nivel con nuestra lista precisa de los países mejor pagados!""", unsafe_allow_html=True)

    for i in range(5):
        location = results_df.loc[i, 'company_location']
        salary = results_df.loc[i, 'predicted_salary']
        st.markdown(f'### **{location}**: ${salary:,.2f}',
                    unsafe_allow_html=True)

    # Mostrar el menú desplegable para seleccionar un país
    st.markdown("""
        <h2>Seleccionar un país</h2>
        <hr>
        """, unsafe_allow_html=True)
    selected_location = st.selectbox('Ubicación de la empresa',
                                     decoded_locations)

    # Mostrar el salario predicho para el país seleccionado
    predicted_salary = results_df.loc[results_df[
                                          'company_location'] == selected_location, 'predicted_salary'].iloc[
        0]
    st.markdown(f'### **{selected_location}**: ${predicted_salary:,.2f}',
                unsafe_allow_html=True)

    #####

    # Cargar los datos
    df = pd.read_csv('./assets/dataset_modelo_1.csv')

    # Crear una lista con todas las skills disponibles
    all_skills = set()
    for skills in df.skills:
        all_skills.update(skills.split(", "))

    # Crear un diccionario que relaciona cada skill con su índice en el vector
    skill_indices = {skill: i for i, skill in enumerate(all_skills)}

    # Crear una matriz de características con la frecuencia de cada skill en cada fila
    vectorizer = CountVectorizer(vocabulary=skill_indices.keys(),
                                 lowercase=False)
    X = vectorizer.fit_transform(df.skills)

    # Entrenar el modelo
    clf = MultinomialNB()
    clf.fit(X, df.Aptitude)

    # Crear la interfaz de usuario con Streamlit
    st.markdown("""
        <h2>Encuentra el talento perfecto con nuestro modelo de Naive Bayes para identificar las habilidades más importantes.</h2>
        <hr>
        """, unsafe_allow_html=True)
    st.markdown(
        """
        <p>Como reclutador, sabes que encontrar al talento perfecto es un 
        desafío constante. Con nuestro modelo de <strong>Naive Bayes</strong>, 
        podemos 
        identificar las habilidades más importantes para cualquier trabajo en particular. Al ingresar el título de trabajo, nuestro algoritmo genera una lista precisa de habilidades necesarias para tener éxito en esa posición específica. Esto te permite encontrar y atraer al candidato perfecto para el trabajo. Únete a nuestra comunidad y comienza a impulsar tu carrera hoy mismo!</p>""", unsafe_allow_html=True)

    title = st.text_input("Título del trabajo")

    # Crear una función que encuentra las habilidades más importantes para un título dado
    def get_top_skills(title, limit):
        # Filtrar el dataframe por el título dado
        filtered_df = df[df.job_title.str.contains(title, case=False)]

        # Crear una matriz de características con la frecuencia de cada skill en el dataframe filtrado
        X_filtered = vectorizer.transform(filtered_df.skills)

        # Calcular la frecuencia de cada habilidad en el dataframe filtrado
        skill_frequencies = X_filtered.sum(axis=0).A1

        # Obtener los nombres de las habilidades
        skill_names = vectorizer.vocabulary_.keys()

        # Crear un diccionario que relaciona cada habilidad con su frecuencia
        skill_freq_dict = dict(zip(skill_names, skill_frequencies))

        # Ordenar las habilidades por frecuencia descendente y devolver las más importantes (según el límite dado)
        top_skills = sorted(skill_freq_dict, key=skill_freq_dict.get,
                            reverse=True)[:limit]
        return top_skills

    if title:
        limit = st.number_input("Cantidad de habilidades a mostrar", value=5,
                                min_value=1, max_value=len(all_skills))
        top_skills = get_top_skills(title, limit)
        st.write(
            f"Las {limit} habilidades más importantes para el trabajo de '{title}' son:")
        for skill in top_skills:
            st.write(f"- {skill}")

    #####