{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction\n",
"\n",
"My friend [Andrew Key] and I are developing a series of [Data Science Challenges] to help each other and others become better Data Scientists by working on hands-on projects.\n",
"\n",
"This notebook contains my work for the first challenge, _Exploring the Meetup API_ in my city of choice, beautiful **Vancouver, BC**.\n",
"\n",
"## Challenge 01: Explore the Meetup API\n",
"\n",
"Use the [Meetup API] to explore meetups in your city of choice.\n",
"\n",
"**Guide Questions:**\n",
"\n",
"Below are some guide line questions to get you started:\n",
"\n",
"- What is the largest meetup in your location of choice (city, cities, country...etc)?\n",
"- How many meetups of a certain category (e.g. Tech, Art...etc) are in your city?\n",
"- Basic statistics of meetups\n",
" - What is the average size of meetups?\n",
" - How frequently do meetups host events?\n",
"\n",
"## My guideline\n",
"\n",
"I will focus on exploring the Tech Meetups in Vancouver. Specifically, I will look at the size and activity of these meetups.\n",
"\n",
"As I explore the data, I will also raise additional questions that could be further explored as extensions to this project.\n",
"\n",
"[//]: # (References)\n",
"[Andrew Key]: https://github.com/redpanda-ai\n",
"[Data Science Challenges]: https://johannesgiorgis.com/introducing-data-science-challenges/\n",
"[Meetup API]: https://www.meetup.com/meetup_api/"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# import libraries\n",
"\n",
"import datetime\n",
"import math\n",
"import meetup.api\n",
"import os\n",
"import pprint\n",
"import requests\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"\n",
"from mpl_toolkits.basemap import Basemap\n",
"from pandas.plotting import scatter_matrix\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Make sure you have set up **MEETUP_API_KEY** in your environment:\n",
"\n",
"In _Ubuntu_:\n",
"\n",
"1. Open `/etc/environment` as super user - e.g. `sudo vim /etc/environment`\n",
"2. Add `MEETUP_API_KEY=\"YOUR MEETUP API KEY\"`\n",
"3. Open a new terminal and verify: `env | grep -i meetup`\n",
"\n",
"In _MacOS_:\n",
"\n",
"1. Open `~/.bash_profile`\n",
"2. Add `export MEETUP_API_KEY=\"YOUR MEETUP API KEY\"` at the end of the file\n",
"3. Open a new terminal and verify: `env | grep -i meetup`"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"assert 'MEETUP_API_KEY' in os.environ, (\n",
" \"You need MEETUP_API_KEY in your environment\"\n",
")\n",
"client = meetup.api.Client()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Helper Functions\n",
"\n",
"Let's first create some helper functions.\n",
"\n",
"I got the `parse_response` function from my friend Andy. Below are the explanations from his [notebook]:\n",
"\n",
"This helper function helps us parse out the two most useful different pieces:\n",
"\n",
"1. **meta**: an object containing meta-data about the response object itself\n",
"2. **results**: A page of actual data from the entire result of our API call\n",
"\n",
"\n",
"\n",
"[notebook]: https://github.com/redpanda-ai/datascience_challenges/blob/master/01_explore_meetup_api/explore_sf_meetups.ipynb"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def parse_response(response):\n",
" '''returns two dataframes, meta and results:\n",
" - meta: a vertically aligned dataframe, where each row is an element\n",
" of the response.meta dictionary\n",
" - results: a horizontally aligned dataframe, where each column is\n",
" an element of the response.results dictionary'''\n",
" meta = pd.DataFrame.from_dict(response.meta, orient='index')\n",
" results = pd.DataFrame.from_dict(response.results)\n",
" return (meta, results)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get Groups\n",
"\n",
"We are interested in exploring Tech Meetup groups based in _Vancouver, BC_. We will use the [GetGroups] method to get the information we need.\n",
"\n",
"The method requires the following information:\n",
"\n",
"- Category ID\n",
"- Location information: _country/state/city, latitude+longitude, or zip code_\n",
"\n",
"**Category ID**\n",
"\n",
"We don't know what Category ID to use. We will have to find this via the [GetCategories] method.\n",
"\n",
"\n",
"**Location Information**\n",
"\n",
"We know the city, province and country that we are interested in. The following parameters are what we need to provide in the `GetGroups` method to specify a location:\n",
"\n",
"- **city** – A valid country code, city and for the US, State.\n",
"- **country** – A valid country code, city and for the US, State.\n",
"- **lat** – A valid latitude and longitude\n",
"- **lon** – A valid latitude and longitude\n",
"- **zip** – A valid US zip code\n",
"\n",
"These 5 parameters limit the returned groups to within a 6th parameter, **radius** miles of the specified location.\n",
"\n",
"- **radius** – Radius, in miles for geographic requests, default 25 – maximum 100\n",
"\n",
"Let's use the _city_ and _country_ parameters, but we are not sure what the API considers a **valid country code**. We can use the [GetCities] method to get this information.\n",
"\n",
"[GetGroups]: https://meetup-api.readthedocs.io/en/latest/meetup_api.html?highlight=getgroups#meetup.api.meetup.api.Client.GetGroups\n",
"[GetCategories]: https://meetup-api.readthedocs.io/en/latest/meetup_api.html#meetup.api.meetup.api.Client.GetCategories\n",
"[GetCities]: https://meetup-api.readthedocs.io/en/latest/meetup_api.html?highlight=getgroups#meetup.api.meetup.api.Client.GetCities"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Categories\n",
"\n",
"Let's use the [GetCategories] method to discover the different categories and their IDs:\n",
"\n",
"[GetCategories]: https://meetup-api.readthedocs.io/en/latest/meetup_api.html#meetup.api.meetup.api.Client.GetCategories"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"29/30 (10 seconds remaining)\n"
]
}
],
"source": [
"categories_resp = client.GetCategories()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"categories_meta_df, categories_df = parse_response(categories_resp)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
0
\n",
"
\n",
" \n",
" \n",
"
\n",
"
next
\n",
"
\n",
"
\n",
"
\n",
"
method
\n",
"
Categories
\n",
"
\n",
"
\n",
"
total_count
\n",
"
33
\n",
"
\n",
"
\n",
"
link
\n",
"
https://api.meetup.com/2/categories
\n",
"
\n",
"
\n",
"
count
\n",
"
33
\n",
"
\n",
"
\n",
"
description
\n",
"
Returns a list of Meetup group categories
\n",
"
\n",
"
\n",
"
lon
\n",
"
None
\n",
"
\n",
"
\n",
"
title
\n",
"
Categories
\n",
"
\n",
"
\n",
"
url
\n",
"
https://api.meetup.com/2/categories?offset=0&f...
\n",
"
\n",
"
\n",
"
id
\n",
"
\n",
"
\n",
"
\n",
"
updated
\n",
"
1450292956000
\n",
"
\n",
"
\n",
"
lat
\n",
"
None
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0\n",
"next \n",
"method Categories\n",
"total_count 33\n",
"link https://api.meetup.com/2/categories\n",
"count 33\n",
"description Returns a list of Meetup group categories\n",
"lon None\n",
"title Categories\n",
"url https://api.meetup.com/2/categories?offset=0&f...\n",
"id \n",
"updated 1450292956000\n",
"lat None"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"categories_meta_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We observe there are 33 Meetup categories.\n",
"\n",
"#### How the Meetup API works¶\n",
"\n",
"Let's use this opportunity to understand the Meetup API by looking at the `next` field in the metadata.\n",
"\n",
"Meetup API v2 response payloads are returned in pages, one at a time. Each page by default returns 200 records. If there is more than 1 page of results, the metadata will provide the URI for the next API call in the sequence via the `next` field. We can take advantage of this to programmatically get each subsequent page until we have collected all of the records we are looking for.\n",
"\n",
"In the above metadata, since there are only 33 categories (`total_count` is 33), they are all returned in the first page. Therefore, the `next` field is empty as there is no need for any subsequent API calls to get more records."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
shortname
\n",
"
sort_name
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
Arts & Culture
\n",
"
Arts
\n",
"
Arts & Culture
\n",
"
\n",
"
\n",
"
1
\n",
"
18
\n",
"
Book Clubs
\n",
"
Book Clubs
\n",
"
Book Clubs
\n",
"
\n",
"
\n",
"
2
\n",
"
2
\n",
"
Career & Business
\n",
"
Business
\n",
"
Career & Business
\n",
"
\n",
"
\n",
"
3
\n",
"
3
\n",
"
Cars & Motorcycles
\n",
"
Auto
\n",
"
Cars & Motorcycles
\n",
"
\n",
"
\n",
"
4
\n",
"
4
\n",
"
Community & Environment
\n",
"
Community
\n",
"
Community & Environment
\n",
"
\n",
"
\n",
"
5
\n",
"
5
\n",
"
Dancing
\n",
"
Dancing
\n",
"
Dancing
\n",
"
\n",
"
\n",
"
6
\n",
"
6
\n",
"
Education & Learning
\n",
"
Education
\n",
"
Education & Learning
\n",
"
\n",
"
\n",
"
7
\n",
"
8
\n",
"
Fashion & Beauty
\n",
"
Fashion
\n",
"
Fashion & Beauty
\n",
"
\n",
"
\n",
"
8
\n",
"
9
\n",
"
Fitness
\n",
"
Fitness
\n",
"
Fitness
\n",
"
\n",
"
\n",
"
9
\n",
"
10
\n",
"
Food & Drink
\n",
"
Food & Drink
\n",
"
Food & Drink
\n",
"
\n",
"
\n",
"
10
\n",
"
11
\n",
"
Games
\n",
"
Games
\n",
"
Games
\n",
"
\n",
"
\n",
"
11
\n",
"
13
\n",
"
Movements & Politics
\n",
"
Movements
\n",
"
Movements & Politics
\n",
"
\n",
"
\n",
"
12
\n",
"
14
\n",
"
Health & Wellbeing
\n",
"
Well-being
\n",
"
Health & Wellbeing
\n",
"
\n",
"
\n",
"
13
\n",
"
15
\n",
"
Hobbies & Crafts
\n",
"
Crafts
\n",
"
Hobbies & Crafts
\n",
"
\n",
"
\n",
"
14
\n",
"
16
\n",
"
Language & Ethnic Identity
\n",
"
Languages
\n",
"
Language & Ethnic Identity
\n",
"
\n",
"
\n",
"
15
\n",
"
12
\n",
"
LGBT
\n",
"
LGBT
\n",
"
LGBT
\n",
"
\n",
"
\n",
"
16
\n",
"
17
\n",
"
Lifestyle
\n",
"
Lifestyle
\n",
"
Lifestyle
\n",
"
\n",
"
\n",
"
17
\n",
"
20
\n",
"
Movies & Film
\n",
"
Films
\n",
"
Movies & Film
\n",
"
\n",
"
\n",
"
18
\n",
"
21
\n",
"
Music
\n",
"
Music
\n",
"
Music
\n",
"
\n",
"
\n",
"
19
\n",
"
22
\n",
"
New Age & Spirituality
\n",
"
Spirituality
\n",
"
New Age & Spirituality
\n",
"
\n",
"
\n",
"
20
\n",
"
23
\n",
"
Outdoors & Adventure
\n",
"
Outdoors
\n",
"
Outdoors & Adventure
\n",
"
\n",
"
\n",
"
21
\n",
"
24
\n",
"
Paranormal
\n",
"
Paranormal
\n",
"
Paranormal
\n",
"
\n",
"
\n",
"
22
\n",
"
25
\n",
"
Parents & Family
\n",
"
Moms & Dads
\n",
"
Parents & Family
\n",
"
\n",
"
\n",
"
23
\n",
"
26
\n",
"
Pets & Animals
\n",
"
Pets
\n",
"
Pets & Animals
\n",
"
\n",
"
\n",
"
24
\n",
"
27
\n",
"
Photography
\n",
"
Photography
\n",
"
Photography
\n",
"
\n",
"
\n",
"
25
\n",
"
28
\n",
"
Religion & Beliefs
\n",
"
Beliefs
\n",
"
Religion & Beliefs
\n",
"
\n",
"
\n",
"
26
\n",
"
29
\n",
"
Sci-Fi & Fantasy
\n",
"
Sci fi
\n",
"
Sci-Fi & Fantasy
\n",
"
\n",
"
\n",
"
27
\n",
"
30
\n",
"
Singles
\n",
"
Singles
\n",
"
Singles
\n",
"
\n",
"
\n",
"
28
\n",
"
31
\n",
"
Socializing
\n",
"
Social
\n",
"
Socializing
\n",
"
\n",
"
\n",
"
29
\n",
"
32
\n",
"
Sports & Recreation
\n",
"
Sports
\n",
"
Sports & Recreation
\n",
"
\n",
"
\n",
"
30
\n",
"
33
\n",
"
Support
\n",
"
Support
\n",
"
Support
\n",
"
\n",
"
\n",
"
31
\n",
"
34
\n",
"
Tech
\n",
"
Tech
\n",
"
Tech
\n",
"
\n",
"
\n",
"
32
\n",
"
36
\n",
"
Writing
\n",
"
Writing
\n",
"
Writing
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name shortname sort_name\n",
"0 1 Arts & Culture Arts Arts & Culture\n",
"1 18 Book Clubs Book Clubs Book Clubs\n",
"2 2 Career & Business Business Career & Business\n",
"3 3 Cars & Motorcycles Auto Cars & Motorcycles\n",
"4 4 Community & Environment Community Community & Environment\n",
"5 5 Dancing Dancing Dancing\n",
"6 6 Education & Learning Education Education & Learning\n",
"7 8 Fashion & Beauty Fashion Fashion & Beauty\n",
"8 9 Fitness Fitness Fitness\n",
"9 10 Food & Drink Food & Drink Food & Drink\n",
"10 11 Games Games Games\n",
"11 13 Movements & Politics Movements Movements & Politics\n",
"12 14 Health & Wellbeing Well-being Health & Wellbeing\n",
"13 15 Hobbies & Crafts Crafts Hobbies & Crafts\n",
"14 16 Language & Ethnic Identity Languages Language & Ethnic Identity\n",
"15 12 LGBT LGBT LGBT\n",
"16 17 Lifestyle Lifestyle Lifestyle\n",
"17 20 Movies & Film Films Movies & Film\n",
"18 21 Music Music Music\n",
"19 22 New Age & Spirituality Spirituality New Age & Spirituality\n",
"20 23 Outdoors & Adventure Outdoors Outdoors & Adventure\n",
"21 24 Paranormal Paranormal Paranormal\n",
"22 25 Parents & Family Moms & Dads Parents & Family\n",
"23 26 Pets & Animals Pets Pets & Animals\n",
"24 27 Photography Photography Photography\n",
"25 28 Religion & Beliefs Beliefs Religion & Beliefs\n",
"26 29 Sci-Fi & Fantasy Sci fi Sci-Fi & Fantasy\n",
"27 30 Singles Singles Singles\n",
"28 31 Socializing Social Socializing\n",
"29 32 Sports & Recreation Sports Sports & Recreation\n",
"30 33 Support Support Support\n",
"31 34 Tech Tech Tech\n",
"32 36 Writing Writing Writing"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"categories_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see the 33 category records, where each category record has an ID, name, short name and a sort name.\n",
"\n",
"**Tech's category id is _34_. We will use this.**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Get Cities\n",
"\n",
"Let's use the [GetCities] method to figure out what the API considers a **valid country code**. Let's use 'Canada' as the country, representing the country code and 'Vancouver' as the query, representing the search term.\n",
"\n",
"[GetGroups]: https://meetup-api.readthedocs.io/en/latest/meetup_api.html?highlight=getgroups#meetup.api.meetup.api.Client.GetGroups\n",
"[GetCities]: https://meetup-api.readthedocs.io/en/latest/meetup_api.html?highlight=getgroups#meetup.api.meetup.api.Client.GetCities"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"28/30 (10 seconds remaining)\n"
]
}
],
"source": [
"cities_resp = client.GetCities(country='Canada', query='Vancouver')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"cities_meta_df, cities_df = parse_response(cities_resp)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" city country id lat localized_country_name lon \\\n",
"0 Vancouver ca 857064 49.279999 Canada -123.040001 \n",
"1 Vancouver us 98660 45.639999 USA -122.680000 \n",
"\n",
" member_count name_string ranking state zip \n",
"0 39959 Vancouver, British Columbia, Canada 0 BC V5K 0A1 \n",
"1 4699 Vancouver, Washington, USA 1 WA 98660 "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observation**:\n",
"\n",
"Our query returned 2 Vancouvers - one based in Canada and another in the USA. So the country code used (`Canada`) was **not valid**. \n",
"\n",
"But from our results, we can see the correct country code is **ca**. Let's confirm this."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"27/30 (10 seconds remaining)\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
city
\n",
"
country
\n",
"
id
\n",
"
lat
\n",
"
localized_country_name
\n",
"
lon
\n",
"
member_count
\n",
"
name_string
\n",
"
ranking
\n",
"
state
\n",
"
zip
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Vancouver
\n",
"
ca
\n",
"
857064
\n",
"
49.279999
\n",
"
Canada
\n",
"
-123.040001
\n",
"
39959
\n",
"
Vancouver, British Columbia, Canada
\n",
"
0
\n",
"
BC
\n",
"
V5K 0A1
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" city country id lat localized_country_name lon \\\n",
"0 Vancouver ca 857064 49.279999 Canada -123.040001 \n",
"\n",
" member_count name_string ranking state zip \n",
"0 39959 Vancouver, British Columbia, Canada 0 BC V5K 0A1 "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities_resp = client.GetCities(country='ca', query='Vancouver')\n",
"cities_meta_df, cities_df = parse_response(cities_resp)\n",
"cities_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we have found the correct **country code (`ca`)** and confirmed we are getting the one city that interests us."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get Tech Meetup Groups\n",
"\n",
"We now have the necessary information to use the `GetGroups` method to get Tech Meetup groups based in Vancouver, BC:\n",
"\n",
"- **category_id**: 34\n",
"- **city**: Vancouver\n",
"- **country**: ca\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"26/30 (10 seconds remaining)\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
0
\n",
"
\n",
" \n",
" \n",
"
\n",
"
next
\n",
"
https://api.meetup.com/2/groups?country=ca&off...
\n",
"
\n",
"
\n",
"
method
\n",
"
Groups
\n",
"
\n",
"
\n",
"
total_count
\n",
"
434
\n",
"
\n",
"
\n",
"
link
\n",
"
https://api.meetup.com/2/groups
\n",
"
\n",
"
\n",
"
count
\n",
"
200
\n",
"
\n",
"
\n",
"
description
\n",
"
None
\n",
"
\n",
"
\n",
"
lon
\n",
"
-123.04
\n",
"
\n",
"
\n",
"
title
\n",
"
Meetup Groups v2
\n",
"
\n",
"
\n",
"
url
\n",
"
https://api.meetup.com/2/groups?country=ca&off...
\n",
"
\n",
"
\n",
"
id
\n",
"
\n",
"
\n",
"
\n",
"
updated
\n",
"
1551248722000
\n",
"
\n",
"
\n",
"
lat
\n",
"
49.28
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0\n",
"next https://api.meetup.com/2/groups?country=ca&off...\n",
"method Groups\n",
"total_count 434\n",
"link https://api.meetup.com/2/groups\n",
"count 200\n",
"description None\n",
"lon -123.04\n",
"title Meetup Groups v2\n",
"url https://api.meetup.com/2/groups?country=ca&off...\n",
"id \n",
"updated 1551248722000\n",
"lat 49.28"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# searching for Vancouver, Canada tech groups\n",
"groups_resp = client.GetGroups(category_id=34, city='Vancouver', country='ca')\n",
"groups_meta_df, groups_df = parse_response(groups_resp)\n",
"groups_meta_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observations**\n",
"\n",
"From the response's metadata, we observe that there are **433** Tech Meetup groups in Vancouver, BC. Per the earlier explanation about how the Meetup API sends back **pages** of results, we only received a single page of **200** group records.\n",
"\n",
"Let's build a function to collect all of the group records spanning multiple pages and return them as a single Dataframe. This function was adapted from my friend Andy's [notebook]:\n",
"\n",
"\n",
"[notebook]: https://github.com/redpanda-ai/datascience_challenges/blob/master/01_explore_meetup_api/explore_sf_meetups.ipynb"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"def get_all_groups_as_df(category_id=34, city='Vancouver', country='ca', radius=25):\n",
" '''returns all groups as a dataframe'''\n",
" \n",
" groups_df_list = []\n",
" page_number = 0\n",
" next_page = None\n",
" \n",
" while next_page != '':\n",
" groups_resp = client.GetGroups(\n",
" category_id=category_id,\n",
" city=city, \n",
" country=country,\n",
" offset=page_number,\n",
" radius=radius\n",
" )\n",
" next_page = groups_resp.meta['next']\n",
" _, group_df = parse_response(groups_resp)\n",
" \n",
" groups_df_list.append(group_df)\n",
" page_number += 1\n",
" \n",
" return pd.concat(groups_df_list, ignore_index=True)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"25/30 (8 seconds remaining)\n",
"24/30 (7 seconds remaining)\n",
"23/30 (6 seconds remaining)\n"
]
},
{
"data": {
"text/plain": [
"(434, 22)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_df = get_all_groups_as_df()\n",
"groups_df.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We successfully got all 433 Tech Meetup groups by checking the size of our dataframe against the `total_count` from the response's metadata.\n",
"\n",
"Time to explore :)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Side Bar\n",
"\n",
"As a side bar, let's look at an example of a group in its raw JSON format. The `pprint.pprint()` function is a great way of showing JSON data / Python Dictionaries:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'category': {'id': 34, 'name': 'tech', 'shortname': 'tech'},\n",
" 'city': 'Vancouver',\n",
" 'country': 'CA',\n",
" 'created': 1034097731000,\n",
" 'description': '
The Vancouver Blogger Meetup Group is a platform '\n",
" 'where blogger and social media professionals and enthusiasts '\n",
" 'interact and network. This platform aims to be a reference '\n",
" 'and provide valuable information to graduates, professionals, '\n",
" 'small and medium sized businesses.
We are '\n",
" 'currently working on revitalizing this MeetUp Group and will '\n",
" 'soon bring up some topics for Meetups. Please, join our group '\n",
" 'and feel free to contact us at any time. Stay '\n",
" 'tuned!
<p>Hello Everyone,</p>\\n<p>My name is Nathan a...
\n",
"
NaN
\n",
"
71383
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/My-Internet-Media-Groups/
\n",
"
...
\n",
"
My Internet Media Groups
\n",
"
{'member_id': 104036462, 'name': 'Nathan W.', ...
\n",
"
4.25
\n",
"
BC
\n",
"
Canada/Pacific
\n",
"
[{'urlkey': 'photoshop', 'name': 'Photoshop', ...
\n",
"
My-Internet-Media-Groups
\n",
"
-28800000
\n",
"
public
\n",
"
Future Moguls
\n",
"
\n",
"
\n",
"
2
\n",
"
{'name': 'tech', 'id': 34, 'shortname': 'tech'}
\n",
"
Vancouver
\n",
"
CA
\n",
"
1072723179000
\n",
"
<p>As the largest software development meetup ...
\n",
"
NaN
\n",
"
144695
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/VanDev/
\n",
"
...
\n",
"
VanDev: Vancouver's Software Developers Network
\n",
"
{'member_id': 273611362, 'name': 'Bevan Hunt',...
\n",
"
4.39
\n",
"
BC
\n",
"
Canada/Pacific
\n",
"
[{'urlkey': 'softwaredev', 'name': 'Software D...
\n",
"
VanDev
\n",
"
-28800000
\n",
"
public
\n",
"
Software Developers
\n",
"
\n",
"
\n",
"
3
\n",
"
{'name': 'tech', 'id': 34, 'shortname': 'tech'}
\n",
"
Vancouver
\n",
"
CA
\n",
"
1142734447000
\n",
"
<p>Vancouver Web Design is British Columbia's ...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
229052
\n",
"
open
\n",
"
49.290001
\n",
"
https://www.meetup.com/webdesign-395/
\n",
"
...
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
{'member_id': 87486782, 'name': 'Darrell Hadde...
\n",
"
4.40
\n",
"
BC
\n",
"
Canada/Pacific
\n",
"
[{'urlkey': 'webstandards', 'name': 'Web Stand...
\n",
"
webdesign-395
\n",
"
-28800000
\n",
"
public
\n",
"
Vancouver Web Design Meetup
\n",
"
\n",
"
\n",
"
4
\n",
"
{'name': 'tech', 'id': 34, 'shortname': 'tech'}
\n",
"
Vancouver
\n",
"
CA
\n",
"
1184711936000
\n",
"
<p>Do you develop with Ruby? Make web applicat...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
573925
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/vancouver-ruby/
\n",
"
...
\n",
"
Vancouver Ruby Meetup Group
\n",
"
{'member_id': 10374191, 'name': 'Philippe Creu...
\n",
"
4.59
\n",
"
BC
\n",
"
Canada/Pacific
\n",
"
[{'urlkey': 'ruby', 'name': 'Ruby', 'id': 1040...
\n",
"
vancouver-ruby
\n",
"
-28800000
\n",
"
public
\n",
"
Ruby Developers
\n",
"
\n",
" \n",
"
\n",
"
5 rows × 22 columns
\n",
"
"
],
"text/plain": [
" category city country \\\n",
"0 {'name': 'tech', 'id': 34, 'shortname': 'tech'} Vancouver CA \n",
"1 {'name': 'tech', 'id': 34, 'shortname': 'tech'} Vancouver CA \n",
"2 {'name': 'tech', 'id': 34, 'shortname': 'tech'} Vancouver CA \n",
"3 {'name': 'tech', 'id': 34, 'shortname': 'tech'} Vancouver CA \n",
"4 {'name': 'tech', 'id': 34, 'shortname': 'tech'} Vancouver CA \n",
"\n",
" created description \\\n",
"0 1034097731000
The Vancouver Blogger Meetup Group is... \n",
"1 1036650741000
Hello Everyone,
\\n
My name is Nathan a... \n",
"2 1072723179000
As the largest software development meetup ... \n",
"3 1142734447000
Vancouver Web Design is British Columbia's ... \n",
"4 1184711936000
Do you develop with Ruby? Make web applicat... \n",
"\n",
" group_photo id join_mode \\\n",
"0 {'highres_link': 'https://secure.meetupstatic.... 21636 approval \n",
"1 NaN 71383 open \n",
"2 NaN 144695 open \n",
"3 {'highres_link': 'https://secure.meetupstatic.... 229052 open \n",
"4 {'highres_link': 'https://secure.meetupstatic.... 573925 open \n",
"\n",
" lat link ... \\\n",
"0 49.279999 https://www.meetup.com/The-Vancouver-Blogger-M... ... \n",
"1 49.279999 https://www.meetup.com/My-Internet-Media-Groups/ ... \n",
"2 49.279999 https://www.meetup.com/VanDev/ ... \n",
"3 49.290001 https://www.meetup.com/webdesign-395/ ... \n",
"4 49.279999 https://www.meetup.com/vancouver-ruby/ ... \n",
"\n",
" name \\\n",
"0 The Vancouver Blogger Meetup Group \n",
"1 My Internet Media Groups \n",
"2 VanDev: Vancouver's Software Developers Network \n",
"3 The Vancouver Web Design Meetup Group \n",
"4 Vancouver Ruby Meetup Group \n",
"\n",
" organizer rating state \\\n",
"0 {'member_id': 66805072, 'name': 'Fabiano Macie... 4.32 BC \n",
"1 {'member_id': 104036462, 'name': 'Nathan W.', ... 4.25 BC \n",
"2 {'member_id': 273611362, 'name': 'Bevan Hunt',... 4.39 BC \n",
"3 {'member_id': 87486782, 'name': 'Darrell Hadde... 4.40 BC \n",
"4 {'member_id': 10374191, 'name': 'Philippe Creu... 4.59 BC \n",
"\n",
" timezone topics \\\n",
"0 Canada/Pacific [{'urlkey': 'smallbiz', 'name': 'Small Busines... \n",
"1 Canada/Pacific [{'urlkey': 'photoshop', 'name': 'Photoshop', ... \n",
"2 Canada/Pacific [{'urlkey': 'softwaredev', 'name': 'Software D... \n",
"3 Canada/Pacific [{'urlkey': 'webstandards', 'name': 'Web Stand... \n",
"4 Canada/Pacific [{'urlkey': 'ruby', 'name': 'Ruby', 'id': 1040... \n",
"\n",
" urlname utc_offset visibility \\\n",
"0 The-Vancouver-Blogger-Meetup-Group -28800000 public \n",
"1 My-Internet-Media-Groups -28800000 public \n",
"2 VanDev -28800000 public \n",
"3 webdesign-395 -28800000 public \n",
"4 vancouver-ruby -28800000 public \n",
"\n",
" who \n",
"0 Friends \n",
"1 Future Moguls \n",
"2 Software Developers \n",
"3 Vancouver Web Design Meetup \n",
"4 Ruby Developers \n",
"\n",
"[5 rows x 22 columns]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_df.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"# explore the uniqueness of each column's values\n",
"def display_columns_unique_values(df):\n",
" '''display each columns unique values\n",
" - if only 1, will display it\n",
" - if unable to get unique values, will display data structure type\n",
" '''\n",
" for column in df.columns:\n",
"\n",
" try:\n",
" unique_values = df[column].unique()\n",
" num_unique_values = len(unique_values)\n",
" result = f\"Column {column.upper():>15}: {num_unique_values:}\"\n",
"\n",
" if num_unique_values == 1:\n",
" result += f\"|Unique values: {unique_values}\"\n",
"\n",
" print(result)\n",
"\n",
" # some columns contain dict objects which aren't hashable so they are ignored\n",
" except TypeError as tp:\n",
" print(f\"Column {column.upper()}: Type: {type(df[column][0])}\")\n",
" pass"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Column CATEGORY: Type: \n",
"Column CITY: 11\n",
"Column COUNTRY: 1|Unique values: ['CA']\n",
"Column CREATED: 434\n",
"Column DESCRIPTION: 434\n",
"Column GROUP_PHOTO: Type: \n",
"Column ID: 434\n",
"Column JOIN_MODE: 2\n",
"Column LAT: 22\n",
"Column LINK: 434\n",
"Column LON: 35\n",
"Column MEMBERS: 343\n",
"Column NAME: 434\n",
"Column ORGANIZER: Type: \n",
"Column RATING: 67\n",
"Column STATE: 1|Unique values: ['BC']\n",
"Column TIMEZONE: 2\n",
"Column TOPICS: Type: \n",
"Column URLNAME: 434\n",
"Column UTC_OFFSET: 1|Unique values: [-28800000]\n",
"Column VISIBILITY: 3\n",
"Column WHO: 193\n"
]
}
],
"source": [
"display_columns_unique_values(groups_df)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['Canada/Pacific', 'America/Vancouver'], dtype=object)"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_df['timezone'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'name': 'tech', 'id': 34, 'shortname': 'tech'}"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_df['category'][0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observations**:\n",
"\n",
"Our dataframe has 22 columns. We could drop a few columns.\n",
"\n",
"A few columns contain only 1 unique value: `country` ('CA'), `state` ('BC') and `utc_offset` (representing UTC-8).\n",
"\n",
"An additional column (`timezone`) only has 2 values (`['Canada/Pacific', 'America/Vancouver']`) which essentially represent the same information. \n",
"\n",
"The `category` column which contains dictionaries is also unnecessary as we are only looking at Tech meetups.\n",
"\n",
"Let's go ahead and drop these columns."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"columns_to_drop = ['country', 'state', 'utc_offset', 'timezone', 'category']\n",
"groups_df = groups_df.drop(columns=columns_to_drop)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(434, 17)"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_df.shape"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['city', 'created', 'description', 'group_photo', 'id', 'join_mode',\n",
" 'lat', 'link', 'lon', 'members', 'name', 'organizer', 'rating',\n",
" 'topics', 'urlname', 'visibility', 'who'],\n",
" dtype='object')"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_df.columns"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
city
\n",
"
created
\n",
"
description
\n",
"
group_photo
\n",
"
id
\n",
"
join_mode
\n",
"
lat
\n",
"
link
\n",
"
lon
\n",
"
members
\n",
"
name
\n",
"
organizer
\n",
"
rating
\n",
"
topics
\n",
"
urlname
\n",
"
visibility
\n",
"
who
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Vancouver
\n",
"
1034097731000
\n",
"
<p><span>The Vancouver Blogger Meetup Group is...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
21636
\n",
"
approval
\n",
"
49.279999
\n",
"
https://www.meetup.com/The-Vancouver-Blogger-M...
\n",
"
-123.129997
\n",
"
652
\n",
"
The Vancouver Blogger Meetup Group
\n",
"
{'member_id': 66805072, 'name': 'Fabiano Macie...
\n",
"
4.32
\n",
"
[{'urlkey': 'smallbiz', 'name': 'Small Busines...
\n",
"
The-Vancouver-Blogger-Meetup-Group
\n",
"
public
\n",
"
Friends
\n",
"
\n",
"
\n",
"
1
\n",
"
Vancouver
\n",
"
1036650741000
\n",
"
<p>Hello Everyone,</p>\\n<p>My name is Nathan a...
\n",
"
NaN
\n",
"
71383
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/My-Internet-Media-Groups/
\n",
"
-123.120003
\n",
"
1866
\n",
"
My Internet Media Groups
\n",
"
{'member_id': 104036462, 'name': 'Nathan W.', ...
\n",
"
4.25
\n",
"
[{'urlkey': 'photoshop', 'name': 'Photoshop', ...
\n",
"
My-Internet-Media-Groups
\n",
"
public
\n",
"
Future Moguls
\n",
"
\n",
"
\n",
"
2
\n",
"
Vancouver
\n",
"
1072723179000
\n",
"
<p>As the largest software development meetup ...
\n",
"
NaN
\n",
"
144695
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/VanDev/
\n",
"
-123.129997
\n",
"
6949
\n",
"
VanDev: Vancouver's Software Developers Network
\n",
"
{'member_id': 273611362, 'name': 'Bevan Hunt',...
\n",
"
4.39
\n",
"
[{'urlkey': 'softwaredev', 'name': 'Software D...
\n",
"
VanDev
\n",
"
public
\n",
"
Software Developers
\n",
"
\n",
"
\n",
"
3
\n",
"
Vancouver
\n",
"
1142734447000
\n",
"
<p>Vancouver Web Design is British Columbia's ...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
229052
\n",
"
open
\n",
"
49.290001
\n",
"
https://www.meetup.com/webdesign-395/
\n",
"
-123.110001
\n",
"
4996
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
{'member_id': 87486782, 'name': 'Darrell Hadde...
\n",
"
4.40
\n",
"
[{'urlkey': 'webstandards', 'name': 'Web Stand...
\n",
"
webdesign-395
\n",
"
public
\n",
"
Vancouver Web Design Meetup
\n",
"
\n",
"
\n",
"
4
\n",
"
Vancouver
\n",
"
1184711936000
\n",
"
<p>Do you develop with Ruby? Make web applicat...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
573925
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/vancouver-ruby/
\n",
"
-123.110001
\n",
"
2624
\n",
"
Vancouver Ruby Meetup Group
\n",
"
{'member_id': 10374191, 'name': 'Philippe Creu...
\n",
"
4.59
\n",
"
[{'urlkey': 'ruby', 'name': 'Ruby', 'id': 1040...
\n",
"
vancouver-ruby
\n",
"
public
\n",
"
Ruby Developers
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" city created \\\n",
"0 Vancouver 1034097731000 \n",
"1 Vancouver 1036650741000 \n",
"2 Vancouver 1072723179000 \n",
"3 Vancouver 1142734447000 \n",
"4 Vancouver 1184711936000 \n",
"\n",
" description \\\n",
"0
The Vancouver Blogger Meetup Group is... \n",
"1
Hello Everyone,
\\n
My name is Nathan a... \n",
"2
As the largest software development meetup ... \n",
"3
Vancouver Web Design is British Columbia's ... \n",
"4
Do you develop with Ruby? Make web applicat... \n",
"\n",
" group_photo id join_mode \\\n",
"0 {'highres_link': 'https://secure.meetupstatic.... 21636 approval \n",
"1 NaN 71383 open \n",
"2 NaN 144695 open \n",
"3 {'highres_link': 'https://secure.meetupstatic.... 229052 open \n",
"4 {'highres_link': 'https://secure.meetupstatic.... 573925 open \n",
"\n",
" lat link lon \\\n",
"0 49.279999 https://www.meetup.com/The-Vancouver-Blogger-M... -123.129997 \n",
"1 49.279999 https://www.meetup.com/My-Internet-Media-Groups/ -123.120003 \n",
"2 49.279999 https://www.meetup.com/VanDev/ -123.129997 \n",
"3 49.290001 https://www.meetup.com/webdesign-395/ -123.110001 \n",
"4 49.279999 https://www.meetup.com/vancouver-ruby/ -123.110001 \n",
"\n",
" members name \\\n",
"0 652 The Vancouver Blogger Meetup Group \n",
"1 1866 My Internet Media Groups \n",
"2 6949 VanDev: Vancouver's Software Developers Network \n",
"3 4996 The Vancouver Web Design Meetup Group \n",
"4 2624 Vancouver Ruby Meetup Group \n",
"\n",
" organizer rating \\\n",
"0 {'member_id': 66805072, 'name': 'Fabiano Macie... 4.32 \n",
"1 {'member_id': 104036462, 'name': 'Nathan W.', ... 4.25 \n",
"2 {'member_id': 273611362, 'name': 'Bevan Hunt',... 4.39 \n",
"3 {'member_id': 87486782, 'name': 'Darrell Hadde... 4.40 \n",
"4 {'member_id': 10374191, 'name': 'Philippe Creu... 4.59 \n",
"\n",
" topics \\\n",
"0 [{'urlkey': 'smallbiz', 'name': 'Small Busines... \n",
"1 [{'urlkey': 'photoshop', 'name': 'Photoshop', ... \n",
"2 [{'urlkey': 'softwaredev', 'name': 'Software D... \n",
"3 [{'urlkey': 'webstandards', 'name': 'Web Stand... \n",
"4 [{'urlkey': 'ruby', 'name': 'Ruby', 'id': 1040... \n",
"\n",
" urlname visibility who \n",
"0 The-Vancouver-Blogger-Meetup-Group public Friends \n",
"1 My-Internet-Media-Groups public Future Moguls \n",
"2 VanDev public Software Developers \n",
"3 webdesign-395 public Vancouver Web Design Meetup \n",
"4 vancouver-ruby public Ruby Developers "
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_df.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Column CITY: 11\n",
"Column CREATED: 434\n",
"Column DESCRIPTION: 434\n",
"Column GROUP_PHOTO: Type: \n",
"Column ID: 434\n",
"Column JOIN_MODE: 2\n",
"Column LAT: 22\n",
"Column LINK: 434\n",
"Column LON: 35\n",
"Column MEMBERS: 343\n",
"Column NAME: 434\n",
"Column ORGANIZER: Type: \n",
"Column RATING: 67\n",
"Column TOPICS: Type: \n",
"Column URLNAME: 434\n",
"Column VISIBILITY: 3\n",
"Column WHO: 193\n"
]
}
],
"source": [
"display_columns_unique_values(groups_df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observations**:\n",
"\n",
"Now that we've done a little bit of clean up, let's look at the 17 remaining columns.\n",
"\n",
"- `city`: It is interesting that there are 11 unique cities. We should look into this.\n",
"- Several columns match the size of our data so these columns contain values unique to each group\n",
" - `created`\n",
" - `description`\n",
" - `id`\n",
" - `link`\n",
" - `name`\n",
" - `urlname`\n",
"- 3 columns contain either lists or dictionaries. We'd have to do some more parsing if we are to explore these columns.\n",
" - `group_photo`\n",
" - `organier`\n",
" - `topics`\n",
"\n",
"- `lat` and `lon`: Short names for **latitude** and **longitude**. We could plot these on a map to see where groups tend to be based.\n",
"- `join_mode`: We could look into the different join modes and how many groups use one versus the other\n",
"- `members` & `ratings`: We could look into the distribution of members and ratings across the different groups\n",
" - Do more highly rated meetup groups tend to have more members?\n",
"- `visibility`: We could see how visible groups tend to be\n",
"- `who`: We could see how many Tech Groups have the same or similar target group\n",
"\n",
"Looking at a portion of our dataframe, the uniqueness, data ranges and tendencies of each column, and the raw JSON format of one group, helps us better understand our data and its structure. This leads us to better questions and areas of exploration. These observations and questions lead to additional project extension ideas."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 11 Cities in 1 City?\n",
"\n",
"We observed 11 unique values in the `city` column. I had expected only 1 city as we had specified '_Vancouver_' in our `GetGroups` method earlier.\n",
"\n",
"Let's explore these:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['Vancouver', 'Langley', 'Surrey', 'North Vancouver', 'Burnaby',\n",
" 'Port Moody', 'New Westminster', 'Richmond', 'West Vancouver',\n",
" 'Port Coquitlam', 'Coquitlam'], dtype=object)"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_df['city'].unique()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So meetups which are not strictly located in Vancouver are also returned. Looking more closely at the _city_ parameter for the `GetGroups` method:\n",
"\n",
"- **city** – A valid country code, city and for the US, State. limits the returned groups to those within **radius miles**\n",
"- **radius** – Radius, in miles for geographic requests, default 25 – maximum 100\n",
"\n",
"Aha! I forgot that the method returns Meetup groups within a **radius** of 25 miles of the specified location. So the 433 Tech Meetup groups we got are actually based within 25 miles of Vancouver, BC and spread across 11 cities.\n",
"\n",
"Let's explore how many Tech meetups are based in each city:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
<p><b>What is Cowork & Coffee?</b></p>\\n<p...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
11908342
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/codecoffeeyvr/
\n",
"
-123.139999
\n",
"
6299
\n",
"
Code & Coffee (Vancouver)
\n",
"
{'member_id': 8906905, 'name': 'Jenn Cooper', ...
\n",
"
4.65
\n",
"
[{'urlkey': 'opensource', 'name': 'Open Source...
\n",
"
codecoffeeyvr
\n",
"
public
\n",
"
Developers
\n",
"
\n",
"
\n",
"
137
\n",
"
Vancouver
\n",
"
1422291923000
\n",
"
<p>Startup Founder 101 brings together aspirin...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
18381330
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/Vancouver-Startup-Found...
\n",
"
-123.040001
\n",
"
5772
\n",
"
Vancouver Startup Founder 101
\n",
"
{'member_id': 11314237, 'name': 'Jonathan Gree...
\n",
"
4.58
\n",
"
[{'urlkey': 'webdesign', 'name': 'Web Design',...
\n",
"
Vancouver-Startup-Founder-101
\n",
"
public
\n",
"
Aspiring Founders
\n",
"
\n",
"
\n",
"
16
\n",
"
Vancouver
\n",
"
1263596978000
\n",
"
<p>Meeting the right people is crucial. We loo...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
1583286
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/Vancouver-Tech-Co-Found...
\n",
"
-123.110001
\n",
"
5120
\n",
"
Vancouver Pixel Crafters
\n",
"
{'member_id': 11767095, 'name': 'Hussein Halla...
\n",
"
4.62
\n",
"
[{'urlkey': 'softwaredev', 'name': 'Software D...
\n",
"
Vancouver-Tech-Co-Founders
\n",
"
public
\n",
"
Entrepreneurs
\n",
"
\n",
"
\n",
"
3
\n",
"
Vancouver
\n",
"
1142734447000
\n",
"
<p>Vancouver Web Design is British Columbia's ...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
229052
\n",
"
open
\n",
"
49.290001
\n",
"
https://www.meetup.com/webdesign-395/
\n",
"
-123.110001
\n",
"
4996
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
{'member_id': 87486782, 'name': 'Darrell Hadde...
\n",
"
4.40
\n",
"
[{'urlkey': 'webstandards', 'name': 'Web Stand...
\n",
"
webdesign-395
\n",
"
public
\n",
"
Vancouver Web Design Meetup
\n",
"
\n",
"
\n",
"
23
\n",
"
Vancouver
\n",
"
1273291070000
\n",
"
<p>Vancouver is home to many game developers a...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
1642334
\n",
"
open
\n",
"
49.270000
\n",
"
https://www.meetup.com/Vancouver-Indie-Game-De...
\n",
"
-123.120003
\n",
"
4829
\n",
"
Full Indie
\n",
"
{'member_id': 2874080, 'name': 'Andrew Hamilto...
\n",
"
4.61
\n",
"
[{'urlkey': 'gamedev', 'name': 'Game Developme...
\n",
"
Vancouver-Indie-Game-Developers
\n",
"
public
\n",
"
Indies
\n",
"
\n",
"
\n",
"
192
\n",
"
Vancouver
\n",
"
1462151582000
\n",
"
<p>We invite startup leaders and experts to sh...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
19905099
\n",
"
open
\n",
"
49.259998
\n",
"
https://www.meetup.com/YVR-Startups/
\n",
"
-123.139999
\n",
"
4720
\n",
"
YVR Startups
\n",
"
{'member_id': 41331852, 'name': 'Ed', 'photo':...
\n",
"
4.67
\n",
"
[{'urlkey': 'webdesign', 'name': 'Web Design',...
\n",
"
YVR-Startups
\n",
"
public
\n",
"
Entrepreneurs
\n",
"
\n",
"
\n",
"
36
\n",
"
Vancouver
\n",
"
1300139469000
\n",
"
<p>This group is for anyone interested in uniq...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
1798770
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/Vancouver-Data-Visualiz...
\n",
"
-123.110001
\n",
"
3892
\n",
"
Vancouver Data Visualization
\n",
"
{'member_id': 13904544, 'name': 'Wayne Carriga...
\n",
"
4.52
\n",
"
[{'urlkey': 'opensource', 'name': 'Open Source...
\n",
"
Vancouver-Data-Visualization
\n",
"
public
\n",
"
Vizers
\n",
"
\n",
"
\n",
"
52
\n",
"
Vancouver
\n",
"
1328480160000
\n",
"
<p>Vancouver's Bitcoin meetup is a space for p...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
3238812
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/bitcoinvan/
\n",
"
-123.099998
\n",
"
3831
\n",
"
Bitcoin Vancouver
\n",
"
{'member_id': 63655392, 'name': 'freddie', 'ph...
\n",
"
4.55
\n",
"
[{'urlkey': 'opensource', 'name': 'Open Source...
\n",
"
bitcoinvan
\n",
"
public
\n",
"
Members
\n",
"
\n",
"
\n",
"
56
\n",
"
Vancouver
\n",
"
1338076931000
\n",
"
<p><span><span>As professionals and/or hobbyis...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
3946322
\n",
"
open
\n",
"
49.259998
\n",
"
https://www.meetup.com/PolyglotVancouver/
\n",
"
-123.120003
\n",
"
3793
\n",
"
PolyglotVancouver
\n",
"
{'member_id': 10575808, 'name': 'Tavis Rudd', ...
\n",
"
4.62
\n",
"
[{'urlkey': 'opensource', 'name': 'Open Source...
\n",
"
PolyglotVancouver
\n",
"
public
\n",
"
Polyglots
\n",
"
\n",
"
\n",
"
26
\n",
"
Vancouver
\n",
"
1292618090000
\n",
"
<p>Agile software development means that you p...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
1751788
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/Agile-Vancouver/
\n",
"
-123.120003
\n",
"
3789
\n",
"
Agile Vancouver
\n",
"
{'member_id': 6885511, 'name': 'Susan Patch', ...
\n",
"
4.43
\n",
"
[{'urlkey': 'softwaredev', 'name': 'Software D...
\n",
"
Agile-Vancouver
\n",
"
public
\n",
"
Agilists
\n",
"
\n",
"
\n",
"
144
\n",
"
Vancouver
\n",
"
1428133116000
\n",
"
<p>Welcome to the Data Science LEARNING Group!...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
18532714
\n",
"
open
\n",
"
49.290001
\n",
"
https://www.meetup.com/LearnDataScience/
\n",
"
-123.120003
\n",
"
3678
\n",
"
Learn Data Science
\n",
"
{'member_id': 53206922, 'name': 'Charles Iliya...
\n",
"
4.84
\n",
"
[{'urlkey': 'ai', 'name': 'Artificial Intellig...
\n",
"
LearnDataScience
\n",
"
public
\n",
"
Data Scientists
\n",
"
\n",
"
\n",
"
7
\n",
"
Vancouver
\n",
"
1203115506000
\n",
"
<p>NetSquared gathers together nonprofits and ...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
1013148
\n",
"
open
\n",
"
49.270000
\n",
"
https://www.meetup.com/net2van/
\n",
"
-123.099998
\n",
"
3409
\n",
"
NetSquared Vancouver: Tech4Good and Nonprofits
\n",
"
{'member_id': 37748782, 'name': 'NetSquared', ...
\n",
"
4.38
\n",
"
[{'urlkey': 'databasepro', 'name': 'Database P...
\n",
"
net2van
\n",
"
public
\n",
"
Members
\n",
"
\n",
"
\n",
"
14
\n",
"
Vancouver
\n",
"
1253472613000
\n",
"
<p>VanJS is a meetup for web developers downto...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
1526926
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/vancouver-javascript-de...
\n",
"
-123.110001
\n",
"
3327
\n",
"
VanJS: Vancouver JavaScript Developers
\n",
"
{'member_id': 9749039, 'name': 'Allen Pike', '...
\n",
"
4.63
\n",
"
[{'urlkey': 'webstandards', 'name': 'Web Stand...
\n",
"
vancouver-javascript-developers
\n",
"
public
\n",
"
JavaScript Developers
\n",
"
\n",
"
\n",
"
142
\n",
"
Vancouver
\n",
"
1427043156000
\n",
"
<p>We host complimentary technology workshops ...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
18515170
\n",
"
open
\n",
"
49.259998
\n",
"
https://www.meetup.com/BrainStation-Vancouver/
\n",
"
-123.099998
\n",
"
3291
\n",
"
BrainStation Vancouver
\n",
"
{'member_id': 185462544, 'name': 'BrainStation...
\n",
"
4.82
\n",
"
[{'urlkey': 'css', 'name': 'CSS', 'id': 1973},...
\n",
"
BrainStation-Vancouver
\n",
"
public
\n",
"
Creators
\n",
"
\n",
"
\n",
"
85
\n",
"
Vancouver
\n",
"
1375470268000
\n",
"
<p>Style & Class is a meetup for those who...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
9636222
\n",
"
open
\n",
"
49.259998
\n",
"
https://www.meetup.com/styleandclass/
\n",
"
-123.139999
\n",
"
2895
\n",
"
Style & Class
\n",
"
{'member_id': 13411316, 'name': 'Steve Fisher'...
\n",
"
4.74
\n",
"
[{'urlkey': 'webstandards', 'name': 'Web Stand...
\n",
"
styleandclass
\n",
"
public
\n",
"
Those that create the web
\n",
"
\n",
"
\n",
"
110
\n",
"
Vancouver
\n",
"
1398141265000
\n",
"
<p>This is an IBM sponsored Big Data meetup gr...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
14038802
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/Big-Data-Developers-in-...
\n",
"
-123.120003
\n",
"
2872
\n",
"
Big Data Developers in Vancouver
\n",
"
{'member_id': 93599762, 'name': 'Nancy Berlin'...
\n",
"
4.64
\n",
"
[{'urlkey': 'opensource', 'name': 'Open Source...
\n",
"
Big-Data-Developers-in-Vancouver
\n",
"
public
\n",
"
Big Data Enthusiasts
\n",
"
\n",
"
\n",
"
11
\n",
"
Vancouver
\n",
"
1240125181000
\n",
"
Meet other Vancouver users of WordPress, the W...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
1438007
\n",
"
open
\n",
"
49.270000
\n",
"
https://www.meetup.com/Vancouver-WordPress-Mee...
\n",
"
-123.150002
\n",
"
2705
\n",
"
The Vancouver WordPress Meetup Group
\n",
"
{'member_id': 72560962, 'name': 'WordPress', '...
\n",
"
4.49
\n",
"
[{'urlkey': 'php', 'name': 'PHP', 'id': 455}, ...
\n",
"
Vancouver-WordPress-Meetup-Group
\n",
"
public
\n",
"
WordPress Enthusiasts
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" city created \\\n",
"172 Vancouver 1448718394000 \n",
"2 Vancouver 1072723179000 \n",
"60 Vancouver 1347316761000 \n",
"98 Vancouver 1389135143000 \n",
"137 Vancouver 1422291923000 \n",
"16 Vancouver 1263596978000 \n",
"3 Vancouver 1142734447000 \n",
"23 Vancouver 1273291070000 \n",
"192 Vancouver 1462151582000 \n",
"36 Vancouver 1300139469000 \n",
"52 Vancouver 1328480160000 \n",
"56 Vancouver 1338076931000 \n",
"26 Vancouver 1292618090000 \n",
"144 Vancouver 1428133116000 \n",
"7 Vancouver 1203115506000 \n",
"14 Vancouver 1253472613000 \n",
"142 Vancouver 1427043156000 \n",
"85 Vancouver 1375470268000 \n",
"110 Vancouver 1398141265000 \n",
"11 Vancouver 1240125181000 \n",
"\n",
" description \\\n",
"172
TechVancouver brings together Vancouver's t... \n",
"2
As the largest software development meetup ... \n",
"60
WHY ATTEND TECH SOCIALS? Simple. To ... \n",
"98
What is Cowork & Coffee?
\\nStartup Founder 101 brings together aspirin... \n",
"16
Meeting the right people is crucial. We loo... \n",
"3
Vancouver Web Design is British Columbia's ... \n",
"23
Vancouver is home to many game developers a... \n",
"192
We invite startup leaders and experts to sh... \n",
"36
This group is for anyone interested in uniq... \n",
"52
Vancouver's Bitcoin meetup is a space for p... \n",
"56
As professionals and/or hobbyis... \n",
"26
Agile software development means that you p... \n",
"144
Welcome to the Data Science LEARNING Group!... \n",
"7
NetSquared gathers together nonprofits and ... \n",
"14
VanJS is a meetup for web developers downto... \n",
"142
We host complimentary technology workshops ... \n",
"85
Style & Class is a meetup for those who... \n",
"110
This is an IBM sponsored Big Data meetup gr... \n",
"11 Meet other Vancouver users of WordPress, the W... \n",
"\n",
" group_photo id join_mode \\\n",
"172 {'highres_link': 'https://secure.meetupstatic.... 19162038 open \n",
"2 NaN 144695 open \n",
"60 {'highres_link': 'https://secure.meetupstatic.... 4869742 open \n",
"98 {'highres_link': 'https://secure.meetupstatic.... 11908342 open \n",
"137 {'highres_link': 'https://secure.meetupstatic.... 18381330 open \n",
"16 {'highres_link': 'https://secure.meetupstatic.... 1583286 open \n",
"3 {'highres_link': 'https://secure.meetupstatic.... 229052 open \n",
"23 {'highres_link': 'https://secure.meetupstatic.... 1642334 open \n",
"192 {'highres_link': 'https://secure.meetupstatic.... 19905099 open \n",
"36 {'highres_link': 'https://secure.meetupstatic.... 1798770 open \n",
"52 {'highres_link': 'https://secure.meetupstatic.... 3238812 open \n",
"56 {'highres_link': 'https://secure.meetupstatic.... 3946322 open \n",
"26 {'highres_link': 'https://secure.meetupstatic.... 1751788 open \n",
"144 {'highres_link': 'https://secure.meetupstatic.... 18532714 open \n",
"7 {'highres_link': 'https://secure.meetupstatic.... 1013148 open \n",
"14 {'highres_link': 'https://secure.meetupstatic.... 1526926 open \n",
"142 {'highres_link': 'https://secure.meetupstatic.... 18515170 open \n",
"85 {'highres_link': 'https://secure.meetupstatic.... 9636222 open \n",
"110 {'highres_link': 'https://secure.meetupstatic.... 14038802 open \n",
"11 {'highres_link': 'https://secure.meetupstatic.... 1438007 open \n",
"\n",
" lat link lon \\\n",
"172 49.279999 https://www.meetup.com/TechVancouverOrg/ -123.040001 \n",
"2 49.279999 https://www.meetup.com/VanDev/ -123.129997 \n",
"60 49.279999 https://www.meetup.com/HackerNestVAN/ -123.120003 \n",
"98 49.279999 https://www.meetup.com/codecoffeeyvr/ -123.139999 \n",
"137 49.279999 https://www.meetup.com/Vancouver-Startup-Found... -123.040001 \n",
"16 49.279999 https://www.meetup.com/Vancouver-Tech-Co-Found... -123.110001 \n",
"3 49.290001 https://www.meetup.com/webdesign-395/ -123.110001 \n",
"23 49.270000 https://www.meetup.com/Vancouver-Indie-Game-De... -123.120003 \n",
"192 49.259998 https://www.meetup.com/YVR-Startups/ -123.139999 \n",
"36 49.279999 https://www.meetup.com/Vancouver-Data-Visualiz... -123.110001 \n",
"52 49.279999 https://www.meetup.com/bitcoinvan/ -123.099998 \n",
"56 49.259998 https://www.meetup.com/PolyglotVancouver/ -123.120003 \n",
"26 49.279999 https://www.meetup.com/Agile-Vancouver/ -123.120003 \n",
"144 49.290001 https://www.meetup.com/LearnDataScience/ -123.120003 \n",
"7 49.270000 https://www.meetup.com/net2van/ -123.099998 \n",
"14 49.279999 https://www.meetup.com/vancouver-javascript-de... -123.110001 \n",
"142 49.259998 https://www.meetup.com/BrainStation-Vancouver/ -123.099998 \n",
"85 49.259998 https://www.meetup.com/styleandclass/ -123.139999 \n",
"110 49.279999 https://www.meetup.com/Big-Data-Developers-in-... -123.120003 \n",
"11 49.270000 https://www.meetup.com/Vancouver-WordPress-Mee... -123.150002 \n",
"\n",
" members name \\\n",
"172 8797 TechVancouver \n",
"2 6949 VanDev: Vancouver's Software Developers Network \n",
"60 6715 HackerNest Vancouver Tech Socials \n",
"98 6299 Code & Coffee (Vancouver) \n",
"137 5772 Vancouver Startup Founder 101 \n",
"16 5120 Vancouver Pixel Crafters \n",
"3 4996 The Vancouver Web Design Meetup Group \n",
"23 4829 Full Indie \n",
"192 4720 YVR Startups \n",
"36 3892 Vancouver Data Visualization \n",
"52 3831 Bitcoin Vancouver \n",
"56 3793 PolyglotVancouver \n",
"26 3789 Agile Vancouver \n",
"144 3678 Learn Data Science \n",
"7 3409 NetSquared Vancouver: Tech4Good and Nonprofits \n",
"14 3327 VanJS: Vancouver JavaScript Developers \n",
"142 3291 BrainStation Vancouver \n",
"85 2895 Style & Class \n",
"110 2872 Big Data Developers in Vancouver \n",
"11 2705 The Vancouver WordPress Meetup Group \n",
"\n",
" organizer rating \\\n",
"172 {'member_id': 14219538, 'name': 'Alexander Nor... 4.78 \n",
"2 {'member_id': 273611362, 'name': 'Bevan Hunt',... 4.39 \n",
"60 {'member_id': 77652922, 'name': 'HackerNest', ... 4.75 \n",
"98 {'member_id': 8906905, 'name': 'Jenn Cooper', ... 4.65 \n",
"137 {'member_id': 11314237, 'name': 'Jonathan Gree... 4.58 \n",
"16 {'member_id': 11767095, 'name': 'Hussein Halla... 4.62 \n",
"3 {'member_id': 87486782, 'name': 'Darrell Hadde... 4.40 \n",
"23 {'member_id': 2874080, 'name': 'Andrew Hamilto... 4.61 \n",
"192 {'member_id': 41331852, 'name': 'Ed', 'photo':... 4.67 \n",
"36 {'member_id': 13904544, 'name': 'Wayne Carriga... 4.52 \n",
"52 {'member_id': 63655392, 'name': 'freddie', 'ph... 4.55 \n",
"56 {'member_id': 10575808, 'name': 'Tavis Rudd', ... 4.62 \n",
"26 {'member_id': 6885511, 'name': 'Susan Patch', ... 4.43 \n",
"144 {'member_id': 53206922, 'name': 'Charles Iliya... 4.84 \n",
"7 {'member_id': 37748782, 'name': 'NetSquared', ... 4.38 \n",
"14 {'member_id': 9749039, 'name': 'Allen Pike', '... 4.63 \n",
"142 {'member_id': 185462544, 'name': 'BrainStation... 4.82 \n",
"85 {'member_id': 13411316, 'name': 'Steve Fisher'... 4.74 \n",
"110 {'member_id': 93599762, 'name': 'Nancy Berlin'... 4.64 \n",
"11 {'member_id': 72560962, 'name': 'WordPress', '... 4.49 \n",
"\n",
" topics \\\n",
"172 [{'urlkey': 'softwaredev', 'name': 'Software D... \n",
"2 [{'urlkey': 'softwaredev', 'name': 'Software D... \n",
"60 [{'urlkey': 'softwaredev', 'name': 'Software D... \n",
"98 [{'urlkey': 'opensource', 'name': 'Open Source... \n",
"137 [{'urlkey': 'webdesign', 'name': 'Web Design',... \n",
"16 [{'urlkey': 'softwaredev', 'name': 'Software D... \n",
"3 [{'urlkey': 'webstandards', 'name': 'Web Stand... \n",
"23 [{'urlkey': 'gamedev', 'name': 'Game Developme... \n",
"192 [{'urlkey': 'webdesign', 'name': 'Web Design',... \n",
"36 [{'urlkey': 'opensource', 'name': 'Open Source... \n",
"52 [{'urlkey': 'opensource', 'name': 'Open Source... \n",
"56 [{'urlkey': 'opensource', 'name': 'Open Source... \n",
"26 [{'urlkey': 'softwaredev', 'name': 'Software D... \n",
"144 [{'urlkey': 'ai', 'name': 'Artificial Intellig... \n",
"7 [{'urlkey': 'databasepro', 'name': 'Database P... \n",
"14 [{'urlkey': 'webstandards', 'name': 'Web Stand... \n",
"142 [{'urlkey': 'css', 'name': 'CSS', 'id': 1973},... \n",
"85 [{'urlkey': 'webstandards', 'name': 'Web Stand... \n",
"110 [{'urlkey': 'opensource', 'name': 'Open Source... \n",
"11 [{'urlkey': 'php', 'name': 'PHP', 'id': 455}, ... \n",
"\n",
" urlname visibility who \n",
"172 TechVancouverOrg public Technologists \n",
"2 VanDev public Software Developers \n",
"60 HackerNestVAN public HackerNesters \n",
"98 codecoffeeyvr public Developers \n",
"137 Vancouver-Startup-Founder-101 public Aspiring Founders \n",
"16 Vancouver-Tech-Co-Founders public Entrepreneurs \n",
"3 webdesign-395 public Vancouver Web Design Meetup \n",
"23 Vancouver-Indie-Game-Developers public Indies \n",
"192 YVR-Startups public Entrepreneurs \n",
"36 Vancouver-Data-Visualization public Vizers \n",
"52 bitcoinvan public Members \n",
"56 PolyglotVancouver public Polyglots \n",
"26 Agile-Vancouver public Agilists \n",
"144 LearnDataScience public Data Scientists \n",
"7 net2van public Members \n",
"14 vancouver-javascript-developers public JavaScript Developers \n",
"142 BrainStation-Vancouver public Creators \n",
"85 styleandclass public Those that create the web \n",
"110 Big-Data-Developers-in-Vancouver public Big Data Enthusiasts \n",
"11 Vancouver-WordPress-Meetup-Group public WordPress Enthusiasts "
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_df.sort_values('members', ascending=False).head(20)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The top 20 largest Tech Meetups by number of members are all based in Vancouver. So we can drop the non-Vancouver based Tech Meetups without it affecting our original question of exploring group's number of members and activities."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"vancouver_tech_groups = groups_df[groups_df['city'] == 'Vancouver']"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(394, 17)"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vancouver_tech_groups.shape"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
city
\n",
"
created
\n",
"
description
\n",
"
group_photo
\n",
"
id
\n",
"
join_mode
\n",
"
lat
\n",
"
link
\n",
"
lon
\n",
"
members
\n",
"
name
\n",
"
organizer
\n",
"
rating
\n",
"
topics
\n",
"
urlname
\n",
"
visibility
\n",
"
who
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Vancouver
\n",
"
1034097731000
\n",
"
<p><span>The Vancouver Blogger Meetup Group is...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
21636
\n",
"
approval
\n",
"
49.279999
\n",
"
https://www.meetup.com/The-Vancouver-Blogger-M...
\n",
"
-123.129997
\n",
"
652
\n",
"
The Vancouver Blogger Meetup Group
\n",
"
{'member_id': 66805072, 'name': 'Fabiano Macie...
\n",
"
4.32
\n",
"
[{'urlkey': 'smallbiz', 'name': 'Small Busines...
\n",
"
The-Vancouver-Blogger-Meetup-Group
\n",
"
public
\n",
"
Friends
\n",
"
\n",
"
\n",
"
1
\n",
"
Vancouver
\n",
"
1036650741000
\n",
"
<p>Hello Everyone,</p>\\n<p>My name is Nathan a...
\n",
"
NaN
\n",
"
71383
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/My-Internet-Media-Groups/
\n",
"
-123.120003
\n",
"
1866
\n",
"
My Internet Media Groups
\n",
"
{'member_id': 104036462, 'name': 'Nathan W.', ...
\n",
"
4.25
\n",
"
[{'urlkey': 'photoshop', 'name': 'Photoshop', ...
\n",
"
My-Internet-Media-Groups
\n",
"
public
\n",
"
Future Moguls
\n",
"
\n",
"
\n",
"
2
\n",
"
Vancouver
\n",
"
1072723179000
\n",
"
<p>As the largest software development meetup ...
\n",
"
NaN
\n",
"
144695
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/VanDev/
\n",
"
-123.129997
\n",
"
6949
\n",
"
VanDev: Vancouver's Software Developers Network
\n",
"
{'member_id': 273611362, 'name': 'Bevan Hunt',...
\n",
"
4.39
\n",
"
[{'urlkey': 'softwaredev', 'name': 'Software D...
\n",
"
VanDev
\n",
"
public
\n",
"
Software Developers
\n",
"
\n",
"
\n",
"
3
\n",
"
Vancouver
\n",
"
1142734447000
\n",
"
<p>Vancouver Web Design is British Columbia's ...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
229052
\n",
"
open
\n",
"
49.290001
\n",
"
https://www.meetup.com/webdesign-395/
\n",
"
-123.110001
\n",
"
4996
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
{'member_id': 87486782, 'name': 'Darrell Hadde...
\n",
"
4.40
\n",
"
[{'urlkey': 'webstandards', 'name': 'Web Stand...
\n",
"
webdesign-395
\n",
"
public
\n",
"
Vancouver Web Design Meetup
\n",
"
\n",
"
\n",
"
4
\n",
"
Vancouver
\n",
"
1184711936000
\n",
"
<p>Do you develop with Ruby? Make web applicat...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
573925
\n",
"
open
\n",
"
49.279999
\n",
"
https://www.meetup.com/vancouver-ruby/
\n",
"
-123.110001
\n",
"
2624
\n",
"
Vancouver Ruby Meetup Group
\n",
"
{'member_id': 10374191, 'name': 'Philippe Creu...
\n",
"
4.59
\n",
"
[{'urlkey': 'ruby', 'name': 'Ruby', 'id': 1040...
\n",
"
vancouver-ruby
\n",
"
public
\n",
"
Ruby Developers
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" city created \\\n",
"0 Vancouver 1034097731000 \n",
"1 Vancouver 1036650741000 \n",
"2 Vancouver 1072723179000 \n",
"3 Vancouver 1142734447000 \n",
"4 Vancouver 1184711936000 \n",
"\n",
" description \\\n",
"0
The Vancouver Blogger Meetup Group is... \n",
"1
Hello Everyone,
\\n
My name is Nathan a... \n",
"2
As the largest software development meetup ... \n",
"3
Vancouver Web Design is British Columbia's ... \n",
"4
Do you develop with Ruby? Make web applicat... \n",
"\n",
" group_photo id join_mode \\\n",
"0 {'highres_link': 'https://secure.meetupstatic.... 21636 approval \n",
"1 NaN 71383 open \n",
"2 NaN 144695 open \n",
"3 {'highres_link': 'https://secure.meetupstatic.... 229052 open \n",
"4 {'highres_link': 'https://secure.meetupstatic.... 573925 open \n",
"\n",
" lat link lon \\\n",
"0 49.279999 https://www.meetup.com/The-Vancouver-Blogger-M... -123.129997 \n",
"1 49.279999 https://www.meetup.com/My-Internet-Media-Groups/ -123.120003 \n",
"2 49.279999 https://www.meetup.com/VanDev/ -123.129997 \n",
"3 49.290001 https://www.meetup.com/webdesign-395/ -123.110001 \n",
"4 49.279999 https://www.meetup.com/vancouver-ruby/ -123.110001 \n",
"\n",
" members name \\\n",
"0 652 The Vancouver Blogger Meetup Group \n",
"1 1866 My Internet Media Groups \n",
"2 6949 VanDev: Vancouver's Software Developers Network \n",
"3 4996 The Vancouver Web Design Meetup Group \n",
"4 2624 Vancouver Ruby Meetup Group \n",
"\n",
" organizer rating \\\n",
"0 {'member_id': 66805072, 'name': 'Fabiano Macie... 4.32 \n",
"1 {'member_id': 104036462, 'name': 'Nathan W.', ... 4.25 \n",
"2 {'member_id': 273611362, 'name': 'Bevan Hunt',... 4.39 \n",
"3 {'member_id': 87486782, 'name': 'Darrell Hadde... 4.40 \n",
"4 {'member_id': 10374191, 'name': 'Philippe Creu... 4.59 \n",
"\n",
" topics \\\n",
"0 [{'urlkey': 'smallbiz', 'name': 'Small Busines... \n",
"1 [{'urlkey': 'photoshop', 'name': 'Photoshop', ... \n",
"2 [{'urlkey': 'softwaredev', 'name': 'Software D... \n",
"3 [{'urlkey': 'webstandards', 'name': 'Web Stand... \n",
"4 [{'urlkey': 'ruby', 'name': 'Ruby', 'id': 1040... \n",
"\n",
" urlname visibility who \n",
"0 The-Vancouver-Blogger-Meetup-Group public Friends \n",
"1 My-Internet-Media-Groups public Future Moguls \n",
"2 VanDev public Software Developers \n",
"3 webdesign-395 public Vancouver Web Design Meetup \n",
"4 vancouver-ruby public Ruby Developers "
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vancouver_tech_groups.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Column CITY: 1|Unique values: ['Vancouver']\n",
"Column CREATED: 394\n",
"Column DESCRIPTION: 394\n",
"Column GROUP_PHOTO: Type: \n",
"Column ID: 394\n",
"Column JOIN_MODE: 2\n",
"Column LAT: 9\n",
"Column LINK: 394\n",
"Column LON: 20\n",
"Column MEMBERS: 323\n",
"Column NAME: 394\n",
"Column ORGANIZER: Type: \n",
"Column RATING: 66\n",
"Column TOPICS: Type: \n",
"Column URLNAME: 394\n",
"Column VISIBILITY: 3\n",
"Column WHO: 184\n"
]
}
],
"source": [
"display_columns_unique_values(vancouver_tech_groups)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"# drop the city column\n",
"vancouver_tech_groups = vancouver_tech_groups.drop(columns=['city'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have limited the groups to the city of Vancouver and further cleaned up our dataframe, let's limit the columns to the ones that interest us:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['created', 'description', 'group_photo', 'id', 'join_mode', 'lat',\n",
" 'link', 'lon', 'members', 'name', 'organizer', 'rating', 'topics',\n",
" 'urlname', 'visibility', 'who'],\n",
" dtype='object')"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vancouver_tech_groups.columns"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
members
\n",
"
rating
\n",
"
join_mode
\n",
"
visibility
\n",
"
who
\n",
"
lat
\n",
"
lon
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
21636
\n",
"
The Vancouver Blogger Meetup Group
\n",
"
652
\n",
"
4.32
\n",
"
approval
\n",
"
public
\n",
"
Friends
\n",
"
49.279999
\n",
"
-123.129997
\n",
"
\n",
"
\n",
"
1
\n",
"
71383
\n",
"
My Internet Media Groups
\n",
"
1866
\n",
"
4.25
\n",
"
open
\n",
"
public
\n",
"
Future Moguls
\n",
"
49.279999
\n",
"
-123.120003
\n",
"
\n",
"
\n",
"
2
\n",
"
144695
\n",
"
VanDev: Vancouver's Software Developers Network
\n",
"
6949
\n",
"
4.39
\n",
"
open
\n",
"
public
\n",
"
Software Developers
\n",
"
49.279999
\n",
"
-123.129997
\n",
"
\n",
"
\n",
"
3
\n",
"
229052
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
4996
\n",
"
4.40
\n",
"
open
\n",
"
public
\n",
"
Vancouver Web Design Meetup
\n",
"
49.290001
\n",
"
-123.110001
\n",
"
\n",
"
\n",
"
4
\n",
"
573925
\n",
"
Vancouver Ruby Meetup Group
\n",
"
2624
\n",
"
4.59
\n",
"
open
\n",
"
public
\n",
"
Ruby Developers
\n",
"
49.279999
\n",
"
-123.110001
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name members rating \\\n",
"0 21636 The Vancouver Blogger Meetup Group 652 4.32 \n",
"1 71383 My Internet Media Groups 1866 4.25 \n",
"2 144695 VanDev: Vancouver's Software Developers Network 6949 4.39 \n",
"3 229052 The Vancouver Web Design Meetup Group 4996 4.40 \n",
"4 573925 Vancouver Ruby Meetup Group 2624 4.59 \n",
"\n",
" join_mode visibility who lat lon \n",
"0 approval public Friends 49.279999 -123.129997 \n",
"1 open public Future Moguls 49.279999 -123.120003 \n",
"2 open public Software Developers 49.279999 -123.129997 \n",
"3 open public Vancouver Web Design Meetup 49.290001 -123.110001 \n",
"4 open public Ruby Developers 49.279999 -123.110001 "
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# columns to keep\n",
"keep_columns = ['id', 'name', 'members', 'rating', 'join_mode', 'visibility',\n",
" 'who', 'lat', 'lon']\n",
"\n",
"vancouver_tech_groups = vancouver_tech_groups[keep_columns]\n",
"\n",
"vancouver_tech_groups.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Tech Meetup Members\n",
"\n",
"Let's explore the distribution of members across Tech Meetups in Vancouver."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 394.000000\n",
"mean 680.951777\n",
"std 1108.259677\n",
"min 1.000000\n",
"25% 86.000000\n",
"50% 295.000000\n",
"75% 699.250000\n",
"max 8797.000000\n",
"Name: members, dtype: float64"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vancouver_tech_groups['members'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"vancouver_tech_groups['members'].plot.box()"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(7917.4, 8797.0] 0.253807\n",
"(7037.8, 7917.4] 0.000000\n",
"(6158.2, 7037.8] 0.761421\n",
"(5278.6, 6158.2] 0.253807\n",
"(4399.0, 5278.6] 1.015228\n",
"(3519.4, 4399.0] 1.269036\n",
"(2639.8, 3519.4] 1.522843\n",
"(1760.2, 2639.8] 5.329949\n",
"(880.6, 1760.2] 11.167513\n",
"(-7.797000000000001, 880.6] 78.426396\n",
"Name: members, dtype: float64"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vancouver_tech_groups['members'].value_counts(bins = 10, normalize=True).sort_index(ascending=False) * 100"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observations**:\n",
"\n",
"From the descriptive statistics table that the `describe()` function provides us, we observe:\n",
"\n",
"- average number of members is 681\n",
"- There is/are meetups with 1 member\n",
"- The largest meetup has 8778 members\n",
"- The median meetup member size is 295\n",
"\n",
"Our histogram is a very rightly skewed plot, further demonstrating how most Tech Meetups have members in the 100's and not 1000's.\n",
"\n",
"The box plot shows the large number of outliers. What is interesting is that there are a few clusters of outliers around the 2000 - 4000, another cluster around ~5000 and the rest spread out a bit more until we get to out largest group of 8778 members.\n",
"\n",
"Lastly, the custom frequency table shows us that:\n",
"\n",
"- almost **90%** of Tech Meetups have 1756 members or less, with a majority of these having less than 878\n",
"- Around **~9%** of Tech Meetups have between 1756 and 5267 members."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
members
\n",
"
rating
\n",
"
join_mode
\n",
"
visibility
\n",
"
who
\n",
"
lat
\n",
"
lon
\n",
"
\n",
" \n",
" \n",
"
\n",
"
433
\n",
"
31260167
\n",
"
Vancouver Amazon Seller Meetup AMZ One Step
\n",
"
1
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name members rating \\\n",
"433 31260167 Vancouver Amazon Seller Meetup AMZ One Step 1 0.0 \n",
"\n",
" join_mode visibility who lat lon \n",
"433 open public Members 49.279999 -123.040001 "
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vancouver_tech_groups[vancouver_tech_groups['members'] == 1]"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
members
\n",
"
rating
\n",
"
join_mode
\n",
"
visibility
\n",
"
who
\n",
"
lat
\n",
"
lon
\n",
"
\n",
" \n",
" \n",
"
\n",
"
431
\n",
"
31231458
\n",
"
Vancouver Fintech Startups Meetup
\n",
"
5
\n",
"
0.0
\n",
"
approval
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name members rating join_mode \\\n",
"431 31231458 Vancouver Fintech Startups Meetup 5 0.0 approval \n",
"\n",
" visibility who lat lon \n",
"431 public Members 49.279999 -123.040001 "
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vancouver_tech_groups[vancouver_tech_groups['id'] == 31231458]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There is one Meetup with 1 member is the **Vancouver Lucene/Solr Meetup**. \n",
"\n",
"Members can only join the meetup by being approved, which may explain the low number of members if no one has been approved.\n",
"\n",
"**NOTE**: When I first ran this on Sunday, February 24th 2019, there was only one Meetup with 1 member, the **Vancouver FinTech Startups Meetup**. When I ran this again on Monday, February 25th 2019, a different Meetup group had 1 member: **Vancouver Lucene/Solr Meetup**. The former Meetup now had 3 members. This may indicate some fluctuation in Meetup Groups as people are joining/leaving groups."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Comparing Largest and Smallest Tech Meetups\n",
"\n",
"Let's grab the largest and smallest Tech Meetup groups and compare them.\n",
"\n",
"The largest and smallest groups are defined below:\n",
"\n",
"- _Largest Groups_: Groups with members **larger than 10x the median number** of members.\n",
"\n",
"- _Smallest Groups_: Groups with members **less than 1/10th of the median number** of members."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Dealing with locations**\n",
"\n",
"After some back and forth research done by plotting the largest and smallest Vancouver tech groups, we observed the challenges of dealing with two separate location values (`latitude` and `longitude`). A new column is created which combines both `latitutde` and `longitude` columns. This column will allow us to know exactly how many unique locations there really are."
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [],
"source": [
"vancouver_tech_groups['location'] = list(\n",
" zip(vancouver_tech_groups['lat'], vancouver_tech_groups['lon'])\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Column ID: 394\n",
"Column NAME: 394\n",
"Column MEMBERS: 323\n",
"Column RATING: 66\n",
"Column JOIN_MODE: 2\n",
"Column VISIBILITY: 3\n",
"Column WHO: 184\n",
"Column LAT: 9\n",
"Column LON: 20\n",
"Column LOCATION: 45\n"
]
}
],
"source": [
"display_columns_unique_values(vancouver_tech_groups)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, we can tell that there are **45** unique locations for the **393** Tech Meetups in Vancouver."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Additional Helper Functions**"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"def get_target_group_details(df):\n",
" '''provides information on the target group'''\n",
" unique_targets = df['who'].unique()\n",
"\n",
" print(f\"There are {len(unique_targets)} unique targets: {unique_targets}\\n\")\n",
" \n",
" for target in unique_targets:\n",
" unique_target = df[df['who'] == target]\n",
" print(f\"There are {unique_target.shape[0]} meetup(s) which target {target}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Get the groups"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"295.0"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"median_members = vancouver_tech_groups['members'].median()\n",
"median_members"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Largest Tech Groups**\n",
"\n",
"Let's grab the largest tech meetups:"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(17, 10)\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
members
\n",
"
rating
\n",
"
join_mode
\n",
"
visibility
\n",
"
who
\n",
"
lat
\n",
"
lon
\n",
"
location
\n",
"
\n",
" \n",
" \n",
"
\n",
"
172
\n",
"
19162038
\n",
"
TechVancouver
\n",
"
8797
\n",
"
4.78
\n",
"
open
\n",
"
public
\n",
"
Technologists
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
2
\n",
"
144695
\n",
"
VanDev: Vancouver's Software Developers Network
\n",
"
6949
\n",
"
4.39
\n",
"
open
\n",
"
public
\n",
"
Software Developers
\n",
"
49.279999
\n",
"
-123.129997
\n",
"
(49.279998779296875, -123.12999725341797)
\n",
"
\n",
"
\n",
"
60
\n",
"
4869742
\n",
"
HackerNest Vancouver Tech Socials
\n",
"
6715
\n",
"
4.75
\n",
"
open
\n",
"
public
\n",
"
HackerNesters
\n",
"
49.279999
\n",
"
-123.120003
\n",
"
(49.279998779296875, -123.12000274658203)
\n",
"
\n",
"
\n",
"
98
\n",
"
11908342
\n",
"
Code & Coffee (Vancouver)
\n",
"
6299
\n",
"
4.65
\n",
"
open
\n",
"
public
\n",
"
Developers
\n",
"
49.279999
\n",
"
-123.139999
\n",
"
(49.279998779296875, -123.13999938964844)
\n",
"
\n",
"
\n",
"
137
\n",
"
18381330
\n",
"
Vancouver Startup Founder 101
\n",
"
5772
\n",
"
4.58
\n",
"
open
\n",
"
public
\n",
"
Aspiring Founders
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
16
\n",
"
1583286
\n",
"
Vancouver Pixel Crafters
\n",
"
5120
\n",
"
4.62
\n",
"
open
\n",
"
public
\n",
"
Entrepreneurs
\n",
"
49.279999
\n",
"
-123.110001
\n",
"
(49.279998779296875, -123.11000061035156)
\n",
"
\n",
"
\n",
"
3
\n",
"
229052
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
4996
\n",
"
4.40
\n",
"
open
\n",
"
public
\n",
"
Vancouver Web Design Meetup
\n",
"
49.290001
\n",
"
-123.110001
\n",
"
(49.290000915527344, -123.11000061035156)
\n",
"
\n",
"
\n",
"
23
\n",
"
1642334
\n",
"
Full Indie
\n",
"
4829
\n",
"
4.61
\n",
"
open
\n",
"
public
\n",
"
Indies
\n",
"
49.270000
\n",
"
-123.120003
\n",
"
(49.27000045776367, -123.12000274658203)
\n",
"
\n",
"
\n",
"
192
\n",
"
19905099
\n",
"
YVR Startups
\n",
"
4720
\n",
"
4.67
\n",
"
open
\n",
"
public
\n",
"
Entrepreneurs
\n",
"
49.259998
\n",
"
-123.139999
\n",
"
(49.2599983215332, -123.13999938964844)
\n",
"
\n",
"
\n",
"
36
\n",
"
1798770
\n",
"
Vancouver Data Visualization
\n",
"
3892
\n",
"
4.52
\n",
"
open
\n",
"
public
\n",
"
Vizers
\n",
"
49.279999
\n",
"
-123.110001
\n",
"
(49.279998779296875, -123.11000061035156)
\n",
"
\n",
"
\n",
"
52
\n",
"
3238812
\n",
"
Bitcoin Vancouver
\n",
"
3831
\n",
"
4.55
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.099998
\n",
"
(49.279998779296875, -123.0999984741211)
\n",
"
\n",
"
\n",
"
56
\n",
"
3946322
\n",
"
PolyglotVancouver
\n",
"
3793
\n",
"
4.62
\n",
"
open
\n",
"
public
\n",
"
Polyglots
\n",
"
49.259998
\n",
"
-123.120003
\n",
"
(49.2599983215332, -123.12000274658203)
\n",
"
\n",
"
\n",
"
26
\n",
"
1751788
\n",
"
Agile Vancouver
\n",
"
3789
\n",
"
4.43
\n",
"
open
\n",
"
public
\n",
"
Agilists
\n",
"
49.279999
\n",
"
-123.120003
\n",
"
(49.279998779296875, -123.12000274658203)
\n",
"
\n",
"
\n",
"
144
\n",
"
18532714
\n",
"
Learn Data Science
\n",
"
3678
\n",
"
4.84
\n",
"
open
\n",
"
public
\n",
"
Data Scientists
\n",
"
49.290001
\n",
"
-123.120003
\n",
"
(49.290000915527344, -123.12000274658203)
\n",
"
\n",
"
\n",
"
7
\n",
"
1013148
\n",
"
NetSquared Vancouver: Tech4Good and Nonprofits
\n",
"
3409
\n",
"
4.38
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.270000
\n",
"
-123.099998
\n",
"
(49.27000045776367, -123.0999984741211)
\n",
"
\n",
"
\n",
"
14
\n",
"
1526926
\n",
"
VanJS: Vancouver JavaScript Developers
\n",
"
3327
\n",
"
4.63
\n",
"
open
\n",
"
public
\n",
"
JavaScript Developers
\n",
"
49.279999
\n",
"
-123.110001
\n",
"
(49.279998779296875, -123.11000061035156)
\n",
"
\n",
"
\n",
"
142
\n",
"
18515170
\n",
"
BrainStation Vancouver
\n",
"
3291
\n",
"
4.82
\n",
"
open
\n",
"
public
\n",
"
Creators
\n",
"
49.259998
\n",
"
-123.099998
\n",
"
(49.2599983215332, -123.0999984741211)
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name members \\\n",
"172 19162038 TechVancouver 8797 \n",
"2 144695 VanDev: Vancouver's Software Developers Network 6949 \n",
"60 4869742 HackerNest Vancouver Tech Socials 6715 \n",
"98 11908342 Code & Coffee (Vancouver) 6299 \n",
"137 18381330 Vancouver Startup Founder 101 5772 \n",
"16 1583286 Vancouver Pixel Crafters 5120 \n",
"3 229052 The Vancouver Web Design Meetup Group 4996 \n",
"23 1642334 Full Indie 4829 \n",
"192 19905099 YVR Startups 4720 \n",
"36 1798770 Vancouver Data Visualization 3892 \n",
"52 3238812 Bitcoin Vancouver 3831 \n",
"56 3946322 PolyglotVancouver 3793 \n",
"26 1751788 Agile Vancouver 3789 \n",
"144 18532714 Learn Data Science 3678 \n",
"7 1013148 NetSquared Vancouver: Tech4Good and Nonprofits 3409 \n",
"14 1526926 VanJS: Vancouver JavaScript Developers 3327 \n",
"142 18515170 BrainStation Vancouver 3291 \n",
"\n",
" rating join_mode visibility who lat \\\n",
"172 4.78 open public Technologists 49.279999 \n",
"2 4.39 open public Software Developers 49.279999 \n",
"60 4.75 open public HackerNesters 49.279999 \n",
"98 4.65 open public Developers 49.279999 \n",
"137 4.58 open public Aspiring Founders 49.279999 \n",
"16 4.62 open public Entrepreneurs 49.279999 \n",
"3 4.40 open public Vancouver Web Design Meetup 49.290001 \n",
"23 4.61 open public Indies 49.270000 \n",
"192 4.67 open public Entrepreneurs 49.259998 \n",
"36 4.52 open public Vizers 49.279999 \n",
"52 4.55 open public Members 49.279999 \n",
"56 4.62 open public Polyglots 49.259998 \n",
"26 4.43 open public Agilists 49.279999 \n",
"144 4.84 open public Data Scientists 49.290001 \n",
"7 4.38 open public Members 49.270000 \n",
"14 4.63 open public JavaScript Developers 49.279999 \n",
"142 4.82 open public Creators 49.259998 \n",
"\n",
" lon location \n",
"172 -123.040001 (49.279998779296875, -123.04000091552734) \n",
"2 -123.129997 (49.279998779296875, -123.12999725341797) \n",
"60 -123.120003 (49.279998779296875, -123.12000274658203) \n",
"98 -123.139999 (49.279998779296875, -123.13999938964844) \n",
"137 -123.040001 (49.279998779296875, -123.04000091552734) \n",
"16 -123.110001 (49.279998779296875, -123.11000061035156) \n",
"3 -123.110001 (49.290000915527344, -123.11000061035156) \n",
"23 -123.120003 (49.27000045776367, -123.12000274658203) \n",
"192 -123.139999 (49.2599983215332, -123.13999938964844) \n",
"36 -123.110001 (49.279998779296875, -123.11000061035156) \n",
"52 -123.099998 (49.279998779296875, -123.0999984741211) \n",
"56 -123.120003 (49.2599983215332, -123.12000274658203) \n",
"26 -123.120003 (49.279998779296875, -123.12000274658203) \n",
"144 -123.120003 (49.290000915527344, -123.12000274658203) \n",
"7 -123.099998 (49.27000045776367, -123.0999984741211) \n",
"14 -123.110001 (49.279998779296875, -123.11000061035156) \n",
"142 -123.099998 (49.2599983215332, -123.0999984741211) "
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"largest_tech_groups = vancouver_tech_groups[vancouver_tech_groups['members'] > 10 * median_members]\n",
"print(largest_tech_groups.shape)\n",
"largest_tech_groups.sort_values('members', ascending=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Smallest Tech Groups**\n",
"\n",
"Let's grab the smallest tech meetups:"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(30, 10)\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
members
\n",
"
rating
\n",
"
join_mode
\n",
"
visibility
\n",
"
who
\n",
"
lat
\n",
"
lon
\n",
"
location
\n",
"
\n",
" \n",
" \n",
"
\n",
"
433
\n",
"
31260167
\n",
"
Vancouver Amazon Seller Meetup AMZ One Step
\n",
"
1
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
432
\n",
"
31252547
\n",
"
Vancouver Lucene/Solr Meetup
\n",
"
2
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
431
\n",
"
31231458
\n",
"
Vancouver Fintech Startups Meetup
\n",
"
5
\n",
"
0.0
\n",
"
approval
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
358
\n",
"
28804607
\n",
"
The Efficient Professional
\n",
"
7
\n",
"
0.0
\n",
"
approval
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
363
\n",
"
28978937
\n",
"
ManageEngine IT Management Seminar, Vancouver
\n",
"
9
\n",
"
0.0
\n",
"
open
\n",
"
public_limited
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
349
\n",
"
28518984
\n",
"
Gastown Tech Meetup
\n",
"
9
\n",
"
0.0
\n",
"
approval
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
423
\n",
"
30948318
\n",
"
Algorand Vancouver: Blockchain Community
\n",
"
11
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
280
\n",
"
26300462
\n",
"
Vancouver MuleSoft Meetup Group
\n",
"
12
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
347
\n",
"
28458120
\n",
"
Vancouver MuleSoft User Group
\n",
"
12
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.270000
\n",
"
-123.239998
\n",
"
(49.27000045776367, -123.23999786376953)
\n",
"
\n",
"
\n",
"
408
\n",
"
30478918
\n",
"
Vancouver Clojure & Lisp
\n",
"
13
\n",
"
0.0
\n",
"
approval
\n",
"
public
\n",
"
Parens
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
391
\n",
"
29919671
\n",
"
Crypto Vancity
\n",
"
13
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Disruptors
\n",
"
49.290001
\n",
"
-123.120003
\n",
"
(49.290000915527344, -123.12000274658203)
\n",
"
\n",
"
\n",
"
385
\n",
"
29818562
\n",
"
Vancouver Apache Druid Meetup by Imply
\n",
"
14
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
318
\n",
"
27534165
\n",
"
Enterprise Resource Planning ERP Consultants V...
\n",
"
15
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Membres
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
419
\n",
"
30791164
\n",
"
Token Engineering Vancouver
\n",
"
16
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
362
\n",
"
28976518
\n",
"
Hyperbridge Vancouver
\n",
"
16
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
370
\n",
"
29394462
\n",
"
Slack Platform Community: Vancouver
\n",
"
17
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
SPC Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
428
\n",
"
31176166
\n",
"
ExpoPlaza Latina 2019
\n",
"
18
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
352
\n",
"
28638957
\n",
"
The Vancouver Supply Chain Meetup
\n",
"
18
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Nodes
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
197
\n",
"
20129895
\n",
"
Kong/VANCOUVER
\n",
"
18
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Kong Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
128
\n",
"
17958442
\n",
"
Vancouver Google Apps Meetup
\n",
"
21
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Googlers
\n",
"
49.259998
\n",
"
-123.180000
\n",
"
(49.2599983215332, -123.18000030517578)
\n",
"
\n",
"
\n",
"
329
\n",
"
27908256
\n",
"
Queer Women in STEM
\n",
"
21
\n",
"
0.0
\n",
"
approval
\n",
"
public_limited
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
247
\n",
"
23674891
\n",
"
The Vancouver dRofus User Group
\n",
"
21
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
399
\n",
"
30324509
\n",
"
Vancouver WSO2 User Group
\n",
"
24
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
369
\n",
"
29371748
\n",
"
Vancouver VideoCoin Developer Meetup
\n",
"
24
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
232
\n",
"
22396600
\n",
"
Vancouver Redis Meetup
\n",
"
25
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
320
\n",
"
27735218
\n",
"
Vancouver Video Technology Meetup
\n",
"
27
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
231
\n",
"
22290839
\n",
"
Vancouver NetSuite Users Group
\n",
"
28
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
178
\n",
"
19583761
\n",
"
Bitcoin Hanoi
\n",
"
28
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Bitcoiners
\n",
"
49.230000
\n",
"
-123.110001
\n",
"
(49.22999954223633, -123.11000061035156)
\n",
"
\n",
"
\n",
"
389
\n",
"
29891207
\n",
"
Eyemole Arts and Technology and Friends
\n",
"
29
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
269
\n",
"
25620603
\n",
"
Quantaloop
\n",
"
29
\n",
"
0.0
\n",
"
open
\n",
"
public_limited
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name members \\\n",
"433 31260167 Vancouver Amazon Seller Meetup AMZ One Step 1 \n",
"432 31252547 Vancouver Lucene/Solr Meetup 2 \n",
"431 31231458 Vancouver Fintech Startups Meetup 5 \n",
"358 28804607 The Efficient Professional 7 \n",
"363 28978937 ManageEngine IT Management Seminar, Vancouver 9 \n",
"349 28518984 Gastown Tech Meetup 9 \n",
"423 30948318 Algorand Vancouver: Blockchain Community 11 \n",
"280 26300462 Vancouver MuleSoft Meetup Group 12 \n",
"347 28458120 Vancouver MuleSoft User Group 12 \n",
"408 30478918 Vancouver Clojure & Lisp 13 \n",
"391 29919671 Crypto Vancity 13 \n",
"385 29818562 Vancouver Apache Druid Meetup by Imply 14 \n",
"318 27534165 Enterprise Resource Planning ERP Consultants V... 15 \n",
"419 30791164 Token Engineering Vancouver 16 \n",
"362 28976518 Hyperbridge Vancouver 16 \n",
"370 29394462 Slack Platform Community: Vancouver 17 \n",
"428 31176166 ExpoPlaza Latina 2019 18 \n",
"352 28638957 The Vancouver Supply Chain Meetup 18 \n",
"197 20129895 Kong/VANCOUVER 18 \n",
"128 17958442 Vancouver Google Apps Meetup 21 \n",
"329 27908256 Queer Women in STEM 21 \n",
"247 23674891 The Vancouver dRofus User Group 21 \n",
"399 30324509 Vancouver WSO2 User Group 24 \n",
"369 29371748 Vancouver VideoCoin Developer Meetup 24 \n",
"232 22396600 Vancouver Redis Meetup 25 \n",
"320 27735218 Vancouver Video Technology Meetup 27 \n",
"231 22290839 Vancouver NetSuite Users Group 28 \n",
"178 19583761 Bitcoin Hanoi 28 \n",
"389 29891207 Eyemole Arts and Technology and Friends 29 \n",
"269 25620603 Quantaloop 29 \n",
"\n",
" rating join_mode visibility who lat lon \\\n",
"433 0.0 open public Members 49.279999 -123.040001 \n",
"432 0.0 open public Members 49.279999 -123.040001 \n",
"431 0.0 approval public Members 49.279999 -123.040001 \n",
"358 0.0 approval public Members 49.279999 -123.040001 \n",
"363 0.0 open public_limited Members 49.279999 -123.040001 \n",
"349 0.0 approval public Members 49.279999 -123.040001 \n",
"423 0.0 open public Members 49.279999 -123.040001 \n",
"280 0.0 open public Members 49.279999 -123.040001 \n",
"347 0.0 open public Members 49.270000 -123.239998 \n",
"408 0.0 approval public Parens 49.279999 -123.040001 \n",
"391 0.0 open public Disruptors 49.290001 -123.120003 \n",
"385 0.0 open public Members 49.279999 -123.040001 \n",
"318 0.0 open public Membres 49.279999 -123.040001 \n",
"419 0.0 open public Members 49.279999 -123.040001 \n",
"362 0.0 open public Members 49.279999 -123.040001 \n",
"370 0.0 open public SPC Members 49.279999 -123.040001 \n",
"428 0.0 open public Members 49.279999 -123.040001 \n",
"352 0.0 open public Nodes 49.279999 -123.040001 \n",
"197 0.0 open public Kong Members 49.279999 -123.040001 \n",
"128 0.0 open public Googlers 49.259998 -123.180000 \n",
"329 0.0 approval public_limited Members 49.279999 -123.040001 \n",
"247 0.0 open public Members 49.279999 -123.040001 \n",
"399 0.0 open public Members 49.279999 -123.040001 \n",
"369 0.0 open public Members 49.279999 -123.040001 \n",
"232 0.0 open public Members 49.279999 -123.040001 \n",
"320 0.0 open public Members 49.279999 -123.040001 \n",
"231 0.0 open public Members 49.279999 -123.040001 \n",
"178 0.0 open public Bitcoiners 49.230000 -123.110001 \n",
"389 0.0 open public Members 49.279999 -123.040001 \n",
"269 0.0 open public_limited Members 49.279999 -123.040001 \n",
"\n",
" location \n",
"433 (49.279998779296875, -123.04000091552734) \n",
"432 (49.279998779296875, -123.04000091552734) \n",
"431 (49.279998779296875, -123.04000091552734) \n",
"358 (49.279998779296875, -123.04000091552734) \n",
"363 (49.279998779296875, -123.04000091552734) \n",
"349 (49.279998779296875, -123.04000091552734) \n",
"423 (49.279998779296875, -123.04000091552734) \n",
"280 (49.279998779296875, -123.04000091552734) \n",
"347 (49.27000045776367, -123.23999786376953) \n",
"408 (49.279998779296875, -123.04000091552734) \n",
"391 (49.290000915527344, -123.12000274658203) \n",
"385 (49.279998779296875, -123.04000091552734) \n",
"318 (49.279998779296875, -123.04000091552734) \n",
"419 (49.279998779296875, -123.04000091552734) \n",
"362 (49.279998779296875, -123.04000091552734) \n",
"370 (49.279998779296875, -123.04000091552734) \n",
"428 (49.279998779296875, -123.04000091552734) \n",
"352 (49.279998779296875, -123.04000091552734) \n",
"197 (49.279998779296875, -123.04000091552734) \n",
"128 (49.2599983215332, -123.18000030517578) \n",
"329 (49.279998779296875, -123.04000091552734) \n",
"247 (49.279998779296875, -123.04000091552734) \n",
"399 (49.279998779296875, -123.04000091552734) \n",
"369 (49.279998779296875, -123.04000091552734) \n",
"232 (49.279998779296875, -123.04000091552734) \n",
"320 (49.279998779296875, -123.04000091552734) \n",
"231 (49.279998779296875, -123.04000091552734) \n",
"178 (49.22999954223633, -123.11000061035156) \n",
"389 (49.279998779296875, -123.04000091552734) \n",
"269 (49.279998779296875, -123.04000091552734) "
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"smallest_tech_groups = vancouver_tech_groups[vancouver_tech_groups['members'] < (median_members/10)]\n",
"print(smallest_tech_groups.shape)\n",
"smallest_tech_groups.sort_values('members')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Location of Largest and Smallest Tech Meet Ups\n",
"\n",
"Let's look at where the largest and smallest Tech Meetups are located:"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Column ID: 17\n",
"Column NAME: 17\n",
"Column MEMBERS: 17\n",
"Column RATING: 16\n",
"Column JOIN_MODE: 1|Unique values: ['open']\n",
"Column VISIBILITY: 1|Unique values: ['public']\n",
"Column WHO: 15\n",
"Column LAT: 4\n",
"Column LON: 6\n",
"Column LOCATION: 13\n"
]
}
],
"source": [
"display_columns_unique_values(largest_tech_groups)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Column ID: 30\n",
"Column NAME: 30\n",
"Column MEMBERS: 19\n",
"Column RATING: 1|Unique values: [0.]\n",
"Column JOIN_MODE: 2\n",
"Column VISIBILITY: 2\n",
"Column WHO: 9\n",
"Column LAT: 5\n",
"Column LON: 5\n",
"Column LOCATION: 5\n"
]
}
],
"source": [
"display_columns_unique_values(smallest_tech_groups)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"'''\n",
"projection: the map projection.\n",
"llcrnrlat: latitude of lower left hand corner of the desired map domain\n",
"urcrnrlat: latitude of upper right hand corner of the desired map domain\n",
"llcrnrlon: longitude of lower left hand corner of the desired map domain\n",
"urcrnrlon: longitude of upper right hand corner of the desired map domain\n",
"'''\n",
"lower_left_lat = 49.2\n",
"lower_left_lon = -123.316\n",
"upper_right_lat = 49.35\n",
"upper_right_lon = -123\n",
"\n",
"fig = plt.figure(figsize=(40, 40))\n",
"\n",
"groups = [smallest_tech_groups, largest_tech_groups]\n",
"colors = ['Blue', 'Green']\n",
"titles = ['Smallest Tech Groups', 'Largest Tech Groups']\n",
"\n",
"for sp in range(0, 2):\n",
" ax = fig.add_subplot(1, 5, sp+1)\n",
" \n",
" ax.set_title(titles[sp])\n",
" \n",
" m = Basemap(\n",
" projection = 'merc',\n",
" llcrnrlat = lower_left_lat,\n",
" urcrnrlat = upper_right_lat,\n",
" llcrnrlon = lower_left_lon,\n",
" urcrnrlon = upper_right_lon,\n",
" resolution = 'i',\n",
" )\n",
"\n",
" m.drawmapboundary(fill_color='#85A6D9')\n",
" m.drawcoastlines(color='#6D5F47', linewidth=.4)\n",
" m.drawrivers(color='#6D5F47', linewidth=.4)\n",
" m.fillcontinents(color='white',lake_color='#85A6D9')\n",
" \n",
" longitudes = groups[sp]['lon'].tolist()\n",
" latitudes = groups[sp]['lat'].tolist()\n",
" \n",
" x, y = m(longitudes, latitudes)\n",
" m.scatter(x, y, s=50, zorder=2, color=colors[sp], cmap='summer')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observation**:\n",
"\n",
"From our map plots above, we observe that:\n",
"\n",
"- the largest **17 Tech Meetups are spread across 13 locations**, but are primarily based either **in Downtown or in the surrounding area**.\n",
"- the smallest **29 Tech Meetups are spread across 5 locations** with only one being based in Downtown. The rest are spread out across Vancouver.\n",
"\n",
"Other observations:\n",
"\n",
"- The smallest Tech Meetups all have a **0** rating\n",
"- The largest Tech Meetups are all open and visible to the public \n",
"- A couple of the smallest Tech Meetups are through approval and publicly limited (Not sure what **public_limited** means). According to the [Meetup Group Content Visibility Settings] page, there are only 2 content visibility settings: private and public\n",
"\n",
"[Meetup Group Content Visibility Settings]: https://help.meetup.com/hc/en-us/articles/360002921751-Meetup-Group-Content-Visibility-Settings"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Who do they target?\n",
"\n",
"Let's look at how the largest and smallest Tech Meetup groups are 'marketed' by taking into consideration who they cater to."
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 15 unique targets: ['Software Developers' 'Vancouver Web Design Meetup' 'Members'\n",
" 'JavaScript Developers' 'Entrepreneurs' 'Indies' 'Agilists' 'Vizers'\n",
" 'Polyglots' 'HackerNesters' 'Developers' 'Aspiring Founders' 'Creators'\n",
" 'Data Scientists' 'Technologists']\n",
"\n",
"There are 1 meetup(s) which target Software Developers\n",
"There are 1 meetup(s) which target Vancouver Web Design Meetup\n",
"There are 2 meetup(s) which target Members\n",
"There are 1 meetup(s) which target JavaScript Developers\n",
"There are 2 meetup(s) which target Entrepreneurs\n",
"There are 1 meetup(s) which target Indies\n",
"There are 1 meetup(s) which target Agilists\n",
"There are 1 meetup(s) which target Vizers\n",
"There are 1 meetup(s) which target Polyglots\n",
"There are 1 meetup(s) which target HackerNesters\n",
"There are 1 meetup(s) which target Developers\n",
"There are 1 meetup(s) which target Aspiring Founders\n",
"There are 1 meetup(s) which target Creators\n",
"There are 1 meetup(s) which target Data Scientists\n",
"There are 1 meetup(s) which target Technologists\n"
]
}
],
"source": [
"# who do they target\n",
"get_target_group_details(largest_tech_groups)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 9 unique targets: ['Googlers' 'Bitcoiners' 'Kong Members' 'Members' 'Membres' 'Nodes'\n",
" 'SPC Members' 'Disruptors' 'Parens']\n",
"\n",
"There are 1 meetup(s) which target Googlers\n",
"There are 1 meetup(s) which target Bitcoiners\n",
"There are 1 meetup(s) which target Kong Members\n",
"There are 22 meetup(s) which target Members\n",
"There are 1 meetup(s) which target Membres\n",
"There are 1 meetup(s) which target Nodes\n",
"There are 1 meetup(s) which target SPC Members\n",
"There are 1 meetup(s) which target Disruptors\n",
"There are 1 meetup(s) which target Parens\n"
]
}
],
"source": [
"# who do they target\n",
"get_target_group_details(smallest_tech_groups)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observation**:\n",
"\n",
"Around **75% (21/29)** of the smallest groups are aimed at 'Members'. 1 group is aimed at 'Membres' which I take as a misspelling for 'Members'.\n",
"\n",
"In contrast, **less than 12% (2/17)** of the largest groups are aimed at 'Members'.\n",
"\n",
"Generally, the **largest groups cater to specific audiences compared to the smallest groups**."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Ratings\n",
"\n",
"As we already saw, the smallest groups have ratings of 0. So we aren't able to compare them against the largest group.\n",
"\n",
"A couple of question we could look into is:\n",
"\n",
"- Are the largest groups as we have defined them more popular than the other groups?\n",
"- Is it only the smallest groups that don't have any ratings?"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"251\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
members
\n",
"
rating
\n",
"
join_mode
\n",
"
visibility
\n",
"
who
\n",
"
lat
\n",
"
lon
\n",
"
location
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
21636
\n",
"
The Vancouver Blogger Meetup Group
\n",
"
652
\n",
"
4.32
\n",
"
approval
\n",
"
public
\n",
"
Friends
\n",
"
49.279999
\n",
"
-123.129997
\n",
"
(49.279998779296875, -123.12999725341797)
\n",
"
\n",
"
\n",
"
1
\n",
"
71383
\n",
"
My Internet Media Groups
\n",
"
1866
\n",
"
4.25
\n",
"
open
\n",
"
public
\n",
"
Future Moguls
\n",
"
49.279999
\n",
"
-123.120003
\n",
"
(49.279998779296875, -123.12000274658203)
\n",
"
\n",
"
\n",
"
2
\n",
"
144695
\n",
"
VanDev: Vancouver's Software Developers Network
\n",
"
6949
\n",
"
4.39
\n",
"
open
\n",
"
public
\n",
"
Software Developers
\n",
"
49.279999
\n",
"
-123.129997
\n",
"
(49.279998779296875, -123.12999725341797)
\n",
"
\n",
"
\n",
"
3
\n",
"
229052
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
4996
\n",
"
4.40
\n",
"
open
\n",
"
public
\n",
"
Vancouver Web Design Meetup
\n",
"
49.290001
\n",
"
-123.110001
\n",
"
(49.290000915527344, -123.11000061035156)
\n",
"
\n",
"
\n",
"
4
\n",
"
573925
\n",
"
Vancouver Ruby Meetup Group
\n",
"
2624
\n",
"
4.59
\n",
"
open
\n",
"
public
\n",
"
Ruby Developers
\n",
"
49.279999
\n",
"
-123.110001
\n",
"
(49.279998779296875, -123.11000061035156)
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name members rating \\\n",
"0 21636 The Vancouver Blogger Meetup Group 652 4.32 \n",
"1 71383 My Internet Media Groups 1866 4.25 \n",
"2 144695 VanDev: Vancouver's Software Developers Network 6949 4.39 \n",
"3 229052 The Vancouver Web Design Meetup Group 4996 4.40 \n",
"4 573925 Vancouver Ruby Meetup Group 2624 4.59 \n",
"\n",
" join_mode visibility who lat lon \\\n",
"0 approval public Friends 49.279999 -123.129997 \n",
"1 open public Future Moguls 49.279999 -123.120003 \n",
"2 open public Software Developers 49.279999 -123.129997 \n",
"3 open public Vancouver Web Design Meetup 49.290001 -123.110001 \n",
"4 open public Ruby Developers 49.279999 -123.110001 \n",
"\n",
" location \n",
"0 (49.279998779296875, -123.12999725341797) \n",
"1 (49.279998779296875, -123.12000274658203) \n",
"2 (49.279998779296875, -123.12999725341797) \n",
"3 (49.290000915527344, -123.11000061035156) \n",
"4 (49.279998779296875, -123.11000061035156) "
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_with_ratings = vancouver_tech_groups[vancouver_tech_groups['rating'] != 0.0]\n",
"print(groups_with_ratings.shape[0])\n",
"groups_with_ratings.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So **251/393** groups have ratings. Let's further separate out the non-largest groups:"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"234\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
members
\n",
"
rating
\n",
"
join_mode
\n",
"
visibility
\n",
"
who
\n",
"
lat
\n",
"
lon
\n",
"
location
\n",
"
\n",
" \n",
" \n",
"
\n",
"
85
\n",
"
9636222
\n",
"
Style & Class
\n",
"
2895
\n",
"
4.74
\n",
"
open
\n",
"
public
\n",
"
Those that create the web
\n",
"
49.259998
\n",
"
-123.139999
\n",
"
(49.2599983215332, -123.13999938964844)
\n",
"
\n",
"
\n",
"
110
\n",
"
14038802
\n",
"
Big Data Developers in Vancouver
\n",
"
2872
\n",
"
4.64
\n",
"
open
\n",
"
public
\n",
"
Big Data Enthusiasts
\n",
"
49.279999
\n",
"
-123.120003
\n",
"
(49.279998779296875, -123.12000274658203)
\n",
"
\n",
"
\n",
"
11
\n",
"
1438007
\n",
"
The Vancouver WordPress Meetup Group
\n",
"
2705
\n",
"
4.49
\n",
"
open
\n",
"
public
\n",
"
WordPress Enthusiasts
\n",
"
49.270000
\n",
"
-123.150002
\n",
"
(49.27000045776367, -123.1500015258789)
\n",
"
\n",
"
\n",
"
4
\n",
"
573925
\n",
"
Vancouver Ruby Meetup Group
\n",
"
2624
\n",
"
4.59
\n",
"
open
\n",
"
public
\n",
"
Ruby Developers
\n",
"
49.279999
\n",
"
-123.110001
\n",
"
(49.279998779296875, -123.11000061035156)
\n",
"
\n",
"
\n",
"
20
\n",
"
1618572
\n",
"
VanUE
\n",
"
2620
\n",
"
4.45
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.110001
\n",
"
(49.279998779296875, -123.11000061035156)
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name members rating \\\n",
"85 9636222 Style & Class 2895 4.74 \n",
"110 14038802 Big Data Developers in Vancouver 2872 4.64 \n",
"11 1438007 The Vancouver WordPress Meetup Group 2705 4.49 \n",
"4 573925 Vancouver Ruby Meetup Group 2624 4.59 \n",
"20 1618572 VanUE 2620 4.45 \n",
"\n",
" join_mode visibility who lat lon \\\n",
"85 open public Those that create the web 49.259998 -123.139999 \n",
"110 open public Big Data Enthusiasts 49.279999 -123.120003 \n",
"11 open public WordPress Enthusiasts 49.270000 -123.150002 \n",
"4 open public Ruby Developers 49.279999 -123.110001 \n",
"20 open public Members 49.279999 -123.110001 \n",
"\n",
" location \n",
"85 (49.2599983215332, -123.13999938964844) \n",
"110 (49.279998779296875, -123.12000274658203) \n",
"11 (49.27000045776367, -123.1500015258789) \n",
"4 (49.279998779296875, -123.11000061035156) \n",
"20 (49.279998779296875, -123.11000061035156) "
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"non_largest_groups_with_ratings = groups_with_ratings[groups_with_ratings['members'] < 10 * median_members]\n",
"print(non_largest_groups_with_ratings.shape[0])\n",
"non_largest_groups_with_ratings.sort_values('members', ascending=False).head(5)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"cb_dark_blue = (0/255, 107/255, 164/255)\n",
"cb_orange = (255/255, 128/255, 14/255)\n",
"\n",
"# largest tech groups\n",
"plt.scatter(largest_tech_groups['members'], \n",
" largest_tech_groups['rating'],\n",
" color=cb_dark_blue,\n",
" alpha=0.5,\n",
" label='largest')\n",
"\n",
"# non-largest tech groups\n",
"plt.scatter(non_largest_groups_with_ratings['members'],\n",
" non_largest_groups_with_ratings['rating'],\n",
" color=cb_orange,\n",
" alpha=0.5,\n",
" label='non-largest')\n",
"\n",
"plt.title('Members vs Ratings')\n",
"plt.xlabel('Members')\n",
"plt.ylabel('Ratings')\n",
"plt.legend()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observations**:\n",
"\n",
"- The largest Tech groups **are not rated higher** than the other rated smaller groups\n",
"- There are a number of highly rated smaller groups (with ratings close to or at 5.0). This goes along with our earlier findings that ~90% of groups have members in the 100's\n",
"- Out of the groups with a rating, a **majority have very high ratings (above 4.0)**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Groups with no Ratings**\n",
"\n",
"Let's look into groups with no ratings:"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"143\n"
]
}
],
"source": [
"groups_with_no_ratings = vancouver_tech_groups[vancouver_tech_groups['rating'] == 0.0]\n",
"print(groups_with_no_ratings.shape[0])"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 143.000000\n",
"mean 111.062937\n",
"std 140.850296\n",
"min 1.000000\n",
"25% 35.000000\n",
"50% 60.000000\n",
"75% 135.500000\n",
"max 1084.000000\n",
"Name: members, dtype: float64"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_with_no_ratings['members'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
members
\n",
"
rating
\n",
"
join_mode
\n",
"
visibility
\n",
"
who
\n",
"
lat
\n",
"
lon
\n",
"
location
\n",
"
\n",
" \n",
" \n",
"
\n",
"
357
\n",
"
28775204
\n",
"
Vancouver AI Tech Talk
\n",
"
1084
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
371
\n",
"
29424450
\n",
"
Devhub Vancouver
\n",
"
646
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.120003
\n",
"
(49.279998779296875, -123.12000274658203)
\n",
"
\n",
"
\n",
"
131
\n",
"
18221599
\n",
"
Vancouver ACM SIGGRAPH
\n",
"
571
\n",
"
0.0
\n",
"
approval
\n",
"
public
\n",
"
Computer Graphics Professionals
\n",
"
49.279999
\n",
"
-123.110001
\n",
"
(49.279998779296875, -123.11000061035156)
\n",
"
\n",
"
\n",
"
223
\n",
"
21464522
\n",
"
Social After Tech
\n",
"
559
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
189
\n",
"
19878077
\n",
"
Futures of Learning
\n",
"
449
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Learning Practitioners
\n",
"
49.279999
\n",
"
-123.110001
\n",
"
(49.279998779296875, -123.11000061035156)
\n",
"
\n",
"
\n",
"
380
\n",
"
29739350
\n",
"
Node&JS Community Hangouts
\n",
"
392
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
297
\n",
"
26682494
\n",
"
Women in Emerging Tech
\n",
"
377
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Emerging Techies
\n",
"
49.279999
\n",
"
-123.110001
\n",
"
(49.279998779296875, -123.11000061035156)
\n",
"
\n",
"
\n",
"
324
\n",
"
27819281
\n",
"
ProductTank Vancouver
\n",
"
344
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Product People
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
356
\n",
"
28719901
\n",
"
Design Systems Vancouver
\n",
"
332
\n",
"
0.0
\n",
"
approval
\n",
"
public
\n",
"
Members
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
"
\n",
"
326
\n",
"
27851504
\n",
"
Vancity Vue.js
\n",
"
326
\n",
"
0.0
\n",
"
open
\n",
"
public
\n",
"
Developers
\n",
"
49.279999
\n",
"
-123.040001
\n",
"
(49.279998779296875, -123.04000091552734)
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name members rating join_mode \\\n",
"357 28775204 Vancouver AI Tech Talk 1084 0.0 open \n",
"371 29424450 Devhub Vancouver 646 0.0 open \n",
"131 18221599 Vancouver ACM SIGGRAPH 571 0.0 approval \n",
"223 21464522 Social After Tech 559 0.0 open \n",
"189 19878077 Futures of Learning 449 0.0 open \n",
"380 29739350 Node&JS Community Hangouts 392 0.0 open \n",
"297 26682494 Women in Emerging Tech 377 0.0 open \n",
"324 27819281 ProductTank Vancouver 344 0.0 open \n",
"356 28719901 Design Systems Vancouver 332 0.0 approval \n",
"326 27851504 Vancity Vue.js 326 0.0 open \n",
"\n",
" visibility who lat lon \\\n",
"357 public Members 49.279999 -123.040001 \n",
"371 public Members 49.279999 -123.120003 \n",
"131 public Computer Graphics Professionals 49.279999 -123.110001 \n",
"223 public Members 49.279999 -123.040001 \n",
"189 public Learning Practitioners 49.279999 -123.110001 \n",
"380 public Members 49.279999 -123.040001 \n",
"297 public Emerging Techies 49.279999 -123.110001 \n",
"324 public Product People 49.279999 -123.040001 \n",
"356 public Members 49.279999 -123.040001 \n",
"326 public Developers 49.279999 -123.040001 \n",
"\n",
" location \n",
"357 (49.279998779296875, -123.04000091552734) \n",
"371 (49.279998779296875, -123.12000274658203) \n",
"131 (49.279998779296875, -123.11000061035156) \n",
"223 (49.279998779296875, -123.04000091552734) \n",
"189 (49.279998779296875, -123.11000061035156) \n",
"380 (49.279998779296875, -123.04000091552734) \n",
"297 (49.279998779296875, -123.11000061035156) \n",
"324 (49.279998779296875, -123.04000091552734) \n",
"356 (49.279998779296875, -123.04000091552734) \n",
"326 (49.279998779296875, -123.04000091552734) "
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups_with_no_ratings.sort_values('members', ascending=False).head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observations**:\n",
"\n",
"- A lot of the groups with no ratings actually have quite a number of members with the largest group having over 1000 members\n",
"- I wonder why these groups despite having decent number of members have **0** rating\n",
"- One possible explanation could be these groups may have not held an event yet. But I know the _Vancouver AI Tech Talk_ has regular online events where talks are streamed."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Group Events\n",
"\n",
"For the purpose of this initial scoped project, we will look at the group events for the largest tech meetup groups.\n",
"\n",
"We will use the [GetEvents] method.\n",
"\n",
"[GetEvents]: https://meetup-api.readthedocs.io/en/latest/meetup_api.html#meetup.api.meetup.api.Client.GetEvents"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'144695,229052,1013148,1526926,1583286,1642334,1751788,1798770,3238812,3946322,4869742,11908342,18381330,18515170,18532714,19162038,19905099'"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# first we need the id of the groups\n",
"group_ids = largest_tech_groups['id'].tolist()\n",
"ids = ','.join(str(x) for x in group_ids)\n",
"ids"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"22/30 (2 seconds remaining)\n"
]
}
],
"source": [
"events_resp = client.GetEvents(group_id=ids, status='past')"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"events_meta, events_df = parse_response(events_resp)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
0
\n",
"
\n",
" \n",
" \n",
"
\n",
"
next
\n",
"
https://api.meetup.com/2/events?offset=1&forma...
\n",
"
\n",
"
\n",
"
method
\n",
"
Events
\n",
"
\n",
"
\n",
"
total_count
\n",
"
3283
\n",
"
\n",
"
\n",
"
link
\n",
"
https://api.meetup.com/2/events
\n",
"
\n",
"
\n",
"
count
\n",
"
200
\n",
"
\n",
"
\n",
"
description
\n",
"
Access Meetup events using a group, member, or...
\n",
"
\n",
"
\n",
"
lon
\n",
"
\n",
"
\n",
"
\n",
"
title
\n",
"
Meetup Events v2
\n",
"
\n",
"
\n",
"
url
\n",
"
https://api.meetup.com/2/events?offset=0&forma...
\n",
"
\n",
"
\n",
"
id
\n",
"
\n",
"
\n",
"
\n",
"
updated
\n",
"
1551244894000
\n",
"
\n",
"
\n",
"
lat
\n",
"
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0\n",
"next https://api.meetup.com/2/events?offset=1&forma...\n",
"method Events\n",
"total_count 3283\n",
"link https://api.meetup.com/2/events\n",
"count 200\n",
"description Access Meetup events using a group, member, or...\n",
"lon \n",
"title Meetup Events v2\n",
"url https://api.meetup.com/2/events?offset=0&forma...\n",
"id \n",
"updated 1551244894000\n",
"lat "
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"events_meta"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observations**\n",
"\n",
"From the response's metadata, we observe that there are **3279** events for our largest tech meetups. As we specified past events, this may have given us all the past events.\n",
"\n",
"Let's limit it to the past 6 months. All time data is represented as **epoch milliseconds**. So we need to represent the date range between now and 6 months ago in this format.\n",
"\n",
"- Today's Date: **Sunday February 24th 2019**\n",
"- Six Months Ago: **Friday, August 24th 2018**"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Now: 1550990827123\t Six months ago: 1535179627123\n"
]
}
],
"source": [
"def to_millis(dt):\n",
" val = pd.to_datetime(dt)\n",
" print(f\"Value:{val}|{val.value}\")\n",
" return int(pd.to_datetime(dt).value / 1000000)\n",
"\n",
"\n",
"#right_now = to_millis(datetime.datetime.now())\n",
"right_now = 1550990827123 # represents 2019-02-24 06:47:07 AM PT\n",
"six_months_ago = int(right_now -183 * 24 * 60 * 60 * 1000)\n",
"print(f\"Now: {right_now}\\t Six months ago: {six_months_ago}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The original above cell was run on **Sunday, February 24th 2019 around 06:47:07 AM PT**. In order to keep the analysis below valid, the microsecond value that the `to_millis()` function returned was hard coded in. Otherwise the date would change each time the above cell is run as you can see from the commented out line. I will consider this in future projects and find a better way of keeping the original proper date format."
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"29/30 (10 seconds remaining)\n"
]
},
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" id time_ms duration_ms yes_rsvp_count waitlist_count \\\n",
"0 19905099 1535418000000 12600000 96 0 \n",
"\n",
" time duration \n",
"0 08/28/18 01:00 3 hours, 30 minutes "
]
},
"execution_count": 80,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# rename columns\n",
"rename_map = {\n",
" 'group_id': 'id', #need to change this so we can later merge with the groups df!\n",
" 'time': 'time_ms',\n",
" 'time_human': 'time',\n",
" 'duration': 'duration_ms',\n",
" 'duration_human': 'duration'\n",
"}\n",
"past_events_df = past_events_df.rename(rename_map, axis='columns')\n",
"\n",
"past_events_df.head(1)"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
time
\n",
"
time_ms
\n",
"
duration
\n",
"
duration_ms
\n",
"
yes_rsvp_count
\n",
"
waitlist_count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
19905099
\n",
"
08/28/18 01:00
\n",
"
1535418000000
\n",
"
3 hours, 30 minutes
\n",
"
12600000
\n",
"
96
\n",
"
0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id time time_ms duration duration_ms \\\n",
"0 19905099 08/28/18 01:00 1535418000000 3 hours, 30 minutes 12600000 \n",
"\n",
" yes_rsvp_count waitlist_count \n",
"0 96 0 "
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# re-order columns\n",
"new_column_order = ['id', 'time', 'time_ms', 'duration', 'duration_ms',\n",
" 'yes_rsvp_count', 'waitlist_count']\n",
"\n",
"past_events_df = past_events_df[new_column_order]\n",
"\n",
"past_events_df.head(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Merge Largest Tech Meetups and Events Dataframes\n",
"\n",
"To properly analyze the events, we should match them back up with their respective group.\n",
"\n",
"We will merge the two dataframes (`largest_tech_groups` and `past_events_df`) in a operation which is similar to a _left join_ in SQL.\n",
"\n",
"Left Join is picked as we want to retain all rows from our past events dataframe, while getting only the rows from our groups dataframe. Although in this case, as the events were derived from the group and assuming each group hosted at least one event in the past 6 months, we should end up retaining all events and all groups data.\n",
"\n",
"We will filter out unnecessary columns and sort the ouput by **group name** ascending and then **time** descending."
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Largest Tech Groups Columns:\n",
"Index(['id', 'name', 'members', 'rating', 'join_mode', 'visibility', 'who',\n",
" 'lat', 'lon', 'location'],\n",
" dtype='object')\n",
"\n",
"Past Events Columns:\n",
"Index(['id', 'time', 'time_ms', 'duration', 'duration_ms', 'yes_rsvp_count',\n",
" 'waitlist_count'],\n",
" dtype='object')\n"
]
}
],
"source": [
"print(f\"Largest Tech Groups Columns:\\n{largest_tech_groups.columns}\")\n",
"print(f\"\\nPast Events Columns:\\n{past_events_df.columns}\")"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"g = sns.lmplot(x=\"time_ms\", y=\"yes_rsvp_count\", \n",
" data=without_yvr_startups, hue=\"name\", \n",
" height=6, aspect=2, \n",
" order=1, ci=None)\n",
"\n",
"plt.title(\"Yes RSVP's over Time\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observations**:\n",
"\n",
"We are able to confirm the largest downward trending group was the The _YVR Startups_ group. It was quite an outlier.\n",
"\n",
"We get a slightly closer view of the remaining plots. But it isn't quite easy to figure out which groups to pick.\n",
"\n",
"Let's look at average RSVPs and frequency of events:\n",
"\n",
"**Average RSVPs**"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
name
\n",
"
id
\n",
"
time_ms
\n",
"
yes_rsvp_count
\n",
"
waitlist_count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
2
\n",
"
BrainStation Vancouver
\n",
"
18515170.0
\n",
"
1.542418e+12
\n",
"
5.360656
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
1
\n",
"
Bitcoin Vancouver
\n",
"
3238812.0
\n",
"
1.540088e+12
\n",
"
11.400000
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
13
\n",
"
Vancouver Pixel Crafters
\n",
"
1583286.0
\n",
"
1.542226e+12
\n",
"
14.481481
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
10
\n",
"
VanDev: Vancouver's Software Developers Network
\n",
"
144695.0
\n",
"
1.542207e+12
\n",
"
19.000000
\n",
"
2.600000
\n",
"
\n",
"
\n",
"
14
\n",
"
Vancouver Startup Founder 101
\n",
"
18381330.0
\n",
"
1.543088e+12
\n",
"
19.500000
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
3
\n",
"
Code & Coffee (Vancouver)
\n",
"
11908342.0
\n",
"
1.542799e+12
\n",
"
21.730769
\n",
"
0.076923
\n",
"
\n",
"
\n",
"
12
\n",
"
Vancouver Data Visualization
\n",
"
1798770.0
\n",
"
1.539124e+12
\n",
"
29.333333
\n",
"
15.000000
\n",
"
\n",
"
\n",
"
15
\n",
"
YVR Startups
\n",
"
19905099.0
\n",
"
1.543489e+12
\n",
"
49.733333
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
6
\n",
"
Learn Data Science
\n",
"
18532714.0
\n",
"
1.542407e+12
\n",
"
57.258065
\n",
"
4.225806
\n",
"
\n",
"
\n",
"
7
\n",
"
NetSquared Vancouver: Tech4Good and Nonprofits
\n",
"
1013148.0
\n",
"
1.543106e+12
\n",
"
66.000000
\n",
"
0.166667
\n",
"
\n",
"
\n",
"
4
\n",
"
Full Indie
\n",
"
1642334.0
\n",
"
1.542010e+12
\n",
"
86.250000
\n",
"
3.500000
\n",
"
\n",
"
\n",
"
0
\n",
"
Agile Vancouver
\n",
"
1751788.0
\n",
"
1.542008e+12
\n",
"
90.250000
\n",
"
13.250000
\n",
"
\n",
"
\n",
"
5
\n",
"
HackerNest Vancouver Tech Socials
\n",
"
4869742.0
\n",
"
1.541788e+12
\n",
"
93.333333
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
11
\n",
"
VanJS: Vancouver JavaScript Developers
\n",
"
1526926.0
\n",
"
1.538098e+12
\n",
"
119.000000
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
8
\n",
"
TechVancouver
\n",
"
19162038.0
\n",
"
1.543225e+12
\n",
"
140.166667
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
9
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
229052.0
\n",
"
1.544362e+12
\n",
"
174.500000
\n",
"
3.000000
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name id time_ms \\\n",
"2 BrainStation Vancouver 18515170.0 1.542418e+12 \n",
"1 Bitcoin Vancouver 3238812.0 1.540088e+12 \n",
"13 Vancouver Pixel Crafters 1583286.0 1.542226e+12 \n",
"10 VanDev: Vancouver's Software Developers Network 144695.0 1.542207e+12 \n",
"14 Vancouver Startup Founder 101 18381330.0 1.543088e+12 \n",
"3 Code & Coffee (Vancouver) 11908342.0 1.542799e+12 \n",
"12 Vancouver Data Visualization 1798770.0 1.539124e+12 \n",
"15 YVR Startups 19905099.0 1.543489e+12 \n",
"6 Learn Data Science 18532714.0 1.542407e+12 \n",
"7 NetSquared Vancouver: Tech4Good and Nonprofits 1013148.0 1.543106e+12 \n",
"4 Full Indie 1642334.0 1.542010e+12 \n",
"0 Agile Vancouver 1751788.0 1.542008e+12 \n",
"5 HackerNest Vancouver Tech Socials 4869742.0 1.541788e+12 \n",
"11 VanJS: Vancouver JavaScript Developers 1526926.0 1.538098e+12 \n",
"8 TechVancouver 19162038.0 1.543225e+12 \n",
"9 The Vancouver Web Design Meetup Group 229052.0 1.544362e+12 \n",
"\n",
" yes_rsvp_count waitlist_count \n",
"2 5.360656 0.000000 \n",
"1 11.400000 0.000000 \n",
"13 14.481481 0.000000 \n",
"10 19.000000 2.600000 \n",
"14 19.500000 0.000000 \n",
"3 21.730769 0.076923 \n",
"12 29.333333 15.000000 \n",
"15 49.733333 0.000000 \n",
"6 57.258065 4.225806 \n",
"7 66.000000 0.166667 \n",
"4 86.250000 3.500000 \n",
"0 90.250000 13.250000 \n",
"5 93.333333 0.000000 \n",
"11 119.000000 0.000000 \n",
"8 140.166667 0.000000 \n",
"9 174.500000 3.000000 "
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rsvp_df = final_df.groupby(['name'], as_index=False).mean()\n",
"\n",
"rsvp_df = rsvp_df.sort_values(by=['yes_rsvp_count', 'name'], ascending=[True, True])\n",
"rsvp_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observations**:\n",
"\n",
"There are 7 groups that get less than 30 YES RSVPs on average. As these groups have members of over 3000, 30 RSVPs represents only **1%** of all members of these groups.\n",
"\n",
"Out of these 3 had a non 0 average for their waitlist count:\n",
"\n",
"- VanDev: Vancouver's Software Developers Network\n",
"- Code & Coffee (Vancouver)\n",
"- Vancouver Data Visualization\n",
"\n",
"Which leads to another question:\n",
"\n",
"- How can a group have on average low RSVPs yet have people on the waitlist?\n",
"\n",
"Let's focus on YES RSVPs for now and drop these groups."
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(75, 7)\n",
"\n",
"Remaining Groups:\n",
"['Agile Vancouver' 'Full Indie' 'HackerNest Vancouver Tech Socials'\n",
" 'Learn Data Science' 'NetSquared Vancouver: Tech4Good and Nonprofits'\n",
" 'TechVancouver' 'The Vancouver Web Design Meetup Group'\n",
" 'VanJS: Vancouver JavaScript Developers' 'YVR Startups']\n"
]
}
],
"source": [
"groups_to_drop = [\n",
" 'BrainStation Vancouver', 'Bitcoin Vancouver',\n",
" 'Code & Coffee (Vancouver)', 'Vancouver Startup Founder 101',\n",
" \"VanDev: Vancouver's Software Developers Network\",\n",
" 'Vancouver Data Visualization', 'Vancouver Pixel Crafters',\n",
"]\n",
"\n",
"largest_groups_events = final_df.copy()\n",
"largest_groups_events = largest_groups_events[~largest_groups_events['name'].isin(\n",
" groups_to_drop)]\n",
"\n",
"print(largest_groups_events.shape)\n",
"print(f\"\\nRemaining Groups:\\n{largest_groups_events['name'].unique()}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Frequency of Events**"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
name
\n",
"
id
\n",
"
time
\n",
"
time_ms
\n",
"
duration
\n",
"
yes_rsvp_count
\n",
"
waitlist_count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Agile Vancouver
\n",
"
4
\n",
"
4
\n",
"
4
\n",
"
4
\n",
"
4
\n",
"
4
\n",
"
\n",
"
\n",
"
1
\n",
"
Full Indie
\n",
"
4
\n",
"
4
\n",
"
4
\n",
"
4
\n",
"
4
\n",
"
4
\n",
"
\n",
"
\n",
"
2
\n",
"
HackerNest Vancouver Tech Socials
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
\n",
"
\n",
"
3
\n",
"
Learn Data Science
\n",
"
31
\n",
"
31
\n",
"
31
\n",
"
31
\n",
"
31
\n",
"
31
\n",
"
\n",
"
\n",
"
4
\n",
"
NetSquared Vancouver: Tech4Good and Nonprofits
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
\n",
"
\n",
"
5
\n",
"
TechVancouver
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
6
\n",
"
\n",
"
\n",
"
6
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
2
\n",
"
2
\n",
"
2
\n",
"
2
\n",
"
2
\n",
"
2
\n",
"
\n",
"
\n",
"
7
\n",
"
VanJS: Vancouver JavaScript Developers
\n",
"
1
\n",
"
1
\n",
"
1
\n",
"
1
\n",
"
1
\n",
"
1
\n",
"
\n",
"
\n",
"
8
\n",
"
YVR Startups
\n",
"
15
\n",
"
15
\n",
"
15
\n",
"
15
\n",
"
15
\n",
"
15
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name id time time_ms \\\n",
"0 Agile Vancouver 4 4 4 \n",
"1 Full Indie 4 4 4 \n",
"2 HackerNest Vancouver Tech Socials 6 6 6 \n",
"3 Learn Data Science 31 31 31 \n",
"4 NetSquared Vancouver: Tech4Good and Nonprofits 6 6 6 \n",
"5 TechVancouver 6 6 6 \n",
"6 The Vancouver Web Design Meetup Group 2 2 2 \n",
"7 VanJS: Vancouver JavaScript Developers 1 1 1 \n",
"8 YVR Startups 15 15 15 \n",
"\n",
" duration yes_rsvp_count waitlist_count \n",
"0 4 4 4 \n",
"1 4 4 4 \n",
"2 6 6 6 \n",
"3 31 31 31 \n",
"4 6 6 6 \n",
"5 6 6 6 \n",
"6 2 2 2 \n",
"7 1 1 1 \n",
"8 15 15 15 "
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"event_count_df = largest_groups_events.groupby('name', as_index=False).count()\n",
"\n",
"event_count_df = event_count_df.sort_values(by='name', ascending=True)\n",
"event_count_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observation**:\n",
"\n",
"- With the exception of _Learn Data Science_ and _YVR Startups_, every other group met less than 10 times in the past 6 months\n",
"- A couple of meetups have only met once or twice:\n",
" - _VanJS: Vancouver JavaScript Developers_ met only once\n",
" - _Vancouver Web Design Meetup Group_ met twice"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Focus on Infrequently meeting groups**\n",
"\n",
"Let's filter out _Learn Data Science_ and _YVR Startups_ and see when was the last time the other meetups met."
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(29, 7)\n",
"\n",
"Remaining Groups:\n",
"['Agile Vancouver' 'Full Indie' 'HackerNest Vancouver Tech Socials'\n",
" 'NetSquared Vancouver: Tech4Good and Nonprofits' 'TechVancouver'\n",
" 'The Vancouver Web Design Meetup Group'\n",
" 'VanJS: Vancouver JavaScript Developers']\n"
]
}
],
"source": [
"groups_to_drop = ['Learn Data Science', 'YVR Startups']\n",
"\n",
"infrequent_groups = largest_groups_events[~largest_groups_events['name'].isin(\n",
" groups_to_drop)]\n",
"\n",
"print(infrequent_groups.shape)\n",
"print(f\"\\nRemaining Groups:\\n{infrequent_groups['name'].unique()}\")"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
time
\n",
"
time_ms
\n",
"
duration
\n",
"
yes_rsvp_count
\n",
"
waitlist_count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
34
\n",
"
1751788
\n",
"
Agile Vancouver
\n",
"
09/19/18 01:00
\n",
"
1537318800000
\n",
"
2 hours, 0 minutes
\n",
"
66
\n",
"
0
\n",
"
\n",
"
\n",
"
70
\n",
"
1751788
\n",
"
Agile Vancouver
\n",
"
10/17/18 01:00
\n",
"
1539738000000
\n",
"
2 hours, 0 minutes
\n",
"
75
\n",
"
0
\n",
"
\n",
"
\n",
"
123
\n",
"
1751788
\n",
"
Agile Vancouver
\n",
"
11/21/18 02:00
\n",
"
1542765600000
\n",
"
2 hours, 0 minutes
\n",
"
120
\n",
"
14
\n",
"
\n",
"
\n",
"
195
\n",
"
1751788
\n",
"
Agile Vancouver
\n",
"
01/23/19 02:00
\n",
"
1548208800000
\n",
"
3 hours, 0 minutes
\n",
"
100
\n",
"
39
\n",
"
\n",
"
\n",
"
8
\n",
"
1642334
\n",
"
Full Indie
\n",
"
08/29/18 01:00
\n",
"
1535504400000
\n",
"
3 hours, 0 minutes
\n",
"
20
\n",
"
14
\n",
"
\n",
"
\n",
"
83
\n",
"
1642334
\n",
"
Full Indie
\n",
"
10/24/18 02:00
\n",
"
1540346400000
\n",
"
2 hours, 0 minutes
\n",
"
111
\n",
"
0
\n",
"
\n",
"
\n",
"
140
\n",
"
1642334
\n",
"
Full Indie
\n",
"
11/29/18 03:00
\n",
"
1543460400000
\n",
"
2 hours, 0 minutes
\n",
"
104
\n",
"
0
\n",
"
\n",
"
\n",
"
206
\n",
"
1642334
\n",
"
Full Indie
\n",
"
01/29/19 03:00
\n",
"
1548730800000
\n",
"
2 hours, 0 minutes
\n",
"
110
\n",
"
0
\n",
"
\n",
"
\n",
"
4
\n",
"
4869742
\n",
"
HackerNest Vancouver Tech Socials
\n",
"
08/28/18 02:00
\n",
"
1535421600000
\n",
"
2 hours, 0 minutes
\n",
"
65
\n",
"
0
\n",
"
\n",
"
\n",
"
43
\n",
"
4869742
\n",
"
HackerNest Vancouver Tech Socials
\n",
"
09/25/18 02:00
\n",
"
1537840800000
\n",
"
2 hours, 0 minutes
\n",
"
75
\n",
"
0
\n",
"
\n",
"
\n",
"
95
\n",
"
4869742
\n",
"
HackerNest Vancouver Tech Socials
\n",
"
10/30/18 02:00
\n",
"
1540864800000
\n",
"
2 hours, 0 minutes
\n",
"
142
\n",
"
0
\n",
"
\n",
"
\n",
"
133
\n",
"
4869742
\n",
"
HackerNest Vancouver Tech Socials
\n",
"
11/27/18 03:00
\n",
"
1543287600000
\n",
"
2 hours, 0 minutes
\n",
"
118
\n",
"
0
\n",
"
\n",
"
\n",
"
158
\n",
"
4869742
\n",
"
HackerNest Vancouver Tech Socials
\n",
"
12/12/18 02:00
\n",
"
1544580000000
\n",
"
3 hours, 0 minutes
\n",
"
8
\n",
"
0
\n",
"
\n",
"
\n",
"
205
\n",
"
4869742
\n",
"
HackerNest Vancouver Tech Socials
\n",
"
01/29/19 03:00
\n",
"
1548730800000
\n",
"
2 hours, 0 minutes
\n",
"
152
\n",
"
0
\n",
"
\n",
"
\n",
"
25
\n",
"
1013148
\n",
"
NetSquared Vancouver: Tech4Good and Nonprofits
\n",
"
09/12/18 00:30
\n",
"
1536712200000
\n",
"
2 hours, 30 minutes
\n",
"
68
\n",
"
0
\n",
"
\n",
"
\n",
"
66
\n",
"
1013148
\n",
"
NetSquared Vancouver: Tech4Good and Nonprofits
\n",
"
10/11/18 00:30
\n",
"
1539217800000
\n",
"
2 hours, 0 minutes
\n",
"
50
\n",
"
0
\n",
"
\n",
"
\n",
"
101
\n",
"
1013148
\n",
"
NetSquared Vancouver: Tech4Good and Nonprofits
\n",
"
11/07/18 01:30
\n",
"
1541554200000
\n",
"
2 hours, 30 minutes
\n",
"
76
\n",
"
0
\n",
"
\n",
"
\n",
"
144
\n",
"
1013148
\n",
"
NetSquared Vancouver: Tech4Good and Nonprofits
\n",
"
11/30/18 01:30
\n",
"
1543541400000
\n",
"
2 hours, 0 minutes
\n",
"
37
\n",
"
0
\n",
"
\n",
"
\n",
"
178
\n",
"
1013148
\n",
"
NetSquared Vancouver: Tech4Good and Nonprofits
\n",
"
01/09/19 02:00
\n",
"
1546999200000
\n",
"
2 hours, 0 minutes
\n",
"
105
\n",
"
0
\n",
"
\n",
"
\n",
"
225
\n",
"
1013148
\n",
"
NetSquared Vancouver: Tech4Good and Nonprofits
\n",
"
02/19/19 21:00
\n",
"
1550610000000
\n",
"
3 hours, 0 minutes
\n",
"
60
\n",
"
1
\n",
"
\n",
"
\n",
"
26
\n",
"
19162038
\n",
"
TechVancouver
\n",
"
09/12/18 01:00
\n",
"
1536714000000
\n",
"
3 hours, 0 minutes
\n",
"
147
\n",
"
0
\n",
"
\n",
"
\n",
"
62
\n",
"
19162038
\n",
"
TechVancouver
\n",
"
10/10/18 01:00
\n",
"
1539133200000
\n",
"
3 hours, 0 minutes
\n",
"
112
\n",
"
0
\n",
"
\n",
"
\n",
"
116
\n",
"
19162038
\n",
"
TechVancouver
\n",
"
11/15/18 02:00
\n",
"
1542247200000
\n",
"
2 hours, 0 minutes
\n",
"
143
\n",
"
0
\n",
"
\n",
"
\n",
"
160
\n",
"
19162038
\n",
"
TechVancouver
\n",
"
12/12/18 02:00
\n",
"
1544580000000
\n",
"
2 hours, 0 minutes
\n",
"
143
\n",
"
0
\n",
"
\n",
"
\n",
"
182
\n",
"
19162038
\n",
"
TechVancouver
\n",
"
01/10/19 02:00
\n",
"
1547085600000
\n",
"
3 hours, 0 minutes
\n",
"
133
\n",
"
0
\n",
"
\n",
"
\n",
"
218
\n",
"
19162038
\n",
"
TechVancouver
\n",
"
02/08/19 02:00
\n",
"
1549591200000
\n",
"
3 hours, 0 minutes
\n",
"
163
\n",
"
0
\n",
"
\n",
"
\n",
"
81
\n",
"
229052
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
10/24/18 01:00
\n",
"
1540342800000
\n",
"
2 hours, 0 minutes
\n",
"
150
\n",
"
0
\n",
"
\n",
"
\n",
"
203
\n",
"
229052
\n",
"
The Vancouver Web Design Meetup Group
\n",
"
01/25/19 02:00
\n",
"
1548381600000
\n",
"
2 hours, 0 minutes
\n",
"
199
\n",
"
6
\n",
"
\n",
"
\n",
"
52
\n",
"
1526926
\n",
"
VanJS: Vancouver JavaScript Developers
\n",
"
09/28/18 01:30
\n",
"
1538098200000
\n",
"
2 hours, 30 minutes
\n",
"
119
\n",
"
0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name time \\\n",
"34 1751788 Agile Vancouver 09/19/18 01:00 \n",
"70 1751788 Agile Vancouver 10/17/18 01:00 \n",
"123 1751788 Agile Vancouver 11/21/18 02:00 \n",
"195 1751788 Agile Vancouver 01/23/19 02:00 \n",
"8 1642334 Full Indie 08/29/18 01:00 \n",
"83 1642334 Full Indie 10/24/18 02:00 \n",
"140 1642334 Full Indie 11/29/18 03:00 \n",
"206 1642334 Full Indie 01/29/19 03:00 \n",
"4 4869742 HackerNest Vancouver Tech Socials 08/28/18 02:00 \n",
"43 4869742 HackerNest Vancouver Tech Socials 09/25/18 02:00 \n",
"95 4869742 HackerNest Vancouver Tech Socials 10/30/18 02:00 \n",
"133 4869742 HackerNest Vancouver Tech Socials 11/27/18 03:00 \n",
"158 4869742 HackerNest Vancouver Tech Socials 12/12/18 02:00 \n",
"205 4869742 HackerNest Vancouver Tech Socials 01/29/19 03:00 \n",
"25 1013148 NetSquared Vancouver: Tech4Good and Nonprofits 09/12/18 00:30 \n",
"66 1013148 NetSquared Vancouver: Tech4Good and Nonprofits 10/11/18 00:30 \n",
"101 1013148 NetSquared Vancouver: Tech4Good and Nonprofits 11/07/18 01:30 \n",
"144 1013148 NetSquared Vancouver: Tech4Good and Nonprofits 11/30/18 01:30 \n",
"178 1013148 NetSquared Vancouver: Tech4Good and Nonprofits 01/09/19 02:00 \n",
"225 1013148 NetSquared Vancouver: Tech4Good and Nonprofits 02/19/19 21:00 \n",
"26 19162038 TechVancouver 09/12/18 01:00 \n",
"62 19162038 TechVancouver 10/10/18 01:00 \n",
"116 19162038 TechVancouver 11/15/18 02:00 \n",
"160 19162038 TechVancouver 12/12/18 02:00 \n",
"182 19162038 TechVancouver 01/10/19 02:00 \n",
"218 19162038 TechVancouver 02/08/19 02:00 \n",
"81 229052 The Vancouver Web Design Meetup Group 10/24/18 01:00 \n",
"203 229052 The Vancouver Web Design Meetup Group 01/25/19 02:00 \n",
"52 1526926 VanJS: Vancouver JavaScript Developers 09/28/18 01:30 \n",
"\n",
" time_ms duration yes_rsvp_count waitlist_count \n",
"34 1537318800000 2 hours, 0 minutes 66 0 \n",
"70 1539738000000 2 hours, 0 minutes 75 0 \n",
"123 1542765600000 2 hours, 0 minutes 120 14 \n",
"195 1548208800000 3 hours, 0 minutes 100 39 \n",
"8 1535504400000 3 hours, 0 minutes 20 14 \n",
"83 1540346400000 2 hours, 0 minutes 111 0 \n",
"140 1543460400000 2 hours, 0 minutes 104 0 \n",
"206 1548730800000 2 hours, 0 minutes 110 0 \n",
"4 1535421600000 2 hours, 0 minutes 65 0 \n",
"43 1537840800000 2 hours, 0 minutes 75 0 \n",
"95 1540864800000 2 hours, 0 minutes 142 0 \n",
"133 1543287600000 2 hours, 0 minutes 118 0 \n",
"158 1544580000000 3 hours, 0 minutes 8 0 \n",
"205 1548730800000 2 hours, 0 minutes 152 0 \n",
"25 1536712200000 2 hours, 30 minutes 68 0 \n",
"66 1539217800000 2 hours, 0 minutes 50 0 \n",
"101 1541554200000 2 hours, 30 minutes 76 0 \n",
"144 1543541400000 2 hours, 0 minutes 37 0 \n",
"178 1546999200000 2 hours, 0 minutes 105 0 \n",
"225 1550610000000 3 hours, 0 minutes 60 1 \n",
"26 1536714000000 3 hours, 0 minutes 147 0 \n",
"62 1539133200000 3 hours, 0 minutes 112 0 \n",
"116 1542247200000 2 hours, 0 minutes 143 0 \n",
"160 1544580000000 2 hours, 0 minutes 143 0 \n",
"182 1547085600000 3 hours, 0 minutes 133 0 \n",
"218 1549591200000 3 hours, 0 minutes 163 0 \n",
"81 1540342800000 2 hours, 0 minutes 150 0 \n",
"203 1548381600000 2 hours, 0 minutes 199 6 \n",
"52 1538098200000 2 hours, 30 minutes 119 0 "
]
},
"execution_count": 96,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"infrequent_groups.sort_values(by=['name', 'time_ms'], ascending=[True, True])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Observations**:\n",
"\n",
"1. 2 Meetup groups don't meet frequently enough but have large attendance when they do (over 150 people):\n",
" - _VanJS: Vancouver JavaScript Developers_ had 1 event on September 28th 2018\n",
" - _The Vancouver Web Design Meetup Group_ had 1 event on October 2018 and 1 on January 2019.\n",
"2. The other Meetup groups meet once a month with a few groups skipping 1-2 months. The month of December are the holidays and people are busy with end of year activities both at work and in their personal lives, so it is understandable if meetups didn't host any events then.\n",
"3. The other Meetup groups are also in general increasing or maintaining their attendance over time with a few exceptions/outliers as mentioned in point 2 above.\n",
"\n",
"We should drop the 2 infrequently meeting groups."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Focus on Frequently meeting groups**\n",
"\n",
"Let's also look at the frequency of events for the two meetups which meet the most often:\n",
"- Learn Data Science\n",
"- YVR Startups"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(46, 7)\n",
"\n",
"Remaining Groups:\n",
"['Learn Data Science' 'YVR Startups']\n"
]
}
],
"source": [
"groups_to_keep = ['Learn Data Science', 'YVR Startups']\n",
"\n",
"frequent_groups = largest_groups_events[largest_groups_events['name'].isin(\n",
" groups_to_drop)]\n",
"\n",
"print(frequent_groups.shape)\n",
"print(f\"\\nRemaining Groups:\\n{frequent_groups['name'].unique()}\")"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"