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']
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')
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')
AU 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)
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: