Spaces:
Runtime error
Runtime error
perezcatriel
commited on
Commit
•
4f30b91
1
Parent(s):
67051c5
projects
Browse files- .streamlit/config.toml +5 -4
- .streamlit/secrets.html +7 -0
- ML/prediccion_job.py +132 -0
- app.py +607 -30
.streamlit/config.toml
CHANGED
@@ -1,7 +1,8 @@
|
|
1 |
[theme]
|
2 |
-
base="
|
3 |
-
primaryColor="#
|
4 |
-
backgroundColor="#057893"
|
5 |
secondaryBackgroundColor="#5c62ac"
|
6 |
textColor="#7fe3fa"
|
7 |
-
font="
|
|
|
|
1 |
[theme]
|
2 |
+
base="dark"
|
3 |
+
primaryColor="#08a9ce"
|
4 |
+
#backgroundColor="#057893"
|
5 |
secondaryBackgroundColor="#5c62ac"
|
6 |
textColor="#7fe3fa"
|
7 |
+
font="monospace"
|
8 |
+
|
.streamlit/secrets.html
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# .streamlit/secrets.toml
|
2 |
+
|
3 |
+
[tableau]
|
4 |
+
token_name = "perezcatriel"
|
5 |
+
token_secret = "laGranCena863"
|
6 |
+
server_url = "https://public.tableau.com/views/sp500_analyst/Sheet1?:language=es-ES&:display_count=n&:origin=viz_share_link"
|
7 |
+
site_id = "streamlitexample" # in your site's URL behind the server_url
|
ML/prediccion_job.py
ADDED
@@ -0,0 +1,132 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
st.set_page_config(page_title="Predicción de nuevos puestos de trabajo",
|
10 |
+
page_icon=":bar_chart:", layout="wide")
|
11 |
+
|
12 |
+
st.title('Predicción de nuevos puestos de trabajo')
|
13 |
+
|
14 |
+
# Cargar los datos
|
15 |
+
df = pd.read_csv('/home/catriel/Documents/data_world_jobs/data/ds_salaries.csv')
|
16 |
+
|
17 |
+
# Seleccionar las columnas relevantes
|
18 |
+
df_relevant = df[['job_title', 'work_year']]
|
19 |
+
|
20 |
+
# Transformar la columna work_year en un tipo date en la columna date
|
21 |
+
df_relevant['date'] = pd.to_datetime(df_relevant['work_year'], format='%Y')
|
22 |
+
|
23 |
+
# Agregar una columna con el año de creación
|
24 |
+
df_relevant['year'] = pd.DatetimeIndex(df_relevant['date']).year
|
25 |
+
|
26 |
+
# Contar la cantidad de job_title creados por año
|
27 |
+
job_title_count = df_relevant.groupby('year').count()['job_title']
|
28 |
+
|
29 |
+
# Crear un dataframe con la cantidad de job_title creados por año
|
30 |
+
df_job_title_count = pd.DataFrame(
|
31 |
+
{'year': job_title_count.index, 'job_title_count': job_title_count.values})
|
32 |
+
|
33 |
+
# Crear un modelo de regresión lineal
|
34 |
+
model = LinearRegression()
|
35 |
+
|
36 |
+
# Entrenar el modelo con los datos históricos
|
37 |
+
X = df_job_title_count[['year']]
|
38 |
+
y = df_job_title_count['job_title_count']
|
39 |
+
model.fit(X, y)
|
40 |
+
|
41 |
+
# Obtener el año actual
|
42 |
+
current_year = datetime.datetime.now().year
|
43 |
+
|
44 |
+
# Predecir la cantidad de nuevos job_title que se crearán este año
|
45 |
+
current_year_input = st.number_input('Ingresa un año:', value=current_year,
|
46 |
+
min_value=current_year,
|
47 |
+
max_value=2050, step=1)
|
48 |
+
if current_year_input < current_year:
|
49 |
+
st.warning('Solo se pueden hacer predicciones para años futuros.')
|
50 |
+
current_year_input = current_year
|
51 |
+
st.write('Se usará el año actual:', current_year_input)
|
52 |
+
|
53 |
+
with st.spinner('Prediciendo...'):
|
54 |
+
time.sleep(1)
|
55 |
+
job_title_count_pred = model.predict([[current_year_input]])
|
56 |
+
|
57 |
+
# Obtener el último año del dataset
|
58 |
+
last_year = df_job_title_count['year'].max()
|
59 |
+
last_year_count = \
|
60 |
+
df_job_title_count.loc[df_job_title_count['year'] == last_year][
|
61 |
+
'job_title_count'].values[0]
|
62 |
+
|
63 |
+
# Mostrar resultados
|
64 |
+
st.write(
|
65 |
+
"Se crearán aproximadamente **{}** nuevos puestos de trabajo este año **{}**.".format(
|
66 |
+
int(job_title_count_pred), current_year_input))
|
67 |
+
percentage_change = (
|
68 |
+
job_title_count_pred - last_year_count) / last_year_count * 100
|
69 |
+
percentage_change = float(percentage_change)
|
70 |
+
if percentage_change >= 0:
|
71 |
+
st.write(
|
72 |
+
"Esto representa un aumento del {:.2f}% con respecto al año {}.".format(
|
73 |
+
percentage_change, last_year))
|
74 |
+
else:
|
75 |
+
st.write(
|
76 |
+
"Esto representa una disminución del {:.2f}% con respecto al año {}".format(
|
77 |
+
abs(percentage_change), last_year))
|
78 |
+
|
79 |
+
# Crear un gráfico de línea
|
80 |
+
line_chart = alt.Chart(df_job_title_count).mark_line().encode(
|
81 |
+
x='year',
|
82 |
+
y='job_title_count'
|
83 |
+
).properties(
|
84 |
+
title='Cantidad de nuevos puestos de trabajo por año',
|
85 |
+
width=700,
|
86 |
+
height=400
|
87 |
+
).configure_axis(
|
88 |
+
labelFontSize=14,
|
89 |
+
titleFontSize=16
|
90 |
+
)
|
91 |
+
|
92 |
+
# Crear un punto para mostrar el valor predicho
|
93 |
+
point = alt.Chart(df_job_title_count.iloc[-1:]).mark_point(color='#5c62ac').encode(
|
94 |
+
x='year',
|
95 |
+
y='job_title_count'
|
96 |
+
)
|
97 |
+
|
98 |
+
# Mostrar la gráfica actualizada con el valor predicho para el año ingresado
|
99 |
+
# st.altair_chart(line_chart, use_container_width=True)
|
100 |
+
|
101 |
+
|
102 |
+
# Crear botón para graficar la predicción
|
103 |
+
if st.button('Mostrar gráfico de predicción'):
|
104 |
+
# Crear dataframe con los años y las predicciones
|
105 |
+
years = list(range(last_year, current_year + current_year_input - 2000))
|
106 |
+
predictions = model.predict([[year] for year in years])
|
107 |
+
df_predictions = pd.DataFrame(
|
108 |
+
{'year': years, 'job_title_count_pred': predictions})
|
109 |
+
|
110 |
+
# Crear gráfico de línea
|
111 |
+
line_chart = alt.Chart(df_predictions).mark_line().encode(
|
112 |
+
x='year',
|
113 |
+
y='job_title_count_pred'
|
114 |
+
).properties(
|
115 |
+
width=1200,
|
116 |
+
height=600
|
117 |
+
)
|
118 |
+
|
119 |
+
# Agregar capa con punto rojo en el valor predicho para el año actual
|
120 |
+
current_year_pred = int(model.predict([[current_year_input]])[0])
|
121 |
+
point_chart = alt.Chart(pd.DataFrame(
|
122 |
+
{'x': [current_year_input], 'y': [current_year_pred]})).mark_point(
|
123 |
+
color='#5c62ac',
|
124 |
+
size=300,
|
125 |
+
stroke='#5c62ac',
|
126 |
+
strokeWidth=5).encode(
|
127 |
+
x='x',
|
128 |
+
y='y'
|
129 |
+
)
|
130 |
+
|
131 |
+
# Mostrar gráfico con la capa adicional del punto rojo
|
132 |
+
st.altair_chart(line_chart + point_chart)
|
app.py
CHANGED
@@ -1,7 +1,15 @@
|
|
1 |
import streamlit as st
|
2 |
from PIL import Image
|
3 |
from streamlit_option_menu import option_menu
|
4 |
-
import
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
|
6 |
image = Image.open('./assets/logo_latam_brain.png')
|
7 |
logo = Image.open('./assets/LatamBrainlogo.png')
|
@@ -46,25 +54,31 @@ if selected2 == "Home":
|
|
46 |
<br/>
|
47 |
<br/>
|
48 |
<hr/>
|
49 |
-
<h1
|
50 |
-
|
|
|
51 |
<hr />
|
52 |
""", unsafe_allow_html=True)
|
53 |
col2.image(image, width=300)
|
54 |
|
55 |
st.markdown('''
|
|
|
56 |
<h2>Quienes somos?</h2>
|
57 |
-
<
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
|
|
|
|
62 |
</p>
|
63 |
-
<p>LatamBrain,
|
64 |
''', unsafe_allow_html=True)
|
65 |
|
66 |
st.markdown('''
|
|
|
67 |
<h2>Servicios</h2>
|
|
|
68 |
''', unsafe_allow_html=True)
|
69 |
|
70 |
col1, col2, col3 = st.columns(3)
|
@@ -78,8 +92,7 @@ if selected2 == "Home":
|
|
78 |
col2.markdown('''
|
79 |
<li>Machine Learning
|
80 |
<li>Deep Learning
|
81 |
-
<li>Automatización de
|
82 |
-
<li>Predicciones con ML
|
83 |
<li>ChatBot
|
84 |
<li>Y más...
|
85 |
''', unsafe_allow_html=True)
|
@@ -91,52 +104,609 @@ if selected2 == "Home":
|
|
91 |
''', unsafe_allow_html=True)
|
92 |
|
93 |
st.markdown('''
|
|
|
94 |
<h2>Nosotros y Como Trabajamos</h2>
|
|
|
95 |
''', unsafe_allow_html=True)
|
96 |
st.image(scrum)
|
97 |
|
98 |
# st.image(logo, width=700)
|
99 |
st.markdown('''
|
|
|
100 |
<h2>Opiniones</h2>
|
|
|
101 |
''', unsafe_allow_html=True)
|
102 |
col1, col2, col3 = st.columns(3)
|
103 |
-
|
104 |
-
<
|
105 |
<a href="mailto:perezcatriel@gmail.com">Contactame</a>
|
106 |
-
<p>
|
107 |
-
|
108 |
-
resultado conseguido las experiencias vividas. Y a seguir creciendo,
|
109 |
-
juegando y aprendiendo en el proceso!</p>
|
110 |
<p>24 de abril del 2023</p>
|
111 |
'''
|
112 |
|
113 |
-
|
114 |
-
|
115 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
|
117 |
if selected2 == "Projects":
|
118 |
st.markdown('''
|
119 |
-
<h1>Data
|
|
|
120 |
''', unsafe_allow_html=True)
|
121 |
|
122 |
st.markdown('''
|
123 |
<h2>Situación actual</h2>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
''', unsafe_allow_html=True)
|
125 |
-
st.write('breve descripcion')
|
126 |
st.write('dashboard')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
|
128 |
st.markdown('''
|
|
|
129 |
<h2>Nuestra Solución</h2>
|
|
|
130 |
''', unsafe_allow_html=True)
|
131 |
-
st.write('
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
st.write('dashboard')
|
133 |
st.write('modelo de ML prediccion')
|
134 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
st.markdown('''
|
136 |
-
|
137 |
<h2>Gracias por su tiempo y atención!</h2>
|
|
|
138 |
<h3>Nuevas Propuestas...</h3>
|
139 |
-
<p>Sí
|
140 |
sección "New"</p>
|
141 |
''', unsafe_allow_html=True)
|
142 |
|
@@ -229,13 +799,14 @@ if selected2 == "Contact US":
|
|
229 |
|
230 |
st.markdown('''
|
231 |
<h2>Presupuesto</h2>
|
|
|
232 |
''', unsafe_allow_html=True)
|
233 |
|
234 |
# Define los precios para cada opción
|
235 |
-
precio_analisis =
|
236 |
-
precio_ML =
|
237 |
-
precio_app =
|
238 |
-
precio_mantenimiento =
|
239 |
|
240 |
# Define las opciones como un diccionario de la forma {nombre_opción: precio_opción}
|
241 |
opciones = {
|
@@ -264,10 +835,16 @@ if selected2 == "Contact US":
|
|
264 |
seleccionada])
|
265 |
|
266 |
# Muestra el total
|
267 |
-
st.
|
|
|
|
|
|
|
|
|
268 |
|
269 |
st.markdown('''
|
|
|
270 |
<h2>Datos de contactos</h2>
|
|
|
271 |
''', unsafe_allow_html=True)
|
272 |
# Crea campos de entrada para el nombre, correo electrónico y mensaje
|
273 |
nombre = st.text_input("Nombre completo")
|
|
|
1 |
import streamlit as st
|
2 |
from PIL import Image
|
3 |
from streamlit_option_menu import option_menu
|
4 |
+
import pandas as pd
|
5 |
+
|
6 |
+
import datetime
|
7 |
+
import time
|
8 |
+
|
9 |
+
import altair as alt
|
10 |
+
import pandas as pd
|
11 |
+
import streamlit as st
|
12 |
+
from sklearn.linear_model import LinearRegression
|
13 |
|
14 |
image = Image.open('./assets/logo_latam_brain.png')
|
15 |
logo = Image.open('./assets/LatamBrainlogo.png')
|
|
|
54 |
<br/>
|
55 |
<br/>
|
56 |
<hr/>
|
57 |
+
<h1 style="text-align:center; font-weight:bold;
|
58 |
+
text-shadow:0px 0px 10px #5c62ac">LatamBrain</h1>
|
59 |
+
<h5 style="text-align:center;color:#5c62ac">tú cerebro tecnológico</h5>
|
60 |
<hr />
|
61 |
""", unsafe_allow_html=True)
|
62 |
col2.image(image, width=300)
|
63 |
|
64 |
st.markdown('''
|
65 |
+
<br>
|
66 |
<h2>Quienes somos?</h2>
|
67 |
+
<hr>
|
68 |
+
<p>LatamBrain es una startup latinoamericana altamente innovadora y
|
69 |
+
tecnológica que está aprovechando las últimas tendencias en tecnología
|
70 |
+
para brindar soluciones personalizadas, seguras y eficientes a sus
|
71 |
+
clientes.
|
72 |
+
Si busca soluciones que lo preparen para el futuro,
|
73 |
+
no dude en contactar a LatamBrain.
|
74 |
</p>
|
75 |
+
<p>LatamBrain, tú cerebro tecnológico!</p>
|
76 |
''', unsafe_allow_html=True)
|
77 |
|
78 |
st.markdown('''
|
79 |
+
<br>
|
80 |
<h2>Servicios</h2>
|
81 |
+
<hr>
|
82 |
''', unsafe_allow_html=True)
|
83 |
|
84 |
col1, col2, col3 = st.columns(3)
|
|
|
92 |
col2.markdown('''
|
93 |
<li>Machine Learning
|
94 |
<li>Deep Learning
|
95 |
+
<li>Automatización de con ML
|
|
|
96 |
<li>ChatBot
|
97 |
<li>Y más...
|
98 |
''', unsafe_allow_html=True)
|
|
|
104 |
''', unsafe_allow_html=True)
|
105 |
|
106 |
st.markdown('''
|
107 |
+
<br>
|
108 |
<h2>Nosotros y Como Trabajamos</h2>
|
109 |
+
<hr>
|
110 |
''', unsafe_allow_html=True)
|
111 |
st.image(scrum)
|
112 |
|
113 |
# st.image(logo, width=700)
|
114 |
st.markdown('''
|
115 |
+
<br>
|
116 |
<h2>Opiniones</h2>
|
117 |
+
<hr>
|
118 |
''', unsafe_allow_html=True)
|
119 |
col1, col2, col3 = st.columns(3)
|
120 |
+
catriel = '''
|
121 |
+
<h4>Catriel Pérez</h4>
|
122 |
<a href="mailto:perezcatriel@gmail.com">Contactame</a>
|
123 |
+
<p>Ha sido una experiencia increíble trabajar con este equipo. Todos
|
124 |
+
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>
|
|
|
|
|
125 |
<p>24 de abril del 2023</p>
|
126 |
'''
|
127 |
|
128 |
+
mati = '''
|
129 |
+
<h4>Matias Benitez</h4>
|
130 |
+
|
131 |
+
<a href="mailto:matiasbenitezcarrizo@gmail.com">Contactame</a>
|
132 |
+
<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>
|
133 |
+
<p>24 de abril del 2023</p>
|
134 |
+
'''
|
135 |
+
|
136 |
+
luis = '''
|
137 |
+
<h4>Luis Rascón</h4>
|
138 |
+
<a href="mailto:luis.francisco.rc@gmail.com">Contactame</a>
|
139 |
+
<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>
|
140 |
+
<p>24 de abril del 2023</p>
|
141 |
+
'''
|
142 |
+
|
143 |
+
col1.markdown(luis, unsafe_allow_html=True)
|
144 |
+
col2.markdown(mati, unsafe_allow_html=True)
|
145 |
+
col3.markdown(catriel, unsafe_allow_html=True)
|
146 |
|
147 |
if selected2 == "Projects":
|
148 |
st.markdown('''
|
149 |
+
<h1 style="text-shadow:0 0 10px #5c62ac;font-weight:bold">Data
|
150 |
+
World Jobs</h1>
|
151 |
''', unsafe_allow_html=True)
|
152 |
|
153 |
st.markdown('''
|
154 |
<h2>Situación actual</h2>
|
155 |
+
<hr>
|
156 |
+
''', unsafe_allow_html=True)
|
157 |
+
st.write('''
|
158 |
+
Primero, es importante tener en cuenta que la demanda de trabajos relacionados con la tecnología y la analítica de datos ha aumentado significativamente en los últimos años, lo que ha llevado a que muchos trabajos de data analyst y data scientist se hayan convertido en algunas de las posiciones más populares y mejor remuneradas en el mercado laboral.
|
159 |
+
|
160 |
+
En Latinoamérica, el crecimiento de la industria tecnológica y de la analítica de datos se ha ido acelerando en los últimos años, especialmente en países como México, Brasil, Argentina, Colombia y Chile. Estos países han experimentado una demanda creciente de profesionales en el área de la tecnología y la analítica de datos, lo que ha llevado a que la mayoría de los empleos en estas áreas se concentren en las grandes ciudades de estos países.
|
161 |
+
|
162 |
+
Según los informes de los portales de empleo en línea, las posiciones de data analyst en Latinoamérica tienen un salario promedio anual de alrededor de $ 25,000 a $ 40,000 dólares. Sin embargo, es importante tener en cuenta que el salario puede variar dependiendo del país, la ciudad, la experiencia del profesional y la empresa.
|
163 |
+
|
164 |
+
Además, hay una serie de habilidades que son muy importantes para los profesionales que buscan trabajar en el área de data. Algunas de las habilidades más importantes para un data analyst son:
|
165 |
+
|
166 |
+
Conocimientos avanzados en Excel y otras herramientas de análisis de datos como Python, R, SQL, entre otras.
|
167 |
+
Habilidad para trabajar con grandes volúmenes de datos y bases de datos complejas.
|
168 |
+
Conocimientos de estadística y análisis de datos.
|
169 |
+
Habilidad para presentar los resultados de los análisis de datos en informes y presentaciones claras y precisas.
|
170 |
+
Habilidad para trabajar en equipo y colaborar con otros profesionales.
|
171 |
+
En resumen, la industria de la tecnología y la analítica de datos está en constante crecimiento en Latinoamérica, lo que ha llevado a una alta demanda de profesionales en el área de data. Los salarios en este campo son competitivos y las habilidades requeridas para ser un buen data analyst incluyen una combinación de conocimientos técnicos y habilidades blandas.
|
172 |
''', unsafe_allow_html=True)
|
|
|
173 |
st.write('dashboard')
|
174 |
+
st.markdown('''
|
175 |
+
https://public.tableau.com/views/sp500_16798321799250/sp500?:language=en-US&:display_count=n&:origin=viz_share_link
|
176 |
+
''', unsafe_allow_html=True)
|
177 |
+
st.markdown('''
|
178 |
+
<div class='tableauPlaceholder' id='viz1682356202051' style='position: relative'><noscript><a href='https://public.tableau.com/views/sp500_analyst/Sheet1?:language=es-ES&:display_count=n&:origin=viz_share_link'><img alt='sp500 ' src='https://public.tableau.com/static/images/sp/sp500_16798321799250/sp500/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='embed_code_version' value='3' /> <param name='site_root' value='' /><param name='name' value='sp500_16798321799250/sp500' /><param name='tabs' value='no' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/sp/sp500_16798321799250/sp500/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='language' value='en-US' /></object></div> <script type='text/javascript'> var divElement = document.getElementById('viz1682356202051'); var vizElement = divElement.getElementsByTagName('object')[0]; vizElement.style.width='100%';vizElement.style.height=(divElement.offsetWidth*0.75)+'px'; var scriptElement = document.createElement('script'); scriptElement.src = 'https://public.tableau.com/javascripts/api/viz_v1.js'; vizElement.parentNode.insertBefore(scriptElement, vizElement); </script>
|
179 |
+
''', unsafe_allow_html=True)
|
180 |
+
|
181 |
+
# streamlit_app.py
|
182 |
+
|
183 |
+
import streamlit as st
|
184 |
+
|
185 |
+
# # Set up connection.
|
186 |
+
# tableau_auth = TSC.PersonalAccessTokenAuth(
|
187 |
+
# st.secrets["tableau"]["token_name"],
|
188 |
+
# st.secrets["tableau"]["personal_access_token"],
|
189 |
+
# st.secrets["tableau"]["site_id"],
|
190 |
+
# )
|
191 |
+
# server = TSC.Server(st.secrets["tableau"]["server_url"],
|
192 |
+
# use_server_version=True)
|
193 |
+
|
194 |
+
# Get various data.
|
195 |
+
# Explore the tableauserverclient library for more options.
|
196 |
+
# Uses st.cache_data to only rerun when the query changes or after 10 min.
|
197 |
+
# @st.cache_data(ttl=600)
|
198 |
+
# def run_query():
|
199 |
+
# with server.auth.sign_in(tableau_auth):
|
200 |
+
# # Get all workbooks.
|
201 |
+
# workbooks, pagination_item = server.workbooks.get()
|
202 |
+
# workbooks_names = [w.name for w in workbooks]
|
203 |
+
#
|
204 |
+
# # Get views for first workbook.
|
205 |
+
# server.workbooks.populate_views(workbooks[0])
|
206 |
+
# views_names = [v.name for v in workbooks[0].views]
|
207 |
+
#
|
208 |
+
# # Get image & CSV for first view of first workbook.
|
209 |
+
# view_item = workbooks[0].views[0]
|
210 |
+
# server.views.populate_image(view_item)
|
211 |
+
# server.views.populate_csv(view_item)
|
212 |
+
# view_name = view_item.name
|
213 |
+
# view_image = view_item.image
|
214 |
+
# # `view_item.csv` is a list of binary objects, convert to str.
|
215 |
+
# view_csv = b"".join(view_item.csv).decode("utf-8")
|
216 |
+
#
|
217 |
+
# return workbooks_names, views_names, view_name, view_image, view_csv
|
218 |
+
#
|
219 |
+
#
|
220 |
+
# workbooks_names, views_names, view_name, view_image, view_csv = run_query()
|
221 |
+
#
|
222 |
+
# # Print results.
|
223 |
+
# st.subheader("📓 Workbooks")
|
224 |
+
# st.write("Found the following workbooks:", ", ".join(workbooks_names))
|
225 |
+
#
|
226 |
+
# st.subheader("👁️ Views")
|
227 |
+
# st.write(
|
228 |
+
# f"Workbook *{workbooks_names[0]}* has the following views:",
|
229 |
+
# ", ".join(views_names),
|
230 |
+
# )
|
231 |
+
#
|
232 |
+
# st.subheader("🖼️ Image")
|
233 |
+
# st.write(f"Here's what view *{view_name}* looks like:")
|
234 |
+
# st.image(view_image, width=300)
|
235 |
+
#
|
236 |
+
# st.subheader("📊 Data")
|
237 |
+
# st.write(f"And here's the data for view *{view_name}*:")
|
238 |
+
# st.write(pd.read_csv(StringIO(view_csv)))
|
239 |
+
#
|
240 |
+
# code = """
|
241 |
+
# <div class='tableauPlaceholder' id='viz1682353778450' style='position: relative'><noscript><a href='https://public.tableau.com/views/sp500_analyst/Sheet1?:language=es-ES&:display_count=n&:origin=viz_share_link'><img alt='sp500 ' src='https://public.tableau.com/static/images/sp/sp500_16798321799250/sp500/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='embed_code_version' value='3' /> <param name='site_root' value='' /><param name='name' value='sp500_16798321799250/sp500' /><param name='tabs' value='no' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/sp/sp500_16798321799250/sp500/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='language' value='en-US' /></object></div> <script type='text/javascript'> var divElement = document.getElementById('viz1682353778450'); var vizElement = divElement.getElementsByTagName('object')[0]; vizElement.style.width='100%';vizElement.style.height=(divElement.offsetWidth*0.75)+'px'; var scriptElement = document.createElement('script'); scriptElement.src = 'https://public.tableau.com/javascripts/api/viz_v1.js'; vizElement.parentNode.insertBefore(scriptElement, vizElement); </script>
|
242 |
+
# """
|
243 |
+
|
244 |
+
# embed_code(code, "html")
|
245 |
+
|
246 |
+
# # st.write(
|
247 |
+
# "<div class='tableauPlaceholder' id='viz1682353778450' style='position: relative'><noscript><a href='https://public.tableau.com/views/sp500_analyst/Sheet1?:language=es-ES&:display_count=n&:origin=viz_share_link'><img alt='sp500 ' src='https://public.tableau.com/static/images/sp/sp500_16798321799250/sp500/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='embed_code_version' value='3' /> <param name='site_root' value='' /><param name='name' value='sp500_16798321799250/sp500' /><param name='tabs' value='no' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/sp/sp500_16798321799250/sp500/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='language' value='en-US' /></object></div> <script type='text/javascript'> var divElement = document.getElementById('viz1682353778450'); var vizElement = divElement.getElementsByTagName('object')[0]; vizElement.style.width='100%';vizElement.style.height=(divElement.offsetWidth*0.75)+'px'; var scriptElement = document.createElement('script'); scriptElement.src = 'https://public.tableau.com/javascripts/api/viz_v1.js'; vizElement.parentNode.insertBefore(scriptElement, vizElement); </script>",
|
248 |
+
# unsafe_allow_html=True)
|
249 |
|
250 |
st.markdown('''
|
251 |
+
<br>
|
252 |
<h2>Nuestra Solución</h2>
|
253 |
+
<hr>
|
254 |
''', unsafe_allow_html=True)
|
255 |
+
st.write('''
|
256 |
+
Gracias
|
257 |
+
por
|
258 |
+
compartir
|
259 |
+
su
|
260 |
+
análisis
|
261 |
+
sobre
|
262 |
+
el
|
263 |
+
mercado
|
264 |
+
de
|
265 |
+
empleo
|
266 |
+
de
|
267 |
+
Data
|
268 |
+
en
|
269 |
+
Latinoamérica.Sobre
|
270 |
+
la
|
271 |
+
base
|
272 |
+
de
|
273 |
+
los
|
274 |
+
hallazgos
|
275 |
+
que
|
276 |
+
ha
|
277 |
+
presentado, se
|
278 |
+
pueden
|
279 |
+
identificar
|
280 |
+
algunas
|
281 |
+
oportunidades
|
282 |
+
y
|
283 |
+
desafíos
|
284 |
+
clave
|
285 |
+
para
|
286 |
+
el
|
287 |
+
crecimiento
|
288 |
+
del sector
|
289 |
+
en
|
290 |
+
la
|
291 |
+
región.
|
292 |
+
|
293 |
+
Algunas
|
294 |
+
de
|
295 |
+
las
|
296 |
+
principales
|
297 |
+
oportunidades
|
298 |
+
incluyen
|
299 |
+
la
|
300 |
+
creciente
|
301 |
+
demanda
|
302 |
+
de
|
303 |
+
habilidades
|
304 |
+
en
|
305 |
+
Data
|
306 |
+
Science
|
307 |
+
y
|
308 |
+
Machine
|
309 |
+
Learning, la
|
310 |
+
expansión
|
311 |
+
de
|
312 |
+
la
|
313 |
+
adopción
|
314 |
+
de
|
315 |
+
tecnologías
|
316 |
+
de
|
317 |
+
Big
|
318 |
+
Data, y
|
319 |
+
el
|
320 |
+
aumento
|
321 |
+
del interés
|
322 |
+
en
|
323 |
+
la
|
324 |
+
analítica
|
325 |
+
avanzada.Estas
|
326 |
+
tendencias
|
327 |
+
sugieren
|
328 |
+
que
|
329 |
+
hay
|
330 |
+
un
|
331 |
+
mercado
|
332 |
+
creciente
|
333 |
+
para
|
334 |
+
los
|
335 |
+
profesionales
|
336 |
+
de
|
337 |
+
datos
|
338 |
+
en
|
339 |
+
Latinoamérica.
|
340 |
+
|
341 |
+
Al
|
342 |
+
mismo
|
343 |
+
tiempo, sin
|
344 |
+
embargo, hay
|
345 |
+
algunos
|
346 |
+
desafíos
|
347 |
+
significativos
|
348 |
+
que
|
349 |
+
enfrenta
|
350 |
+
el
|
351 |
+
mercado
|
352 |
+
de
|
353 |
+
empleo
|
354 |
+
de
|
355 |
+
datos
|
356 |
+
en
|
357 |
+
la
|
358 |
+
región.En
|
359 |
+
particular, la
|
360 |
+
falta
|
361 |
+
de
|
362 |
+
habilidades
|
363 |
+
y
|
364 |
+
talento
|
365 |
+
especializado
|
366 |
+
es
|
367 |
+
un
|
368 |
+
problema
|
369 |
+
importante, ya
|
370 |
+
que
|
371 |
+
la
|
372 |
+
mayoría
|
373 |
+
de
|
374 |
+
las
|
375 |
+
empresas
|
376 |
+
no
|
377 |
+
tienen
|
378 |
+
el
|
379 |
+
personal
|
380 |
+
necesario
|
381 |
+
para
|
382 |
+
implementar
|
383 |
+
proyectos
|
384 |
+
de
|
385 |
+
datos
|
386 |
+
complejos.Además, la
|
387 |
+
falta
|
388 |
+
de
|
389 |
+
inversión
|
390 |
+
en
|
391 |
+
tecnologías
|
392 |
+
y
|
393 |
+
herramientas
|
394 |
+
de
|
395 |
+
datos
|
396 |
+
adecuadas
|
397 |
+
y
|
398 |
+
la
|
399 |
+
falta
|
400 |
+
de
|
401 |
+
infraestructura
|
402 |
+
digital
|
403 |
+
suficiente
|
404 |
+
también
|
405 |
+
son
|
406 |
+
barreras
|
407 |
+
para
|
408 |
+
el
|
409 |
+
crecimiento
|
410 |
+
del mercado.
|
411 |
+
|
412 |
+
Como
|
413 |
+
especialista
|
414 |
+
en
|
415 |
+
Data
|
416 |
+
Analytics, una
|
417 |
+
propuesta
|
418 |
+
de
|
419 |
+
negocio
|
420 |
+
para
|
421 |
+
abordar
|
422 |
+
estos
|
423 |
+
desafíos
|
424 |
+
y
|
425 |
+
aprovechar
|
426 |
+
las
|
427 |
+
oportunidades
|
428 |
+
en
|
429 |
+
el
|
430 |
+
mercado
|
431 |
+
de
|
432 |
+
empleo
|
433 |
+
de
|
434 |
+
datos
|
435 |
+
de
|
436 |
+
Latinoamérica
|
437 |
+
podría
|
438 |
+
ser
|
439 |
+
ofrecer
|
440 |
+
servicios
|
441 |
+
de
|
442 |
+
consultoría
|
443 |
+
y
|
444 |
+
formación
|
445 |
+
para
|
446 |
+
empresas
|
447 |
+
que
|
448 |
+
deseen
|
449 |
+
adoptar
|
450 |
+
tecnologías
|
451 |
+
de
|
452 |
+
Big
|
453 |
+
Data
|
454 |
+
y
|
455 |
+
analítica
|
456 |
+
avanzada.Además, se
|
457 |
+
podría
|
458 |
+
crear
|
459 |
+
una
|
460 |
+
plataforma
|
461 |
+
de
|
462 |
+
datos
|
463 |
+
en
|
464 |
+
línea
|
465 |
+
que
|
466 |
+
brinde
|
467 |
+
acceso
|
468 |
+
a
|
469 |
+
herramientas
|
470 |
+
y
|
471 |
+
recursos
|
472 |
+
de
|
473 |
+
análisis
|
474 |
+
de
|
475 |
+
datos
|
476 |
+
para
|
477 |
+
empresas
|
478 |
+
y
|
479 |
+
profesionales
|
480 |
+
de
|
481 |
+
datos
|
482 |
+
en
|
483 |
+
toda
|
484 |
+
la
|
485 |
+
región.Esta
|
486 |
+
plataforma
|
487 |
+
también
|
488 |
+
podría
|
489 |
+
ofrecer
|
490 |
+
oportunidades
|
491 |
+
de
|
492 |
+
trabajo
|
493 |
+
y
|
494 |
+
proyectos
|
495 |
+
de
|
496 |
+
datos
|
497 |
+
para
|
498 |
+
profesionales
|
499 |
+
de
|
500 |
+
datos
|
501 |
+
en
|
502 |
+
la
|
503 |
+
región.
|
504 |
+
|
505 |
+
En
|
506 |
+
resumen, el
|
507 |
+
mercado
|
508 |
+
de
|
509 |
+
empleo
|
510 |
+
de
|
511 |
+
datos
|
512 |
+
en
|
513 |
+
Latinoamérica
|
514 |
+
ofrece
|
515 |
+
grandes
|
516 |
+
oportunidades
|
517 |
+
de
|
518 |
+
crecimiento, pero
|
519 |
+
también
|
520 |
+
enfrenta
|
521 |
+
desafíos
|
522 |
+
importantes.Ofrecer
|
523 |
+
servicios
|
524 |
+
de
|
525 |
+
consultoría
|
526 |
+
y
|
527 |
+
formación
|
528 |
+
para
|
529 |
+
empresas
|
530 |
+
que
|
531 |
+
deseen
|
532 |
+
adoptar
|
533 |
+
tecnologías
|
534 |
+
de
|
535 |
+
Big
|
536 |
+
Data
|
537 |
+
y
|
538 |
+
crear
|
539 |
+
una
|
540 |
+
plataforma
|
541 |
+
de
|
542 |
+
datos
|
543 |
+
en
|
544 |
+
línea
|
545 |
+
podría
|
546 |
+
ser
|
547 |
+
una
|
548 |
+
forma
|
549 |
+
de
|
550 |
+
abordar
|
551 |
+
estos
|
552 |
+
desafíos
|
553 |
+
y
|
554 |
+
aprovechar
|
555 |
+
las
|
556 |
+
oportunidades
|
557 |
+
en
|
558 |
+
el
|
559 |
+
mercado
|
560 |
+
de
|
561 |
+
datos
|
562 |
+
de
|
563 |
+
Latinoamérica.'''
|
564 |
+
)
|
565 |
st.write('dashboard')
|
566 |
st.write('modelo de ML prediccion')
|
567 |
|
568 |
+
# st.set_page_config(page_title="Predicción de nuevos puestos de trabajo",
|
569 |
+
# page_icon=":bar_chart:", layout="wide")
|
570 |
+
|
571 |
+
st.title('Predicción de nuevos puestos de trabajo con ML')
|
572 |
+
|
573 |
+
# Cargar los datos
|
574 |
+
df = pd.read_csv(
|
575 |
+
'/home/catriel/Documents/data_world_jobs/data/ds_salaries.csv')
|
576 |
+
|
577 |
+
# Seleccionar las columnas relevantes
|
578 |
+
df_relevant = df[['job_title', 'work_year']]
|
579 |
+
|
580 |
+
# Transformar la columna work_year en un tipo date en la columna date
|
581 |
+
df_relevant['date'] = pd.to_datetime(df_relevant['work_year'], format='%Y')
|
582 |
+
|
583 |
+
# Agregar una columna con el año de creación
|
584 |
+
df_relevant['year'] = pd.DatetimeIndex(df_relevant['date']).year
|
585 |
+
|
586 |
+
# Contar la cantidad de job_title creados por año
|
587 |
+
job_title_count = df_relevant.groupby('year').count()['job_title']
|
588 |
+
|
589 |
+
# Crear un dataframe con la cantidad de job_title creados por año
|
590 |
+
df_job_title_count = pd.DataFrame(
|
591 |
+
{'year': job_title_count.index,
|
592 |
+
'job_title_count': job_title_count.values})
|
593 |
+
|
594 |
+
# Crear un modelo de regresión lineal
|
595 |
+
model = LinearRegression()
|
596 |
+
|
597 |
+
# Entrenar el modelo con los datos históricos
|
598 |
+
X = df_job_title_count[['year']]
|
599 |
+
y = df_job_title_count['job_title_count']
|
600 |
+
model.fit(X, y)
|
601 |
+
|
602 |
+
# Obtener el año actual
|
603 |
+
current_year = datetime.datetime.now().year
|
604 |
+
|
605 |
+
# Predecir la cantidad de nuevos job_title que se crearán este año
|
606 |
+
current_year_input = st.number_input('Ingresa un año:', value=current_year,
|
607 |
+
min_value=current_year,
|
608 |
+
max_value=2050, step=1)
|
609 |
+
if current_year_input < current_year:
|
610 |
+
st.warning('Solo se pueden hacer predicciones para años futuros.')
|
611 |
+
current_year_input = current_year
|
612 |
+
st.write('Se usará el año actual:', current_year_input)
|
613 |
+
|
614 |
+
with st.spinner('Prediciendo...'):
|
615 |
+
time.sleep(1)
|
616 |
+
job_title_count_pred = model.predict([[current_year_input]])
|
617 |
+
|
618 |
+
# Obtener el último año del dataset
|
619 |
+
last_year = df_job_title_count['year'].max()
|
620 |
+
last_year_count = \
|
621 |
+
df_job_title_count.loc[df_job_title_count['year'] == last_year][
|
622 |
+
'job_title_count'].values[0]
|
623 |
+
|
624 |
+
# Mostrar resultados
|
625 |
+
st.write(
|
626 |
+
"Se crearán aproximadamente **{}** nuevos puestos de trabajo este año **{}**.".format(
|
627 |
+
int(job_title_count_pred), current_year_input))
|
628 |
+
percentage_change = (
|
629 |
+
job_title_count_pred - last_year_count) / last_year_count * 100
|
630 |
+
percentage_change = float(percentage_change)
|
631 |
+
if percentage_change >= 0:
|
632 |
+
st.write(
|
633 |
+
"Esto representa un aumento del {:.2f}% con respecto al año {}.".format(
|
634 |
+
percentage_change, last_year))
|
635 |
+
else:
|
636 |
+
st.write(
|
637 |
+
"Esto representa una disminución del {:.2f}% con respecto al año {}".format(
|
638 |
+
abs(percentage_change), last_year))
|
639 |
+
|
640 |
+
# Crear un gráfico de línea
|
641 |
+
line_chart = alt.Chart(df_job_title_count).mark_line().encode(
|
642 |
+
x='year',
|
643 |
+
y='job_title_count'
|
644 |
+
).properties(
|
645 |
+
title='Cantidad de nuevos puestos de trabajo por año',
|
646 |
+
width=300,
|
647 |
+
height=200
|
648 |
+
).configure_axis(
|
649 |
+
labelFontSize=14,
|
650 |
+
titleFontSize=16
|
651 |
+
)
|
652 |
+
|
653 |
+
# Crear un punto para mostrar el valor predicho
|
654 |
+
point = alt.Chart(df_job_title_count.iloc[-1:]).mark_point(
|
655 |
+
color='#5c62ac').encode(
|
656 |
+
x='year',
|
657 |
+
y='job_title_count'
|
658 |
+
)
|
659 |
+
|
660 |
+
# Mostrar la gráfica actualizada con el valor predicho para el año ingresado
|
661 |
+
# st.altair_chart(line_chart, use_container_width=True)
|
662 |
+
|
663 |
+
# Crear botón para graficar la predicción
|
664 |
+
if st.button('Mostrar gráfico de predicción'):
|
665 |
+
# Crear dataframe con los años y las predicciones
|
666 |
+
years = list(range(last_year, current_year + current_year_input - 2000))
|
667 |
+
predictions = model.predict([[year] for year in years])
|
668 |
+
df_predictions = pd.DataFrame(
|
669 |
+
{'year': years, 'job_title_count_pred': predictions})
|
670 |
+
|
671 |
+
# Crear gráfico de línea
|
672 |
+
line_chart = alt.Chart(df_predictions).mark_line().encode(
|
673 |
+
x='year',
|
674 |
+
y='job_title_count_pred'
|
675 |
+
).properties(
|
676 |
+
width=700,
|
677 |
+
height=400
|
678 |
+
)
|
679 |
+
|
680 |
+
# Agregar capa con punto rojo en el valor predicho para el año actual
|
681 |
+
current_year_pred = int(model.predict([[current_year_input]])[0])
|
682 |
+
point_chart = alt.Chart(pd.DataFrame(
|
683 |
+
{'x': [current_year_input], 'y': [current_year_pred]})).mark_point(
|
684 |
+
color='#5c62ac',
|
685 |
+
size=300,
|
686 |
+
stroke='#5c62ac',
|
687 |
+
strokeWidth=5).encode(
|
688 |
+
x='x',
|
689 |
+
y='y'
|
690 |
+
)
|
691 |
+
|
692 |
+
# Mostrar gráfico con la capa adicional del punto rojo
|
693 |
+
st.altair_chart(line_chart + point_chart)
|
694 |
+
|
695 |
+
|
696 |
+
|
697 |
+
|
698 |
+
|
699 |
+
|
700 |
+
|
701 |
+
|
702 |
+
|
703 |
+
|
704 |
st.markdown('''
|
705 |
+
<br>
|
706 |
<h2>Gracias por su tiempo y atención!</h2>
|
707 |
+
<hr>
|
708 |
<h3>Nuevas Propuestas...</h3>
|
709 |
+
<p>Sí te gusto lo que viste, te invito a ver lo que se vendrá en la
|
710 |
sección "New"</p>
|
711 |
''', unsafe_allow_html=True)
|
712 |
|
|
|
799 |
|
800 |
st.markdown('''
|
801 |
<h2>Presupuesto</h2>
|
802 |
+
<hr>
|
803 |
''', unsafe_allow_html=True)
|
804 |
|
805 |
# Define los precios para cada opción
|
806 |
+
precio_analisis = 3500
|
807 |
+
precio_ML = 5500
|
808 |
+
precio_app = 3000
|
809 |
+
precio_mantenimiento = 550
|
810 |
|
811 |
# Define las opciones como un diccionario de la forma {nombre_opción: precio_opción}
|
812 |
opciones = {
|
|
|
835 |
seleccionada])
|
836 |
|
837 |
# Muestra el total
|
838 |
+
st.markdown(f'''
|
839 |
+
Total $: <span style="background:#5c62ac;\
|
840 |
+
border-radius:5px;padding:5px">{total}</span>
|
841 |
+
:rocket:
|
842 |
+
''', unsafe_allow_html=True)
|
843 |
|
844 |
st.markdown('''
|
845 |
+
<br>
|
846 |
<h2>Datos de contactos</h2>
|
847 |
+
<hr>
|
848 |
''', unsafe_allow_html=True)
|
849 |
# Crea campos de entrada para el nombre, correo electrónico y mensaje
|
850 |
nombre = st.text_input("Nombre completo")
|