Also, one could ask for a file name. Save the data to a csv file with that name, and then the user could import the csv file outside the function. This might
be a good solution if more than one series at a time is requested.
However, it would be nice to be able to add a variable to the dataset with a simple function call.
Logan
From: gretl-devel-bounces@lists.wfu.edu [mailto:gretl-devel-bounces@lists.wfu.edu]
On Behalf Of Logan Kelly
Sent: Wednesday, April 23, 2014 6:17 PM
To: Gretl development
Subject: Re: [Gretl-devel] New function for retrieving data from BLS
Hélio,
OK so the following works…kind of. I do not believe you can affect the dataset from within a function. So set up as a time series needs to be handled outside
of the functions. It might be better to return a bundle rather than a series?
Logan
function series get_series_BSL(string dataname)
set echo off
set messages off
string bslurl = "http://api.bls.gov/publicAPI/v1/timeseries/data/"~dataname
string s = readfile(bslurl)
sprintf q "\""
sprintf sq "\'"
sprintf nl "\n"
s = strsub(s,q,"")
s = strsub(s,"{year:",nl)
s = strsub(s," ","")
s = strsub(s,"[","")
s = strsub(s,"{","")
s = strsub(s,"]","")
s = strsub(s,"}","")
s = strsub(s,"'","")
s = strsub(s,":",",")
s = strsub(s,",period,","")
s = strsub(s,","," ")
s = strsub(s,"seriesID","obs blank blank blank ")
bundle dt
scalar i = 1
string line
scalar lcount = 0
string obs1 = null
string obs2 = null
loop while getline(s, line)
temp = strsplit(line,1)~","~strsplit(line,5)
if i > 2
sprintf ii "%d", i-2
dt.@ii = temp
temp = dt[@ii]
lcount ++
endif
i++
endloop
outfile test.csv --write
printf "%s\n", dt[1]
loop for (j = lcount; j>1; j--) --quiet
printf "%s\n", dt[$j]
endloop
outfile test.csv --close
s = readfile("test.csv")
s = strsub(s,","," ")
i = 1
scalar jj = 1
string sPD = ""
matrix value = zeros(lcount-1,1)
loop while getline(s, line)
if i > 1
obs1 = (i=2) ? strsplit(line,1) : obs1
obs2 = strsplit(line,1)
sPD = (strstr(obs1,"M")!="") ? "M13" : "Q5"
if strstr(obs2,sPD)=""
value[i-1] = atof(strsplit(line,2))
endif
endif
i = strstr(obs2,sPD)="" ? i+1 : i
jj++
endloop
value = trimr(value,0,jj-i)
print value
pd = (strstr(obs1,"M")!="") ? 12 : (strstr(obs1,"Q")!="") ? 4 : 1
obs1 = (pd=12) ? strsub(obs1, "M", ":") : strsub(obs1, "Q", ":")
obs2 = (pd=12) ? strsub(obs2, "M", ":") : strsub(obs2, "Q", ":")
print obs1
print obs2
setobs pd @obs1 --time-series #no effect outside the function
smpl @obs1 @obs2 #no effect outside the function
series @dataname = value
delete dt
return @dataname
end function
set echo off
set messages off
clear
nulldata 36
test = get_series_BSL("LAUCN040010000000005")
From:
gretl-devel-bounces@lists.wfu.edu [mailto:gretl-devel-bounces@lists.wfu.edu]
On Behalf Of Hélio Guilherme
Sent: Wednesday, April 23, 2014 4:31 PM
To: Gretl development
Subject: Re: [Gretl-devel] New function for retrieving data from BLS
Hi Logan,
Tried to make a function, but got stuck on append.
function void get_series_BSL(string dataname)
set echo off
set messages off
string bslurl = "http://api.bls.gov/publicAPI/v1/timeseries/data/"~dataname
string s = readfile(bslurl)
sprintf q "\""
sprintf sq "\'"
sprintf nl "\n"
s = strsub(s,q,"")
s = strsub(s,"{year:",nl)
s = strsub(s," ","")
s = strsub(s,"[","")
s = strsub(s,"{","")
s = strsub(s,"]","")
s = strsub(s,"}","")
s = strsub(s,"'","")
s = strsub(s,":",",")
s = strsub(s,",period,","")
s = strsub(s,","," ")
s = strsub(s,"seriesID","obs blank blank blank ")
bundle dt
scalar i = 1
string line
scalar lcount = 0
loop while getline(s, line)
temp = strsplit(line,1)~","~strsplit(line,5)
if i > 2
sprintf ii "%d", i-2
dt.@ii = temp
temp = dt[@ii]
lcount ++
endif
i++
endloop
outfile test.csv --write
printf "%s\n", dt[1]
loop for (j = lcount; j>1; j--)
printf "%s\n", dt[$j]
endloop
outfile test.csv --close
delete dt
append test.csv #It fails here because is inside function
end function
set echo off
set messages off
clear
get_series_BSL("LAUCN040010000000005")
On Wed, Apr 23, 2014 at 8:24 PM, Logan Kelly <logan.kelly@uwrf.edu> wrote:
Ok. As promised, the code is not pretty, but here is a start at parsing a bls api call for a single series, which is what the current readfile() function can handle. It works but I can foresee the code being rather fragile.
Logan
clear
set echo off
string s = readfile("http://api.bls.gov/publicAPI/v1/timeseries/data/LAUCN040010000000005")
sprintf q "\""
sprintf sq "\'"
sprintf nl "\n"
s = strsub(s,q,"")
s = strsub(s,"{year:",nl)
s = strsub(s," ","")
s = strsub(s,"[","")
s = strsub(s,"{","")
s = strsub(s,"]","")
s = strsub(s,"}","")
s = strsub(s,"'","")
s = strsub(s,":",",")
s = strsub(s,",period,","")
s = strsub(s,","," ")
s = strsub(s,"seriesID","obs blank blank blank ")
bundle dt
scalar i = 1
string line
scalar lcount = 0
loop while getline(s, line)
temp = strsplit(line,1)~","~strsplit(line,5)
if i > 2
sprintf ii "%d", i-2
dt.@ii = temp
temp = dt[@ii]
lcount ++
endif
i++
endloop
outfile test.csv --write
printf "%s\n", dt[1]
loop for (j = lcount; j>1; j--)
printf "%s\n", dt[$j]
endloop
outfile test.csv --close
append test.csv
_______________________________________________
Gretl-devel mailing list
Gretl-devel@lists.wfu.edu
http://lists.wfu.edu/mailman/listinfo/gretl-devel