domingo, 21 de dezembro de 2014

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.

Para ajudar, temos dois posts mostrando como importar dados no mongodb:

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