Spaces:
Runtime error
Runtime error
Commit
·
643da87
1
Parent(s):
122cd0e
modulos y copywriting
Browse files- __pycache__/app.cpython-310.pyc +0 -0
- app.py +20 -848
- page/__pycache__/analisis.cpython-310.pyc +0 -0
- page/__pycache__/contact.cpython-310.pyc +0 -0
- page/__pycache__/home.cpython-310.pyc +0 -0
- page/__pycache__/machine_learning.cpython-310.pyc +0 -0
- page/__pycache__/new.cpython-310.pyc +0 -0
- page/analisis.py +382 -0
- page/contact.py +69 -0
- page/home.py +166 -0
- page/machine_learning.py +159 -0
- page/new.py +161 -0
- requirements.txt +0 -56
__pycache__/app.cpython-310.pyc
ADDED
Binary file (31.6 kB). View file
|
|
app.py
CHANGED
@@ -1,23 +1,15 @@
|
|
1 |
-
|
2 |
-
import time
|
3 |
-
|
4 |
-
import altair as alt
|
5 |
-
import pandas as pd
|
6 |
import streamlit as st
|
7 |
-
from PIL import Image
|
8 |
-
from sklearn.linear_model import LinearRegression
|
9 |
-
from streamlit.components.v1 import components
|
10 |
from streamlit_option_menu import option_menu
|
11 |
|
12 |
-
#
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
df = pd.read_csv('./ML/ds_salaries.csv')
|
20 |
|
|
|
21 |
st.markdown("""<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
|
22 |
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>""",
|
23 |
unsafe_allow_html=True)
|
@@ -27,847 +19,27 @@ selected2 = option_menu(None, ["Home", "Análisis", "ML", "New", "Contact"],
|
|
27 |
icons=['house', 'bi-archive', "bi-robot",
|
28 |
"bi-arrow-up-right-square",
|
29 |
"bi-envelope"],
|
30 |
-
menu_icon="cast",
|
|
|
31 |
orientation="horizontal",
|
32 |
-
|
33 |
)
|
34 |
|
35 |
-
#
|
36 |
if selected2 == "Home":
|
37 |
-
|
38 |
-
col1.markdown("""
|
39 |
-
<br/>
|
40 |
-
<br/>
|
41 |
-
<br/>
|
42 |
-
<h1 style="text-align:center; font-weight:bold;
|
43 |
-
text-shadow:0px 0px 10px #5c62ac;font-size:3rem">LatamBrain</h1>
|
44 |
-
<h5 style="text-align:center;color:#5c62ac">tú cerebro tecnológico</h5>
|
45 |
-
<br />
|
46 |
-
""", unsafe_allow_html=True)
|
47 |
-
col2.image(image, width=300)
|
48 |
-
|
49 |
-
st.markdown('''
|
50 |
-
<br>
|
51 |
-
<h2>Quienes somos?</h2>
|
52 |
-
<hr>
|
53 |
-
<p>LatamBrain es una startup latinoamericana altamente innovadora y
|
54 |
-
tecnológica que está aprovechando las últimas tendencias en tecnología
|
55 |
-
para brindar soluciones personalizadas, seguras y eficientes a sus
|
56 |
-
clientes.
|
57 |
-
Si busca soluciones que lo preparen para el futuro,
|
58 |
-
no dude en contactar a LatamBrain.
|
59 |
-
</p>
|
60 |
-
<p>LatamBrain, tú cerebro tecnológico!</p>
|
61 |
-
''', unsafe_allow_html=True)
|
62 |
-
|
63 |
-
st.markdown('''
|
64 |
-
<br>
|
65 |
-
<h2>Servicios</h2>
|
66 |
-
<hr>
|
67 |
-
''', unsafe_allow_html=True)
|
68 |
-
|
69 |
-
col1, col2, col3 = st.columns(3)
|
70 |
-
col1.markdown('''
|
71 |
-
<li>Data Análisis
|
72 |
-
<li>Reportes financieros
|
73 |
-
<li>KPI's personalizados
|
74 |
-
<li>Asesoramientos y Plan de Ejecución
|
75 |
-
<li>Y más..
|
76 |
-
''', unsafe_allow_html=True)
|
77 |
-
col2.markdown('''
|
78 |
-
<li>Machine Learning
|
79 |
-
<li>Deep Learning
|
80 |
-
<li>Automatización de con ML
|
81 |
-
<li>ChatBot
|
82 |
-
<li>Y más...
|
83 |
-
''', unsafe_allow_html=True)
|
84 |
-
col3.markdown('''
|
85 |
-
<li>Cloud AWS
|
86 |
-
<li>Máxima seguridad en tús datos
|
87 |
-
<li>Disponibilidad y velocidad de datos
|
88 |
-
<li>Y más...
|
89 |
-
''', unsafe_allow_html=True)
|
90 |
-
|
91 |
-
st.markdown('''
|
92 |
-
<br>
|
93 |
-
<h2>Nosotros y Como Trabajamos</h2>
|
94 |
-
<hr>
|
95 |
-
''', unsafe_allow_html=True)
|
96 |
-
st.image(scrum)
|
97 |
-
|
98 |
-
#####
|
99 |
-
st.markdown("""
|
100 |
-
<br>
|
101 |
-
<h3>LatamBrain - Spot</h3>
|
102 |
-
<hr>
|
103 |
-
""", unsafe_allow_html=True)
|
104 |
-
|
105 |
-
|
106 |
-
VIDEO_ID = "VIDEO_ID"
|
107 |
-
|
108 |
-
# Genera el código HTML del iframe
|
109 |
-
html = f"""
|
110 |
-
<div >
|
111 |
-
<iframe
|
112 |
-
style="height:200px;width
|
113 |
-
:700px"
|
114 |
-
width="530"
|
115 |
-
height="360"
|
116 |
-
src="https://www.youtube.com/embed/G8PdiAwhbNM"
|
117 |
-
title="LatamBrain - Spot"
|
118 |
-
frameborder="0"
|
119 |
-
allow="accelerometer; autoplay; clipboard-write;
|
120 |
-
encrypted-media; gyroscope;
|
121 |
-
picture-in-picture; web-share"
|
122 |
-
allowfullscreen
|
123 |
-
>
|
124 |
-
</iframe>
|
125 |
-
</div>
|
126 |
-
|
127 |
-
"""
|
128 |
-
|
129 |
-
# Inserta el iframe en la aplicación de Streamlit
|
130 |
-
st.components.v1.html(html)
|
131 |
-
|
132 |
-
#####
|
133 |
-
|
134 |
-
# st.image(logo, width=700)
|
135 |
-
st.markdown('''
|
136 |
-
<br>
|
137 |
-
<h3>Como fue este proceso para nosotros?</h3>
|
138 |
-
<hr>
|
139 |
-
''', unsafe_allow_html=True)
|
140 |
-
col1, col2, col3 = st.columns(3)
|
141 |
-
catriel = '''
|
142 |
-
<h4><strong>Catriel Pérez<strong></h4>
|
143 |
-
<p style="margin-top:-20px">Data Engineer</p>
|
144 |
-
<p>Ha sido una experiencia increíble trabajar con este equipo. Todos
|
145 |
-
han sido muy profesionales y comprometidos con el éxito del proyecto. Me siento agradecido de haber formado parte de este equipo y haber aprendido tanto en el proceso. Y esto... recién comienza!</p>
|
146 |
-
<a href="mailto:perezcatriel@gmail.com">Contactame...</a>
|
147 |
-
<p>24 de abril del 2023</p>
|
148 |
-
'''
|
149 |
-
|
150 |
-
mati = '''
|
151 |
-
<h4><strong>Matias Benitez</strong></h4>
|
152 |
-
<p style="margin-top:-20px">Machine Learning</p>
|
153 |
-
<p>Trabajar en este proyecto ha sido una verdadera aventura. He enfrentado muchos desafíos y he aprendido cosas nuevas todos los días. El equipo con el que he trabajado ha sido excepcional, siempre dispuesto a ayudar y colaborar en todo momento. Me llevo una experiencia enriquecedora y valiosa.</p>
|
154 |
-
<a href="mailto:matiasbenitezcarrizo@gmail.com">Contactame...</a>
|
155 |
-
<p>24 de abril del 2023</p>
|
156 |
-
'''
|
157 |
|
158 |
-
|
159 |
-
<h4><strong>Luis Rascón</strong></h4>
|
160 |
-
<p style="margin-top:-20px">Data Analyst</p>
|
161 |
-
<p>No tengo más que palabras de agradecimiento por esta experiencia. He tenido la oportunidad de trabajar con gente talentosa y apasionada por su trabajo, lo que ha hecho que el proyecto sea un éxito rotundo. Me llevo muchas lecciones aprendidas y nuevas habilidades que me servirán en mi carrera profesional. Ha sido una experiencia inolvidable.</p>
|
162 |
-
<a href="mailto:luis.francisco.rc@gmail.com">Contactame...</a>
|
163 |
-
<p>24 de abril del 2023</p>
|
164 |
-
'''
|
165 |
-
|
166 |
-
col1.markdown(luis, unsafe_allow_html=True)
|
167 |
-
col2.markdown(mati, unsafe_allow_html=True)
|
168 |
-
col3.markdown(catriel, unsafe_allow_html=True)
|
169 |
-
|
170 |
-
st.markdown("""
|
171 |
-
<br>
|
172 |
-
<h3>Documentación Extra</h3>
|
173 |
-
<hr>
|
174 |
-
""", unsafe_allow_html=True)
|
175 |
-
|
176 |
-
col1, col2, col3, col4 = st.columns(4)
|
177 |
-
col1.markdown("""
|
178 |
-
<a href="https://github.com/LRascon/data_world_jobs">Github</a>
|
179 |
-
""", unsafe_allow_html=True)
|
180 |
-
col2.markdown("""
|
181 |
-
<a href="https://www.notion.so/Data-World-Tendencias-del-Mercado-Laboral-c61f044bd0db44988147fc961551666d">Notion</a>
|
182 |
-
""", unsafe_allow_html=True)
|
183 |
-
col3.markdown("""
|
184 |
-
<a href="https://public.tableau.com/views/latam_brain_context
|
185 |
-
/DashboardVistazoelMercadoActual?:language=es-ES&publish=yes
|
186 |
-
&:display_count=n&:origin=viz_share_link">Tableau</a>
|
187 |
-
""", unsafe_allow_html=True)
|
188 |
-
col4.markdown("""
|
189 |
-
<a href="https://www.youtube.com/watch?v=G8PdiAwhbNM">YouTube</a>
|
190 |
-
""", unsafe_allow_html=True)
|
191 |
-
|
192 |
-
# Pagina Projects
|
193 |
if selected2 == "Análisis":
|
194 |
-
|
195 |
-
<h1 style="text-shadow:0 0 10px #5c62ac;font-weight:bold">Data
|
196 |
-
World Jobs</h1>
|
197 |
-
''', unsafe_allow_html=True)
|
198 |
-
|
199 |
-
|
200 |
-
#####
|
201 |
-
def main():
|
202 |
-
st.markdown("""
|
203 |
-
<h2>Propuesta de Proyecto</h2>
|
204 |
-
<hr>
|
205 |
-
""",
|
206 |
-
unsafe_allow_html=True)
|
207 |
-
st.markdown("""
|
208 |
-
<p>Es por todo esto que <strong>Latam Brain</strong>, una empresa
|
209 |
-
líder en
|
210 |
-
ciencia de
|
211 |
-
datos, ha diseñado un
|
212 |
-
proyecto revolucionario que aborda este desafío de frente. </p>
|
213 |
-
<ul>Este proyecto se basa en cuatro objetivos fundamentales:
|
214 |
-
<li> Recopilar datos de todas las ofertas de empleo relacionadas con la
|
215 |
-
ciencia de datos
|
216 |
-
y crear un data warehouse, un recurso invaluable para almacenar y analizar
|
217 |
-
información de manera eficiente.
|
218 |
-
<li> Obtener un panorama general de la situación actual del mercado
|
219 |
-
laboral en el
|
220 |
-
ámbito de la ciencia de datos tanto a nivel mundial como en América Latina.
|
221 |
-
<li> Identificar las características clave que definen a los
|
222 |
-
profesionales en este campo,
|
223 |
-
como habilidades, herramientas y funciones, y su relación con el nivel de salario.
|
224 |
-
<li> Crear un modelo predictivo utilizando Machine Learning para
|
225 |
-
identificar patrones y
|
226 |
-
tendencias en los datos generados por las distintas fuentes de información.
|
227 |
-
</ul>
|
228 |
-
""", unsafe_allow_html=True)
|
229 |
-
|
230 |
-
st.markdown(
|
231 |
-
"""
|
232 |
-
<div style="font-weight:bold;font-size:1.5rem;width:60vw
|
233 |
-
;margin:auto;
|
234 |
-
border-radius:10px;padding:10px">
|
235 |
-
<cite >Nuestro proyecto, con su
|
236 |
-
amplio
|
237 |
-
alcance y
|
238 |
-
enfoque
|
239 |
-
en el
|
240 |
-
análisis exhaustivo de las ofertas laborales,busca revolucionar
|
241 |
-
la forma en que las empresas de reclutamiento identifican y
|
242 |
-
contratan a profesionales especializados en ciencia de datos y
|
243 |
-
análisis.</cite>
|
244 |
-
</div>
|
245 |
-
<br>
|
246 |
-
""", unsafe_allow_html=True)
|
247 |
-
st.markdown("""
|
248 |
-
<ul><strong style="font-size:1.5rem">Lo que te ofrecemos:</strong>
|
249 |
-
<li><strong>Base de Datos en la nube (aws)</strong> que nos ayude a
|
250 |
-
descubrir las
|
251 |
-
habilidades y
|
252 |
-
herramientas más demandadas en el mercado. Con esta información, pueden
|
253 |
-
afinar su búsqueda y encontrar a los candidatos ideales para sus clientes. A su vez,
|
254 |
-
los candidatos pueden mejorar sus habilidades y aumentar sus posibilidades de
|
255 |
-
conseguir empleo en empresas que se ajusten a sus metas profesionales.
|
256 |
-
<li><strong>Dashboards de Analítica</strong> que nos permita
|
257 |
-
visualizar las
|
258 |
-
tendencias y características
|
259 |
-
que nos permitan tomar mejores decisiones en el mercado laboral dedicado en
|
260 |
-
este caso a Data.
|
261 |
-
<li><strong>El modelo predictivo de Machine Learning,</strong>
|
262 |
-
como el cerebro detrás
|
263 |
-
de todo el
|
264 |
-
proyecto, permitirá anticipar tendencias y patrones en la demanda de talento, lo
|
265 |
-
que permitirá a las empresas de reclutamiento estar siempre un paso adelante y
|
266 |
-
adaptarse a las necesidades cambiantes del mercado.
|
267 |
-
</ul>
|
268 |
-
""", unsafe_allow_html=True)
|
269 |
-
|
270 |
-
st.markdown(
|
271 |
-
"""<p>Con este proyecto, Latam Brain no solo está cambiando el
|
272 |
-
juego en la industria del reclutamiento, sino que también está
|
273 |
-
creando un puente entre el talento y las empresas en la era del
|
274 |
-
Big Data. Juntos, estamos construyendo un futuro donde las
|
275 |
-
empresas y los profesionales pueden alcanzar su máximo potencial, gracias a la unión perfecta entre la ciencia de datos y el reclutamiento en la era de la Transformación Digital</p>""",
|
276 |
-
unsafe_allow_html=True)
|
277 |
-
|
278 |
-
st.markdown("""
|
279 |
-
<h2>Análisis de mercado y recomendaciones</h2>
|
280 |
-
<hr>
|
281 |
-
""",
|
282 |
-
unsafe_allow_html=True)
|
283 |
-
|
284 |
-
st.markdown("""<h4>Dashboard Vistazo General el Mercado Laboral Empleos
|
285 |
-
Data</h4>""", unsafe_allow_html=True)
|
286 |
-
|
287 |
-
# Cargar y mostrar la imagen
|
288 |
-
imagen_1 = "./assets/Dashboard_Vistazo_al_Mercado_Actual.png"
|
289 |
-
st.image(imagen_1, caption="Dashboard Vistazo el Mercado Actual.",
|
290 |
-
use_column_width=True)
|
291 |
-
|
292 |
-
st.markdown("""
|
293 |
-
<a href="https://public.tableau.com/views/latam_brain_context
|
294 |
-
/DashboardVistazoelMercadoActual?:language=es-ES&publish=yes
|
295 |
-
&:display_count=n&:origin=viz_share_link"> Dashboard Dinámico -
|
296 |
-
Vistazo General Mercado Laboral</a>
|
297 |
-
""", unsafe_allow_html=True)
|
298 |
-
|
299 |
-
st.markdown("""
|
300 |
-
<p>Basándonos en los hallazgos del dashboard de visión
|
301 |
-
general
|
302 |
-
relacionado a los empleos de data, podemos hacer el siguiente
|
303 |
-
análisis y recomendaciones:</p>
|
304 |
-
""", unsafe_allow_html=True)
|
305 |
-
|
306 |
-
st.markdown("""
|
307 |
-
<h3>Análisis</h3>
|
308 |
-
<hr>
|
309 |
-
""", unsafe_allow_html=True)
|
310 |
|
311 |
-
|
312 |
-
<ol>
|
313 |
-
<li> El salario promedio anual en empleos de data ha experimentado
|
314 |
-
un crecimiento significativo (30%) entre 2019 y 2020, lo que indica una alta demanda y valoración de los profesionales en este campo.
|
315 |
-
<li> El número de empleos relacionados con data ha aumentado en un
|
316 |
-
sorprendente 450%, lo que demuestra un interés creciente por parte de las empresas en contratar profesionales con habilidades en ciencia de datos y análisis.
|
317 |
-
<li> La mayoría de los empleados en este campo se encuentran en
|
318 |
-
compañías medianas (más del 50%), lo que sugiere que estas empresas podrían estar invirtiendo más en ciencia de datos y análisis que las pequeñas o grandes empresas.
|
319 |
-
<li> En cuanto a la antigüedad, hay una mayor cantidad de empleados
|
320 |
-
en puestos senior, seguido de semisenior, junior y, por último, expert. Esto indica que las empresas están buscando profesionales con experiencia en el campo, aunque también hay oportunidades para aquellos con menos experiencia.
|
321 |
-
<li> La mayoría de los empleos en este campo se ofrecen en
|
322 |
-
modalidad remota, lo que puede atraer a una amplia gama de candidatos y permitir una mayor flexibilidad en la contratación y el trabajo.
|
323 |
-
""", unsafe_allow_html=True)
|
324 |
-
|
325 |
-
st.markdown("""
|
326 |
-
<h3>Recomendaciones</h3>
|
327 |
-
<hr>
|
328 |
-
""", unsafe_allow_html=True)
|
329 |
-
|
330 |
-
st.markdown("""
|
331 |
-
<li> Como empresa de reclutamiento, enfóquense en buscar candidatos con
|
332 |
-
experiencia en ciencia de datos y análisis, ya que estos perfiles son altamente demandados. Además, consideren ofrecer capacitación y desarrollo profesional para ayudar a los candidatos a avanzar en sus carreras y mejorar sus habilidades.
|
333 |
-
<li> Atraigan a los profesionales de la ciencia de datos ofreciendo
|
334 |
-
salarios competitivos y oportunidades de crecimiento, ya que el salario promedio anual en este campo está en aumento.
|
335 |
-
<li> Las pequeñas y grandes empresas podrían considerar aumentar su
|
336 |
-
inversión en ciencia de datos y análisis, ya que las compañías medianas parecen estar liderando en este aspecto.
|
337 |
-
<li> Las empresas deben adaptarse a las tendencias actuales de
|
338 |
-
contratación y ofrecer puestos de trabajo en modalidad remota cuando sea posible. Esto no solo ampliará el grupo de candidatos, sino que también puede aumentar la satisfacción y la retención de los empleados.
|
339 |
-
<li> Y para loos profesionales que buscan empleo en el campo de la
|
340 |
-
ciencia de datos deben enfocarse en adquirir habilidades y experiencia relevantes, especialmente en áreas de alta demanda. Además, pueden considerar buscar oportunidades de trabajo remoto, ya que estas parecen ser predominantes en la industria.
|
341 |
-
""", unsafe_allow_html=True)
|
342 |
-
|
343 |
-
st.markdown("""
|
344 |
-
<h2>Dashboards especializados como herramientas de Análisis</h2>
|
345 |
-
<hr>
|
346 |
-
""", unsafe_allow_html=True)
|
347 |
-
|
348 |
-
st.markdown("""
|
349 |
-
<h4>Dashboard General Data Jobs</h4>
|
350 |
-
""", unsafe_allow_html=True)
|
351 |
-
|
352 |
-
# Cargar y mostrar la imagen
|
353 |
-
imagen_2 = "./assets/Dashboard_General_Data_Jobs.png"
|
354 |
-
st.image(imagen_2, caption="Dashboard General Data Jobs.",
|
355 |
-
use_column_width=True)
|
356 |
-
|
357 |
-
st.markdown("""
|
358 |
-
<a href="https://public.tableau.com/views/latam_brain_mvp_la
|
359 |
-
/DashboardGeneralDataJobs?:language=es-ES&publish=yes&:display_count
|
360 |
-
=n&:origin=viz_share_link">Dashboard Dinámico - General Data Jobs</a>
|
361 |
-
""", unsafe_allow_html=True)
|
362 |
-
|
363 |
-
st.markdown("""
|
364 |
-
<h3><q>El futuro del empleo en Ciencia de Datos: Un vistazo a nuestros
|
365 |
-
revolucionarios Dashboards de Análisis</q> - <cite>LatamBrain</cite>
|
366 |
-
""", unsafe_allow_html=True)
|
367 |
-
|
368 |
-
st.markdown("""
|
369 |
-
<p>Nuestro <strong>Dashboard General Data Jobs</strong> cuenta con una
|
370 |
-
serie de
|
371 |
-
gráficos esclarecedores que abarcan diferentes aspectos del mercado
|
372 |
-
laboral en el campo de la Ciencia de Datos. El dashboard que atraves
|
373 |
-
de cada uno de los gráficos nos muestra información pertinente para
|
374 |
-
la toma de decisiones informadas y estratégicas.</p>
|
375 |
-
""", unsafe_allow_html=True)
|
376 |
-
|
377 |
-
st.markdown("""
|
378 |
-
<h3>Gráficos y lo que nos permiten visualizar</h3>
|
379 |
-
""", unsafe_allow_html=True)
|
380 |
-
|
381 |
-
st.markdown("""
|
382 |
-
<ol>
|
383 |
-
<li><strong>Participación de empleos por rol:</strong> Este gráfico
|
384 |
-
muestra la
|
385 |
-
distribución de empleos en el ámbito de la Ciencia de Datos entre diferentes roles, como científicos, analistas, ingenieros y especialistas en Machine Learning. Con esta información, podrán identificar las áreas de mayor demanda y adaptar sus estrategias de reclutamiento o formación en consecuencia.
|
386 |
-
<li><strong>Participación de empleos por tipo:</strong> Aquí,
|
387 |
-
visualizamos la
|
388 |
-
proporción de empleos según su tipo: tiempo completo, freelance, pasantías y contratos. Esto les permitirá evaluar la naturaleza del mercado laboral y considerar qué tipo de contratación es más adecuado para sus necesidades empresariales.
|
389 |
-
<li><strong>Participación de mercado en empleos por
|
390 |
-
modalidad:</strong>
|
391 |
-
Este gráfico
|
392 |
-
compara la cantidad de empleos que son presenciales y remotos, lo que les ayudará a comprender la prevalencia de cada modalidad y adaptar sus ofertas de trabajo para satisfacer las expectativas de los profesionales en la actualidad.
|
393 |
-
<li><strong>Salario promedio anual por antigüedad:</strong> Aquí,
|
394 |
-
observamos la
|
395 |
-
relación entre el salario promedio anual y la antigüedad del empleado, desde ejecutivos hasta empleados de nivel inicial. Este conocimiento les permitirá establecer salarios competitivos y atractivos para atraer y retener talento en cada nivel de experiencia.
|
396 |
-
<li><strong>Salario promedio anual por rol:</strong> Este gráfico
|
397 |
-
muestra el salario
|
398 |
-
promedio anual en función del rol, ya sea científico, analista, ingeniero o especialista en Machine Learning. Con esta información, podrán comparar los salarios entre roles y asegurarse de que sus ofertas salariales sean competitivas dentro del mercado.
|
399 |
-
<li><strong>Participación de mercado por país:</strong> Aquí,
|
400 |
-
analizamos la
|
401 |
-
distribución geográfica de los empleos en Ciencia de Datos, lo que les permitirá identificar las áreas geográficas con mayor demanda de profesionales y ajustar sus estrategias de contratación o expansión en consecuencia.
|
402 |
-
<li><strong>Top 10 países por salario promedio anual:</strong> Por
|
403 |
-
último,
|
404 |
-
este gráfico presenta los 10 países con los salarios promedio anuales más altos en el ámbito de la Ciencia de Datos. Este conocimiento les permitirá evaluar la competitividad de sus salarios a nivel internacional y tomar decisiones informadas sobre dónde enfocar sus esfuerzos de contratación.
|
405 |
-
""", unsafe_allow_html=True)
|
406 |
-
|
407 |
-
st.markdown("""
|
408 |
-
<h4>Dashboard Latino América Data Jobs</h4>
|
409 |
-
""", unsafe_allow_html=True)
|
410 |
-
|
411 |
-
# Cargar y mostrar la imagen
|
412 |
-
imagen_3 = "./assets/Dashboard_Latinoamerica_Data_Jobs.png"
|
413 |
-
st.image(imagen_3, caption="Dashboard Latinoamerica Data Jobs.",
|
414 |
-
use_column_width=True)
|
415 |
-
|
416 |
-
st.markdown("""
|
417 |
-
<a href="https://public.tableau.com/views/latam_brain_mvp_la
|
418 |
-
/DashboardLatinoamericaDataJobs?:language=es-ES&publish=yes
|
419 |
-
&:display_count=n&:origin=viz_share_link">Dashboard Dinámico -
|
420 |
-
Latinoamerica Data Jobs</a>
|
421 |
-
""", unsafe_allow_html=True)
|
422 |
-
|
423 |
-
st.markdown("""
|
424 |
-
<p>Nuestro <strong>Dashboard Latinoamérica Data Jobs</strong> es una
|
425 |
-
solución integral
|
426 |
-
diseñada para proporcionar información valiosa sobre el panorama del
|
427 |
-
empleo en el ámbito de la ciencia de datos en América Latina. Esta
|
428 |
-
herramienta fácil de usar presenta una serie de gráficos que abarcan
|
429 |
-
diversos aspectos del mercado laboral en la región, permitiéndoles
|
430 |
-
tomar decisiones informadas y estratégicas en sus esfuerzos de contratación y expansión. A continuación, les presento una descripción de los gráficos incluidos en nuestro dashboard:</p>
|
431 |
-
""", unsafe_allow_html=True)
|
432 |
-
|
433 |
-
st.markdown("""
|
434 |
-
<h3>Gráficos y lo que nos permiten visualizar</h3>
|
435 |
-
""", unsafe_allow_html=True)
|
436 |
-
|
437 |
-
st.markdown("""
|
438 |
-
<ol>
|
439 |
-
<li><strong>Participación de Mercado Latinoamericano por
|
440 |
-
país:</strong>
|
441 |
-
Este
|
442 |
-
gráfico
|
443 |
-
muestra el porcentaje de participación de cada país en cuanto a la cantidad de empleos de data en América Latina. Con esta información, podrán identificar los países con mayor demanda de profesionales en ciencia de datos y enfocar sus esfuerzos de contratación y expansión en consecuencia.
|
444 |
-
<li><strong>Salario Promedio Anual por Región:</strong> Aquí,
|
445 |
-
comparamos el salario
|
446 |
-
promedio anual en el mundo y en América Latina en el ámbito de la ciencia de datos. Esta comparación les permitirá evaluar la competitividad de los salarios en la región y tomar decisiones informadas sobre cómo atraer y retener talento.
|
447 |
-
<li><strong>Participación del mercado en Empleos Data en América
|
448 |
-
Latina:</strong>
|
449 |
-
Este gráfico presenta la participación de cada país en el mercado de empleos de data en América Latina, así como el porcentaje de modalidad (presencial y remota) en cada país. Con esta información, podrán evaluar las tendencias de contratación en la región y adaptar sus ofertas de trabajo para satisfacer las expectativas de los profesionales en el ámbito de la ciencia de datos.
|
450 |
-
<li><strong>Participación de mercado en empleos Data por Rol en
|
451 |
-
porcentaje: </strong>
|
452 |
-
Este gráfico muestra la distribución de empleos en el ámbito de la ciencia de datos en América Latina entre diferentes roles, como científicos, analistas, ingenieros y especialistas en Machine Learning. Con esta información, podrán identificar las áreas de mayor demanda y adaptar sus estrategias de reclutamiento o formación en consecuencia.
|
453 |
-
<li><strong>Salario Promedio Anual en USD por país:</strong> Por
|
454 |
-
último,
|
455 |
-
este gráfico presenta el salario promedio anual en dólares estadounidenses para cada país en América Latina. Este conocimiento les permitirá evaluar la competitividad de sus salarios a nivel regional y tomar decisiones informadas sobre dónde enfocar sus esfuerzos de contratación.
|
456 |
-
""", unsafe_allow_html=True)
|
457 |
-
|
458 |
-
st.markdown("""
|
459 |
-
<p><strong>En resumen,</strong> nuestros revolucionarios Dashboards de
|
460 |
-
Análisis son
|
461 |
-
unas herramientas poderosas que les proporcionan información valiosa
|
462 |
-
sobre el mercado laboral en el ámbito de la Ciencia de Datos. Al
|
463 |
-
aprovechar esta información, podrán tomar decisiones informadas y
|
464 |
-
estratégicas que les permitirán atraer y retener a los mejores
|
465 |
-
talentos en el campo, mantenerse competitivos en el mercado y, en última instancia, impulsar el crecimiento y éxito de su empresa.</p>
|
466 |
-
""", unsafe_allow_html=True)
|
467 |
-
|
468 |
-
st.markdown("""
|
469 |
-
<p>Nuestro equipo de expertos en ciencia de datos y análisis ha
|
470 |
-
trabajado incansablemente para diseñar y desarrollar este dashboard,
|
471 |
-
asegurando que sea fácil de usar, visualmente atractivo y, lo más
|
472 |
-
importante, útil en la toma de decisiones empresariales.</p>
|
473 |
-
""", unsafe_allow_html=True)
|
474 |
-
|
475 |
-
st.markdown("""
|
476 |
-
<p>Les invitamos a explorar nuestro Dashboard de Análisis y
|
477 |
-
experimentar por sí mismos cómo esta herramienta puede transformar la forma en que abordan el empleo en el ámbito de la Ciencia de Datos. Estamos seguros de que, al integrar esta información en sus estrategias de contratación, formación y desarrollo, podrán mantenerse a la vanguardia en este campo en constante evolución y crecimiento.</p>
|
478 |
-
""", unsafe_allow_html=True)
|
479 |
-
|
480 |
-
st.markdown("""
|
481 |
-
<p>Si tienen alguna pregunta o necesitan más información sobre cómo
|
482 |
-
nuestros Dashboards de Análisis puede ayudarles a alcanzar sus
|
483 |
-
objetivos empresariales, no duden en ponerse en contacto con
|
484 |
-
nosotros. Estamos aquí para apoyarles en cada paso del camino hacia
|
485 |
-
el éxito en el emocionante mundo de la Ciencia de Datos.</p>
|
486 |
-
""", unsafe_allow_html=True)
|
487 |
-
|
488 |
-
|
489 |
-
main()
|
490 |
-
# if __name__ == "__main__":
|
491 |
-
# main()
|
492 |
-
|
493 |
-
#####
|
494 |
if selected2 == "ML":
|
495 |
-
|
496 |
-
<br>
|
497 |
-
<h3>Predicción de Tendencias sobre puestos de trabajo con un modelo
|
498 |
-
de Regresión Lineal</h3>
|
499 |
-
<p>Este modelo predice la cantidad de puestos laborales para un año X sobre Data, según los resultados que tiene en la base de datos</p>
|
500 |
-
<hr>
|
501 |
-
''', unsafe_allow_html=True)
|
502 |
-
|
503 |
-
# st.set_page_config(page_title="Predicción de nuevos puestos de trabajo",
|
504 |
-
# page_icon=":bar_chart:", layout="wide")
|
505 |
-
|
506 |
-
# Cargar los datos
|
507 |
-
|
508 |
-
# Seleccionar las columnas relevantes
|
509 |
-
df_relevant = df[['job_title', 'work_year']]
|
510 |
-
|
511 |
-
# Transformar la columna work_year en un tipo date en la columna date
|
512 |
-
df_relevant['date'] = pd.to_datetime(df_relevant['work_year'], format='%Y')
|
513 |
-
|
514 |
-
# Agregar una columna con el año de creación
|
515 |
-
df_relevant['year'] = pd.DatetimeIndex(df_relevant['date']).year
|
516 |
-
|
517 |
-
# Contar la cantidad de job_title creados por año
|
518 |
-
job_title_count = df_relevant.groupby('year').count()['job_title']
|
519 |
-
|
520 |
-
# Crear un dataframe con la cantidad de job_title creados por año
|
521 |
-
df_job_title_count = pd.DataFrame(
|
522 |
-
{'year': job_title_count.index,
|
523 |
-
'job_title_count': job_title_count.values})
|
524 |
-
|
525 |
-
# Crear un modelo de regresión lineal
|
526 |
-
model = LinearRegression()
|
527 |
|
528 |
-
|
529 |
-
X = df_job_title_count[['year']]
|
530 |
-
y = df_job_title_count['job_title_count']
|
531 |
-
model.fit(X, y)
|
532 |
-
|
533 |
-
# Obtener el año actual
|
534 |
-
current_year = datetime.datetime.now().year
|
535 |
-
|
536 |
-
# Predecir la cantidad de nuevos job_title que se crearán este año
|
537 |
-
current_year_input = st.number_input('Ingresa un año:', value=current_year,
|
538 |
-
min_value=current_year,
|
539 |
-
max_value=2050, step=1)
|
540 |
-
if current_year_input < current_year:
|
541 |
-
st.warning('Solo se pueden hacer predicciones para años futuros.')
|
542 |
-
current_year_input = current_year
|
543 |
-
st.write('Se usará el año actual:', current_year_input)
|
544 |
-
|
545 |
-
with st.spinner('Prediciendo...'):
|
546 |
-
time.sleep(1)
|
547 |
-
job_title_count_pred = model.predict([[current_year_input]])
|
548 |
-
|
549 |
-
# Obtener el último año del dataset
|
550 |
-
last_year = df_job_title_count['year'].max()
|
551 |
-
last_year_count = \
|
552 |
-
df_job_title_count.loc[df_job_title_count['year'] == last_year][
|
553 |
-
'job_title_count'].values[0]
|
554 |
-
|
555 |
-
# Mostrar resultados
|
556 |
-
st.write(
|
557 |
-
"Se crearán aproximadamente **{}** nuevos puestos de trabajo este año **{}**.".format(
|
558 |
-
int(job_title_count_pred), current_year_input))
|
559 |
-
percentage_change = (
|
560 |
-
job_title_count_pred - last_year_count) / last_year_count * 100
|
561 |
-
percentage_change = float(percentage_change)
|
562 |
-
if percentage_change >= 0:
|
563 |
-
st.write(
|
564 |
-
"Esto representa un aumento del {:.2f}% con respecto al año {}.".format(
|
565 |
-
percentage_change, last_year))
|
566 |
-
else:
|
567 |
-
st.write(
|
568 |
-
"Esto representa una disminución del {:.2f}% con respecto al año {}".format(
|
569 |
-
abs(percentage_change), last_year))
|
570 |
-
|
571 |
-
# Crear un gráfico de línea
|
572 |
-
line_chart = alt.Chart(df_job_title_count).mark_line().encode(
|
573 |
-
x='year',
|
574 |
-
y='job_title_count'
|
575 |
-
).properties(
|
576 |
-
title='Cantidad de nuevos puestos de trabajo por año',
|
577 |
-
width=300,
|
578 |
-
height=200
|
579 |
-
).configure_axis(
|
580 |
-
labelFontSize=14,
|
581 |
-
titleFontSize=16
|
582 |
-
)
|
583 |
-
|
584 |
-
# Crear un punto para mostrar el valor predicho
|
585 |
-
point = alt.Chart(df_job_title_count.iloc[-1:]).mark_point(
|
586 |
-
color='#5c62ac').encode(
|
587 |
-
x='year',
|
588 |
-
y='job_title_count'
|
589 |
-
)
|
590 |
-
|
591 |
-
# Mostrar la gráfica actualizada con el valor predicho para el año ingresado
|
592 |
-
# st.altair_chart(line_chart, use_container_width=True)
|
593 |
-
|
594 |
-
# Crear botón para graficar la predicción
|
595 |
-
if st.button('Mostrar gráfico de predicción'):
|
596 |
-
# Crear dataframe con los años y las predicciones
|
597 |
-
years = list(range(last_year, current_year + current_year_input - 2000))
|
598 |
-
predictions = model.predict([[year] for year in years])
|
599 |
-
df_predictions = pd.DataFrame(
|
600 |
-
{'year': years, 'job_title_count_pred': predictions})
|
601 |
-
|
602 |
-
# Crear gráfico de línea
|
603 |
-
line_chart = alt.Chart(df_predictions).mark_line().encode(
|
604 |
-
x='year',
|
605 |
-
y='job_title_count_pred'
|
606 |
-
).properties(
|
607 |
-
width=700,
|
608 |
-
height=400
|
609 |
-
)
|
610 |
-
|
611 |
-
# Agregar capa con punto violeta en el valor predicho para el año actual
|
612 |
-
current_year_pred = int(model.predict([[current_year_input]])[0])
|
613 |
-
point_chart = alt.Chart(pd.DataFrame(
|
614 |
-
{'x': [current_year_input], 'y': [current_year_pred]})).mark_point(
|
615 |
-
color='#5c62ac',
|
616 |
-
size=300,
|
617 |
-
stroke='#5c62ac',
|
618 |
-
strokeWidth=5).encode(
|
619 |
-
x='x',
|
620 |
-
y='y'
|
621 |
-
)
|
622 |
-
|
623 |
-
# # ocultar los títulos de los ejes x e y
|
624 |
-
# line_chart.configure_axis(
|
625 |
-
# x=None,
|
626 |
-
# y=None
|
627 |
-
# )
|
628 |
-
|
629 |
-
# Mostrar gráfico con la capa adicional del punto rojo
|
630 |
-
st.altair_chart(line_chart + point_chart)
|
631 |
-
|
632 |
-
st.markdown('''
|
633 |
-
<br><br><br>
|
634 |
-
<h2>Gracias por su <strong>tiempo y atención!</strong></h2>
|
635 |
-
<hr>
|
636 |
-
<h3>Nuevas Propuestas...</h3>
|
637 |
-
<p>Sí te gusto lo que viste, te invito a ver lo que se vendrá en la
|
638 |
-
sección <span style="font-weight:bold">"New"</span></p>
|
639 |
-
''', unsafe_allow_html=True)
|
640 |
-
|
641 |
-
#
|
642 |
if selected2 == "New":
|
|
|
643 |
|
644 |
-
|
645 |
-
my_bar = st.progress(0, text=progress_text)
|
646 |
-
|
647 |
-
for percent_complete in range(100):
|
648 |
-
time.sleep(0.05)
|
649 |
-
my_bar.progress(percent_complete + 1, text=progress_text)
|
650 |
-
|
651 |
-
#####
|
652 |
-
st.markdown("""
|
653 |
-
<h1>Proyectos en Beta</h1>
|
654 |
-
<hr>
|
655 |
-
<p>Estos proyectos todavía no están terminados, pero queremos mostrar un avance de lo que se viene muy pronto...</p>
|
656 |
-
""", unsafe_allow_html=True)
|
657 |
-
|
658 |
-
import pandas as pd
|
659 |
-
import streamlit as st
|
660 |
-
from sklearn.preprocessing import LabelEncoder
|
661 |
-
from sklearn.ensemble import RandomForestRegressor
|
662 |
-
|
663 |
-
# Leer los datos y seleccionar las columnas necesarias
|
664 |
-
df = pd.read_csv('./ML/ds_salaries.csv')
|
665 |
-
df = df[['company_location', 'salary_in_usd']]
|
666 |
-
|
667 |
-
# Codificar las ubicaciones de las empresas
|
668 |
-
le = LabelEncoder()
|
669 |
-
df['company_location'] = le.fit_transform(df['company_location'])
|
670 |
-
|
671 |
-
# Decodificar las ubicaciones de las empresas
|
672 |
-
decoded_locations = le.inverse_transform(df['company_location'].unique())
|
673 |
-
|
674 |
-
# Separar los datos de entrada y salida
|
675 |
-
X = df.iloc[:, :-1].values
|
676 |
-
y = df.iloc[:, -1].values
|
677 |
-
|
678 |
-
# Entrenar el modelo
|
679 |
-
model = RandomForestRegressor(n_estimators=100, random_state=42)
|
680 |
-
model.fit(X, y)
|
681 |
-
|
682 |
-
# Obtener las ubicaciones de las empresas y sus salarios predichos
|
683 |
-
locations = df['company_location'].unique()
|
684 |
-
predicted_salaries = model.predict(locations.reshape(-1, 1))
|
685 |
-
results_df = pd.DataFrame(
|
686 |
-
{'company_location': locations, 'predicted_salary': predicted_salaries})
|
687 |
-
|
688 |
-
# Decodificar las ubicaciones de las empresas
|
689 |
-
results_df['company_location'] = le.inverse_transform(
|
690 |
-
results_df['company_location'])
|
691 |
-
|
692 |
-
# Ordenar los resultados por salario predicho
|
693 |
-
results_df = results_df.sort_values('predicted_salary',
|
694 |
-
ascending=False).reset_index(drop=True)
|
695 |
-
|
696 |
-
# Mostrar el título y el top 5 de países mejor pagados
|
697 |
-
st.markdown("""
|
698 |
-
<h2>Top 5 de países mejor pagados</h2>
|
699 |
-
<hr>
|
700 |
-
""", unsafe_allow_html=True)
|
701 |
-
|
702 |
-
# Descripción
|
703 |
-
st.markdown("""
|
704 |
-
<p>Este código utiliza un algoritmo de <strong>RandomForest</strong>
|
705 |
-
para seleccionar solo algunas empresas de cada país de forma aleatoria y retornar el promedio. Utilizamos este algoritmo para obtener un promedio menos sesgado por outliers</p>
|
706 |
-
""", unsafe_allow_html=True)
|
707 |
-
|
708 |
-
for i in range(5):
|
709 |
-
location = results_df.loc[i, 'company_location']
|
710 |
-
salary = results_df.loc[i, 'predicted_salary']
|
711 |
-
st.markdown(f'### **{location}**: ${salary:,.2f}',
|
712 |
-
unsafe_allow_html=True)
|
713 |
-
|
714 |
-
# Mostrar el menú desplegable para seleccionar un país
|
715 |
-
st.markdown("""
|
716 |
-
<h2>Seleccionar un país</h2>
|
717 |
-
<hr>
|
718 |
-
""", unsafe_allow_html=True)
|
719 |
-
selected_location = st.selectbox('Ubicación de la empresa',
|
720 |
-
decoded_locations)
|
721 |
-
|
722 |
-
# Mostrar el salario predicho para el país seleccionado
|
723 |
-
predicted_salary = results_df.loc[results_df[
|
724 |
-
'company_location'] == selected_location, 'predicted_salary'].iloc[
|
725 |
-
0]
|
726 |
-
st.markdown(f'### **{selected_location}**: ${predicted_salary:,.2f}',
|
727 |
-
unsafe_allow_html=True)
|
728 |
-
|
729 |
-
#####
|
730 |
-
import pandas as pd
|
731 |
-
import streamlit as st
|
732 |
-
from sklearn.feature_extraction.text import CountVectorizer
|
733 |
-
from sklearn.naive_bayes import MultinomialNB
|
734 |
-
|
735 |
-
# Cargar los datos
|
736 |
-
df = pd.read_csv('./assets/dataset_modelo_1.csv')
|
737 |
-
|
738 |
-
# Crear una lista con todas las skills disponibles
|
739 |
-
all_skills = set()
|
740 |
-
for skills in df.skills:
|
741 |
-
all_skills.update(skills.split(", "))
|
742 |
-
|
743 |
-
# Crear un diccionario que relaciona cada skill con su índice en el vector
|
744 |
-
skill_indices = {skill: i for i, skill in enumerate(all_skills)}
|
745 |
-
|
746 |
-
# Crear una matriz de características con la frecuencia de cada skill en cada fila
|
747 |
-
vectorizer = CountVectorizer(vocabulary=skill_indices.keys(),
|
748 |
-
lowercase=False)
|
749 |
-
X = vectorizer.fit_transform(df.skills)
|
750 |
-
|
751 |
-
# Entrenar el modelo
|
752 |
-
clf = MultinomialNB()
|
753 |
-
clf.fit(X, df.Aptitude)
|
754 |
-
|
755 |
-
# Crear la interfaz de usuario con Streamlit
|
756 |
-
st.markdown("""
|
757 |
-
<h2>Predicción de Skills</h2>
|
758 |
-
<hr>
|
759 |
-
""", unsafe_allow_html=True)
|
760 |
-
st.markdown(
|
761 |
-
"""
|
762 |
-
<p>Ingrese el título del trabajo para ver las habilidades más
|
763 |
-
importantes.</p>
|
764 |
-
<p>Con el modelo de <strong>Naive Bayes</strong> cada skill recibe
|
765 |
-
una puntuación con respecto a un título de trabajo, por lo cual,
|
766 |
-
al ingresar un título de trabajo el algoritmo retorna las skill más
|
767 |
-
utilizadas en las publicaciones de la base de dato de LatamBrain.
|
768 |
-
""", unsafe_allow_html=True)
|
769 |
-
|
770 |
-
title = st.text_input("Título del trabajo")
|
771 |
-
|
772 |
-
|
773 |
-
# Crear una función que encuentra las habilidades más importantes para un título dado
|
774 |
-
def get_top_skills(title, limit):
|
775 |
-
# Filtrar el dataframe por el título dado
|
776 |
-
filtered_df = df[df.job_title.str.contains(title, case=False)]
|
777 |
-
|
778 |
-
# Crear una matriz de características con la frecuencia de cada skill en el dataframe filtrado
|
779 |
-
X_filtered = vectorizer.transform(filtered_df.skills)
|
780 |
-
|
781 |
-
# Calcular la frecuencia de cada habilidad en el dataframe filtrado
|
782 |
-
skill_frequencies = X_filtered.sum(axis=0).A1
|
783 |
-
|
784 |
-
# Obtener los nombres de las habilidades
|
785 |
-
skill_names = vectorizer.vocabulary_.keys()
|
786 |
-
|
787 |
-
# Crear un diccionario que relaciona cada habilidad con su frecuencia
|
788 |
-
skill_freq_dict = dict(zip(skill_names, skill_frequencies))
|
789 |
-
|
790 |
-
# Ordenar las habilidades por frecuencia descendente y devolver las más importantes (según el límite dado)
|
791 |
-
top_skills = sorted(skill_freq_dict, key=skill_freq_dict.get,
|
792 |
-
reverse=True)[:limit]
|
793 |
-
return top_skills
|
794 |
-
|
795 |
-
|
796 |
-
if title:
|
797 |
-
limit = st.number_input("Cantidad de habilidades a mostrar", value=5,
|
798 |
-
min_value=1, max_value=len(all_skills))
|
799 |
-
top_skills = get_top_skills(title, limit)
|
800 |
-
st.write(
|
801 |
-
f"Las {limit} habilidades más importantes para el trabajo de '{title}' son:")
|
802 |
-
for skill in top_skills:
|
803 |
-
st.write(f"- {skill}")
|
804 |
-
|
805 |
-
#####
|
806 |
-
|
807 |
if selected2 == "Contact":
|
808 |
-
|
809 |
-
st.markdown('''
|
810 |
-
<h2>Simulación de <strong>Presupuesto</strong></h2>
|
811 |
-
<hr>
|
812 |
-
''', unsafe_allow_html=True)
|
813 |
-
|
814 |
-
# Define los precios para cada opción
|
815 |
-
precio_analisis = 3500
|
816 |
-
precio_ML = 5500
|
817 |
-
precio_app = 3000
|
818 |
-
precio_mantenimiento = 550
|
819 |
-
|
820 |
-
# Define las opciones como un diccionario de la forma {nombre_opción: precio_opción}
|
821 |
-
opciones = {
|
822 |
-
"Opción 1": precio_analisis,
|
823 |
-
"Opción 2": precio_ML,
|
824 |
-
"Opción 3": precio_app,
|
825 |
-
"Opción 4": precio_mantenimiento
|
826 |
-
}
|
827 |
-
|
828 |
-
# Crea un checkbox para cada opción
|
829 |
-
analisis = st.checkbox("Análisis y Reportes")
|
830 |
-
ML = st.checkbox("Algoritmos de ML aplicado")
|
831 |
-
app = st.checkbox("Creación de una App")
|
832 |
-
# mantenimiento = st.checkbox('Mantenimiento')
|
833 |
-
|
834 |
-
# Crea un campo numérico para la cantidad
|
835 |
-
cantidad = st.number_input("Meses de mantenimiento:", min_value=0, value=0)
|
836 |
-
|
837 |
-
mes_mantenimiento = cantidad * precio_mantenimiento
|
838 |
-
|
839 |
-
# Calcula el total en función de las opciones elegidas
|
840 |
-
total = mes_mantenimiento + sum(
|
841 |
-
[opciones[opcion] for opcion, seleccionada in zip(opciones.keys(),
|
842 |
-
[analisis, ML,
|
843 |
-
app]) if
|
844 |
-
seleccionada])
|
845 |
-
|
846 |
-
# Muestra el total
|
847 |
-
st.markdown(f'''
|
848 |
-
Total $: <span style="background:#5c62ac;\
|
849 |
-
border-radius:5px;padding:5px">{total}</span>
|
850 |
-
:rocket:
|
851 |
-
''', unsafe_allow_html=True)
|
852 |
-
|
853 |
-
st.markdown('''
|
854 |
-
<br>
|
855 |
-
<h2>Datos de contactos</h2>
|
856 |
-
<hr>
|
857 |
-
''', unsafe_allow_html=True)
|
858 |
-
# Crea campos de entrada para el nombre, correo electrónico y mensaje
|
859 |
-
nombre = st.text_input("Nombre completo")
|
860 |
-
email = st.text_input("Correo electrónico")
|
861 |
-
mensaje = st.text_area("Mensaje")
|
862 |
-
|
863 |
-
# Crea un botón para enviar el formulario
|
864 |
-
enviar = st.button("Enviar")
|
865 |
-
|
866 |
-
# Si el botón es presionado, muestra un mensaje de confirmación
|
867 |
-
if enviar:
|
868 |
-
if nombre and email and mensaje:
|
869 |
-
|
870 |
-
st.write(
|
871 |
-
"¡Gracias por tu mensaje! Nos pondremos en contacto contigo pronto.")
|
872 |
-
else:
|
873 |
-
st.error("Por favor completa todos los campos requeridos.")
|
|
|
1 |
+
# librerias
|
|
|
|
|
|
|
|
|
2 |
import streamlit as st
|
|
|
|
|
|
|
3 |
from streamlit_option_menu import option_menu
|
4 |
|
5 |
+
# paginas
|
6 |
+
from page.analisis import Analisis
|
7 |
+
from page.contact import Contact
|
8 |
+
from page.home import Home
|
9 |
+
from page.machine_learning import ML
|
10 |
+
from page.new import New
|
|
|
|
|
11 |
|
12 |
+
# link necesario para bootstrap
|
13 |
st.markdown("""<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
|
14 |
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>""",
|
15 |
unsafe_allow_html=True)
|
|
|
19 |
icons=['house', 'bi-archive', "bi-robot",
|
20 |
"bi-arrow-up-right-square",
|
21 |
"bi-envelope"],
|
22 |
+
menu_icon="cast",
|
23 |
+
default_index=0,
|
24 |
orientation="horizontal",
|
|
|
25 |
)
|
26 |
|
27 |
+
# Home
|
28 |
if selected2 == "Home":
|
29 |
+
Home()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
|
31 |
+
# Análisis
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
if selected2 == "Análisis":
|
33 |
+
Analisis()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
|
35 |
+
# ML
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
if selected2 == "ML":
|
37 |
+
ML()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
|
39 |
+
# New
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
if selected2 == "New":
|
41 |
+
New()
|
42 |
|
43 |
+
# Contact
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
if selected2 == "Contact":
|
45 |
+
Contact()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
page/__pycache__/analisis.cpython-310.pyc
ADDED
Binary file (2.83 kB). View file
|
|
page/__pycache__/contact.cpython-310.pyc
ADDED
Binary file (1.81 kB). View file
|
|
page/__pycache__/home.cpython-310.pyc
ADDED
Binary file (6.07 kB). View file
|
|
page/__pycache__/machine_learning.cpython-310.pyc
ADDED
Binary file (3.6 kB). View file
|
|
page/__pycache__/new.cpython-310.pyc
ADDED
Binary file (4.27 kB). View file
|
|
page/analisis.py
ADDED
@@ -0,0 +1,382 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
|
3 |
+
|
4 |
+
def Analisis():
|
5 |
+
# Titulo
|
6 |
+
# st.markdown('''
|
7 |
+
# <h1 style="text-shadow:0 0 10px #5c62ac;font-weight:bold">Data
|
8 |
+
# World Jobs</h1>
|
9 |
+
# ''', unsafe_allow_html=True)
|
10 |
+
|
11 |
+
# Propuesta
|
12 |
+
# st.markdown("""
|
13 |
+
# <h2>Propuesta de Proyecto</h2>
|
14 |
+
# <hr>
|
15 |
+
# """,
|
16 |
+
# unsafe_allow_html=True)
|
17 |
+
# st.markdown("""
|
18 |
+
# <p>Es por todo esto que <strong>Latam Brain</strong>, una empresa
|
19 |
+
# líder en ciencia de datos, ha diseñado un proyecto revolucionario
|
20 |
+
# que aborda este desafío de frente. </p>
|
21 |
+
# <ul>Este proyecto se basa en cuatro objetivos fundamentales:
|
22 |
+
# <li> Recopilar datos de todas las ofertas de empleo relacionadas
|
23 |
+
# con la ciencia de datos y crear un data warehouse, un recurso
|
24 |
+
# invaluable para almacenar y analizar información de manera
|
25 |
+
# eficiente.
|
26 |
+
# <li> Obtener un panorama general de la situación actual del
|
27 |
+
# mercado laboral en el ámbito de la ciencia de datos tanto a
|
28 |
+
# nivel mundial como en América Latina.
|
29 |
+
# <li> Identificar las características clave que definen a los
|
30 |
+
# profesionales en este campo, como habilidades, herramientas y
|
31 |
+
# funciones, y su relación con el nivel de salario.
|
32 |
+
# <li> Crear un modelo predictivo utilizando Machine Learning para
|
33 |
+
# identificar patrones y tendencias en los datos generados por
|
34 |
+
# las distintas fuentes de información.
|
35 |
+
# </ul>
|
36 |
+
# """, unsafe_allow_html=True)
|
37 |
+
#
|
38 |
+
# st.markdown(
|
39 |
+
# """
|
40 |
+
# <div style="font-weight:bold;font-size:1.5rem;width:60vw;margin:auto;
|
41 |
+
# border-radius:10px;padding:10px">
|
42 |
+
# <cite >Nuestro proyecto, con su amplio alcance y enfoque en el
|
43 |
+
# análisis exhaustivo de las ofertas laborales,busca revolucionar
|
44 |
+
# la forma en que las empresas de reclutamiento identifican y
|
45 |
+
# contratan a profesionales especializados en ciencia de datos y
|
46 |
+
# análisis.</cite>
|
47 |
+
# </div>
|
48 |
+
# <br>
|
49 |
+
# """, unsafe_allow_html=True)
|
50 |
+
# st.markdown("""
|
51 |
+
# <ul><strong style="font-size:1.5rem">Lo que te ofrecemos:</strong>
|
52 |
+
# <li><strong>Base de Datos en la nube (aws)</strong> que nos ayude a
|
53 |
+
# descubrir las
|
54 |
+
# habilidades y
|
55 |
+
# herramientas más demandadas en el mercado. Con esta información, pueden
|
56 |
+
# afinar su búsqueda y encontrar a los candidatos ideales para sus clientes. A su vez,
|
57 |
+
# los candidatos pueden mejorar sus habilidades y aumentar sus posibilidades de
|
58 |
+
# conseguir empleo en empresas que se ajusten a sus metas profesionales.
|
59 |
+
# <li><strong>Dashboards de Analítica</strong> que nos permita
|
60 |
+
# visualizar las
|
61 |
+
# tendencias y características
|
62 |
+
# que nos permitan tomar mejores decisiones en el mercado laboral dedicado en
|
63 |
+
# este caso a Data.
|
64 |
+
# <li><strong>El modelo predictivo de Machine Learning,</strong>
|
65 |
+
# como el cerebro detrás
|
66 |
+
# de todo el
|
67 |
+
# proyecto, permitirá anticipar tendencias y patrones en la demanda de talento, lo
|
68 |
+
# que permitirá a las empresas de reclutamiento estar siempre un paso adelante y
|
69 |
+
# adaptarse a las necesidades cambiantes del mercado.
|
70 |
+
# </ul>
|
71 |
+
# """, unsafe_allow_html=True)
|
72 |
+
#
|
73 |
+
# st.markdown(
|
74 |
+
# """<p>Con este proyecto, Latam Brain no solo está cambiando el juego en
|
75 |
+
# la industria del reclutamiento, sino que también está creando un puente
|
76 |
+
# entre el talento y las empresas en la era del Big Data. Juntos, estamos
|
77 |
+
# construyendo un futuro donde las empresas y los profesionales pueden
|
78 |
+
# alcanzar su máximo potencial, gracias a la unión perfecta entre la
|
79 |
+
# ciencia de datos y el reclutamiento en la era de la Transformación
|
80 |
+
# Digital</p>""",
|
81 |
+
# unsafe_allow_html=True)
|
82 |
+
|
83 |
+
# Opción comercial
|
84 |
+
|
85 |
+
|
86 |
+
# Análisis y Recomendación
|
87 |
+
# st.markdown("""
|
88 |
+
# <h2>Análisis de mercado y recomendaciones</h2>
|
89 |
+
# <hr>
|
90 |
+
# """,
|
91 |
+
# unsafe_allow_html=True)
|
92 |
+
|
93 |
+
# Dashboard General
|
94 |
+
# st.markdown("""
|
95 |
+
# <h4>¡Descubre el panorama completo del mercado laboral de
|
96 |
+
# Data con nuestro Dashboard de Empleos Data!</h4>
|
97 |
+
# """, unsafe_allow_html=True)
|
98 |
+
|
99 |
+
# imagen_1 = "./assets/Dashboard_Vistazo_al_Mercado_Actual.png"
|
100 |
+
# st.image(imagen_1, caption="Dashboard de Empleos Data",
|
101 |
+
# use_column_width=True)
|
102 |
+
|
103 |
+
# # st.markdown("""
|
104 |
+
# <a href="https://public.tableau.com/views/latam_brain_context
|
105 |
+
# /DashboardVistazoelMercadoActual?:language=es-ES&publish=yes
|
106 |
+
# &:display_count=n&:origin=viz_share_link"> Dashboard - Tableau</a>
|
107 |
+
# """, unsafe_allow_html=True)
|
108 |
+
|
109 |
+
# Análisis
|
110 |
+
# st.markdown("""
|
111 |
+
# <h3>Análisis</h3>
|
112 |
+
# <hr>
|
113 |
+
# """, unsafe_allow_html=True)
|
114 |
+
|
115 |
+
# st.markdown("""
|
116 |
+
# <ol>
|
117 |
+
# <li> El salario promedio anual en empleos de data ha experimentado
|
118 |
+
# un crecimiento significativo (30%) entre 2019 y 2020, lo que indica una alta demanda y valoración de los profesionales en este campo.
|
119 |
+
# <li> El número de empleos relacionados con data ha aumentado en un
|
120 |
+
# sorprendente 450%, lo que demuestra un interés creciente por parte de las empresas en contratar profesionales con habilidades en ciencia de datos y análisis.
|
121 |
+
# <li> La mayoría de los empleados en este campo se encuentran en
|
122 |
+
# compañías medianas (más del 50%), lo que sugiere que estas empresas podrían estar invirtiendo más en ciencia de datos y análisis que las pequeñas o grandes empresas.
|
123 |
+
# <li> En cuanto a la antigüedad, hay una mayor cantidad de empleados
|
124 |
+
# en puestos senior, seguido de semisenior, junior y, por último, expert. Esto indica que las empresas están buscando profesionales con experiencia en el campo, aunque también hay oportunidades para aquellos con menos experiencia.
|
125 |
+
# <li> La mayoría de los empleos en este campo se ofrecen en
|
126 |
+
# modalidad remota, lo que puede atraer a una amplia gama de candidatos y permitir una mayor flexibilidad en la contratación y el trabajo.
|
127 |
+
# """, unsafe_allow_html=True)
|
128 |
+
|
129 |
+
# Opción comercial
|
130 |
+
|
131 |
+
|
132 |
+
# Recomendación
|
133 |
+
# st.markdown("""
|
134 |
+
# <h3>Recomendaciones</h3>
|
135 |
+
# <hr>
|
136 |
+
# """, unsafe_allow_html=True)
|
137 |
+
|
138 |
+
# st.markdown("""
|
139 |
+
# <li> Como empresa de reclutamiento, enfóquense en buscar
|
140 |
+
# candidatos con experiencia en ciencia de datos y análisis, ya que
|
141 |
+
# estos perfiles son altamente demandados. Además, consideren ofrecer
|
142 |
+
# capacitación y desarrollo profesional para ayudar a los candidatos
|
143 |
+
# a avanzar en sus carreras y mejorar sus habilidades.
|
144 |
+
# <li> Atraigan a los profesionales de la ciencia de datos ofreciendo
|
145 |
+
# salarios competitivos y oportunidades de crecimiento, ya que el
|
146 |
+
# salario promedio anual en este campo está en aumento.
|
147 |
+
# <li> Las pequeñas y grandes empresas podrían considerar aumentar su
|
148 |
+
# inversión en ciencia de datos y análisis, ya que las compañías
|
149 |
+
# medianas parecen estar liderando en este aspecto.
|
150 |
+
# <li> Las empresas deben adaptarse a las tendencias actuales de
|
151 |
+
# contratación y ofrecer puestos de trabajo en modalidad remota cuando
|
152 |
+
# sea posible. Esto no solo ampliará el grupo de candidatos, sino que
|
153 |
+
# también puede aumentar la satisfacción y la retención de los
|
154 |
+
# empleados.
|
155 |
+
# <li> Y para loos profesionales que buscan empleo en el campo de la
|
156 |
+
# ciencia de datos deben enfocarse en adquirir habilidades y
|
157 |
+
# experiencia relevantes, especialmente en áreas de alta demanda.
|
158 |
+
# Además, pueden considerar buscar oportunidades de trabajo remoto,
|
159 |
+
# ya que estas parecen ser predominantes en la industria.
|
160 |
+
# """, unsafe_allow_html=True)
|
161 |
+
|
162 |
+
|
163 |
+
|
164 |
+
# Dashboard Especifico
|
165 |
+
# st.markdown("""
|
166 |
+
# <h2>Dashboards especializados como herramientas de Análisis</h2>
|
167 |
+
# <hr>
|
168 |
+
# """, unsafe_allow_html=True)
|
169 |
+
|
170 |
+
# Opción comercial
|
171 |
+
|
172 |
+
|
173 |
+
|
174 |
+
# st.markdown("""
|
175 |
+
# <h4>"Descubre las Tendencias Laborales: Crecimiento Explosivo en Empleos de Ciencia de Datos y Análisis"</h4>
|
176 |
+
# """, unsafe_allow_html=True)
|
177 |
+
|
178 |
+
# Cargar y mostrar la imagen
|
179 |
+
# imagen_2 = "./assets/Dashboard_General_Data_Jobs.png"
|
180 |
+
# st.image(imagen_2, caption="Dashboard General Data Jobs.",
|
181 |
+
# use_column_width=True)
|
182 |
+
|
183 |
+
# st.markdown("""
|
184 |
+
# <a href="https://public.tableau.com/views/latam_brain_mvp_la
|
185 |
+
# /DashboardGeneralDataJobs?:language=es-ES&publish=yes&:display_count
|
186 |
+
# =n&:origin=viz_share_link">Dashboard - Tableau</a>
|
187 |
+
# """, unsafe_allow_html=True)
|
188 |
+
|
189 |
+
# Cita
|
190 |
+
# st.markdown("""
|
191 |
+
# <h3><q>El futuro del empleo en Ciencia de Datos: Un vistazo a
|
192 |
+
# nuestros
|
193 |
+
# revolucionarios Dashboards de Análisis</q> - <cite>LatamBrain</cite>
|
194 |
+
# """, unsafe_allow_html=True)
|
195 |
+
|
196 |
+
# st.markdown("""
|
197 |
+
# <p>Nuestro <strong>Dashboard General Data Jobs</strong> cuenta con
|
198 |
+
# una serie de gráficos esclarecedores que abarcan diferentes aspectos
|
199 |
+
# del mercado laboral en el campo de la Ciencia de Datos. El dashboard
|
200 |
+
# que atraves de cada uno de los gráficos nos muestra información
|
201 |
+
# pertinente para la toma de decisiones informadas y estratégicas.</p>
|
202 |
+
# """, unsafe_allow_html=True)
|
203 |
+
|
204 |
+
# Graficos
|
205 |
+
# st.markdown("""
|
206 |
+
# <h3>Gráficos y lo que nos permiten visualizar</h3>
|
207 |
+
# """, unsafe_allow_html=True)
|
208 |
+
|
209 |
+
# st.markdown("""
|
210 |
+
# <ol>
|
211 |
+
# <li><strong>Participación de empleos por rol:</strong> Este
|
212 |
+
# gráfico muestra la distribución de empleos en el ámbito de la
|
213 |
+
# Ciencia de Datos entre diferentes roles, como científicos,
|
214 |
+
# analistas, ingenieros y especialistas en Machine Learning. Con
|
215 |
+
# esta información, podrán identificar las áreas de mayor demanda
|
216 |
+
# y adaptar sus estrategias de reclutamiento o formación en
|
217 |
+
# consecuencia.
|
218 |
+
# <li><strong>Participación de empleos por tipo:</strong> Aquí,
|
219 |
+
# visualizamos la proporción de empleos según su tipo: tiempo
|
220 |
+
# completo, freelance, pasantías y contratos. Esto les permitirá
|
221 |
+
# evaluar la naturaleza del mercado laboral y considerar qué tipo
|
222 |
+
# de contratación es más adecuado para sus necesidades
|
223 |
+
# empresariales.
|
224 |
+
# <li><strong>Participación de mercado en empleos por
|
225 |
+
# modalidad:</strong> Este gráfico compara la cantidad de empleos
|
226 |
+
# que son presenciales y remotos, lo que les ayudará a comprender
|
227 |
+
# la prevalencia de cada modalidad y adaptar sus ofertas de
|
228 |
+
# trabajo para satisfacer las expectativas de los profesionales
|
229 |
+
# en la actualidad.
|
230 |
+
# <li><strong>Salario promedio anual por antigüedad:</strong>
|
231 |
+
# Aquí, observamos la relación entre el salario promedio anual y
|
232 |
+
# la antigüedad del empleado, desde ejecutivos hasta empleados de
|
233 |
+
# nivel inicial. Este conocimiento les permitirá establecer
|
234 |
+
# salarios competitivos y atractivos para atraer y retener talento
|
235 |
+
# en cada nivel de experiencia.
|
236 |
+
# <li><strong>Salario promedio anual por rol:</strong> Este
|
237 |
+
# gráfico muestra el salario promedio anual en función del rol, ya
|
238 |
+
# sea científico, analista, ingeniero o especialista en Machine
|
239 |
+
# Learning. Con esta información, podrán comparar los salarios
|
240 |
+
# entre roles y asegurarse de que sus ofertas salariales sean
|
241 |
+
# competitivas dentro del mercado.
|
242 |
+
# <li><strong>Participación de mercado por país:</strong> Aquí,
|
243 |
+
# analizamos la distribución geográfica de los empleos en Ciencia
|
244 |
+
# de Datos, lo que les permitirá identificar las áreas geográficas
|
245 |
+
# con mayor demanda de profesionales y ajustar sus estrategias de
|
246 |
+
# contratación o expansión en consecuencia.
|
247 |
+
# <li><strong>Top 10 países por salario promedio anual:</strong>
|
248 |
+
# Por último, este gráfico presenta los 10 países con los salarios
|
249 |
+
# promedio anuales más altos en el ámbito de la Ciencia de Datos.
|
250 |
+
# Este conocimiento les permitirá evaluar la competitividad de sus
|
251 |
+
# salarios a nivel internacional y tomar decisiones informadas
|
252 |
+
# sobre dónde enfocar sus esfuerzos de contratación.
|
253 |
+
# """, unsafe_allow_html=True)
|
254 |
+
|
255 |
+
# Dashboard Latino América
|
256 |
+
|
257 |
+
|
258 |
+
|
259 |
+
# st.markdown("""
|
260 |
+
# <h4>¡Descubre el panorama laboral de la Ciencia de Datos en
|
261 |
+
# Latinoamérica con nuestro Dashboard Latinoamérica Data Jobs!</h4>
|
262 |
+
# """, unsafe_allow_html=True)
|
263 |
+
|
264 |
+
# Cargar y mostrar la imagen
|
265 |
+
# imagen_3 = "./assets/Dashboard_Latinoamerica_Data_Jobs.png"
|
266 |
+
# st.image(imagen_3, caption="Dashboard Latinoamerica Data Jobs.",
|
267 |
+
# use_column_width=True)
|
268 |
+
#
|
269 |
+
# st.markdown("""
|
270 |
+
# <a href="https://public.tableau.com/views/latam_brain_mvp_la
|
271 |
+
# /DashboardLatinoamericaDataJobs?:language=es-ES&publish=yes
|
272 |
+
# &:display_count=n&:origin=viz_share_link">Dashboard - Tableau</a>
|
273 |
+
# """, unsafe_allow_html=True)
|
274 |
+
|
275 |
+
# st.markdown("""
|
276 |
+
# <p>Nuestro <strong>Dashboard Latinoamérica Data Jobs</strong> es una
|
277 |
+
# solución integral diseñada para proporcionar información valiosa
|
278 |
+
# sobre el panorama del empleo en el ámbito de la ciencia de datos en
|
279 |
+
# América Latina. Esta herramienta fácil de usar presenta una serie de
|
280 |
+
# gráficos que abarcan diversos aspectos del mercado laboral en la
|
281 |
+
# región, permitiéndoles tomar decisiones informadas y estratégicas en
|
282 |
+
# sus esfuerzos de contratación y expansión. A continuación, les
|
283 |
+
# presento una descripción de los gráficos incluidos en nuestro
|
284 |
+
# dashboard:</p>
|
285 |
+
# """, unsafe_allow_html=True)
|
286 |
+
|
287 |
+
# st.markdown("""
|
288 |
+
# <h3>Gráficos y lo que nos permiten visualizar</h3>
|
289 |
+
# """, unsafe_allow_html=True)
|
290 |
+
#
|
291 |
+
# st.markdown("""
|
292 |
+
# <ol>
|
293 |
+
# <li><strong>Participación de Mercado Latinoamericano por
|
294 |
+
# país:</strong> Este gráfico muestra el porcentaje de
|
295 |
+
# participación de cada país en cuanto a la cantidad de empleos de
|
296 |
+
# data en América Latina. Con esta información, podrán identificar
|
297 |
+
# los países con mayor demanda de profesionales en ciencia de
|
298 |
+
# datos y enfocar sus esfuerzos de contratación y expansión en
|
299 |
+
# consecuencia.
|
300 |
+
# <li><strong>Salario Promedio Anual por Región:</strong> Aquí,
|
301 |
+
# comparamos el salario promedio anual en el mundo y en América
|
302 |
+
# Latina en el ámbito de la ciencia de datos. Esta comparación les
|
303 |
+
# permitirá evaluar la competitividad de los salarios en la región
|
304 |
+
# y tomar decisiones informadas sobre cómo atraer y retener
|
305 |
+
# talento.
|
306 |
+
# <li><strong>Participación del mercado en Empleos Data en América
|
307 |
+
# Latina:</strong> Este gráfico presenta la participación de cada
|
308 |
+
# país en el mercado de empleos de data en América Latina, así
|
309 |
+
# como el porcentaje de modalidad (presencial y remota) en cada
|
310 |
+
# país. Con esta información, podrán evaluar las tendencias de
|
311 |
+
# contratación en la región y adaptar sus ofertas de trabajo para
|
312 |
+
# satisfacer las expectativas de los profesionales en el ámbito de
|
313 |
+
# la ciencia de datos.
|
314 |
+
# <li><strong>Participación de mercado en empleos Data por Rol en
|
315 |
+
# porcentaje: </strong> Este gráfico muestra la distribución de
|
316 |
+
# empleos en el ámbito de la ciencia de datos en América Latina
|
317 |
+
# entre diferentes roles, como científicos, analistas, ingenieros
|
318 |
+
# y especialistas en Machine Learning. Con esta información,
|
319 |
+
# podrán identificar las áreas de mayor demanda y adaptar sus
|
320 |
+
# estrategias de reclutamiento o formación en consecuencia.
|
321 |
+
# <li><strong>Salario Promedio Anual en USD por país:</strong> Por
|
322 |
+
# último, este gráfico presenta el salario promedio anual en
|
323 |
+
# dólares estadounidenses para cada país en América Latina. Este
|
324 |
+
# conocimiento les permitirá evaluar la competitividad de sus
|
325 |
+
# salarios a nivel regional y tomar decisiones informadas sobre
|
326 |
+
# dónde enfocar sus esfuerzos de contratación.
|
327 |
+
# """, unsafe_allow_html=True)
|
328 |
+
|
329 |
+
|
330 |
+
|
331 |
+
# st.markdown("""
|
332 |
+
# <p><strong>En resumen,</strong> nuestros revolucionarios Dashboards
|
333 |
+
# de Análisis son unas herramientas poderosas que les proporcionan
|
334 |
+
# información valiosa sobre el mercado laboral en el ámbito de la
|
335 |
+
# Ciencia de Datos. Al aprovechar esta información, podrán tomar
|
336 |
+
# decisiones informadas y estratégicas que les permitirán atraer y
|
337 |
+
# retener a los mejores talentos en el campo, mantenerse competitivos
|
338 |
+
# en el mercado y, en última instancia, impulsar el crecimiento y
|
339 |
+
# éxito de su empresa.</p>
|
340 |
+
# """, unsafe_allow_html=True)
|
341 |
+
|
342 |
+
# st.markdown("""
|
343 |
+
# <p>Nuestro equipo de expertos en ciencia de datos y análisis ha
|
344 |
+
# trabajado incansablemente para diseñar y desarrollar este dashboard,
|
345 |
+
# asegurando que sea fácil de usar, visualmente atractivo y, lo más
|
346 |
+
# importante, útil en la toma de decisiones empresariales.</p>
|
347 |
+
# """, unsafe_allow_html=True)
|
348 |
+
|
349 |
+
# st.markdown("""
|
350 |
+
# <p>Les invitamos a explorar nuestro Dashboard de Análisis y
|
351 |
+
# experimentar por sí mismos cómo esta herramienta puede transformar
|
352 |
+
# la forma en que abordan el empleo en el ámbito de la Ciencia de
|
353 |
+
# Datos. Estamos seguros de que, al integrar esta información en sus
|
354 |
+
# estrategias de contratación, formación y desarrollo, podrán
|
355 |
+
# mantenerse a la vanguardia en este campo en constante evolución y
|
356 |
+
# crecimiento.</p>
|
357 |
+
# """, unsafe_allow_html=True)
|
358 |
+
|
359 |
+
# st.markdown("""
|
360 |
+
# <p>Si tienen alguna pregunta o necesitan más información sobre cómo
|
361 |
+
# nuestros Dashboards de Análisis puede ayudarles a alcanzar sus
|
362 |
+
# objetivos empresariales, no duden en ponerse en contacto con
|
363 |
+
# nosotros. Estamos aquí para apoyarles en cada paso del camino hacia
|
364 |
+
# el éxito en el emocionante mundo de la Ciencia de Datos.</p>
|
365 |
+
# """, unsafe_allow_html=True)
|
366 |
+
|
367 |
+
|
368 |
+
|
369 |
+
# Version Comercial
|
370 |
+
st.markdown("""La ciencia de datos es una de las industrias de mayor
|
371 |
+
crecimiento en el mundo, y las oportunidades laborales para profesionales en este campo son más emocionantes y abundantes que nunca. Como expertos en Data Analyst, sabemos que la demanda de profesionales en ciencia de datos y análisis se ha disparado en los últimos años, con un aumento del 450% en el número de empleos relacionados con data. ¡Eso es una locura!
|
372 |
+
|
373 |
+
Pero aquí viene lo más emocionante: el salario promedio anual en este campo aumentó un 30% entre 2019 y 2020. Eso significa que hay una gran cantidad de oportunidades disponibles para quienes quieran trabajar en esta industria en constante crecimiento.
|
374 |
+
|
375 |
+
En Latam Brain, estamos en el negocio de ayudar a las empresas a aprovechar al máximo el análisis de datos, y para lograrlo, estamos creando un data warehouse para almacenar y analizar información de manera eficiente. Además, estamos identificando las características clave que definen a los profesionales en este campo, como habilidades, herramientas y funciones, y estamos creando un modelo predictivo utilizando Machine Learning para identificar patrones y tendencias en los datos.
|
376 |
+
|
377 |
+
Nuestra recomendación para las empresas que quieran aprovechar al máximo el mercado laboral de la ciencia de datos es enfocarse en buscar candidatos con habilidades en ciencia de datos y análisis y ofrecerles oportunidades de capacitación y desarrollo profesional para ayudarles a avanzar en sus carreras y mejorar sus habilidades. No olvides ofrecer salarios competitivos y oportunidades de crecimiento, ya que el salario promedio anual en este campo está en aumento. También es importante que consideren la posibilidad de ofrecer oportunidades de trabajo remoto para atraer a los mejores talentos, ya que la mayoría de los empleos en este campo se ofrecen en modalidad remota.
|
378 |
+
|
379 |
+
En resumen, la ciencia de datos es una de las industrias más emocionantes y
|
380 |
+
en constante crecimiento, y las oportunidades para profesionales en este
|
381 |
+
campo son abundantes. Si tu empresa quiere aprovechar al máximo el mercado
|
382 |
+
laboral de la ciencia de datos, asegúrate de enfocarte en buscar talentos con habilidades en ciencia de datos y análisis, ofrecer oportunidades de capacitación y desarrollo profesional, salarios competitivos y oportunidades de crecimiento, y considerar la posibilidad de ofrecer oportunidades de trabajo remoto. ¡No te quedes atrás en esta emocionante industria! !Utiliza el paquete de Recruiter de LatamBrain!""")
|
page/contact.py
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
|
3 |
+
|
4 |
+
def Contact():
|
5 |
+
st.markdown('''
|
6 |
+
<h2>Simulación de <strong>Presupuesto</strong></h2>
|
7 |
+
<hr>
|
8 |
+
''', unsafe_allow_html=True)
|
9 |
+
|
10 |
+
# Define los precios para cada opción
|
11 |
+
precio_analisis = 3500
|
12 |
+
precio_ML = 5500
|
13 |
+
precio_app = 3000
|
14 |
+
precio_mantenimiento = 550
|
15 |
+
|
16 |
+
# Define las opciones como un diccionario de la forma {nombre_opción: precio_opción}
|
17 |
+
opciones = {
|
18 |
+
"Opción 1": precio_analisis,
|
19 |
+
"Opción 2": precio_ML,
|
20 |
+
"Opción 3": precio_app,
|
21 |
+
"Opción 4": precio_mantenimiento
|
22 |
+
}
|
23 |
+
|
24 |
+
# Crea un checkbox para cada opción
|
25 |
+
analisis = st.checkbox("Análisis y Reportes")
|
26 |
+
ML = st.checkbox("Algoritmos de ML aplicado")
|
27 |
+
app = st.checkbox("Creación de una App")
|
28 |
+
# mantenimiento = st.checkbox('Mantenimiento')
|
29 |
+
|
30 |
+
# Crea un campo numérico para la cantidad
|
31 |
+
cantidad = st.number_input("Meses de mantenimiento:", min_value=0, value=0)
|
32 |
+
|
33 |
+
mes_mantenimiento = cantidad * precio_mantenimiento
|
34 |
+
|
35 |
+
# Calcula el total en función de las opciones elegidas
|
36 |
+
total = mes_mantenimiento + sum(
|
37 |
+
[opciones[opcion] for opcion, seleccionada in zip(opciones.keys(),
|
38 |
+
[analisis, ML,
|
39 |
+
app]) if
|
40 |
+
seleccionada])
|
41 |
+
|
42 |
+
# Muestra el total
|
43 |
+
st.markdown(f'''
|
44 |
+
Total $: <span style="background:#5c62ac;\
|
45 |
+
border-radius:5px;padding:5px">{total}</span>
|
46 |
+
:rocket:
|
47 |
+
''', unsafe_allow_html=True)
|
48 |
+
|
49 |
+
st.markdown('''
|
50 |
+
<br>
|
51 |
+
<h2>Datos de contactos</h2>
|
52 |
+
<hr>
|
53 |
+
''', unsafe_allow_html=True)
|
54 |
+
# Crea campos de entrada para el nombre, correo electrónico y mensaje
|
55 |
+
nombre = st.text_input("Nombre completo")
|
56 |
+
email = st.text_input("Correo electrónico")
|
57 |
+
mensaje = st.text_area("Mensaje")
|
58 |
+
|
59 |
+
# Crea un botón para enviar el formulario
|
60 |
+
enviar = st.button("Enviar")
|
61 |
+
|
62 |
+
# Si el botón es presionado, muestra un mensaje de confirmación
|
63 |
+
if enviar:
|
64 |
+
if nombre and email and mensaje:
|
65 |
+
|
66 |
+
st.write(
|
67 |
+
"¡Gracias por tu mensaje! Nos pondremos en contacto contigo pronto.")
|
68 |
+
else:
|
69 |
+
st.error("Por favor completa todos los campos requeridos.")
|
page/home.py
ADDED
@@ -0,0 +1,166 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
from PIL import Image
|
3 |
+
|
4 |
+
image = Image.open('./assets/logo_latam_brain.png')
|
5 |
+
logo = Image.open('./assets/LatamBrainlogo.png')
|
6 |
+
scrum = Image.open("./assets/Scrum'ProcessLB.png")
|
7 |
+
|
8 |
+
|
9 |
+
def Home():
|
10 |
+
# Logo y Presentación
|
11 |
+
col1, col2 = st.columns(2)
|
12 |
+
col1.markdown("""
|
13 |
+
<br/>
|
14 |
+
<br/>
|
15 |
+
<br/>
|
16 |
+
<h1 style="text-align:center; font-weight:bold;
|
17 |
+
text-shadow:0px 0px 10px #5c62ac;font-size:3rem">LatamBrain</h1>
|
18 |
+
<h5 style="text-align:center;color:#5c62ac">tú cerebro tecnológico</h5>
|
19 |
+
<br />
|
20 |
+
""", unsafe_allow_html=True)
|
21 |
+
col2.image(image, width=300)
|
22 |
+
|
23 |
+
# Quienes somos
|
24 |
+
st.markdown('''
|
25 |
+
<br>
|
26 |
+
<h2>Quienes somos?</h2>
|
27 |
+
<hr>
|
28 |
+
<p><strong>LatamBrain</strong> es la startup que necesitas para llevar
|
29 |
+
tu negocio al siguiente nivel. Nuestro enfoque altamente innovador y
|
30 |
+
tecnológico garantiza soluciones personalizadas, seguras y eficientes
|
31 |
+
que te mantendrán un paso adelante de la competencia. Nos enorgullece
|
32 |
+
ser líderes en nuestra industria y estamos comprometidos en ayudarte a
|
33 |
+
prepararte para el futuro. No pierdas la oportunidad de contactar con
|
34 |
+
<strong>LatamBrain</strong> y descubrir cómo podemos ayudarte a llevar
|
35 |
+
tus ideas más allá.</p>
|
36 |
+
|
37 |
+
<p><strong>LatamBrain</strong>, tú cerebro tecnológico!</p>
|
38 |
+
''', unsafe_allow_html=True)
|
39 |
+
|
40 |
+
# Servicios
|
41 |
+
st.markdown('''
|
42 |
+
<br>
|
43 |
+
<h2>Servicios</h2>
|
44 |
+
<hr>
|
45 |
+
''', unsafe_allow_html=True)
|
46 |
+
|
47 |
+
col1, col2, col3 = st.columns(3)
|
48 |
+
col1.markdown('''
|
49 |
+
<li>Data Análisis
|
50 |
+
<li>Reportes financieros
|
51 |
+
<li>KPI's personalizados
|
52 |
+
<li>Asesoramientos y Plan de Ejecución
|
53 |
+
<li>Y más...
|
54 |
+
''', unsafe_allow_html=True)
|
55 |
+
col2.markdown('''
|
56 |
+
<li>Machine Learning
|
57 |
+
<li>Deep Learning
|
58 |
+
<li>Automatización de con ML
|
59 |
+
<li>ChatBot
|
60 |
+
<li>Y más...
|
61 |
+
''', unsafe_allow_html=True)
|
62 |
+
col3.markdown('''
|
63 |
+
<li>Cloud AWS
|
64 |
+
<li>Máxima seguridad en tús datos
|
65 |
+
<li>Disponibilidad y velocidad de datos
|
66 |
+
<li>Y más...
|
67 |
+
''', unsafe_allow_html=True)
|
68 |
+
|
69 |
+
# Nosotros y como trabajamos
|
70 |
+
st.markdown('''
|
71 |
+
<br>
|
72 |
+
<h2>Nosotros y Como Trabajamos</h2>
|
73 |
+
<hr>
|
74 |
+
''', unsafe_allow_html=True)
|
75 |
+
st.image(scrum)
|
76 |
+
|
77 |
+
# Video
|
78 |
+
st.markdown("""
|
79 |
+
<br>
|
80 |
+
<h3>LatamBrain - Spot</h3>
|
81 |
+
<hr>
|
82 |
+
""", unsafe_allow_html=True)
|
83 |
+
|
84 |
+
VIDEO_ID = "https://www.youtube.com/embed/G8PdiAwhbNM"
|
85 |
+
|
86 |
+
# Genera el código HTML del iframe
|
87 |
+
html = f"""
|
88 |
+
<div >
|
89 |
+
<iframe
|
90 |
+
style="height:200px;width
|
91 |
+
:700px"
|
92 |
+
width="530"
|
93 |
+
height="360"
|
94 |
+
src= {VIDEO_ID}
|
95 |
+
title="LatamBrain - Spot"
|
96 |
+
frameborder="0"
|
97 |
+
allow="accelerometer; autoplay; clipboard-write;
|
98 |
+
encrypted-media; gyroscope;
|
99 |
+
picture-in-picture; web-share"
|
100 |
+
allowfullscreen
|
101 |
+
>
|
102 |
+
</iframe>
|
103 |
+
</div>
|
104 |
+
|
105 |
+
"""
|
106 |
+
|
107 |
+
# Inserta el iframe en la aplicación de Streamlit
|
108 |
+
st.components.v1.html(html)
|
109 |
+
|
110 |
+
# Opiniones
|
111 |
+
st.markdown('''
|
112 |
+
<br>
|
113 |
+
<h3>Como fue este proceso para nosotros?</h3>
|
114 |
+
<hr>
|
115 |
+
''', unsafe_allow_html=True)
|
116 |
+
col1, col2, col3 = st.columns(3)
|
117 |
+
|
118 |
+
catriel = '''
|
119 |
+
<h4><strong>Catriel Pérez<strong></h4>
|
120 |
+
<p style="margin-top:-20px">Data Engineer</p>
|
121 |
+
<p>Ha sido una experiencia increíble trabajar con este equipo. Todos
|
122 |
+
han sido muy profesionales y comprometidos con el éxito del proyecto. Me siento agradecido de haber formado parte de este equipo y haber aprendido tanto en el proceso. Y esto... recién comienza!</p>
|
123 |
+
<a href="mailto:perezcatriel@gmail.com">Contactame...</a>
|
124 |
+
<p>24 de abril del 2023</p>
|
125 |
+
'''
|
126 |
+
mati = '''
|
127 |
+
<h4><strong>Matias Benitez</strong></h4>
|
128 |
+
<p style="margin-top:-20px">Machine Learning</p>
|
129 |
+
<p>Trabajar en este proyecto ha sido una verdadera aventura. He enfrentado muchos desafíos y he aprendido cosas nuevas todos los días. El equipo con el que he trabajado ha sido excepcional, siempre dispuesto a ayudar y colaborar en todo momento. Me llevo una experiencia enriquecedora y valiosa.</p>
|
130 |
+
<a href="mailto:matiasbenitezcarrizo@gmail.com">Contactame...</a>
|
131 |
+
<p>24 de abril del 2023</p>
|
132 |
+
'''
|
133 |
+
luis = '''
|
134 |
+
<h4><strong>Luis Rascón</strong></h4>
|
135 |
+
<p style="margin-top:-20px">Data Analyst</p>
|
136 |
+
<p>No tengo más que palabras de agradecimiento por esta experiencia. He tenido la oportunidad de trabajar con gente talentosa y apasionada por su trabajo, lo que ha hecho que el proyecto sea un éxito rotundo. Me llevo muchas lecciones aprendidas y nuevas habilidades que me servirán en mi carrera profesional. Ha sido una experiencia inolvidable.</p>
|
137 |
+
<a href="mailto:luis.francisco.rc@gmail.com">Contactame...</a>
|
138 |
+
<p>24 de abril del 2023</p>
|
139 |
+
'''
|
140 |
+
|
141 |
+
col1.markdown(luis, unsafe_allow_html=True)
|
142 |
+
col2.markdown(mati, unsafe_allow_html=True)
|
143 |
+
col3.markdown(catriel, unsafe_allow_html=True)
|
144 |
+
|
145 |
+
# Documentos Extras
|
146 |
+
st.markdown("""
|
147 |
+
<br>
|
148 |
+
<h3>Documentación Extra</h3>
|
149 |
+
<hr>
|
150 |
+
""", unsafe_allow_html=True)
|
151 |
+
|
152 |
+
col1, col2, col3, col4 = st.columns(4)
|
153 |
+
col1.markdown("""
|
154 |
+
<a href="https://github.com/LRascon/data_world_jobs">Github</a>
|
155 |
+
""", unsafe_allow_html=True)
|
156 |
+
col2.markdown("""
|
157 |
+
<a href="https://www.notion.so/Data-World-Tendencias-del-Mercado-Laboral-c61f044bd0db44988147fc961551666d">Notion</a>
|
158 |
+
""", unsafe_allow_html=True)
|
159 |
+
col3.markdown("""
|
160 |
+
<a href="https://public.tableau.com/views/latam_brain_context
|
161 |
+
/DashboardVistazoelMercadoActual?:language=es-ES&publish=yes
|
162 |
+
&:display_count=n&:origin=viz_share_link">Tableau</a>
|
163 |
+
""", unsafe_allow_html=True)
|
164 |
+
col4.markdown("""
|
165 |
+
<a href="https://www.youtube.com/watch?v=G8PdiAwhbNM">YouTube</a>
|
166 |
+
""", unsafe_allow_html=True)
|
page/machine_learning.py
ADDED
@@ -0,0 +1,159 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import datetime
|
2 |
+
import time
|
3 |
+
|
4 |
+
import altair as alt
|
5 |
+
import pandas as pd
|
6 |
+
import streamlit as st
|
7 |
+
from sklearn.linear_model import LinearRegression
|
8 |
+
|
9 |
+
df = pd.read_csv('./ML/ds_salaries.csv')
|
10 |
+
|
11 |
+
|
12 |
+
def ML():
|
13 |
+
st.markdown('''
|
14 |
+
<br>
|
15 |
+
<h3>Predicción de Tendencias sobre puestos de trabajo con un modelo
|
16 |
+
de Regresión Lineal</h3>
|
17 |
+
<p>Este modelo predice la cantidad de puestos laborales para un año X sobre Data, según los resultados que tiene en la base de datos</p>
|
18 |
+
<hr>
|
19 |
+
''', unsafe_allow_html=True)
|
20 |
+
|
21 |
+
# st.set_page_config(page_title="Predicción de nuevos puestos de trabajo",
|
22 |
+
# page_icon=":bar_chart:", layout="wide")
|
23 |
+
|
24 |
+
# Cargar los datos
|
25 |
+
|
26 |
+
# Seleccionar las columnas relevantes
|
27 |
+
df_relevant = df[['job_title', 'work_year']]
|
28 |
+
|
29 |
+
# Transformar la columna work_year en un tipo date en la columna date
|
30 |
+
df_relevant['date'] = pd.to_datetime(df_relevant['work_year'], format='%Y')
|
31 |
+
|
32 |
+
# Agregar una columna con el año de creación
|
33 |
+
df_relevant['year'] = pd.DatetimeIndex(df_relevant['date']).year
|
34 |
+
|
35 |
+
# Contar la cantidad de job_title creados por año
|
36 |
+
job_title_count = df_relevant.groupby('year').count()['job_title']
|
37 |
+
|
38 |
+
# Crear un dataframe con la cantidad de job_title creados por año
|
39 |
+
df_job_title_count = pd.DataFrame(
|
40 |
+
{'year': job_title_count.index,
|
41 |
+
'job_title_count': job_title_count.values})
|
42 |
+
|
43 |
+
# Crear un modelo de regresión lineal
|
44 |
+
model = LinearRegression()
|
45 |
+
|
46 |
+
# Entrenar el modelo con los datos históricos
|
47 |
+
X = df_job_title_count[['year']]
|
48 |
+
y = df_job_title_count['job_title_count']
|
49 |
+
model.fit(X, y)
|
50 |
+
|
51 |
+
# Obtener el año actual
|
52 |
+
current_year = datetime.datetime.now().year
|
53 |
+
|
54 |
+
# Predecir la cantidad de nuevos job_title que se crearán este año
|
55 |
+
current_year_input = st.number_input('Ingresa un año:', value=current_year,
|
56 |
+
min_value=current_year,
|
57 |
+
max_value=2050, step=1)
|
58 |
+
if current_year_input < current_year:
|
59 |
+
st.warning('Solo se pueden hacer predicciones para años futuros.')
|
60 |
+
current_year_input = current_year
|
61 |
+
st.write('Se usará el año actual:', current_year_input)
|
62 |
+
|
63 |
+
with st.spinner('Prediciendo...'):
|
64 |
+
time.sleep(1)
|
65 |
+
job_title_count_pred = model.predict([[current_year_input]])
|
66 |
+
|
67 |
+
# Obtener el último año del dataset
|
68 |
+
last_year = df_job_title_count['year'].max()
|
69 |
+
last_year_count = \
|
70 |
+
df_job_title_count.loc[df_job_title_count['year'] == last_year][
|
71 |
+
'job_title_count'].values[0]
|
72 |
+
|
73 |
+
# Mostrar resultados
|
74 |
+
st.write(
|
75 |
+
"Se crearán aproximadamente **{}** nuevos puestos de trabajo este año **{}**.".format(
|
76 |
+
int(job_title_count_pred), current_year_input))
|
77 |
+
percentage_change = (
|
78 |
+
job_title_count_pred - last_year_count) / last_year_count * 100
|
79 |
+
percentage_change = float(percentage_change)
|
80 |
+
if percentage_change >= 0:
|
81 |
+
st.write(
|
82 |
+
"Esto representa un aumento del {:.2f}% con respecto al año {}.".format(
|
83 |
+
percentage_change, last_year))
|
84 |
+
else:
|
85 |
+
st.write(
|
86 |
+
"Esto representa una disminución del {:.2f}% con respecto al año {}".format(
|
87 |
+
abs(percentage_change), last_year))
|
88 |
+
|
89 |
+
# Crear un gráfico de línea
|
90 |
+
line_chart = alt.Chart(df_job_title_count).mark_line().encode(
|
91 |
+
x='year',
|
92 |
+
y='job_title_count'
|
93 |
+
).properties(
|
94 |
+
title='Cantidad de nuevos puestos de trabajo por año',
|
95 |
+
width=300,
|
96 |
+
height=200
|
97 |
+
).configure_axis(
|
98 |
+
labelFontSize=14,
|
99 |
+
titleFontSize=16
|
100 |
+
)
|
101 |
+
|
102 |
+
# Crear un punto para mostrar el valor predicho
|
103 |
+
point = alt.Chart(df_job_title_count.iloc[-1:]).mark_point(
|
104 |
+
color='#5c62ac').encode(
|
105 |
+
x='year',
|
106 |
+
y='job_title_count'
|
107 |
+
)
|
108 |
+
|
109 |
+
# Mostrar la gráfica actualizada con el valor predicho para el año ingresado
|
110 |
+
# st.altair_chart(line_chart, use_container_width=True)
|
111 |
+
|
112 |
+
# Crear botón para graficar la predicción
|
113 |
+
if st.button('Mostrar gráfico de predicción'):
|
114 |
+
# Crear dataframe con los años y las predicciones
|
115 |
+
years = list(range(last_year, current_year + current_year_input - 2000))
|
116 |
+
predictions = model.predict([[year] for year in years])
|
117 |
+
df_predictions = pd.DataFrame(
|
118 |
+
{'year': years, 'job_title_count_pred': predictions})
|
119 |
+
|
120 |
+
# Crear gráfico de línea
|
121 |
+
line_chart = alt.Chart(df_predictions).mark_line().encode(
|
122 |
+
x='year',
|
123 |
+
y='job_title_count_pred'
|
124 |
+
).properties(
|
125 |
+
width=700,
|
126 |
+
height=400
|
127 |
+
)
|
128 |
+
|
129 |
+
# Agregar capa con punto violeta en el valor predicho para el año actual
|
130 |
+
current_year_pred = int(model.predict([[current_year_input]])[0])
|
131 |
+
point_chart = alt.Chart(pd.DataFrame(
|
132 |
+
{'x': [current_year_input], 'y': [current_year_pred]})).mark_point(
|
133 |
+
color='#5c62ac',
|
134 |
+
size=300,
|
135 |
+
stroke='#5c62ac',
|
136 |
+
strokeWidth=5).encode(
|
137 |
+
x='x',
|
138 |
+
y='y'
|
139 |
+
)
|
140 |
+
|
141 |
+
# # ocultar los títulos de los ejes x e y
|
142 |
+
# line_chart.configure_axis(
|
143 |
+
# x=None,
|
144 |
+
# y=None
|
145 |
+
# )
|
146 |
+
|
147 |
+
# Mostrar gráfico con la capa adicional del punto rojo
|
148 |
+
st.altair_chart(line_chart + point_chart)
|
149 |
+
|
150 |
+
st.markdown('''
|
151 |
+
<br><br><br>
|
152 |
+
<h2>Gracias por su <strong>tiempo y atención!</strong></h2>
|
153 |
+
<hr>
|
154 |
+
<h3>Nuevas Propuestas...</h3>
|
155 |
+
<p>Sí te gusto lo que viste, te invito a ver lo que se vendrá en la
|
156 |
+
sección <span style="font-weight:bold">"New"</span></p>
|
157 |
+
''', unsafe_allow_html=True)
|
158 |
+
|
159 |
+
#
|
page/new.py
ADDED
@@ -0,0 +1,161 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import time
|
2 |
+
|
3 |
+
import pandas as pd
|
4 |
+
import streamlit as st
|
5 |
+
from sklearn.ensemble import RandomForestRegressor
|
6 |
+
from sklearn.feature_extraction.text import CountVectorizer
|
7 |
+
from sklearn.naive_bayes import MultinomialNB
|
8 |
+
from sklearn.preprocessing import LabelEncoder
|
9 |
+
|
10 |
+
|
11 |
+
def New():
|
12 |
+
progress_text = "Operación en progreso... Por favor espere..."
|
13 |
+
my_bar = st.progress(0, text=progress_text)
|
14 |
+
|
15 |
+
for percent_complete in range(100):
|
16 |
+
time.sleep(0.05)
|
17 |
+
my_bar.progress(percent_complete + 1, text=progress_text)
|
18 |
+
|
19 |
+
st.markdown("""
|
20 |
+
<h1>Proyectos en Beta</h1>
|
21 |
+
<hr>
|
22 |
+
<p>Estos proyectos todavía no están terminados, pero queremos mostrar un avance de lo que se viene muy pronto...</p>
|
23 |
+
""", unsafe_allow_html=True)
|
24 |
+
|
25 |
+
# Leer los datos y seleccionar las columnas necesarias
|
26 |
+
df = pd.read_csv('./ML/ds_salaries.csv')
|
27 |
+
df = df[['company_location', 'salary_in_usd']]
|
28 |
+
|
29 |
+
# Codificar las ubicaciones de las empresas
|
30 |
+
le = LabelEncoder()
|
31 |
+
df['company_location'] = le.fit_transform(df['company_location'])
|
32 |
+
|
33 |
+
# Decodificar las ubicaciones de las empresas
|
34 |
+
decoded_locations = le.inverse_transform(df['company_location'].unique())
|
35 |
+
|
36 |
+
# Separar los datos de entrada y salida
|
37 |
+
X = df.iloc[:, :-1].values
|
38 |
+
y = df.iloc[:, -1].values
|
39 |
+
|
40 |
+
# Entrenar el modelo
|
41 |
+
model = RandomForestRegressor(n_estimators=100, random_state=42)
|
42 |
+
model.fit(X, y)
|
43 |
+
|
44 |
+
# Obtener las ubicaciones de las empresas y sus salarios predichos
|
45 |
+
locations = df['company_location'].unique()
|
46 |
+
predicted_salaries = model.predict(locations.reshape(-1, 1))
|
47 |
+
results_df = pd.DataFrame(
|
48 |
+
{'company_location': locations, 'predicted_salary': predicted_salaries})
|
49 |
+
|
50 |
+
# Decodificar las ubicaciones de las empresas
|
51 |
+
results_df['company_location'] = le.inverse_transform(
|
52 |
+
results_df['company_location'])
|
53 |
+
|
54 |
+
# Ordenar los resultados por salario predicho
|
55 |
+
results_df = results_df.sort_values('predicted_salary',
|
56 |
+
ascending=False).reset_index(drop=True)
|
57 |
+
|
58 |
+
# Mostrar el título y el top 5 de países mejor pagados
|
59 |
+
st.markdown("""
|
60 |
+
<h2>Top 5 de países mejor pagados</h2>
|
61 |
+
<hr>
|
62 |
+
""", unsafe_allow_html=True)
|
63 |
+
|
64 |
+
# Descripción
|
65 |
+
st.markdown("""
|
66 |
+
<p>Este código utiliza un algoritmo de <strong>RandomForest</strong>
|
67 |
+
para seleccionar solo algunas empresas de cada país de forma aleatoria y retornar el promedio. Utilizamos este algoritmo para obtener un promedio menos sesgado por outliers</p>
|
68 |
+
""", unsafe_allow_html=True)
|
69 |
+
|
70 |
+
for i in range(5):
|
71 |
+
location = results_df.loc[i, 'company_location']
|
72 |
+
salary = results_df.loc[i, 'predicted_salary']
|
73 |
+
st.markdown(f'### **{location}**: ${salary:,.2f}',
|
74 |
+
unsafe_allow_html=True)
|
75 |
+
|
76 |
+
# Mostrar el menú desplegable para seleccionar un país
|
77 |
+
st.markdown("""
|
78 |
+
<h2>Seleccionar un país</h2>
|
79 |
+
<hr>
|
80 |
+
""", unsafe_allow_html=True)
|
81 |
+
selected_location = st.selectbox('Ubicación de la empresa',
|
82 |
+
decoded_locations)
|
83 |
+
|
84 |
+
# Mostrar el salario predicho para el país seleccionado
|
85 |
+
predicted_salary = results_df.loc[results_df[
|
86 |
+
'company_location'] == selected_location, 'predicted_salary'].iloc[
|
87 |
+
0]
|
88 |
+
st.markdown(f'### **{selected_location}**: ${predicted_salary:,.2f}',
|
89 |
+
unsafe_allow_html=True)
|
90 |
+
|
91 |
+
#####
|
92 |
+
|
93 |
+
# Cargar los datos
|
94 |
+
df = pd.read_csv('./assets/dataset_modelo_1.csv')
|
95 |
+
|
96 |
+
# Crear una lista con todas las skills disponibles
|
97 |
+
all_skills = set()
|
98 |
+
for skills in df.skills:
|
99 |
+
all_skills.update(skills.split(", "))
|
100 |
+
|
101 |
+
# Crear un diccionario que relaciona cada skill con su índice en el vector
|
102 |
+
skill_indices = {skill: i for i, skill in enumerate(all_skills)}
|
103 |
+
|
104 |
+
# Crear una matriz de características con la frecuencia de cada skill en cada fila
|
105 |
+
vectorizer = CountVectorizer(vocabulary=skill_indices.keys(),
|
106 |
+
lowercase=False)
|
107 |
+
X = vectorizer.fit_transform(df.skills)
|
108 |
+
|
109 |
+
# Entrenar el modelo
|
110 |
+
clf = MultinomialNB()
|
111 |
+
clf.fit(X, df.Aptitude)
|
112 |
+
|
113 |
+
# Crear la interfaz de usuario con Streamlit
|
114 |
+
st.markdown("""
|
115 |
+
<h2>Predicción de Skills</h2>
|
116 |
+
<hr>
|
117 |
+
""", unsafe_allow_html=True)
|
118 |
+
st.markdown(
|
119 |
+
"""
|
120 |
+
<p>Ingrese el título del trabajo para ver las habilidades más
|
121 |
+
importantes.</p>
|
122 |
+
<p>Con el modelo de <strong>Naive Bayes</strong> cada skill recibe
|
123 |
+
una puntuación con respecto a un título de trabajo, por lo cual,
|
124 |
+
al ingresar un título de trabajo el algoritmo retorna las skill más
|
125 |
+
utilizadas en las publicaciones de la base de dato de LatamBrain.
|
126 |
+
""", unsafe_allow_html=True)
|
127 |
+
|
128 |
+
title = st.text_input("Título del trabajo")
|
129 |
+
|
130 |
+
# Crear una función que encuentra las habilidades más importantes para un título dado
|
131 |
+
def get_top_skills(title, limit):
|
132 |
+
# Filtrar el dataframe por el título dado
|
133 |
+
filtered_df = df[df.job_title.str.contains(title, case=False)]
|
134 |
+
|
135 |
+
# Crear una matriz de características con la frecuencia de cada skill en el dataframe filtrado
|
136 |
+
X_filtered = vectorizer.transform(filtered_df.skills)
|
137 |
+
|
138 |
+
# Calcular la frecuencia de cada habilidad en el dataframe filtrado
|
139 |
+
skill_frequencies = X_filtered.sum(axis=0).A1
|
140 |
+
|
141 |
+
# Obtener los nombres de las habilidades
|
142 |
+
skill_names = vectorizer.vocabulary_.keys()
|
143 |
+
|
144 |
+
# Crear un diccionario que relaciona cada habilidad con su frecuencia
|
145 |
+
skill_freq_dict = dict(zip(skill_names, skill_frequencies))
|
146 |
+
|
147 |
+
# Ordenar las habilidades por frecuencia descendente y devolver las más importantes (según el límite dado)
|
148 |
+
top_skills = sorted(skill_freq_dict, key=skill_freq_dict.get,
|
149 |
+
reverse=True)[:limit]
|
150 |
+
return top_skills
|
151 |
+
|
152 |
+
if title:
|
153 |
+
limit = st.number_input("Cantidad de habilidades a mostrar", value=5,
|
154 |
+
min_value=1, max_value=len(all_skills))
|
155 |
+
top_skills = get_top_skills(title, limit)
|
156 |
+
st.write(
|
157 |
+
f"Las {limit} habilidades más importantes para el trabajo de '{title}' son:")
|
158 |
+
for skill in top_skills:
|
159 |
+
st.write(f"- {skill}")
|
160 |
+
|
161 |
+
#####
|
requirements.txt
CHANGED
@@ -1,56 +0,0 @@
|
|
1 |
-
altair==4.2.2
|
2 |
-
attrs==23.1.0
|
3 |
-
blinker==1.6.2
|
4 |
-
cachetools==5.3.0
|
5 |
-
certifi==2022.12.7
|
6 |
-
charset-normalizer==3.1.0
|
7 |
-
click==8.1.3
|
8 |
-
decorator==5.1.1
|
9 |
-
defusedxml==0.7.1
|
10 |
-
entrypoints==0.4
|
11 |
-
gitdb==4.0.10
|
12 |
-
GitPython==3.1.31
|
13 |
-
idna==3.4
|
14 |
-
importlib-metadata==6.6.0
|
15 |
-
Jinja2==3.1.2
|
16 |
-
joblib==1.2.0
|
17 |
-
jsonschema==4.17.3
|
18 |
-
markdown-it-py==2.2.0
|
19 |
-
MarkupSafe==2.1.2
|
20 |
-
mdurl==0.1.2
|
21 |
-
numpy==1.24.2
|
22 |
-
packaging==23.1
|
23 |
-
pandas==1.5.3
|
24 |
-
Pillow==9.5.0
|
25 |
-
plotly==5.14.1
|
26 |
-
protobuf==3.20.3
|
27 |
-
pyarrow==11.0.0
|
28 |
-
pydeck==0.8.1b0
|
29 |
-
Pygments==2.15.1
|
30 |
-
Pympler==1.0.1
|
31 |
-
pyrsistent==0.19.3
|
32 |
-
python-dateutil==2.8.2
|
33 |
-
pytz==2023.3
|
34 |
-
pytz-deprecation-shim==0.1.0.post0
|
35 |
-
requests==2.28.2
|
36 |
-
rich==13.3.4
|
37 |
-
scikit-learn==1.2.2
|
38 |
-
scipy==1.10.1
|
39 |
-
six==1.16.0
|
40 |
-
smmap==5.0.0
|
41 |
-
streamlit==1.21.0
|
42 |
-
streamlit-embedcode==0.1.2
|
43 |
-
streamlit-option-menu==0.3.2
|
44 |
-
tableauserverclient==0.25
|
45 |
-
tenacity==8.2.2
|
46 |
-
threadpoolctl==3.1.0
|
47 |
-
toml==0.10.2
|
48 |
-
toolz==0.12.0
|
49 |
-
tornado==6.3.1
|
50 |
-
typing_extensions==4.5.0
|
51 |
-
tzdata==2023.3
|
52 |
-
tzlocal==4.3
|
53 |
-
urllib3==1.26.15
|
54 |
-
validators==0.20.0
|
55 |
-
watchdog==3.0.0
|
56 |
-
zipp==3.15.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|