Data Scientist hack para encontrar grupos Meetup certos (usando Python)

Traduzido de: Data scientist hack to find the right Meetup groups (using Python)

Por: ,

Introdução

Cientista de Dados é um animal preguiçoso! Nós detestamos ter que fazer trabalhos repetitivos manualmente. Nos afligimos com o mero pensamento de ter que fazer tarefas tediosas e quando nos deparamos com uma, tentamos automatizá-la para que o mundo se torne um lugar melhor!

Realizamos alguns meetups na Índia durante os últimos meses e queríamos saber o que os melhores meetups em todo o mundo estão fazendo. Para um ser humano normal, isso significaria surfar pelas páginas de meetups e descobrir essas informações manualmente.

Não para um cientista de dados!

O que é um meetup?

Meetup pode ser entendido como uma reunião auto-organizada feita para alcançar um objectivo pré-definido. Meetup.com é a maior rede de grupos locais do mundo. A missão da Meetup é “revitalizar comunidades locais e ajudar as pessoas ao redor do mundo a se auto-organizar”.

O processo de pesquisar meetups pode ser bastante demorado (eu diria). Existem múltiplas limitações associadas a ele (o que eu explico na seção a seguir). Mas, como um cientista de dados realizaria essa tarefa para economizar tempo? Naturalmente, ele tentaria automatizar o processo!

Neste artigo, vou apresentar a abordagem de um cientista de dados para localizar grupos de meetup usando Python. Tomando como referência, você poderá encontrar grupos localizados em qualquer canto da terra. Você também pode adicionar sua própria camada de análise para descobrir algumas informações interessantes.

O Desafio com abordagem manual

Digamos que você queira descobrir e participar de alguns dos melhores meetups em sua área. Obviamente você pode fazer esta tarefa manualmente, mas há alguns desafios que você irá encontrar:

  • Pode haver vários grupos com nomes e propósito semelhantes. Torna-se difícil encontrar os certos apenas lendo nomes.
  • Digamos que você esteja procurando meetups em ciência de dados, você precisará navegar manualmente por cada um dos grupos, ver vários parâmetros para julgar sua qualidade (por exemplo, freqüência de reunião, número de membros, revisão média etc.) e então tomar uma decisão para se juntar ao grupo ou não – já soa como um monte de trabalho para mim!
  • Além disso, se você tem algum requisito específico, como ver grupos presentes em várias cidades, você vai acabar navegando pelos grupos de cada cidade manualmente – estou me arrepiando só em pensar nisso.

Pense se você tiver uma situação com mais de 200 grupos de interesse, como encontrar o melhor?

A Solução do Cientista de Dados

Neste artigo, eu identifico vários grupos Python de meetup em cidades da Índia, EUA, Hong Kong, Taiwan e Austrália. Seguem-se os passos que vou executar:

  • Obtenha informações de meetup.com usando a API que eles forneceram
  • Mova os dados para um DataFrame e
  • Analise e junte-os em grupos corretos

Essas etapas são bastante fáceis de executar. Abaixo, eu enumero as etapas para executá-las. Como mencionado anteriormente, este é apenas o início de possibilidades que se abrem. Você poderá usar esta informação para extrair um monte de insights sobre várias comunidades em todo o mundo.

Passo 0: Importar Bibliotecas

Abaixo lista de bibliotecas que eu usei para codificar este projeto:

import urllib
import json
import pandas as pd
import matplotlib.pyplot as plt
from geopy.geocoders import Nominatim

Um rápido overview delas:

  • urllib: Este módulo fornece uma interface de alto nível para obter dados da World Wide Web.
  • json (Java Script Object Notation): A biblioteca json pode analisar JSON a partir de strings ou arquivos. A biblioteca analisa o JSON em um dicionário ou lista do Python.
  • Pandas: É usado para operações de dados estruturados e manipulações. É extensivamente usado para munging e preparação de dados.
  • matplotlib: usado para traçar uma grande variedade de gráficos, começando de histogramas para traçados de linha até mapas de calor.
  • geocoders: biblioteca de geocodificação simples e consistente escrita em Python.

Passo 1: Use API para ler dados em JSON

Você pode buscar dados de qualquer site de várias maneiras:

  • Rastreie as páginas da Web usando uma combinação de bibliotecas como o BeautifulSoup e o Scrapy. Encontre tendências subjacentes em html usando expressões regulares para puxar os dados necessários.
  • Se o site fornecer uma API (Application Programming Interface), use-a para buscar os dados. Você pode entender isso como um intermediário entre um programador e um aplicativo. Este intermediário aceita solicitações e, se essa solicitação é permitida, retorna os dados.
  • Ferramentas como import.io também podem ajudá-lo a fazer isso.

Para os sites que fornecem uma API, geralmente é a melhor maneira de buscar as informações. O primeiro método mencionado acima é suscetível a alterações de layout em uma página e pode ficar muito confuso às vezes. Felizmente, Meetup.com fornece várias APIs para acessar os dados necessários. Usando esta API, podemos acessar informações sobre vários grupos.

Para acessar a API baseada em solução automatizada, será necessário um valor para sig_id e sig (diferente para diferentes usuários). Siga os passos abaixo para acessa-los.

  • Login no meetup.com. Se não tiver uma conta, então crie uma
  • Para extrair informações sobre grupos, vá para a API. Para saber mais sobre o atributo de API, leia aqui.
  • Aqui, você pode fornecer suas palavras-chave de entrada para a cidade, país, estado, tópico e vários outros campos para extrair informações relevantes. Forneça os valores para qualquer um dos campos. Assim como para tópicos, eu coloquei “Python” e cliquei em “show response”. Você receberá um url assinado. Ele exibe o valor para sig_id e sig, guarde esses valores.
"https://api.meetup.com/2/groups?offset=0&format=json&topic=python&photo-host=public&page=20&radius=25.0&fields=&order=id&desc=false&sig_id=******&sig=*****************"

Passo 2: Gerar uma lista de URLs assinadas para todas as cidades

Agora, devemos solicitar a URL assinalada para cada pesquisa (no nosso caso, cidade + tópico) e a saída dessas URLs assinaladas fornecerá as informações detalhadas sobre os grupos correspondentes:

  • Crie uma lista com todas as cidades
  • Crie um objeto para acessar a longitude e latitude da cidade
  • Acesse a cidade para uma dada lista e gere a latitude e longitude usando o objeto  “geolocator”
  • Gere a string da url com os atributos necessários como formato de dados (json), raio (número milhas a partir do centro da cidade, 50), tópico (Python), latitude e longitude
  • Repetir esta etapa para cada cidade e anexar todos os URLs em uma lista
places = [ "san fransisco", "california", "boston ", "new york" , "pennsylvania", "colorado", "seattle", "washington","los angeles", "san diego", "houston", "austin", "kansas", "delhi", "chennai", "bangalore", "mumbai" , "Sydney","Melbourne", "Perth", "Adelaide", "Brisbane", "Launceston", "Newcastle" , "beijing", "shanghai", "Suzhou", "Shenzhen","Guangzhou","Dongguan", "Taipei", "Chengdu", "Hong Kong"] urls = [] #lista de urls 
radius = 50.0 #adiciona o raio em milhas
data_format = "json" 
topic = "Python" #adiciona sua escolha de tópico
sig_id = "########" #inicie com seu id, cheque chave de assinatura 
sig = "##############" #inicie com seu id, cheque chave de assinatura
for place in places: 
 location = geolocator.geocode(place)
 urls.append("https://api.meetup.com/2/groups?offset=0&format=" + data_format + "&lon=" + str(location.longitude) + "&topic=" + topic + "&photo-host=public&page=500&radius=" + str(radius)+"&fields=&lat=" + str(location.latitude) + "&order=id&desc=false&sig_id=" +sig_id + "&sig=" + sig)

Passo 3: Ler dados da URL e acessar recursos relevantes em um DataFrame

Agora, temos uma lista de URLs para todas as cidades. Em seguida, usaremos a biblioteca urllib para ler dados no formato JSON. Em seguida, leremos os dados em uma lista antes de convertê-los em um DataFrame.

city,country,rating,name,members = [],[],[],[],[]
for url in urls:
 response = urllib.urlopen(url)
 data = json.loads(response.read())
 data=data["results"] #acessou somente dados das chaves de resultado
 
for i in data :
 city.append(i['city'])
 country.append(i['country'])
 rating.append(i['rating'])
 name.append(i['name'])
 members.append(i['members']) 
 
df = pd.DataFrame([city,country,rating,name,members]).T
df.columns=['city','country','rating','name','members']

Python

Passo 4: Compare grupos Meetup em várias cidades

Hora de analisar os dados e encontrar os grupos adequados com base em várias métricas como número de membros, avaliações, cidade e outros. Abaixo estão alguns achados básicos, que eu gerei para grupos de python em diferentes cidades da Índia, EUA, Reino Unido, Hong Kong, Taiwan e Austrália.

Para saber mais sobre esses códigos Python, você pode ler artigos sobre exploração de dados e visualização usando Python.

Número de grupos do Python em seis países

freq = df.groupby('country').city.count() 
fig = plt.figure(figsize=(8,4))
ax1 = fig.add_subplot(121)
ax1.set_xlabel('Country')
ax1.set_ylabel('Count of Groups')
ax1.set_title("Number of Python Meetup Groups")
freq.plot(kind='bar') Number_Groups
Acima você pode notar que os EUA é o líder em número de grupos meetup python. Esta estatística também pode nos ajudar a estimar a penetração de Python na indústria de ciência dos dados dos EUA comparada com os outros.

Tamanho médio dos grupos entre os países

freq = df.groupby('country').members.sum()/df.groupby('country').members.count()
fig = plt.figure(figsize=(8,4))
ax1 = fig.add_subplot(121)
ax1.set_xlabel('Country')
ax1.set_ylabel('Average Members in each group')
ax1.set_title("Python Meetup Groups")
freq.plot(kind='bar')

Novamente, os EUA são os líderes no número médio de membros por grupo.

Classificação média dos grupos entre os países

freq = df.groupby('country').rating.sum()/df.groupby('country').rating.count()
fig = plt.figure(figsize=(8,4))
ax1 = fig.add_subplot(121)
ax1.set_xlabel('Country')
ax1.set_ylabel('Average rating')
ax1.set_title("Python Meetup Groups")
freq.plot(kind='bar')

Average_RatingAU e EUA têm classificação média semelhante (~ 4) entre grupos.

Grupos top 2 para cada país.

df=df.sort(['country','members'], ascending=[False,False])
df.groupby('country').head(2)

Top_2_Groups

Hora de identificar os dois grupos principais de cada país com base no número de membros. Você também pode identificar os grupos com base na classificação. Aqui eu fiz uma análise básica para ilustrar esta abordagem. Você pode acessar outras APIs também para encontrar informações como eventos futuros, número de eventos, duração de eventos e outros e depois disso mesclar todas as informações relevantes com base em group_id (ou valor-chave).

Código Final

Abaixo o código final deste exercício, você pode brincar com ele, colocando sua sig_id e sig chave e pesquisar vários resultados de diferentes tópicos em diferentes cidades. Também fiz o upload no GitHub.

import urllib
import json
import pandas as pd
import matplotlib.pyplot as plt
from geopy.geocoders import Nominatim
geolocator = Nominatim() #create object
places = [ "san fransisco", "california", "boston ", "new york" , "pennsylvania", "colorado", "seattle", "washington","los angeles", "san diego", "houston", "austin", "kansas", "delhi", "chennai", "bangalore", "mumbai" , "Sydney","Melbourne", "Perth", "Adelaide", "Brisbane", "Launceston", "Newcastle" , "beijing", "shanghai", "Suzhou", "Shenzhen","Guangzhou","Dongguan", "Taipei", "Chengdu", "Hong Kong"]
# login no meetup.com. Se tiver uma conta, faça o signup
# Vá para https://secure.meetup.com/meetup_api/console/?path=/2/groups
# Nos tópicos "Python", entre o tópico de preferência, e clique em "show response"
# Copie a chave de assinatura. Na chave, copie o sig_id e sig e inicie as variáveis sig_id e sig
# Aostra chave de assinatura: "https://api.meetup.com/2/groups?offset=0&format=json&topic=python&photo-host=public&page=20&radius=25.0&fields=&order=id&desc=false&sig_id=******&sig=*****************"
urls = [] #lista de urls
radius = 50.0 #adiciona o raio em milhas
data_format = "json" #você pode adicionar outro formato como xml
topic = "Python" #adicione seu tópico de preferência aqui
sig_id = "186640998" #inicie com seu id, cheque chave de assinatura 
sig = "6dba1b76011927d40a45fcbd5147b3363ff2af92" #inicie com seu id, cheque chave de assinatura
for place in places: 
 location = geolocator.geocode(place)
 urls.append("https://api.meetup.com/2/groups?offset=0&format=" + data_format + "&lon=" + str(location.longitude) + "&topic=" + topic + "&photo-host=public&page=500&radius=" + str(radius)+"&fields=&lat=" + str(location.latitude) + "&order=id&desc=false&sig_id=" +sig_id + "&sig=" + sig)
city,country,rating,name,members = [],[],[],[],[]
for url in urls:
 response = urllib.urlopen(url)
 data = json.loads(response.read())
 data=data["results"]
 
for i in data :
 city.append(i['city'])
 country.append(i['country'])
 rating.append(i['rating'])
 name.append(i['name'])
 members.append(i['members']) 
 
df = pd.DataFrame([city,country,rating,name,members]).T
df.columns=['city','country','rating','name','members']
df.sort(['members','rating'], ascending=[False, False])
freq = df.groupby('country').city.count()
fig = plt.figure(figsize=(8,4))
ax1 = fig.add_subplot(121)
ax1.set_xlabel('Country')
ax1.set_ylabel('Count of Groups')
ax1.set_title("Number of Python Meetup Groups")
freq.plot(kind='bar')
freq = df.groupby('country').members.sum()/df.groupby('country').members.count()
ax1.set_xlabel('Country')
ax1.set_ylabel('Average Members in each group')
ax1.set_title("Python Meetup Groups")
freq.plot(kind='bar')
freq = df.groupby('country').rating.sum()/df.groupby('country').rating.count()
ax1.set_xlabel('Country')
ax1.set_ylabel('Average rating')
ax1.set_title("Python Meetup Groups")
freq.plot(kind='bar')
df=df.sort(['country','members'], ascending=[False,False])
df.groupby('country').head(2)

Notas Finais

Neste artigo, analisamos a aplicação do Python para automatizar um processo manual e o nível de precisão para encontrar os grupos Meetup certos. Usamos a API para acessar informações da web e transferi-las para um DataFrame. Posteriormente, analisamos essas informações para gerar insights.

Podemos tornar este aplicativo mais inteligente adicionando mais informações como eventos futuros, número de eventos, RSVP e várias outras métricas. Você também pode usar esses dados para gerar insights interessantes sobre a comunidade e as pessoas. Por exemplo, a taxa de RSVP por comparecimento, em revisando a taxa de funil, diverge de país para país? Que países planejam seus encontros com a maior antecedência?

Experimente aí e compartilhe seu conhecimento na seção de comentários abaixo.


Veja também:


Deixe uma resposta