perezcatriel commited on
Commit
4f30b91
1 Parent(s): 67051c5
Files changed (4) hide show
  1. .streamlit/config.toml +5 -4
  2. .streamlit/secrets.html +7 -0
  3. ML/prediccion_job.py +132 -0
  4. app.py +607 -30
.streamlit/config.toml CHANGED
@@ -1,7 +1,8 @@
1
  [theme]
2
- base="#1b9ac4"
3
- primaryColor="#7fe3fa"
4
- backgroundColor="#057893"
5
  secondaryBackgroundColor="#5c62ac"
6
  textColor="#7fe3fa"
7
- font="sans serif"
 
 
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 smtplib
 
 
 
 
 
 
 
 
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>LatamBrain</h1>
50
- <h2>Pensamos Futuro</h2>
 
51
  <hr />
52
  """, unsafe_allow_html=True)
53
  col2.image(image, width=300)
54
 
55
  st.markdown('''
 
56
  <h2>Quienes somos?</h2>
57
- <p>Hola, Somos LatamBrain una Startup Latino-americana creada para
58
- solucionar futuro aplicando tecnologías de última generación como
59
- algoritmos de ML y Deep Learning, Data Analyst y todo esto sobre el
60
- servicio de AWS Cloud para mayor disponibilidad, seguridad y
61
- almacenamiento.
 
 
62
  </p>
63
- <p>LatamBrain, Pensamos futuro!</p>
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 procesos
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
- ejemplo = '''
104
- <h3>Catriel Pérez</h3>
105
  <a href="mailto:perezcatriel@gmail.com">Contactame</a>
106
- <p>Excelente experiencia! trabajando a la par de un gran grupo
107
- humano y muy dedicados de Data Scientist y Mentor. Feliz del
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
- col1.markdown(ejemplo, unsafe_allow_html=True)
114
- col2.markdown(ejemplo, unsafe_allow_html=True)
115
- col3.markdown(ejemplo, unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
  if selected2 == "Projects":
118
  st.markdown('''
119
- <h1>Data World Jobs</h1>
 
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('breve descripcion')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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í le gusto lo que vio, lo invito a ver lo que vendra en la
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 = 1000
236
- precio_ML = 1500
237
- precio_app = 500
238
- precio_mantenimiento = 250
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.write("Total $:", total, ':rocket:')
 
 
 
 
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:&#47;&#47;public.tableau.com&#47;views&#47;sp500_analyst&#47;Sheet1?:language=es-ES&amp;:display_count=n&amp;:origin=viz_share_link'><img alt='sp500 ' src='https:&#47;&#47;public.tableau.com&#47;static&#47;images&#47;sp&#47;sp500_16798321799250&#47;sp500&#47;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&#47;sp500' /><param name='tabs' value='no' /><param name='toolbar' value='yes' /><param name='static_image' value='https:&#47;&#47;public.tableau.com&#47;static&#47;images&#47;sp&#47;sp500_16798321799250&#47;sp500&#47;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:&#47;&#47;public.tableau.com&#47;views&#47;sp500_analyst&#47;Sheet1?:language=es-ES&amp;:display_count=n&amp;:origin=viz_share_link'><img alt='sp500 ' src='https:&#47;&#47;public.tableau.com&#47;static&#47;images&#47;sp&#47;sp500_16798321799250&#47;sp500&#47;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&#47;sp500' /><param name='tabs' value='no' /><param name='toolbar' value='yes' /><param name='static_image' value='https:&#47;&#47;public.tableau.com&#47;static&#47;images&#47;sp&#47;sp500_16798321799250&#47;sp500&#47;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:&#47;&#47;public.tableau.com&#47;views&#47;sp500_analyst&#47;Sheet1?:language=es-ES&amp;:display_count=n&amp;:origin=viz_share_link'><img alt='sp500 ' src='https:&#47;&#47;public.tableau.com&#47;static&#47;images&#47;sp&#47;sp500_16798321799250&#47;sp500&#47;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&#47;sp500' /><param name='tabs' value='no' /><param name='toolbar' value='yes' /><param name='static_image' value='https:&#47;&#47;public.tableau.com&#47;static&#47;images&#47;sp&#47;sp500_16798321799250&#47;sp500&#47;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")