R

Rmarkdown en el panel principal de Shiny

R

Comparto con mis lectores un experimento de esta misma mañana: cómo insertar en el panel principal de Shiny un documento generado con Rmarkdown. Que, por supuesto, cambia según se seleccionen unos u otros parámetros en Shiny.

Es un ejemplo sencillo, estúpido, sin comentarios, desordenado y, en resumen, muy mejorable. Puede descargarse de aquí.

El truco es de los sucios:

  • En server.R se guardan los parámetros que envía ui.R en un fichero de intercambio con save.
  • La plantilla del .Rmd lee esos parámetros durante el proceso de compilación (con rmarkdown::render).
  • ui.R pinta el html con htmlOutput.

Y, a partir de la plantilla, ¡a crecer!

El impacto causal del óbito del Sr. Botín en la cotización bursátil del benemérito Banco de Santander

R

El Sr. Botín, presidente que fue del Banco de Santander, falleció el 2014-09-10. Cabe preguntarse por el impacto causal à la Google de no continuidad de su gestión a cargo de dicha institución.

Comienzo pues.

Primero los datos:

library(tseries)
library(CausalImpact)

santander <- get.hist.quote(instrument="san.mc",
    start= Sys.Date() - 365*3,
    end= Sys.Date(), quote="AdjClose",
    provider="yahoo", origin="1970-01-01",
    compression="d", retclass="zoo")

bbva <- get.hist.quote(instrument="bbva.mc",
    start= Sys.Date() - 365*3,
    end= Sys.Date(), quote="AdjClose",
    provider="yahoo", origin="1970-01-01",
    compression="d", retclass="zoo")

ibex <- get.hist.quote(instrument="^IBEX",
    start= Sys.Date() - 365*3,
    end= Sys.Date(), quote="AdjClose",
    provider="yahoo", origin="1970-01-01",
    compression="d", retclass="zoo")

obito.botin <- as.Date("2014-09-10")

cotizaciones <- cbind(santander, bbva, ibex)
cotizaciones <- cotizaciones[!is.na(cotizaciones$AdjClose.ibex)]

Con lo anterior, he bajado las cotizaciones diarias de las acciones del Banco de Santander, las del BBVA y la del IBEX 35 durante los últimos tres años. Eso deja la fecha de la muerte del Sr. Botín, aproximadamente, en la mitad.

Ahora caRtociudad encuentra información administrativa relativa a un punto

R

Y lo hace así:

library(caRtociudad)
get_cartociudad_location_info(40.473219,-3.7227241, year = 2015)
# $seccion
# [1] "2807908148"
#
# $distrito
# [1] "2807908"
#
# $provincia
# [1] "Madrid"
#
# $municipio
# [1] "Madrid"

Esto da respuesta a una pregunta de Rubén.

La función es en su mayor parte (salvo algunos retoques más estéticos que otra cosa míos) de Luz Frías, que hizo omiso caso de la inexistente docuentación del INE sobre su servicio de mapas y capturó directamente la petición que el portal de Cartociudad hace al servicio.

¿Quieres aprender R? ¡Matricúlate en mi curso en KSchool!

Si quieres aprender R, bien puedes matricularte en el curso que voy a impartir en KSchool. Es un programa de iniciación a R centrado en aquellos aspectos de R que más usan en la práctica diaria quienes trabajan con datos (y no son estadísticos duros). ¡Y ya vamos por la tercera edición!

Tendrá lugar durante el mes de junio (y un poco de julio). Son diez sesiones de tres horas. Los detalles están aquí.

Clústers de trayectorias con la distancia de Fréchet

R

Los viejos del lugar recordarán esto, donde agrupo trayectorias usando k-medias a pelo.

El paquete kmlShape usa la distancia de Fréchet para hacer algo parecido: buscar trayectorias geométricamente similares.

El código es

    library(kmlShape)
    library(tseries)
    library(zoo)
    library(XML)
    library(reshape)
    library(ggplot2)

    foo  <- function(
      simbolo, final = Sys.time(),
      profundidad = 30 * 24 * 3600) {
      precios <- get.hist.quote(
        instrument= simbolo,
        start = final - profundidad,
        end = final, quote=c("AdjClose"),
        provider="yahoo", origin="1970-01-01",
        compression="d", retclass="zoo")
      colnames(precios) <- simbolo
      return(precios)
    }

    # lista de símbolos del ibex

    tmp <- readHTMLTable("http://finance.yahoo.com/q/cp?s=%5EIBEX+Components")[[5]]
    tmp <- as.character(tmp$V1[-(1:6)])

    ibex <- do.call(merge,
      sapply(simbolos, foo, simplify = F))

    ibex.scaled <- data.frame(t(scale(ibex)))
    tmp <- cldsWide(ibex.scaled)

    res <- kmlShape(tmp, 4, toPlot = "none")

    tmp <- data.frame(
      id = rownames(ibex.scaled),
      cluster = res@clusters, ibex.scaled)

    tmp <- melt(tmp, id.vars = c("id", "cluster"))
    tmp$fecha <- as.Date(tmp$variable, "X%Y.%m.%d")

    ggplot(tmp, aes(x=fecha, y=value, group=id)) +
      geom_line() + facet_wrap(~cluster)

y el resultado,

¿Un libro recomendable de estadística básica?

Me piden bibliografía para unos cursos de ciencia de datos. En particular, de estadística básica. Un texto que reúna los conceptos fundamentales de la cosa para quienes o no los aprendieron en su día o los olvidaron por el camino. Tiene que cumplir algunos requisitos mínimos:

  • Que presente los gráficos estadísticos básicos y que no estén construidos con Excel (en 3D).
  • Que, a lo más, incluya un único gráfico de tarta.
  • Que no sea muy pesado matemáticamente.
  • Que sea breve, pero no demasiado.
  • Que esté accesible, idealmente en internet, gratuita y legalmente.

Finalmente, si está escrito escrito en español y usa R, mejor aún.

rPython + feather

R

Supongo que a estas alturas todos conoceréis feather y rPython. Hoy los vais a ver trabajar juntos.

Primero solo en R:

library(feather)
path <- "/tmp/my_data.feather"
write_feather(cars, path)
my_cars <- read_feather(path)

Ahora, para pasarle datos a Python:

library(rPython)
python.exec("import feather")
python.exec("a = feather.read_dataframe('/tmp/my_data.feather')")
python.exec("print a")

Y, finalmente, para crear datos grandes en Python y devolvéselos a R:

python.exec("import numpy as np")
python.exec("import pandas as pd")
python.exec("arr = np.random.randn(10000000)")
python.exec("arr[::10] = np.nan")
python.exec("df = pd.DataFrame({'column_{0}'.format(i): arr for i in range(10)})")
python.exec("feather.write_dataframe(df, '/tmp/test.feather')")

python.data <- read_feather("/tmp/test.feather")
dim(python.data)
#[1] 10000000       10

Los tiempos, que los mida cada cual.