{"id":2991,"date":"2021-10-24T20:59:26","date_gmt":"2021-10-24T23:59:26","guid":{"rendered":"https:\/\/www.geekosas.com\/?p=2991"},"modified":"2021-10-24T22:48:00","modified_gmt":"2021-10-25T01:48:00","slug":"back-to-office-post-covid19","status":"publish","type":"post","link":"https:\/\/geekosas.com\/index.php\/es\/2021\/10\/24\/back-to-office-post-covid19\/","title":{"rendered":"Back to Office Post-Covid19"},"content":{"rendered":"<p>Antes de comenzar con este art\u00edculo quiero agradecer a Tristan Riquelme por darme la idea, es \u00e9l alguien que siempre tiene excelentes ideas sobre d\u00f3nde aplicar herramientas matem\u00e1ticas a problemas reales.<\/p>\n<p>Ahora comenzando con el art\u00edculo:<br \/>\nAunque encontremos una cura definitiva para el COVID-19, este ya ha creado cambios culturales que seguir\u00e1n con nosotros por mucho tiempo.<br \/>\nUno de los grandes cambios, es que se demostr\u00f3 que el trabajo remoto es una posibilidad y en muchas ocasiones m\u00e1s eficiente que el trabajo presencial, pero eso no significa que no existan beneficios en el trabajo presencial. Es por eso que muchas empresas han optado por un sistema h\u00edbrido con turnos presenciales, los cuales se ajustan a los aforos existentes y las necesidades de la empresa.<br \/>\nEn una empresa grande, decidir qu\u00e9 d\u00eda va cada colaborador a trabajar es una tarea bastante compleja  que abarca muchas dimensiones, por ejemplo:<\/p>\n<ul>\n<li>que las personas correctas se topen<\/li>\n<li>que se cumplan los aforos<\/li>\n<li>preferencias de cada colaborador<\/li>\n<li>n\u00famero de veces a la semana que debe ir cada uno<\/li>\n<\/ul>\n<p>El computador no es m\u00e1s inteligente que las personas, pero si tiene m\u00e1s ojos, por eso estos casos con muchas variables es mejor entregarselos al computador.La herramienta que utilizaremos ser\u00e1 la programaci\u00f3n matem\u00e1tica, donde la utilizaremos para decidir qu\u00e9 d\u00eda va cada colaborador a trabajar, acorde a sus preferencias y las necesidades de la empresa.<\/p>\n<p>En este caso, vamos a definir que las personas que deben toparse en la oficina son las del mismo equipo, haremos que cada persona pertenezca a uno y un d\u00eda a la semana, todos los de un equipo deber\u00e1n ir a la oficina y as\u00ed realizar actividades de equipo.<\/p>\n<h3>Planteamiento del Modelo<\/h3>\n<h4>Cargar Datasets<\/h4>\n<p>Para considerar las preferencias de cada colaborador, le pediremos a cada uno que asigne un puntaje a cada d\u00eda del siguiente modo:<br \/>\n<img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2021\/10\/image-1635109694128.png?ssl=1\" alt=\"file\" \/><\/p>\n<p>Comenzaremos cargando los datos a python y preparando la data:<\/p>\n<pre><code class=\"language-python\">>&gt;&gt; import pulp\n>&gt;&gt; import itertools\n>&gt;&gt; import pandas as pd\n>&gt;&gt; pref = pd.read_excel(&quot;data_con_pref.xlsx&quot;,&quot;pref&quot;)\n>&gt;&gt; pref = pref.fillna(0)\n>&gt;&gt; print(pref)\n       lun  mar  mie  jue  vie\ncolab                         \nc1       1    4   -5    5   -5\nc2      -3    5   -3    5   -4\nc3       3    3   -5    4   -5\nc4      -2    1    8    1   -8\nc5      -4   -6    1    7    2\nc6       3    3    3    1  -10\nc7       2    2    2    2    2\nc8      -8    3    3   -2    4\nc9      -2   -8    4    2    4\nc10      4    3    3   -5   -5\nc11      0    5    2    3  -10\nc12      1   -3   -7    8    1\nc13      5    5   -3   -3   -4\nc14     -2    5    5   -2   -6\nc15      2   -3   -4   -3    8<\/code><\/pre>\n<p>Las preferencias se utilizar\u00e1n para calcular el beneficio de seguirlas para el modelo, pero obviamente obligar a ir a trabajar a una persona un d\u00eda que no es de su preferencia, es bastante molesto, por eso luego de escalar los puntajes, multiplicaremos por 2 los valores negativos.<\/p>\n<pre><code class=\"language-python\">>&gt;&gt; #escalado a 1 y doble ponderaci\u00f3n de negativos\n>&gt;&gt; \n>&gt;&gt; for c in pref.index:\n...     pref.loc[c,:] = pref.loc[c,:]\/pref.loc[c,:].abs().sum()\n...     pref.loc[c,:] = [x if x &gt; 0 else 2*x for x in pref.loc[c,:]]\n... \n>&gt;&gt; print(pref)\n        lun   mar   mie   jue   vie\ncolab                              \nc1     0.05  0.20 -0.50  0.25 -0.50\nc2    -0.30  0.25 -0.30  0.25 -0.40\nc3     0.15  0.15 -0.50  0.20 -0.50\nc4    -0.20  0.05  0.40  0.05 -0.80\nc5    -0.40 -0.60  0.05  0.35  0.10\nc6     0.15  0.15  0.15  0.05 -1.00\nc7     0.20  0.20  0.20  0.20  0.20\nc8    -0.80  0.15  0.15 -0.20  0.20\nc9    -0.20 -0.80  0.20  0.10  0.20\nc10    0.20  0.15  0.15 -0.50 -0.50\nc11    0.00  0.25  0.10  0.15 -1.00\nc12    0.05 -0.30 -0.70  0.40  0.05\nc13    0.25  0.25 -0.30 -0.30 -0.40\nc14   -0.20  0.25  0.25 -0.20 -0.60\nc15    0.10 -0.30 -0.40 -0.30  0.40<\/code><\/pre>\n<p>adem\u00e1s de una tabla con la pertenencia a cada equipo:<br \/>\n<img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2021\/10\/image-1635109747576.png?ssl=1\" alt=\"file\" \/><\/p>\n<pre><code class=\"language-python\">>&gt;&gt; team = pd.read_excel(&quot;data_con_pref.xlsx&quot;,&quot;team&quot;)\n>&gt;&gt; team = team.set_index(&#039;colab&#039;)\n>&gt;&gt; print(team)\n      team\ncolab     \nc1      t1\nc2      t1\nc3      t1\nc4      t1\nc5      t2\nc6      t2\nc7      t2\nc8      t2\nc9      t2\nc10     t3\nc11     t3\nc12     t3\nc13     t3\nc14     t3\nc15     t3<\/code><\/pre>\n<h4>Dimensiones<\/h4>\n<p>Son como las coordenadas de los datos<\/p>\n<ul>\n<li><strong>colab<\/strong>: colaboradores<\/li>\n<li><strong>dias<\/strong>: d\u00eda de la semana<\/li>\n<li><strong>team<\/strong> : equipo (team)<\/li>\n<\/ul>\n<p>los sacamos de los mismos datos:<\/p>\n<pre><code class=\"language-python\"># indices\ndias = pref.columns\ncolab = pref.index\nteams = set(team[&quot;team&quot;])<\/code><\/pre>\n<h4>Variables de Decisi\u00f3n<\/h4>\n<p>Qu\u00e9 d\u00eda va cada colaborador: 1 si va un d\u00eda 0 si no:<\/p>\n<pre><code class=\"language-python\">CD = {e:{d:pulp.LpVariable(cat =&#039;Binary&#039;, name =&#039;{} el {}&#039;.format(e, d)) for d in dias} for e in emp}<\/code><\/pre>\n<p>Cu\u00e1l ser\u00e1 el d\u00eda que cada equipo se encontrara<\/p>\n<pre><code class=\"language-python\">TD = {t:{d:pulp.LpVariable(cat =&#039;Binary&#039;, name =&#039;{} el {}&#039;.format(t, d)) for d in dias} for t in teams}<\/code><\/pre>\n<h4>Funci\u00f3n Objetivo<\/h4>\n<p>La funci\u00f3n objetivo es la que nos permite comparar con un n\u00famero diferentes combinaciones de turnos.<\/p>\n<p>La funci\u00f3n objetivo es discutible, podr\u00edan muchas por ejemplo: maximizar el colaborador que peor queda con respecto a sus preferencias o maximizar el beneficio global. En este caso construiremos el segundo caso, donde hay beneficio por ir los d\u00edas de preferencia y por no ir los d\u00edas sin preferencia o score negativo:<\/p>\n<p><code class=\"katex-inline\">obj = \\sum_{c,d}{CD_{c,d} * pref_{c,d} - (1-CD_{c,d}) * pref_{c,d} }<\/code><\/p>\n<pre><code class=\"language-python\">prob = pulp.LpProblem(&quot;DIAS&quot;, pulp.LpMaximize)\nprob += pulp.lpSum([ CD[e][d] * pref.loc[e, d] - (1 - CD[e][d]) * pref.loc[e, d] for e, d in itertools.product(emp, dias)])<\/code><\/pre>\n<h4>Restricciones<\/h4>\n<p>Por \u00faltimo definiremos la interacci\u00f3n de las variables como restricciones que reflejan las condiciones que hacen que una combinaci\u00f3n de turnos sea v\u00e1lida:<\/p>\n<h5>Todos van 2 veces a la semana<\/h5>\n<p><code class=\"katex-inline\">\\forall e \\in colab \\sum_{d \\in dias} CD_{c,d} = 2<\/code><\/p>\n<pre><code class=\"language-python\">for e in emp:\n    prob += pulp.lpSum([CD[e][d] for d in dias]) == 2<\/code><\/pre>\n<h5>Cada equipo tiene su d\u00eda<\/h5>\n<p><code class=\"katex-inline\">\\forall t \\in team \\sum_{d \\in dias} TD_{t,d} = 1<\/code><\/p>\n<pre><code class=\"language-python\">for t in teams:\n    prob += pulp.lpSum([TD[t][d] for d in dias]) == 1<\/code><\/pre>\n<h5>Todos van en el d\u00eda del equipo<\/h5>\n<pre><code class=\"language-python\">for e, t, d in itertools.product(colab,teams,dias):\n    if team.loc[e,&#039;team&#039;] == t:\n        prob += CD[e][d] &gt;= TD[t][d]<\/code><\/pre>\n<h5>Aforo m\u00e1ximo de 10 personas diarias en la oficina<\/h5>\n<p><code class=\"katex-inline\">\\forall d \\in dias \\sum_{e \\in colab} CD_{e,d} <= 10<\/code><\/p>\n<pre><code class=\"language-python\">for d in dias:\n    prob += pulp.lpSum([CD[e][d] for e in emp]) &lt;= 10<\/code><\/pre>\n<h4>Resolvemos el problema y vemos los resultados:<\/h4>\n<pre><code class=\"language-python\">solver = pulp.getSolver(&#039;PULP_CBC_CMD&#039;)\nprob.solve(solver)<\/code><\/pre>\n<h4>vemos la soluci\u00f3n<\/h4>\n<p>vemos que en este caso solo 2 colaboradores tendr\u00e1n que ir en d\u00edas que no son de su preferencia<\/p>\n<pre><code class=\"language-python\">>&gt;&gt; for e,d in itertools.product(colab,dias):\n...     if(pulp.value(CD[e][d]) &gt; 0.9):\n...         print(&#039;{} va el {} y esta {}&#039;.format(e,d,&#039;ok&#039; if pref.loc[e,d] &gt; 0 else &#039;mal&#039;))\n... \nc1 va el mar y esta ok\nc1 va el jue y esta ok\nc2 va el mar y esta ok\nc2 va el jue y esta ok\nc3 va el mar y esta ok\nc3 va el jue y esta ok\nc4 va el mie y esta ok\nc4 va el jue y esta ok\nc5 va el mie y esta ok\nc5 va el jue y esta ok\nc6 va el lun y esta ok\nc6 va el mie y esta ok\nc7 va el mar y esta ok\nc7 va el mie y esta ok\nc8 va el mie y esta ok\nc8 va el vie y esta ok\nc9 va el mie y esta ok\nc9 va el vie y esta ok\nc10 va el lun y esta ok\nc10 va el mie y esta ok\nc11 va el lun y esta mal\nc11 va el mar y esta ok\nc12 va el lun y esta ok\nc12 va el jue y esta ok\nc13 va el lun y esta ok\nc13 va el mar y esta ok\nc14 va el lun y esta mal\nc14 va el mie y esta ok\nc15 va el lun y esta ok\nc15 va el vie y esta ok<\/code><\/pre>\n<p>obteniendo un score de 17.4<\/p>\n<pre><code class=\"language-python\">>&gt;&gt;print(&quot;Valor Objetivo&quot;)\n>&gt;&gt;print(pulp.value(prob.objective))\n17.400000000000006<\/code><\/pre>\n<p>si quieres ver el c\u00f3digo lo puedes descargar desde mi github:  <a href=\"https:\/\/github.com\/danielfm123\/turnos_back_to_office\">https:\/\/github.com\/danielfm123\/turnos_back_to_office<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Antes de comenzar con este art\u00edculo quiero agradecer a Tristan Riquelme por darme la idea, es \u00e9l alguien que siempre tiene excelentes ideas sobre d\u00f3nde <a class=\"mh-excerpt-more\" href=\"https:\/\/geekosas.com\/index.php\/es\/2021\/10\/24\/back-to-office-post-covid19\/\" title=\"Back to Office Post-Covid19\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":3031,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-2991","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categoria"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/dressed_0617-780x710-1.jpg?fit=780%2C710&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8vjqF-Mf","jetpack-related-posts":[{"id":2728,"url":"https:\/\/geekosas.com\/index.php\/es\/2019\/07\/15\/estamos-de-vuelta\/","url_meta":{"origin":2991,"position":0},"title":"Estamos de Vuelta","author":"Daniel Fischer","date":"2019-07-15","format":false,"excerpt":"A pesar de nuestro EX-HOSTING DigitalOcean, el cual despu\u00e9s de ser cliente por 5 a\u00f1os por un mes de atraso borr\u00f3 todo el contenido de mi cuenta, incluido el trabajo de este sitio Web. Es razonable que por no pagar se bajen los servidores, incluso que seo borren, debo decir\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/07\/digital-ocean.png?fit=815%2C495&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/07\/digital-ocean.png?fit=815%2C495&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/07\/digital-ocean.png?fit=815%2C495&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/07\/digital-ocean.png?fit=815%2C495&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":2743,"url":"https:\/\/geekosas.com\/index.php\/es\/2019\/08\/04\/destapando-los-promedios\/","url_meta":{"origin":2991,"position":1},"title":"Destapando los promedios","author":"Daniel Fischer","date":"2019-08-04","format":false,"excerpt":"Como dicen por ah\u00ed, los promedios esconden muchas cosas, en el articulo gender-pay-gap-en-tecnologia vimos un an\u00e1lisis que mostraba como, para esos datos, la diferencia de sueldos entre hombres y mujeres puede entenderse con factores distintos al g\u00e9nero. Ahora vamos a ver una t\u00e9cnica, basada en machine learning, muy simple de\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/08\/distribution.png?fit=1200%2C767&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/08\/distribution.png?fit=1200%2C767&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/08\/distribution.png?fit=1200%2C767&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/08\/distribution.png?fit=1200%2C767&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/08\/distribution.png?fit=1200%2C767&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":21,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/04\/11\/como-elegir-celular\/","url_meta":{"origin":2991,"position":2},"title":"Como elegir celular?","author":"Daniel Fischer","date":"2016-04-11","format":false,"excerpt":"Pasamos m\u00e1s tiempo con nuestro celular que con nuestra familia, es m\u00e1s, lo usamos para comunicarlos con ella y para muchos es una herramienta fundamental de trabajo. Un celular, quiera admitirlo o no, es un compa\u00f1ero de vida, que seg\u00fan sea la relaci\u00f3n te podr\u00eda acompa\u00f1ar el ba\u00f1o por varios\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/mensagens_amor_namorados_para_celular.jpg?fit=400%2C225&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2755,"url":"https:\/\/geekosas.com\/index.php\/es\/2019\/08\/26\/destapando-promedios-v2\/","url_meta":{"origin":2991,"position":3},"title":"Destapando Promedios V2","author":"Daniel Fischer","date":"2019-08-26","format":false,"excerpt":"Unos d\u00edas atr\u00e1s escrib\u00ed el articulo Destapando Promedios que b\u00e1sicamente lo que hac\u00eda era abrir un valor promedio en factores utilizando arboles, por favor leer el articulo antes de seguir. En ese an\u00e1lisis de ejemplo yo cree el dataset y por ende sabia exactamente donde estaba el cambio, el cual\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/08\/averages.jpeg?fit=500%2C345&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2067,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/03\/27\/que-son-las-redes-neuronales\/","url_meta":{"origin":2991,"position":4},"title":"Que son las redes neuronales?","author":"Daniel Fischer","date":"2016-03-27","format":false,"excerpt":"Muchos han escuchado alguna vez hablar sobre las redes neuronales o la \"inteligencia artificial\" y hemos de ser honestos que cuando alguien utiliza aquellas palabras, suena como todo un Einstein de la computaci\u00f3n sacado de Terminator 2. B\u00e1sicamente, las redes neuronales, se aplican cuando el desarrollador no tiene la m\u00e1s\u2026","rel":"","context":"In &quot;Uncategorized&quot;","block_context":{"text":"Uncategorized","link":"https:\/\/geekosas.com\/index.php\/es\/category\/uncategorized-es\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/03\/ai.jpg?fit=608%2C211&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/03\/ai.jpg?fit=608%2C211&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/03\/ai.jpg?fit=608%2C211&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3115,"url":"https:\/\/geekosas.com\/index.php\/es\/2022\/05\/07\/buenas-practicas-al-programar-con-codigo\/","url_meta":{"origin":2991,"position":5},"title":"Buenas pr\u00e1cticas al programar (con c\u00f3digo)","author":"Daniel Fischer","date":"2022-05-07","format":false,"excerpt":"Muchos disfrutan programar y resolver laberintos algor\u00edtmicos en su lenguaje favorito, pero lo que a nadie le gusta, es meterse en un c\u00f3digo viejo o incluso peor, en un c\u00f3digo escrito por otro. A m\u00ed me ha tocado hacerlo ya varias veces, algunas veces ha sido malo, otras veces peor,\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=1050%2C600 3x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/2991","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/comments?post=2991"}],"version-history":[{"count":11,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/2991\/revisions"}],"predecessor-version":[{"id":3043,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/2991\/revisions\/3043"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media\/3031"}],"wp:attachment":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media?parent=2991"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/categories?post=2991"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/tags?post=2991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}