Ejemplo de como consumir un servicio SOAP y limpiar datos para evaluacion.

En este caso nos vamos a comunicar con un servicio del Banco de Guatemala y obtener el tipo de cambio por un rango de fechas y luego vamos a limpiar esa informacion quitando los valores repetidos en fechas consecutivas, ya sea por el valor de compra o de venta.

Instalacion de librerias

library("RCurl")
## Loading required package: bitops
library("XML")

Definimos la funcion de obtener el rango de fechas

obtener_banguat_rango_fecha <- function(fecha1, fecha2){
headerfields = c(
  Accept = "text/xml",
  Accept = "multipart/*",
  'Content-Type' = "text/xml; charset=utf-8"
)

body = paste("<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://www.banguat.gob.gt/variables/ws/\">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:TipoCambioRango>
         <!--Optional:-->
         <ws:fechainit>", fecha1 ,"</ws:fechainit>
         <!--Optional:-->
         <ws:fechafin>" , fecha2 , "</ws:fechafin>
      </ws:TipoCambioRango>
   </soapenv:Body>
</soapenv:Envelope>", sep="")

reader = basicTextGatherer()

curlPerform(
  url = "http://www.banguat.gob.gt/variables/ws/TipoCambio.asmx",
  httpheader = headerfields,
  postfields = body,
  writefunction = reader$update
)

doc <- xmlParse(reader$value())
rootNode <- xmlRoot(doc)
nodo2 <- rootNode[[1]]
nodo3 <- nodo2[[1]]
nodo4 <- nodo3[[1]]
nodo5 <- nodo4[[1]]
data <- xmlToDataFrame(nodo5)
return(data)
}

Definimos la funcion que limpia los datos para valores consecutivos iguales

quitar_datos_secuencia <- function(data, numero_columna){
  datos <- as.matrix.noquote(data)
  cols <- colnames(data)
  ret <- matrix(,ncol=dim(data)[2],nrow=0)
  colnames(ret) <- cols
  anterior <- -1
  for(i in 1:dim(data)[1]){
    if(anterior!=datos[i, numero_columna]){
      nuevo <- matrix(,ncol=dim(data)[2],nrow=1)
      for(j in 1:dim(data)[2]){
        nuevo[1, j] <- datos[i, j]
      }
      ret <- rbind(ret, nuevo)
    }
    anterior <- datos[i, numero_columna]
  }
  ret2 <- as.data.frame(ret)
  ret2$compra <- as.numeric(as.character(ret2$compra))
  ret2$venta <- as.numeric(as.character(ret2$venta))
  return(ret2)
}

Como se utiliza

Leyendo del servicio web de banguat por rango de fecha

datos <- obtener_banguat_rango_fecha("01/03/2019","25/03/2019")
head(datos)
##   moneda      fecha   venta  compra
## 1      2 01/03/2019 7.70445 7.70445
## 2      2 02/03/2019 7.70445 7.70445
## 3      2 03/03/2019 7.70445 7.70445
## 4      2 04/03/2019 7.70537 7.70537
## 5      2 05/03/2019 7.70243 7.70243
## 6      2 06/03/2019  7.6994  7.6994

Limpiando valores

datos2 <- quitar_datos_secuencia(datos, "compra")
head(datos2)
##   moneda      fecha   venta  compra
## 1      2 01/03/2019 7.70445 7.70445
## 2      2 04/03/2019 7.70537 7.70537
## 3      2 05/03/2019 7.70243 7.70243
## 4      2 06/03/2019 7.69940 7.69940
## 5      2 07/03/2019 7.69823 7.69823
## 6      2 08/03/2019 7.69653 7.69653

Obteniendo valores estadisticos

summary(datos2$compra)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   7.676   7.689   7.693   7.693   7.698   7.705
summary(datos2$venta)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   7.676   7.689   7.693   7.693   7.698   7.705