data_world_jobs / ML /skill_top.py
perezcatriel's picture
spot youtube
74b1fdc
import pandas as pd
import streamlit as st
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
# Cargar los datos
df = pd.read_csv('./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.title("Predicción de aptitud para un trabajo")
st.write(
"Ingrese el título del trabajo para ver las habilidades más importantes.")
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_high = sorted(skill_freq_dict, key=skill_freq_dict.get,
reverse=True)[:limit]
# Ordenar las habilidades por frecuencia ascendente y devolver las menos importantes (según el límite dado)
top_skills_low = sorted(skill_freq_dict, key=skill_freq_dict.get)[:limit]
return top_skills_high, top_skills_low
if title:
limit = st.number_input("Cantidad de habilidades a mostrar", value=5,
min_value=1, max_value=len(all_skills))
top_skills_high, top_skills_low = get_top_skills(title, limit)
col1, col2 = st.columns(2)
with col1:
st.write(
f"Las {limit} habilidades más importantes para el trabajo de '{title}' son:")
for skill in top_skills_high:
st.write(f"- {skill}")
with col2:
st.write(
f"Las {limit} habilidades menos importantes para el trabajo de '{title}' son:")
for skill in top_skills_low:
st.write(f"- {skill}")