Análise de redes sociais usando NetworkX e Google App Engine

1,674 views

Published on

Agrupar amigos com base nas relações sociais, criar um mapa de calor por temas ou achar aquela pessoa que, na prática é a conexão entre grupos distintos de amigos. Tudo isto feito com Python, Python e mais Python.

Published in: Technology
3 Comments
2 Likes
Statistics
Notes
No Downloads
Views
Total views
1,674
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
15
Comments
3
Likes
2
Embeds 0
No embeds

No notes for slide

Análise de redes sociais usando NetworkX e Google App Engine

  1. 1. Análise de Redes Sociais usando NetworkX e Google App Engine (Shaving the yak with Python) Érico Andrei Pessoa Física
  2. 2. Érico Andrei • Sócio/Diretor da Simples Consultoria • Gerente de consultoria na Assessoria da Presidência da Editora Abril • Consultor de Marketing - Microsoft Brasil • Diretor de Marketing da APyB • Professor de Administração e Marketing (UNIP, UNICSUL)
  3. 3. E para evitar o efeito Google
  4. 4. Pai de uma linda garota
  5. 5. Part time nerd
  6. 6. Torcedor do Juventus da Mooca
  7. 7. Shaving theYak • Outro dia eu estava conversando com o @osantana sobre o uso de Git vs Mercurial vs PythonBrasil vs Futebol vs Teatro...
  8. 8. On any given sunday... • Como será que se comporta minha rede de amigos no Facebook? • E que tal se eu aproveitasse para aprender este tal de Google App Engine? • E se ....
  9. 9. On any given sunday... • Listar meus amigos • Relações entre estes amigos • Fazer um gráfico destas relações
  10. 10. On any given sunday... • Depois de 2 horas e um pouco de : • NetworkX + App Engine + Nexus + pyfacebook + Matplotlib
  11. 11. On any given sunday...
  12. 12. On any given sunday...
  13. 13. Retrospectiva
  14. 14. Dados Facebook http://developers.facebook.com/ • Várias formas de acesso • REST • FQL • Graph API • Social plugins
  15. 15. Dados Facebook http://developers.facebook.com/ • Entender Permissões • user_about_me • user_birthday • user_location • user_religion_politics, • user_website • user_work_history • read_friendlists,user_hometown, • user_groups • offline_access
  16. 16. PyFacebook http://github.com/sciyoshi/pyfacebook/ • Parecia a melhor solução • Usa a api REST do Facebook • Fácil de usar
  17. 17. PyFacebook • Meio que morto...
  18. 18. PyFacebook Meus dados import facebook _FbApiKey = 'e18cfce409596b6508930fd99edffd' _FbSecret = 'e18cfce409596b6508930fd99edffd' fb = facebook.Facebook(_FbApiKey, _FbSecret) fb.auth.createToken() fb.login() fb.auth.getSession() info = fb.users.getInfo([fb.uid], ['name', 'birthday', 'affiliations', 'sex'])[0] print 'Nome: ', info['name'] print 'Sexo: ', info['sex']
  19. 19. FQL Listar amigos SELECT uid, name, sex, birthday_date FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1=534881870)
  20. 20. PyFacebook + FQL Meus amigos import facebook ... query ="""SELECT uid, name, sex, birthday_date FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1=534881870)""" friends = fb.fql.query(query) friends = friends.get('fql_result_set',[])
  21. 21. PyFacebook + FQL Meus amigos e relações entre eles query ={"friends": """SELECT uid, name, birthday, relationship_status, pic_square, FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1=534881870)""", "friendFriends": """SELECT uid1, uid2 FROM friend WHERE uid1 IN (SELECT uid FROM #friends) AND uid2 in (SELECT uid FROM #friends) """} friends, friendsFriend = fb.fql.multiquery(query) friends = friends.get('fql_result_set',[]) friendsFriend = friendsFriend.get('fql_result_set',[])
  22. 22. E entra OpenGraph • Facebook disponibiliza SDK para Python • Foco apenas em OpenGraph http://github.com/facebook/python-sdk
  23. 23. Python SDK Meus dados import facebook FACEBOOK_APP_ID = "114205635404397" FACEBOOK_APP_SECRET = "abc21d6d41ec7ae98c31d97942e66276" cookie = facebook.get_user_from_cookie(cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET) graph = facebook.GraphAPI(cookie["access_token"]) profile = graph.get_object("me") nome = profile.get('name')
  24. 24. Python SDK Meus Amigos import facebook FACEBOOK_APP_ID = "114205635404397" FACEBOOK_APP_SECRET = "abc21d6d41ec7ae98c31d97942e66276" cookie = facebook.get_user_from_cookie(cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET) graph = facebook.GraphAPI(cookie["access_token"]) amigos = graph.get_connections("me", "friends")
  25. 25. Python SDK FQL import facebook ...
  26. 26. NetworkX Agrupando amigos http://github.com/ericof/bin/blob/master/facebook/graph.py #!/usr/local/bin/python2.4 try: import matplotlib.pyplot as plt except: raise import networkx as nx x_min,x_max = (0.946,1.3) y_min,y_max = (0.9,1.3) x_avg = (x_max+x_min)/2 y_avg = (y_max+y_min)/2
  27. 27. E entra o App Engine http://apps.facebook.com/manoexplorer/ • Manter alguns dados dos usuários • Permitir relatórios complexos • Pedir ajuda aos amigos • Brincar (+) um pouco
  28. 28. Desafios • Buscar dados Facebook • Entender o Datastore • Limites, limites
  29. 29. Dados do Facebook • Acesso HTTP • Limite de tempo de resposta • urlfetch ou urllib
  30. 30. Datastore • Maldito vício de RDBMS • Agradeço a @rodolphoeck • Agora reescrever boa parte do código
  31. 31. Limites • ReferenceProperty são coisas do mal • Mantenha dados a serem exibidos no mesmo “registro” • Lembre-se de que temos tempo limite de execução
  32. 32. Exemplo prático • Um cabra tem 560 amigos no Facebook • Ao entrar no Mano Explorer quero listar os amigos • Adicionar registros relativos a novos usuários
  33. 33. Exemplo prático • No máximo posso salvar 500 registros por vez • Isto consome muita CPU
  34. 34. Exemplo prático • Solução: TaskQueue + Memcache • Memcache: Resultado vindo do Facebook • TaskQueue: Processa resultados direto do Memcache
  35. 35. Exemplo prático Criando a fila def friends(self): ''' Let's get the friends of this user ''' user = self.current_user if user: taskqueue.add(url='/queue/getFriends', params={'user_id':user.id})
  36. 36. Exemplo prático Armazenando amigos if friends: memcache.add(key="friends_%s" % str(user.id), value=friends, time=180) if tmpFF: memcache.add(key='queue_%s' % str(user.id),value=tmpFF,time=240) ranges = [(r,((((r+limit)<nUsers) and (r+limit)) or nUsers)) for r in range (0,nUsers,limit)] memcache.delete(key='queues_%s' % str(user.id)) for s,e in ranges: tmpQueues.append((s,e)) logging.debug('Adiciona tarefa na fila %d - %d' % (s,e)) taskqueue.add(queue_name='friendsUp' ,url='/queue/friend_fetch', params={'user_id':user.id, 'start':s, 'end':e,}) memcache.add(key='queues_%s' % str(user.id),value=tmpQueues,time=180)
  37. 37. Exemplo prático
  38. 38. Exemplo prático
  39. 39. Meus amigos
  40. 40. Amigos do Cleber
  41. 41. Próximos Capítulos • RaphäelJs ou Flare • Ter mais que > 17 usuários • Implementar rede no AppEngine
  42. 42. Obrigado Érico Andrei +551138982121 ext.1019 erico@simplesconsultoria.com.br http://www.simplesconsultoria.com.br Twitter: @ericof Gtalk, MSN: ericof@gmail.com

×