Neste post vamos mostrar como estabelecer uma conexão via R com um banco de dados não estruturado - MongoDB. Estabelecer uma conexão direta com o banco é útil quando os dados disponíveis para análise são dinâmicos, ou seja, atualizados com uma frequência que torna inviável a exportação para algum arquivo tipo txt ou csv, por exemplo. No post Python e MongoDB: porque usar e primeiros passos mostramos como conectar o Python ao MongoDB.
Conectando o R ao MongoDB
Começamos instalando e carregando a library rmongodb.
install.packages("rmongodb")
library(rmongodb)
Na sequência, estabelecemos a conexão (local), conferimos o status e se a conexão está ativa.
#Estabelecendo a conexão com o banco (localhost)
mongo <- mongo.create()
mongo
[1] 0
attr(,"mongo")
<pointer: 0x00000000074aab10>
attr(,"class")
[1] "mongo"
attr(,"host")
[1] "127.0.0.1"
attr(,"name")
[1] ""
attr(,"username")
[1] ""
attr(,"password")
[1] ""
attr(,"db")
[1] "admin"
attr(,"timeout")
[1] 0
mongo.is.connected(mongo)
[1] TRUE
O comando mongo.get.databases() lista todas as bases disponíveis.
> mongo.get.databases(mongo)
[1] "agg" "aitech" "blog" "enron" "fia" "inflacao" "m101"
[8] "mongobook" "reddit" "school" "stocks" "students" "test" "testando"
[15] "tweetsearch"
Vamos trabalhar com a base "stocks". Vamos utilizar um if para verificar se nossa conexão está ativa ou não e o comando mongo.get.database.collections() para listar as collections da base.
if(mongo.is.connected(mongo) == TRUE) {
db <- "stocks"
mongo.get.database.collections(mongo, db)
collection <- mongo.get.database.collections(mongo, db)
}
A variável collection recebeu o valor "stocks.magic" onde magic é a collection dentro da base stocks. A sintaxe do rmongodb lembra a próxima sintaxe do pymongo ou do próprio mongo. Vamos contar a quantidade de documentos da nossa collection e retornar um documento.
mongo.count(mongo, collection)
[1] 1234
mongo.find.one(mongo, collection)
_id : 7 53497bd4047eb41f006a0013
acao : 2 TRPN3
data : 2 2014-04-12
cotacao : 1 12.700000
Neste caso, retornamos a cotação da ação da Tarpon (TRPN3) no dia 12.04,2014. Vamos agora retornar todos os valores da cotação das ações da Tarpon, pelo comando mongo.find().
mongo.find(mongo, collection, '{"acao":"TRPN3"}')
[1] 0
attr(,"mongo.cursor")
<pointer: 0x0000000024014918>
attr(,"class")
[1] "mongo.cursor"
Repare que a execução deste comando retorna um cursor que aponta para os valores, e não os valores propriamente ditos. Para recuperá-los, fazemos.
cotacao <- vector()
cursor <- mongo.find(mongo, collection, '{"acao":"TRPN3"}')
while (mongo.cursor.next(cursor)) {
val <- mongo.cursor.value(cursor)
cotacao[length(cotacao)+1] <- mongo.bson.value(val, "cotacao")
}
Usamos o loop while para varrer o cursor (equanto houver, por isso usamos o .next), recuperação os dados do cursor com o mongo.cursor.value(cursor) e atribuímos à variável cotacao apenas o valor cotacao.
Agora, podemos executar os comandos do R como conhecemos, como por exemplo um plot dos valores da cotação.
plot(cotacao,ylim = c(12.1,14.5),type='l')
Podemos deixar nosso gráfico um pouco mais elaborado, retornando as informações das datas das cotações e mudando a cor caso a cotação seja maior que a média simples do período.
#Retornando as datas
data <- vector()
cursor <- mongo.find(mongo, collection, '{"acao":"TRPN3"}')
while (mongo.cursor.next(cursor)) {
val <- mongo.cursor.value(cursor)
data[length(data)+1] <- mongo.bson.value(val, "data")
}
#Converte o formato string para Date
data <- as.Date(data,format="%Y-%m-%d")
plot(data,cotacao, main = "Cotação da TRPN3\nvia MongoDB",
xlab="Data", ylab="Cotação",
col=ifelse(cotacao>mean(cotacao),"blue", "red"),
ylim = c(12.1,14.5))
O código e a base de dados completa está disponível em nosso GitHub Arte dos Dados, nos arquivos R_MongoDB.R, magic.bson e magic.metadata.json.
mongodump e mongorestore: backup no MongoDB
Como importar arquivos no MongoDB - Usando o comando mongoimport
Um abraço e até o próximo post!
0 comentários:
Postar um comentário