Baixando dados fiscais do site Transparência no R

Ao contrário de outros sites do governo, o Transparência Orçamentária não tem um acesso por planilhas ou base de dados muito claro. Usei então como base para aprender um pouco de como extrair dados das tabelas de uma página genérica de internet.

O código abaixo faz o serviço, você só precisa mudar a variável ano na primeira linha para qualquer um entre 2013 e 2017.

O segredo, como sempre, é descobrir o endereço web correto. Para a busca básica, que é o que fazemos aqui, é “http://www.portaldatransparencia.gov.br/PortalFuncoes.asp?Exercicio=” seguido do ano. Esta busca específica só nos dá parte dos dados que são divididos em duas páginas. Acrescentamos “&Pagina=2” após o ano ao endereço para isso. Para ver alguma conta específica se deve adicionar &codFuncao=28” ao final. 28 é o código para encargos especiais, por exemplo. O resto do código é limpeza dos dados, que estão aqui em formato HTML.


ano = 2016

url = paste0("http://www.portaldatransparencia.gov.br/PortalFuncoes.asp?Exercicio=",ano)

page = readLines(url)

grep("Total",page)
pattern = '
<td class=\"colunaValor\">([^<]*)</td>
'
datalines = grep(pattern,page[290:length(page)],value=TRUE)
getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
gg = gregexpr(pattern,datalines)
matches = mapply(getexpr,datalines,gg)
result = gsub(pattern,'\\1',matches)
names(result) = NULL

v1 = gsub(".","",result, fixed = TRUE)
v1 = as.numeric(gsub(",",".", v1, fixed = TRUE))

grep("Funç", page)
pattern2 = '
<td class=\"firstChild\"><a href=\"/PortalFuncoes_Detalhe.asp?([^<]*)</a></td>
'
datalines = grep(pattern2,page[1:length(page)],value=TRUE)
getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
gg = gregexpr(pattern2,datalines)
matches = mapply(getexpr,datalines,gg)
result = gsub(pattern,'\\1',matches)
names(result) = NULL

t1 = substr(result,94,nchar(result))
t1 = substr(t1, 1, nchar(t1)-10+1)

url = paste0("http://www.portaldatransparencia.gov.br/PortalFuncoes.asp?Exercicio=",ano,"&Pagina=2")

page = readLines(url)
grep("Total",page)

pattern = '
<td class=\"colunaValor\">([^<]*)</td>
'
datalines = grep(pattern,page[290:length(page)],value=TRUE)
getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
gg = gregexpr(pattern,datalines)
matches = mapply(getexpr,datalines,gg)
result = gsub(pattern,'\\1',matches)
names(result) = NULL

v2 = gsub(".","",result, fixed = TRUE)
v2 = as.numeric(gsub(",",".", v2, fixed = TRUE))

grep("Funç", page)
pattern2 = '
<td class=\"firstChild\"><a href=\"/PortalFuncoes_Detalhe.asp?([^<]*)</a></td>
'
datalines = grep(pattern2,page[1:length(page)],value=TRUE)
getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
gg = gregexpr(pattern2,datalines)
matches = mapply(getexpr,datalines,gg)
result = gsub(pattern,'\\1',matches)
names(result) = NULL

t2 = substr(result,94,nchar(result))
t2 = substr(t2, 1, nchar(t2)-10+1)

tab1 = data.frame(cbind(append(t1,t2), append(v1,v2)))
colnames(tab1) = c("Funcao","Valor")
tab1[,2] = as.numeric(paste(tab1[,2]))

tab1

O resultado é salvo na variável “tab1”.

 

Anúncios

Baixando séries diretamente do SGS do Banco Central pelo R

Pesquisando pelos blogs a gente acaba conhecendo vários pacotes que fazem isso. Alguns ótimos, outros exageradamente grandes, mas minha dificuldade sempre foi fazer funcionar através do firewall do escritório. Pesquisei um pouco mais e adotei uma abordagem mais minimalista, baixando os dados direto das APIs dos institutos e trabalhando. Segue um código de exemplo simples, facilmente adaptável e a explicação:

Os dados do BCB estão acessíveis através de endereços web especialmente construídos, que podemos colocar no próprio browser. Vou usar como exemplo a série do IBC-BR, que é a série 24363. O endereço para ela é:

http://api.bcb.gov.br/dados/serie/bcdata.sgs.24363/dados?formato=json

Se quiser, experimente colar este endereço no seu navegador. Os dados aparecem razoavelmente ordenados, de acordo com o formato JSON. Repare que o número da série é parte do endereço, portanto, para puxar outra série basta substituir o número dela no local correto.

Para o IBC reparei que a série não vai até o final quado chamada neste endereço. Para vir ela toda eu adiciono no fim uma data inicial e ele interpreta que quero tudo, até o fim. O endereço fica assim:

http://api.bcb.gov.br/dados/serie/bcdata.sgs.24363/dados?formato=json&dataInicial=01/01/2001

Repare que coloquei 2001, mas os dados só começam em 2003. O R possui algumas bibliotecas que lêem os dados no formato JSON, eu escolhi usar a “jsonlite”.


library(jsonlite)

A função que lê os dados JSON é a fromJSON. Na linha a seguir mando ele baixar os dados do endereço, passo pelo fromJSON para traduzir para o formato data.frame e salvo em uma variável.


ibc = fromJSON("http://api.bcb.gov.br/dados/serie/bcdata.sgs.24363/dados?formato=json&amp;dataInicial=01/01/2001")

Se der um erro provavelmente você está no escritório e a TIC está bloqueando o acesso direto. Contornamos isso baixando os dados primeiro para um arquivo e lendo ele a partir daí.


download.file("http://api.bcb.gov.br/dados/serie/bcdata.sgs.24363/dados?formato=json&amp;dataInicial=01/01/2001","ibcbr.json")
ibc = fromJSON("ibcbr.json")

Já podemos ler essa variável IBC no R normalmente, PARECE que está tudo certo. Se analisarmos mais profundamente, no entanto, vemos que os dados estão codificados como “caracteres” e não como números. Vamos fazer a conversão no R mesmo.


ibc$valor = as.numeric(ibc$valor)
ibc$data = as.Date(ibc$data,"%d/%m/%Y")

ibc

plot(ibc, type="l", main="IBC-BR", ylab="", xlab="")

O último gráfico deve ficar assim:

Rplot.jpg

Esse método vale para o BCB, mas para os demais órgãos é semelhante. Só é questão de descobrir como são formados os endereços e qual formato de arquivo eles usam. Por exemplo, no IBGE os endereços são formados com regras de acordo com esta página: http://api.sidra.ibge.gov.br/home/ajuda

Divulgação das bases de dados

Assunto importante debatido no blog do Gelman, sobre estatística (na maioria das vezes). Minha posição é de maior divulgação possível, tanto para as bases como também para os códigos. Na minha tese usarei uma base fechada, mas pretendo divulgar o código (github talvez?). A melhor forma de separar o trabalho de “arrumação” dos dados dos próprios, e explicitar o “valor adicionado” do seu trabalho é que a limpeza esteja no código e não diretamente nas planilhas.

It is still relatively uncommon for social scientists to share data or code as a part of the peer review process. I feel that this practice runs contrary to notions of replicability and reproducibility and have a desire to voice opposition to instances in which manuscripts are submitted without data and code. Where, however, is such opposition appropriately expressed? I am specifically curious about whether or not it is appropriate to refuse to review an article in the absence of code or data.

Fonte: Why aren’t people sharing their data and code? – Statistical Modeling, Causal Inference, and Social Science Statistical Modeling, Causal Inference, and Social Science

How Economists Convert Quarterly Data into Monthly: Cubic Spline Interpolation

Só repassando esse achado que fiz procurando um método de mensalização (dados trimestrais para mensais) aqui na empresa. Usem com cuidado!

Columbia Economics, L.L.C.

(Update: Please note that cubic spline interpolation can only provide estimates of data between known data points. It cannot “create” unknown data. For example, if only annual figures exist for your data set, then annual observations are the only real data. Cubic splining between them to generate monthly estimates is only an approximation technique, and does not provide new actual monthly figures). For this reason, the below method may not be appropriate for all research purposes.)

A common problem economists face with time-series data is getting them into the right time interval. Some data are daily or weekly, while others are in monthly, quarterly or annual intervals. Since most regression models require consistent time intervals, an econometrician’s first job is usually getting data into the same frequency.

In this post I’ll explain how to solve a common problem we’ve run into: how to divide quarterly data into…

Ver o post original 994 mais palavras

Filtro de Hodrick-Prescott no Excel

Um pouco fora da minha área certamente mas estou sempre pronto a apreciar boa programação e facilidade de uso. Se você precisa tirar a tendência de uma série com o filtro HP e quer a facilidade do Excel, ou quer usar em um ambiente de trabalho onde os programas são controlados, fica a dica do site abaixo. Ele explica onde baixar o add-in e como utilizar. Testado e aprovado.

There is a how to use PDF, short, says you give it a range of cells and a number (a constant). The long version: Select a range of cells for your results, type =HP( , select the range of cells containing the data to be filtered, type in a comma, type in the constant, and close the parentheses. But don’t hit ENTER.

Instead, hold down CTRL and SHIFT and then press ENTER. That’s it. Then you can make a graph or whatever, from the results.

Holding down CTRL and SHIFT while you press ENTER is standard Excel stuff. They call it “array formulas” which sounds pretty complicated… but all you have to do is hold down CTRL and SHIFT while pressing ENTER. How complicated is that?

None of that works, though, if you don’t have the Hodrick Prescott filter installed. No problem. Among the search results is a link to Kurt Annen’s HP-Filter Excel Add-In at IDEAS. There are three separate files you can download:

1. an XLA file, an Excel add-in which adds the HP( ) function to the built-in Excel functions.

2. the Visual BASIC source code for the HP( ) function.

3. an example.

For most people the simple thing would be to install the add-in. (The PDF linked above tells how.) For me, the simple thing was to copy the Visual BASIC source code and paste it into a code module. That way I got to look the code over a bit. It looks like a very complicated (arithmetically) version of a “moving average” calculation, or something comparable. That’s a crude description; I didn’t work through all the arithmetic. But the result you get from the HP filter serves the same sort of purpose as the result you get from the moving average calc.

Anyway, after it’s installed one way or the other, it’s as easy to use as =SUM( ) or any other Excel function. I expect to explore it, and to use it.

What number do you use for the constant?… for the “Lambda” as they call it?

Rule of thumb is:

Lambda = 100*(number of periods in a year)^2

There is additional research that suggests using a power of 4 instead of 2. See Ravn and Uhlig (2002). http://ideas.repec.org/a/tpr/restat/v84 … 1-375.html

via The New Arthurian Economics: De-Trending.

Modelagem baseada em agente: primeiros passos

Aqui o Understanding Society mostra um bom guia para começar a olhar estes modelos baseados em agente que falei na semana passada e coloca algumas dúvidas sobre a viabilidade do projeto. Para ele (e concordo) quando os agentes são homogêneos podemos usar uma abordagem agregada. Mas quando é que algo é homogêneo? Me parece possível encaixar preceitos evolucionistas nessa abordagem.

Agent-based modeling is an intriguing new set of tools for computational social science. The techniques permit us to project forward the system-level effects of a set of assumptions about agent behavior and a given environment. What kinds of real social phenomena are amenable to treatment by the techniques of agent-based modeling? David O’Sullivan and his co-authors offer an assessment of this question in their contribution to a valuable recent handbook, Heppenstall et al, Agent-Based Models of Geographical Systems. (Andrew Crooks and Alison Heppenstall provide a valuable and clear introduction to ABM methodology in their contribution to the volume.)

via UnderstandingSociety: Domain of agent-based modeling methods.

Citando um post do twitter

Bluebird 1

Ainda não cruzei com nenhum tuíto citável em artigo, tese, etc. que não fosse apenas um link para algo maior, mais tradicionalmente citável (como uma página em um site – muito tradicional…). Fica a dica para o futuro, é até bem simples e bastante lógico.

The Modern Language Association likes to keep up with the times. As we all know, some information breaks first or only on Twitter and a good academic needs to be able to cite those sources. So, the MLA has devised a standard format that you should keep in mind. Its form is:

citation-style2_615.jpg

via The Atlantic – How to cite a tweet in an academic paper