{"id":39981,"date":"2020-01-23T12:23:08","date_gmt":"2020-01-23T12:23:08","guid":{"rendered":"https:\/\/keepler.io\/?p=39981"},"modified":"2023-11-27T12:26:49","modified_gmt":"2023-11-27T12:26:49","slug":"prediccion-series-temporales-redes-neuronas","status":"publish","type":"post","link":"https:\/\/keepler.io\/es\/2020\/01\/23\/prediccion-series-temporales-redes-neuronas\/","title":{"rendered":"Predicci\u00f3n de series temporales con redes de neuronas"},"content":{"rendered":"<p>Las series temporales son una disciplina ampliamente estudiada por sus m\u00faltiples aplicaciones en muchos sectores. Por ejemplo, los valores de las acciones en la bolsa, las visitas de usuarios en una web, suscripciones a una plataforma online, consumo el\u00e9ctrico, etc. Generalmente se suele hablar de datos segmentados por su variable temporal en los que parece haber una cierta dependencia entre cada instante temporal y los anteriores.<\/p>\n<div id=\"attachment_29185\" style=\"width: 710px\" class=\"wp-caption aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29185\" class=\"wp-image-29185\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/10\/ejemplo-serie-temporal.png?resize=700%2C215&#038;ssl=1\" alt=\"\" width=\"700\" height=\"215\" \/><p id=\"caption-attachment-29185\" class=\"wp-caption-text\">Ejemplo de serie temporal.<\/p><\/div>\n<p>A lo largo de este art\u00edculo desgranamos las diferentes partes de una serie temporal y c\u00f3mo podemos aplicar las redes de neuronas para realizar predicciones sobre las mismas.<\/p>\n<h4>\u00bfQu\u00e9 es una serie temporal?<\/h4>\n<p>Una serie temporal se define como una sucesi\u00f3n de <strong>observaciones<\/strong> (datos o valores) de una variable tomadas en diferentes <strong>instantes temporales y ordenadas<\/strong> en base a los mismos. M\u00e1s formalmente podemos definir una serie temporal a partir de las siguientes componentes generales:<\/p>\n<p><strong>Estacionariedad<\/strong>: refleja la variabilidad de la serie. Formalmente se define como proceso estacionario (o proceso estrictamente estacionario), un proceso estoc\u00e1stico cuya distribuci\u00f3n de probabilidad en un instante de tiempo fijo o una posici\u00f3n fija es la misma para todos los instantes de tiempo o posiciones. Es decir, una serie cuya media y varianza permanecen constantes a lo largo de toda la serie.<\/p>\n<p><strong>Tendencia<\/strong>: refleja la evoluci\u00f3n o el comportamiento de las observaciones a largo plazo. No es necesariamente lineal y puede ser creciente o decreciente.<\/p>\n<ul>\n<li>Componente c\u00edclico: variaciones que aparecen en algunas series temporales y tiene relaci\u00f3n con la tendencia. Toman forma de oscilaciones irregulares peri\u00f3dicas de m\u00e1s de un a\u00f1o de duraci\u00f3n.<\/li>\n<\/ul>\n<p><strong>Estacionalidad<\/strong>: movimiento de oscilaci\u00f3n a corto plazo (las estaciones, los meses). Siempre es un periodo de repetici\u00f3n conocido y fijo (no como los ciclos).<\/p>\n<p><strong>Componente aleatoria<\/strong>: Componentes con car\u00e1cter aleatorio en torno a las dos anteriores: aleatoria (o residuo, suele ser ruido debido a fen\u00f3menos ocasionales externos) o transiente (producto de fen\u00f3menos aislados que no impactan en la tendencia).<\/p>\n<p>En caso de buscar utilizar m\u00e9todos estad\u00edsticos tradicionales (ARIMA, Prophet, etc), la serie temporal debe ser estacionaria para que las predicciones no est\u00e9n sesgadas. En caso de no ser estacionaria la influencia de otras componentes que no son constantes (como la tendencia) provoca que la predicci\u00f3n no sea correcta. Es por esto que gran parte de estos m\u00e9todos tradicionales de estudio y predicci\u00f3n se basan en intentar convertir la serie temporal a una serie equivalente estacionaria tras haber caracterizado las componentes principales.<\/p>\n<p>Otra t\u00e9cnica utilizada para la predicci\u00f3n en series temporales son las redes de neuronas artificiales. Son una t\u00e9cnica de machine learning que aproxima funciones para caracterizar un conjunto y resolver diferentes tipos de problemas. La principal ventaja frente a m\u00e9todos tradicionales es que no es necesario realizar el paso de feature engineering (extracci\u00f3n de caracter\u00edsticas), si no que lo realiza la red autom\u00e1ticamente, en mayor o menor medida dependiendo del tipo de red. Esto, aplicado a las series temporales, quiere decir que la caracterizaci\u00f3n es autom\u00e1tica.<\/p>\n<p>En concreto existen un tipo de redes de neuronas, las LSTM (Long Short Term Memory), que funcionan muy bien con este tipo de casos de uso. Son redes que pueden almacenar cierto grado de memoria sobre el estado de la red con conjuntos de instancias anteriores. Esto las hace muy buenas en problemas donde las instancias tienen cierta tendencia heredada de observaciones anteriores como la series temporales.<\/p>\n<h4>\u00bfC\u00f3mo funcionan las redes de neuronas?<\/h4>\n<p>Una red de neuronas (en ocasiones denominado \u201caproximador universal\u201d) es un modelo de Machine Learning (disciplina que forma parte de la Inteligencia Artificial) que permite caracterizar un conjunto de datos por medio de una funci\u00f3n matem\u00e1tica que aproxima la \u201csalida\u201d de la red. Esta salida corresponde con las soluci\u00f3n objetivo del problema. Por ejemplo, en una regresi\u00f3n sobre una serie temporal ser\u00eda el siguiente valor de la serie.<\/p>\n<div id=\"attachment_29191\" style=\"width: 610px\" class=\"wp-caption aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29191\" class=\"wp-image-29191\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/10\/arquitectura-red-neuronas.png?resize=600%2C371&#038;ssl=1\" alt=\"\" width=\"600\" height=\"371\" \/><p id=\"caption-attachment-29191\" class=\"wp-caption-text\">Arquitectura de red de neuronas tradicional.<\/p><\/div>\n<p>Tiene varias componentes principales:<\/p>\n<p><strong>Entrada<\/strong> (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+x_i+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" x_i \" class=\"latex\" \/>): matriz con los patrones de entrada en cada iteraci\u00f3n. Deben ser num\u00e9ricos.<\/p>\n<p><strong>Capa<\/strong>: Conjunto de neuronas completamente conectadas con la capa anterior.<\/p>\n<p><strong>Pesos<\/strong> (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+w_%7Bin%7D+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" w_{in} \" class=\"latex\" \/>): matriz de pesos que multiplican a las entradas o activaciones. Estos pesos se actualizan durante el backpropagation, que es como se llama al proceso de aprendizaje. Adem\u00e1s, normalmente se asocia a los pesos el bias ( <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+b+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" b \" class=\"latex\" \/> ), una componente de sesgo que no depende de la entrada.<\/p>\n<p><strong>Funci\u00f3n de activaci\u00f3n<\/strong>: Funci\u00f3n que determina la salida de cada neurona. Su entrada es la combinaci\u00f3n lineal de salidas de la capa anterior y los pesos. T\u00edpicamente son funciones no lineales -sigmoid, tanh, ReLU, softplus-.<\/p>\n<ul>\n<li>Por ejemplo, para la primera neurona <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+a_0+%3D+f%28x_0+%5Ccdot+w_%7B00%7D+%2B+x_1+%5Ccdot+w_%7B10%7D+%2B+%5Cldots%7B%7D+%2B+x_i+%5Ccdot+w_%7B10%7D+%2B+b%29+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" a_0 = f(x_0 &#92;cdot w_{00} + x_1 &#92;cdot w_{10} + &#92;ldots{} + x_i &#92;cdot w_{10} + b) \" class=\"latex\" \/><\/li>\n<\/ul>\n<p>El funcionamiento de una red de neuronas es lo que se suele llamar <em>feedforward<\/em>, que es esencialmente el comportamiento de la red al realizar las operaciones \u201chacia delante\u201d. Este proceso se realiza tanto durante el entrenamiento como durante la inferencia, es el funcionamiento normal de la red.<\/p>\n<p>Durante el proceso de <em>feedforward<\/em> lo que hace el algoritmo es, para cada neurona desde la capa de entrada hasta la de salida:<\/p>\n<ol>\n<li>Multiplicar cada una de las salidas de la capa anterior por los pesos de las conexiones entre la capa anterior y la actual y sumarlos. Esto es la combinaci\u00f3n lineal de salidas de la capa anterior por pesos.<\/li>\n<li>Ejecuta la funci\u00f3n de activaci\u00f3n al resultado de la combinaci\u00f3n lineal obtenida en el paso anterior. Este resultado es la salida de esta neurona. El vector resultante de la salida de cada neurona se considera la salida de cada capa.<\/li>\n<\/ol>\n<p>Este proceso se repite hasta haber recorrido todas las capas. El resultado en la \u00faltima capa (la capa de salida) se considera la salida de la red.<\/p>\n<p>Existe otro procedimiento, llamado <em>backpropagation<\/em>, que es el que se realiza durante el entrenamiento de la red para actualizar los pesos entre capas. Esta modificaci\u00f3n es la que incorpora el conocimiento que se extrae durante el entrenamiento al modelo final. Este modelo final no es m\u00e1s que la configuraci\u00f3n de pesos de la red al final del entrenamiento, una vez optimizado el error.<\/p>\n<p>Conceptualmente este algoritmo lo que hace es aplicar un algoritmo de optimizaci\u00f3n (como el descenso de gradiente) sobre el error entre la salida de la red durante el <em>feedforward<\/em> y la salida esperada. De esta forma se actualizan los pesos de todas las capas buscando minimizar el error. Este proceso se repite de forma iterativa hasta que la reducci\u00f3n del error sea poco significativa.<\/p>\n<p>Debido a estas derivadas parciales que se realizan sobre las funciones sigmoidales, en las redes de neuronas entrenadas con descenso de gradiente se produce un problema cuando tienen muchas capas que se conoce como el problema del <em>Vanishing Gradient<\/em>. Cuantas m\u00e1s capas tiene que recorrer la propagaci\u00f3n del error, m\u00e1s se aten\u00faa, es decir, menos impacto tiene en la actualizaci\u00f3n de los pesos y menos aprende la red.<\/p>\n<p>Las redes LSTM, adem\u00e1s de tener una componente de memoria, no tienen el problema de <em>Vanishing Gradient<\/em> ya que el aprendizaje es algo diferente.<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-29199\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/10\/lstm-datascience.png?resize=120%2C233&#038;ssl=1\" alt=\"\" width=\"120\" height=\"233\" \/><br \/>\nUna red LSTM (Long Short Term Memory) es un tipo de red recurrente donde parte de la entrada a cada capa es la salida (estado) de la capa en la iteraci\u00f3n anterior. Este estado es el que dota a la red de &#8220;memoria&#8221;.<\/p>\n<p>En estas redes las neuronas se llaman c\u00e9lulas y tienen m\u00e1s complejidad que las neuronas de una red de neuronas tradicional. Las campas est\u00e1n compuestas por varias de estas c\u00e9lulas, y cada c\u00e9lula recibe como entrada la salida de la capa anterior (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+x_%7Bt%7D+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" x_{t} \" class=\"latex\" \/>) y la salida de la misma c\u00e9lula en el instante de tiempo anterior (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+h_%7Bt-1%7D+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" h_{t-1} \" class=\"latex\" \/>).<\/p>\n<div id=\"attachment_29202\" style=\"width: 610px\" class=\"wp-caption aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29202\" class=\"wp-image-29202\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/10\/arquitectura-celula-lstm.png?resize=600%2C452&#038;ssl=1\" alt=\"\" width=\"600\" height=\"452\" \/><p id=\"caption-attachment-29202\" class=\"wp-caption-text\">Arquitectura de una c\u00e9lula de LSTM. Fuente: <a href=\"http:\/\/colah.github.io\/posts\/2015-08-Understanding-LSTMs\/\" rel=\"nofollow\">http:\/\/colah.github.io\/posts\/2015-08-Understanding-LSTMs\/<\/a><\/p><\/div>\n<p>Las LSTM tienen las siguientes componentes principales, con alguna terminolog\u00eda diferente a las redes de neuronas tradicionales:<\/p>\n<div class=\"small-body\" style=\"text-align: right;\"><em>En todas las f\u00f3rmulas <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+b_%7BN%7D+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" b_{N} \" class=\"latex\" \/> hace referencia al bias en cada capa.<\/em><\/div>\n<ul>\n<li><strong>Forget gate<\/strong> (puerta del olvido): decide qu\u00e9 informaci\u00f3n del contexto \u201colvidar\u201d.<br \/>\n<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=f%3D%5Csigma+%28W_f+%5Ccdot+%5B+h_%7Bt-1%7D%2C+x_t%5D+%2B+b_%7Bfg%7D+%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"f=&#92;sigma (W_f &#92;cdot [ h_{t-1}, x_t] + b_{fg} )\" class=\"latex\" \/><\/li>\n<li><strong>Input gate<\/strong> (puerta de entrada): genera el nuevo contexto en base al contexto anterior y la entrada.<br \/>\n<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+i+%3D+%5Csigma%28W_f+%5Ccdot+%5Bh_%7Bt-1%7D%2C+x_t%5D+%2B+b_%7Bfg%7D%29+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" i = &#92;sigma(W_f &#92;cdot [h_{t-1}, x_t] + b_{fg}) \" class=\"latex\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+pc+%3D+%5Ctanh%28W_c+%5Ccdot+%5Bh_%7Bt-1%7D%2C+x_t%5D+%2B+b_%7Bpc%7D%29+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" pc = &#92;tanh(W_c &#92;cdot [h_{t-1}, x_t] + b_{pc}) \" class=\"latex\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+c+%3D+f+%5Ccdot+c+%2B+i+%5Ccdot+pc+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" c = f &#92;cdot c + i &#92;cdot pc \" class=\"latex\" \/><\/li>\n<li><strong>Output gate<\/strong> (puerta de salida): genera la salida de la red en base al nuevo contexto y la entrada.<br \/>\n<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+o+%3D+%5Csigma%28W_o+%5Ccdot+%5Bh_%7Bt-1%7D%2C+x_t%5D+%2B+b_o+%29+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" o = &#92;sigma(W_o &#92;cdot [h_{t-1}, x_t] + b_o ) \" class=\"latex\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+h+%3D+o+%5Ccdot+%5Ctanh%28c%29+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" h = o &#92;cdot &#92;tanh(c) \" class=\"latex\" \/><\/li>\n<\/ul>\n<p>En este caso el proceso de <em>feedforward<\/em> lo que hace es, para cada c\u00e9lula:<\/p>\n<ol>\n<li>Calcular la entrada combinada ( <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+%5Bh_%7Bt-1%7D%2C+x_t%5D+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" [h_{t-1}, x_t] \" class=\"latex\" \/> ) a partir de la entrada (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+x_t+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" x_t \" class=\"latex\" \/>) combinada la salida del instante anterior (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+h_%7Bt-1%7D+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" h_{t-1} \" class=\"latex\" \/>).<\/li>\n<li>Calcular la salida de la <em>forget gate<\/em> por medio de la aplicaci\u00f3n de una funci\u00f3n sigmoide () a la entrada combinada. Esta salida se utiliza para filtrar del contexto del estado anterior aquello que debe olvidar.<\/li>\n<li>Calcular la salida de la <em>input gate<\/em> por medio de la entrada combinada ( <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+%5Bh_%7Bt-1%7D%2C+x_t%5D+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" [h_{t-1}, x_t] \" class=\"latex\" \/> ). A la entrada combinada se le aplica una funci\u00f3n arco tangente (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+%5Ctanh+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" &#92;tanh \" class=\"latex\" \/>) para obtener el nuevo contexto. Adem\u00e1s, se aplica una funci\u00f3n sigmoide (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+%5Csigma+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" &#92;sigma \" class=\"latex\" \/>) a la entrada combinada para filtrar la informaci\u00f3n nueva que realmente debe a\u00f1adirse al contexto. Esta salida se a\u00f1ade al contexto filtrado por la forget gate.<\/li>\n<li>Se aplica una funci\u00f3n sigmoide (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+%5Csigma+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" &#92;sigma \" class=\"latex\" \/>) a la entrada combinada y se combina con el arco tangente (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+%5Ctanh+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" &#92;tanh \" class=\"latex\" \/>) del contexto. Esta es la salida de la c\u00e9lula (<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=+h_%7Bt%7D+&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\" h_{t} \" class=\"latex\" \/>).<\/li>\n<\/ol>\n<p>Este es el funcionamiento b\u00e1sico de las redes LSTM, aunque hay configuraciones diferentes en funci\u00f3n de las caracter\u00edsticas concretas de cada problema.<\/p>\n<h4>Conclusiones<\/h4>\n<p>Las LSTM son m\u00e9todos de predicci\u00f3n de series temporales bastante vers\u00e1tiles y muy apropiados cuando la caracterizaci\u00f3n de la serie es compleja. Requieren \u00fanicamente de los datos de la serie temporal, pudiendo caracterizar series de casi cualquier tipo.<\/p>\n<p>Sin embargo, las LSTM son modelos con mucha sensibilidad al ruido, por lo que si los nuevos valores de la serie est\u00e1n muy influenciados por variables no existentes en la serie, es probable que no funcionen bien.<\/p>\n<p>Adem\u00e1s, en muchos casos puede implicar una sobre ingenier\u00eda contraproducente. Por ejemplo, en series con una componente estacional muy fuerte las LSTM funcionan (generalmente) peor que modelos como Prophet. Este modelo caracteriza esa estacionalidad mucho mejor que una LSTM, que puede prestar atenci\u00f3n a una ventana temporal en la que no se marque esa estacionalidad.<\/p>\n<p>En \u00faltima instancia lo importante es conocer bien las herramientas de las que se dispone y saber cu\u00e1ndo utilizar cada una de ellas.<\/p>\n<p>Imagen: unsplash | @shaunak_mirashi<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las series temporales son una disciplina ampliamente estudiada por sus m\u00faltiples aplicaciones en muchos sectores. Por ejemplo, los valores de las acciones en la bolsa, las visitas de usuarios en una web, suscripciones a una plataforma online, consumo el\u00e9ctrico, etc. Generalmente se suele hablar de datos segmentados por su variable temporal en los que parece [&hellip;]<\/p>\n","protected":false},"author":134360170,"featured_media":33899,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"Predicci\u00f3n de series temporales con redes de neuronas","_seopress_titles_desc":"Desgranamos las diferentes partes de una serie temporal y c\u00f3mo podemos aplicar las redes de neuronas para realizar predicciones sobre las mismas.","_seopress_robots_index":"","_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","_crdt_document":"","content-type":"","_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},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[227],"tags":[325,299],"class_list":["post-39981","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ciencia-de-datos","tag-ciencia-de-datos-2","tag-datos-es"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/01\/series-temporales.jpg?fit=850%2C350&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p9CeZw-aoR","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/39981","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/users\/134360170"}],"replies":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/comments?post=39981"}],"version-history":[{"count":1,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/39981\/revisions"}],"predecessor-version":[{"id":39984,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/39981\/revisions\/39984"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media\/33899"}],"wp:attachment":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media?parent=39981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/categories?post=39981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/tags?post=39981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}