2012-10-06 13 views
7

que a menudo utilizan los datos de EUROSTAT y que era bastante molesto que los datos no se pudieron cargar recta hacia adelante al interior R. He escrito este fragmento de conseguir cualquier conjunto de datos proporcionado por la instalación de descarga a granel de EUROSTAT http://epp.eurostat.ec.europa.eu/NavTree_prod/everybody/BulkDownloadListing?sort=1&dir=dic%2Fen¿Es esta la solución para obtener datos de EUROSTAT en R?

¿Hay una ¿mejor manera? ..la se trabajó para mí:

#this library is used to download data from eurostat and to find datasets 
#later extend to extend to find datasets with certain dimensions 

#download data from eurostat 
#unpack and convert to dataframe 
#load label descriptions 
#load factors 
#save as r data object 

datasetname="ebd_all" 

LANGUAGE="en" 

install.packages("RCurl") 
library(RCurl) 
library(data.table) 
library(reshape) 
library(stringr) 

baseurl="http://epp.eurostat.ec.europa.eu/NavTree_prod/everybody/BulkDownloadListing?sort=1&file=data%2F" 

fullfilename=paste(datasetname,".tsv.gz",sep="") 
temp <- paste(tempfile(),".gz",sep="") 
download.file(paste(baseurl,fullfilename,sep=""),temp) 
dataconnection <- gzfile(temp) 
d=read.delim(dataconnection) 
longdata=melt(d,id=colnames(d)[1]) 

firstname=colnames(d)[1] # remove .time and count how many headings are there 
firstname=substr(firstname,1,nchar(firstname)-nchar(".time")) 
headings=toupper(strsplit(firstname,".",fixed=TRUE)[[1]]) 
headingcount=length(headings) 
colnames(longdata)=c("dimensions","time","value") 


#get the data on the dimension tables 
df=data.frame(dimensions=as.character(longdata[,"dimensions"])) 
df = transform(df, dimensions= colsplit(dimensions, split = "\\,",names=headings)) 
dimensions=data.table(df$dimensions) 

#download the dimension labels - save headings as better variable 
dimfile=paste("http://epp.eurostat.ec.europa.eu/NavTree_prod/everybody/BulkDownloadListing?sort=1&file=dic%2F",LANGUAGE,"%2Fdimlst.dic",sep="") 

temp <- paste(tempfile(),".gz",sep="") 
download.file(dimfile,temp) 
dataconnection <- gzfile(temp) 
dimdata=read.delim(dataconnection,header=FALSE) 
colnames(dimdata)=c("colname","desc") 
lab=dimdata$desc 
names(lab)=dimdata$colname 

#create headings that speak for themselves for columns 
speakingheadings=as.character(lab[headings]) 

#download factors for each heading and add 
for(heading in headings){ 
    factorfile=paste("http://epp.eurostat.ec.europa.eu/NavTree_prod/everybody/BulkDownloadListing?sort=1&file=dic%2F",LANGUAGE,"%2F",tolower(heading),".dic",sep="") 
    temp <- paste(tempfile(),".gz",sep="") 
    download.file(factorfile,temp) 
    dataconnection <- gzfile(temp) 
    factordata=read.delim(dataconnection,header=FALSE) 
    colnames(factordata)=c(heading,paste(heading,"_desc",sep="")) 
    #join the heading to the heading dataset 
    dimensions=merge(dimensions,factordata,by=heading,all.x=TRUE) 
} 


    #at the end at speaking headings 
setnames(dimensions,colnames(dimensions)[1:length(speakingheadings)],speakingheadings) 

    #add data columns by writing and reading again---FASTER ;-) 
temp=tempfile() 
values=data.frame(value=as.character(longdata$value)) 
values = transform(values, value= colsplit(value, split = "\\ ",names=c("value","flag"))) 
values=values$value 
values=data.table(values) 

values$value=as.character(values$value) 
values$flag=as.character(values$flag) 
values[value==flag,flag:=NA] 
values$value=as.double(values$value) 

eurostatdata=cbind(dimensions,time=longdata$time,values) 
save(eurostatdata,file=paste(datasetname,".RData")) 
+0

Un paquete R llamado [eurostat] (https://cran.r-project.org/web/packages/eurostat/index.html) fue lanzado en 2015. Una bonita [viñeta] (https: // github. com/rOpenGov/eurostat/blob/master/vignettes/2015-RJournal/lahti-huovari-kainu-biecek.md) proporciona ejemplos de instrucciones para descargar y visualizar los datos de Eurostat. El autor del paquete [SmarterPoland] (https://cran.r-project.org/web/packages/SmarterPoland/index.html) mencionado a continuación es uno de los coautores del paquete Eurostat. –

Respuesta

7

Salida SmarterPoland paquete, hay funciones para descargar (y entrar en R) de datos directamente de EUROSTAT.

aquí es ejemplo:

library(SmarterPoland) 
# info about passagers 
grepEurostatTOC("split of passenger transport") 
## get table 
tmp <- getEurostatRCV("tsdtr210") 
summary(tmp) 

##  vehicle   geo   time   value  
## BUS_TOT:756 AT  : 63 1990 : 108 Min. : 0.0 
## CAR :756 BE  : 63 1991 : 108 1st Qu.: 6.9 
## TRN :756 BG  : 63 1992 : 108 Median :12.9 
##    CH  : 63 1993 : 108 Mean :33.6 
##    CY  : 63 1994 : 108 3rd Qu.:77.4 
##    CZ  : 63 1995 : 108 Max. :93.4 
##    (Other):1890 (Other):1620 NA's :397 

fuente: www.smarterpoland.pl

+0

El paquete eurostat R está desarrollado en base a SmarterPoland e incluye el mismo autor original. Las herramientas específicas de eurostat en el paquete R de eurostat ahora están más actualizadas y mejor conservadas que las de SmarterPoland (aunque ese paquete puede contener otras funciones útiles). – antagomir

2

Revisado respuesta

El RJSDMX package también se puede utilizar para recuperar datos de Eurostat en R. Un ejemplo se muestra a continuación.

library(RJSDMX) 
data <- getTimeSeries("EUROSTAT","nama_gdp_c/.EUR_HAB.B1GM.DE") 

respuesta inicial (a la izquierda aquí por referencia)

Una mejor manera podría ser utilizar la Eurostat Web Service facility que ofrece acceso programático a los datos de Eurostat. El servicio del servicio web es otro servicio, además del servicio de descarga masiva, proporcionado por Eurostat para extraer datos de su base de datos. Para usar el servicio, deberá enviar una solicitud REST o SOAP. Los datos recuperados del servidor son una estructura de datos jerárquica, un tipo de documento XML que se puede analizar utilizando el paquete XML.

Antes de la salida a la rápido ejemplo de abajo, me recomendó la lectura de parte de la información sobre el servicio proporcionado por Eurotat, que se puede encontrar aquí: http://epp.eurostat.ec.europa.eu/portal/page/portal/sdmx_web_services/getting_started/a_few_useful_points

# Step 0: Load the XML package. 
# This is used later on to parse the XML retrieved from Eurostat. 
# For a tutorial on XML and parsing XML documents, read this: http://www.w3schools.com/xpath/default.asp 

library(XML) 

# Step 1: Construct the appropriate REST query. 
# First read this:  http://epp.eurostat.ec.europa.eu/portal/page/portal/sdmx_web_services/getting_started/a_few_useful_points 

# Specify the data to be retrieved. 

resource <- "data" 
dataflow <- "nama_gdp_c" 
key   <- ".EUR_HAB.B1GM.DE" 
time_filter <- "?startPeriod=2010" 

# Construct the query 

partial_url <- paste(paste(resource, dataflow, key, sep="/"), time_filter, sep="") 
base_url <- "http://ec.europa.eu/eurostat/SDMX/diss-web/rest/" 
rest_query <- paste(base_url, partial_url, sep="") 

# Step 2: Make the request using cURL (that is, retrieve the data) 
# For information about cURL, read this: http://curl.haxx.se/ 
# For information about the curl command, check out the man pages: http://curl.haxx.se/docs/manpage.html 

command <- paste("curl", rest_query) 
raw_data <- system(command, intern=TRUE) 

# Note: at this stage, the data is a character object. 

class(raw_data) 

# View the data, which can be found commented out at the bottom of this script. Note that it is a hierarchical data structure. 

# Step 3: Parse the data 
# Here we use functions from the XML package - one could, of course, use base package functions, but why? 

data <- xmlParse(raw_data) 

# Parsing the data returns an object of class: "XMLInternalDocument" and "XMLAbstractDocument" 

class(data) 

# Step 4: Extract the numerical data 

# Data can be found using getNodeSet(), but the data remains stuck between "tags" - we just want the numbers. 

getNodeSet(data,"//generic:ObsValue") 

# The numbers we want to extract are, in this case, value "attributes". We can target these values as follows. 

xpathApply(data, "//generic:ObsValue", xmlGetAttr, name="value") 

# That does the job, but really we'd like those numbers in a vector rather than a list object. 

numbers <- as.numeric(xpathApply(data, "//generic:ObsValue", xmlGetAttr, name="value")) 

# Step 5: Extract the dates (years) - i.e. get some metadata. 
# This is similar to above. 

years <- as.numeric(xpathApply(data, "//generic:ObsDimension", xmlGetAttr, name="value")) 

# Step 6 and on-wards: 
# 
# Enter your code here... =) 
# 
# 
# 

Como referencia, los datos en bruto se parece a esto:

<?xml version="1.0" encoding="utf-8"?> 
<message:GenericData xmlns:footer="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message/footer" xmlns:generic="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic" xmlns:common="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common" xmlns:message="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <message:Header> 
    <message:ID>13e08b8d24936d75b3a6fa1b9c632e22</message:ID> 
    <message:Test>false</message:Test> 
    <message:Prepared>2014-10-20T21:10:50</message:Prepared> 
    <message:Sender id="ESTAT"> 
     <common:Name xml:lang="en">Eurostat</common:Name> 
     <message:Timezone>+01:00</message:Timezone> 
    </message:Sender> 
    <message:Receiver id="RECEIVER"/> 
    <message:Structure structureID="ESTAT_DSD_nama_gdp_c_1_0" dimensionAtObservation="TIME_PERIOD"> 
     <common:Structure> 
     <Ref agencyID="ESTAT" id="DSD_nama_gdp_c" version="1.0"/> 
     </common:Structure> 
    </message:Structure> 
    <message:DataSetAction>Append</message:DataSetAction> 
    <message:DataSetID>nama_gdp_c</message:DataSetID> 
    </message:Header> 
    <message:DataSet structureRef="ESTAT_DSD_nama_gdp_c_1_0"> 
    <generic:Series> 
     <generic:SeriesKey> 
     <generic:Value id="UNIT" value="EUR_HAB"/> 
     <generic:Value id="INDIC_NA" value="B1GM"/> 
     <generic:Value id="GEO" value="DE"/> 
     <generic:Value id="FREQ" value="A"/> 
     </generic:SeriesKey> 
     <generic:Obs> 
     <generic:ObsDimension value="2013"/> 
     <generic:ObsValue value="33300.0"/> 
     </generic:Obs> 
     <generic:Obs> 
     <generic:ObsDimension value="2012"/> 
     <generic:ObsValue value="32600.0"/> 
     </generic:Obs> 
     <generic:Obs> 
     <generic:ObsDimension value="2011"/> 
     <generic:ObsValue value="31900.0"/> 
     </generic:Obs> 
     <generic:Obs> 
     <generic:ObsDimension value="2010"/> 
     <generic:ObsValue value="30500.0"/> 
     </generic:Obs> 
    </generic:Series> 
    </message:DataSet> 
</message:GenericData> 

Puntos a tener en cuenta: he usado cURL para enviar la solicitud, pero esto podría haber sido hecho en muchas otras maneras, por ejemplo, usando Wget, Perl, PHP, etc. Siempre que esté dispuesto (y pueda) usar el comando system(), obtener los datos en R de Eurostat en forma programática debería ser lo suficientemente sencillo (vea la edición a continuación). Cambiar los datos en, digamos, un objeto ts (o un objeto mts dependiendo de la consulta que envíe) también debería ser lo suficientemente directo. Por último, estoy usando un sistema operativo Linux (distribución de Ubuntu), así que si estás en Windows, el ejemplo anterior puede no funcionar para ti.

Espero que esto ayude!

Editar: Me acabo de dar cuenta de que ha cargado el paquete RCurl, así que si lo desea, puede reemplazar cualquier instalación que ofrezca el paquete con el comando del sistema que he usado.

6

Eurostat difunde sus datos estadísticos en formato SDMX. En R, puede usar el paquete rsdmx para leer sus datos.Véase más abajo ejemplo:

#in case you want to install rsdmx from Github 
#(otherwise you can install it from CRAN) 
require(devtools) 
install_github("rsdmx", "opensdmx") 
require(rsdmx) 

#read EUROSTAT dataset 
dataURL <- "http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/cdh_e_fos/..PC.FOS1.BE/?startperiod=2005&endPeriod=2011 " 
sdmx <- readSDMX(dataURL) 
stats <- as.data.frame(sdmx) 
head(stats) 

Nota: Puede encontrar rsdmx ya sea desde CRAN o instalarlo directamente desde el repositorio GitHub. https://github.com/opensdmx/rsdmx

rsdmx no se limita a la lectura SDMX datasets pero todos los documentos SDMX, datos o metadatos, incluyendo data structures y codelists. Te invito a que consultes rsdmx wiki si quieres más ejemplos.

+1

+1 Parece un enfoque simplificado y más fácil de usar para el usuario que el método que sugerí. Aquí, el usuario R no necesita usar XPath directamente, así que muy buen trabajo, de hecho. Esperando usar rsdmx. –

+1

Gracias Graeme Walsh! Sí, uno de los objetivos de [rsdmx] (https://github.com/opensdmx/rsdmx) es hacerlo lo más simple posible. Esto da como resultado una función única '' readSDMX'' para el usuario final. La función se encarga de crear instancias del objeto SDMX R correcto. El enfoque de análisis es XPath, pero tiene la intención de extenderse más tarde con otros enfoques como SAX, para enormes conjuntos de datos. EUROSTAT es una de las fuentes para las cuales se puede usar '' rsdmx'', pero ha sido probado en otros: p. OCDE, BCE, FAO. – eblondel

+1

Eblondel, me gusta su enfoque muy sencillo y eficiente. Estoy leyendo la documentación de SDMX disponible en el sitio web de Eurostat, pero me preguntaba si existe una forma de generar de manera eficiente las URL deseadas, sin absorber todo el contenido de los manuales. Idealmente, me gustaría generar una tabla de nivel de NUT3 generadora de dataURL con tasa de desempleo para todas las series de tiempo disponibles. ¿Cómo, utilizando el sitio web de Eurostat, puedo encontrar todos los elementos necesarios para la URL? – Konrad

Cuestiones relacionadas