Spaces:
Runtime error
Runtime error
Commit
·
2c5c5bd
1
Parent(s):
06e063c
Modelo New
Browse files- ML/skill_top.py +59 -0
- app.py +83 -3
- assets/dataset_modelo_1.csv +0 -0
ML/skill_top.py
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pandas as pd
|
2 |
+
import streamlit as st
|
3 |
+
from sklearn.feature_extraction.text import CountVectorizer
|
4 |
+
from sklearn.naive_bayes import MultinomialNB
|
5 |
+
|
6 |
+
# Cargar los datos
|
7 |
+
df = pd.read_csv('../assets/dataset_modelo_1.csv')
|
8 |
+
|
9 |
+
# Crear una lista con todas las skills disponibles
|
10 |
+
all_skills = set()
|
11 |
+
for skills in df.skills:
|
12 |
+
all_skills.update(skills.split(", "))
|
13 |
+
|
14 |
+
# Crear un diccionario que relaciona cada skill con su índice en el vector
|
15 |
+
skill_indices = {skill: i for i, skill in enumerate(all_skills)}
|
16 |
+
|
17 |
+
# Crear una matriz de características con la frecuencia de cada skill en cada fila
|
18 |
+
vectorizer = CountVectorizer(vocabulary=skill_indices.keys(), lowercase=False)
|
19 |
+
X = vectorizer.fit_transform(df.skills)
|
20 |
+
|
21 |
+
# Entrenar el modelo
|
22 |
+
clf = MultinomialNB()
|
23 |
+
clf.fit(X, df.Aptitude)
|
24 |
+
|
25 |
+
# Crear la interfaz de usuario con Streamlit
|
26 |
+
st.title("Predicción de aptitud para un trabajo")
|
27 |
+
st.write(
|
28 |
+
"Ingrese el título del trabajo para ver las habilidades más importantes.")
|
29 |
+
|
30 |
+
title = st.multiselect("Título del trabajo", df.job_title.unique())
|
31 |
+
|
32 |
+
# Crear una función que encuentra las habilidades más importantes para un título dado
|
33 |
+
def get_top_skills(title, limit):
|
34 |
+
# Filtrar el dataframe por el título dado
|
35 |
+
filtered_df = df[df.job_title == title]
|
36 |
+
|
37 |
+
# Crear una matriz de características con la frecuencia de cada skill en el dataframe filtrado
|
38 |
+
X_filtered = vectorizer.transform(filtered_df.skills)
|
39 |
+
|
40 |
+
# Calcular la frecuencia de cada habilidad en el dataframe filtrado
|
41 |
+
skill_frequencies = X_filtered.sum(axis=0).A1
|
42 |
+
|
43 |
+
# Obtener los nombres de las habilidades
|
44 |
+
skill_names = vectorizer.vocabulary_.keys()
|
45 |
+
|
46 |
+
# Crear un diccionario que relaciona cada habilidad con su frecuencia
|
47 |
+
skill_freq_dict = dict(zip(skill_names, skill_frequencies))
|
48 |
+
|
49 |
+
# Ordenar las habilidades por frecuencia descendente y devolver las más importantes (según el límite dado)
|
50 |
+
top_skills = sorted(skill_freq_dict, key=skill_freq_dict.get,
|
51 |
+
reverse=True)[:limit]
|
52 |
+
return top_skills
|
53 |
+
|
54 |
+
if title:
|
55 |
+
limit = st.number_input("Cantidad de habilidades a mostrar", value=5, min_value=1, max_value=len(all_skills))
|
56 |
+
top_skills = get_top_skills(title[0], limit)
|
57 |
+
st.write(f"Las {limit} habilidades más importantes para el trabajo de '{title[0]}' son:")
|
58 |
+
for skill in top_skills:
|
59 |
+
st.write(f"- {skill}")
|
app.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
import datetime
|
2 |
import time
|
|
|
3 |
|
4 |
import altair as alt
|
5 |
import pandas as pd
|
@@ -159,9 +160,18 @@ En resumen, la industria de la tecnología y la analítica de datos está en con
|
|
159 |
''', unsafe_allow_html=True)
|
160 |
|
161 |
st.write("Este es mi dashboard de Tableau:")
|
162 |
-
|
163 |
st.markdown('''<iframe src="https://public.tableau.com/views/latam_brain_mvp/General?:language=es-ES&publish=yes&:display_count=n&:origin=viz_share_link" width="100%" height="800"></iframe>''', unsafe_allow_html=True)
|
164 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
165 |
st.markdown('''
|
166 |
<br>
|
167 |
<h3>Dashboard contexto actual</h3>
|
@@ -396,7 +406,77 @@ if selected2 == "New":
|
|
396 |
for percent_complete in range(100):
|
397 |
time.sleep(0.05)
|
398 |
my_bar.progress(percent_complete + 1, text=progress_text)
|
399 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
400 |
|
401 |
if selected2 == "Contact US":
|
402 |
|
|
|
1 |
import datetime
|
2 |
import time
|
3 |
+
from streamlit import components
|
4 |
|
5 |
import altair as alt
|
6 |
import pandas as pd
|
|
|
160 |
''', unsafe_allow_html=True)
|
161 |
|
162 |
st.write("Este es mi dashboard de Tableau:")
|
163 |
+
#######
|
164 |
st.markdown('''<iframe src="https://public.tableau.com/views/latam_brain_mvp/General?:language=es-ES&publish=yes&:display_count=n&:origin=viz_share_link" width="100%" height="800"></iframe>''', unsafe_allow_html=True)
|
165 |
+
|
166 |
+
tableau_url = "https://public.tableau.com/views/latam_brain_mvp/DashboardGeneralDataJobs?:language=es-ES&:display_count=n&:origin=viz_share_link"
|
167 |
+
|
168 |
+
# Incruste el dashboard de Tableau utilizando components.html
|
169 |
+
st.components.v1.html(
|
170 |
+
f'<iframe src="{tableau_url}" width="100%" height="800"></iframe>',
|
171 |
+
height=800)
|
172 |
+
|
173 |
+
|
174 |
+
#########
|
175 |
st.markdown('''
|
176 |
<br>
|
177 |
<h3>Dashboard contexto actual</h3>
|
|
|
406 |
for percent_complete in range(100):
|
407 |
time.sleep(0.05)
|
408 |
my_bar.progress(percent_complete + 1, text=progress_text)
|
409 |
+
|
410 |
+
|
411 |
+
#####
|
412 |
+
import pandas as pd
|
413 |
+
import streamlit as st
|
414 |
+
from sklearn.feature_extraction.text import CountVectorizer
|
415 |
+
from sklearn.naive_bayes import MultinomialNB
|
416 |
+
|
417 |
+
# Cargar los datos
|
418 |
+
df = pd.read_csv('./assets/dataset_modelo_1.csv')
|
419 |
+
|
420 |
+
# Crear una lista con todas las skills disponibles
|
421 |
+
all_skills = set()
|
422 |
+
for skills in df.skills:
|
423 |
+
all_skills.update(skills.split(", "))
|
424 |
+
|
425 |
+
# Crear un diccionario que relaciona cada skill con su índice en el vector
|
426 |
+
skill_indices = {skill: i for i, skill in enumerate(all_skills)}
|
427 |
+
|
428 |
+
# Crear una matriz de características con la frecuencia de cada skill en cada fila
|
429 |
+
vectorizer = CountVectorizer(vocabulary=skill_indices.keys(),
|
430 |
+
lowercase=False)
|
431 |
+
X = vectorizer.fit_transform(df.skills)
|
432 |
+
|
433 |
+
# Entrenar el modelo
|
434 |
+
clf = MultinomialNB()
|
435 |
+
clf.fit(X, df.Aptitude)
|
436 |
+
|
437 |
+
# Crear la interfaz de usuario con Streamlit
|
438 |
+
st.title("Predicción de aptitud para un trabajo")
|
439 |
+
st.write(
|
440 |
+
"Ingrese el título del trabajo para ver las habilidades más importantes.")
|
441 |
+
|
442 |
+
title = st.multiselect("Título del trabajo", df.job_title.unique())
|
443 |
+
|
444 |
+
|
445 |
+
# Crear una función que encuentra las habilidades más importantes para un título dado
|
446 |
+
def get_top_skills(title, limit):
|
447 |
+
# Filtrar el dataframe por el título dado
|
448 |
+
filtered_df = df[df.job_title == title]
|
449 |
+
|
450 |
+
# Crear una matriz de características con la frecuencia de cada skill en el dataframe filtrado
|
451 |
+
X_filtered = vectorizer.transform(filtered_df.skills)
|
452 |
+
|
453 |
+
# Calcular la frecuencia de cada habilidad en el dataframe filtrado
|
454 |
+
skill_frequencies = X_filtered.sum(axis=0).A1
|
455 |
+
|
456 |
+
# Obtener los nombres de las habilidades
|
457 |
+
skill_names = vectorizer.vocabulary_.keys()
|
458 |
+
|
459 |
+
# Crear un diccionario que relaciona cada habilidad con su frecuencia
|
460 |
+
skill_freq_dict = dict(zip(skill_names, skill_frequencies))
|
461 |
+
|
462 |
+
# Ordenar las habilidades por frecuencia descendente y devolver las más importantes (según el límite dado)
|
463 |
+
top_skills = sorted(skill_freq_dict, key=skill_freq_dict.get,
|
464 |
+
reverse=True)[:limit]
|
465 |
+
return top_skills
|
466 |
+
|
467 |
+
|
468 |
+
if title:
|
469 |
+
limit = st.number_input("Cantidad de habilidades a mostrar", value=5,
|
470 |
+
min_value=1, max_value=len(all_skills))
|
471 |
+
top_skills = get_top_skills(title[0], limit)
|
472 |
+
st.write(
|
473 |
+
f"Las {limit} habilidades más importantes para el trabajo de '{title[0]}' son:")
|
474 |
+
for skill in top_skills:
|
475 |
+
st.write(f"- {skill}")
|
476 |
+
|
477 |
+
#####
|
478 |
+
|
479 |
+
#####
|
480 |
|
481 |
if selected2 == "Contact US":
|
482 |
|
assets/dataset_modelo_1.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|