{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction\n",
"\n",
"My friend [Johannes Giorgis] and I are developing a series of [Data Science Challenges] to help others\n",
"become better data scientists by presenting a series of challenges. Why did we do this?\n",
"\n",
"\n",
"> Because that's what heroes do!\n",
">\n",
"> --Johannes Giorgis\n",
"\n",
"I now present my response to the first challenge, Exploring the Meetup API in the city of my choice.\n",
"\n",
"**San Francisco, CA**, I choose you!\n",
"\n",
"\n",
"\n",
"# Challenge 01: Explore the Meetup API\n",
"Use the [Meetup API] to explore meetups in your city of choice.\n",
"\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",
"\t- What is the average size of meetups?\n",
"\t- How frequently do meetups host events?\n",
" \n",
"## Okay, but what I really want to know is\n",
"\n",
"What is the biggest Tech Group in San Francisco that meets regularly and has a growing and enthusiastic membership?\n",
"\n",
"\n",
"## Prerequisites:\n",
"Add a [Meetup API Key] to your environment.\n",
"\n",
"[//]: # (References)\n",
"\n",
"[Meetup API]: https://www.meetup.com/meetup_api/\n",
"[Meetup API Key]: https://secure.meetup.com/meetup_api/key/\n",
"[Johannes Giorgis]: http://johannesgiorgis.com/\n",
"[Data Science Challenges]: https://medium.com/red-panda-ai/introducing-data-science-challenges-4ae4a103d67b"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import datetime\n",
"import json\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 numpy as np\n",
"import seaborn as sb\n",
"\n",
"from tqdm import tnrange, tqdm_notebook\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Double check your environment\n",
"\n",
"Nothing works without **MEETUP_API_KEY**."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"assert 'MEETUP_API_KEY' in os.environ, (\n",
" \"You need a MEETUP_API_KEY in your environment please look at the \"\n",
" \"README for instructions.\")\n",
"client = meetup.api.Client()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Categories\n",
"\n",
"There are multiple categories of groups in Meetup, let's use Python's meetup.api to [GetCategories](https://meetup-api.readthedocs.io/en/latest/meetup_api.html#meetup.api.meetup.api.Client.GetCategories)."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"%%capture --no-display\n",
"categories = client.GetCategories()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### What are the attributes of the response object? \n",
"\n",
"First, \n",
"let's create ahelper function to help us parse out the two most useful\n",
"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"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exploring the response object\n",
"\n",
"We received a response object when we called ```client.GetCategories()```.\n",
"\n",
"By looking at the categories **meta** dataframe, we can see that there are 33 different categories."
]
},
{
"cell_type": "code",
"execution_count": 5,
"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": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cats_meta_df, cats_df = parse_response(categories)\n",
"cats_meta_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see from the meta that there are 33 categories available to us.\n",
"I wonder what they are. \n",
"\n",
"### How the Meetup API works\n",
"\n",
"Notice that the value of **next** (above) is an empty string. Meetup API v2 response payloads come in **pages**, one at a time, but provide the URI of the **next** API call in the sequence. We can use this to programmatically get each next **page** in **response.meta\\[\"next\"\\]**. until the complete result is returned.\n",
"\n",
"As we can see, the **response.meta\\[\"next\"\\]** for this page is an empty string, so all of the categories\n",
"fit into our first API call.\n",
"\n",
"#### Secondly, let's review the categories results dataframe"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cats_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### So, if we want to work with a particular category\n",
"In this case, I want **Tech**. Let's query the dataframe for categories named **Tech**."
]
},
{
"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",
"
31
\n",
"
34
\n",
"
Tech
\n",
"
Tech
\n",
"
Tech
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name shortname sort_name\n",
"31 34 Tech Tech Tech"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tech_df = cats_df.loc[cats_df['name'] == 'Tech']\n",
"tech_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Let's store the category ID number for later use"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"34"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tech_category_id = tech_df['id'].values[0]\n",
"tech_category_id"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Explore Cities\n",
"### Now let's look at cities in the United States named San Francisco"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"%%capture --no-display\n",
"cities_resp = client.GetCities(country='us', query='San Francisco')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we used the [GetCities] method of the [Python Meetup API client]\n",
"\n",
"I used a query for cities in **United States** called **San Francisco**.\n",
"\n",
"[//]: # (References)\n",
"\n",
"[GetCities]: https://meetup-api.readthedocs.io/en/latest/meetup_api.html#meetup.api.meetup.api.Client.GetCities\n",
"[Python Meetup API client]: https://meetup-api.readthedocs.io/en/latest/meetup_api.html#api-client-details\n",
"\n",
"Now let's take a look at the **meta** for our results."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
0
\n",
"
\n",
" \n",
" \n",
"
\n",
"
next
\n",
"
\n",
"
\n",
"
\n",
"
method
\n",
"
Cities
\n",
"
\n",
"
\n",
"
total_count
\n",
"
4
\n",
"
\n",
"
\n",
"
link
\n",
"
https://api.meetup.com/2/cities
\n",
"
\n",
"
\n",
"
count
\n",
"
4
\n",
"
\n",
"
\n",
"
description
\n",
"
Returns Meetup cities. This method supports se...
\n",
"
\n",
"
\n",
"
lon
\n",
"
None
\n",
"
\n",
"
\n",
"
title
\n",
"
Cities
\n",
"
\n",
"
\n",
"
url
\n",
"
https://api.meetup.com/2/cities?country=us&off...
\n",
"
\n",
"
\n",
"
id
\n",
"
\n",
"
\n",
"
\n",
"
updated
\n",
"
1263132740000
\n",
"
\n",
"
\n",
"
lat
\n",
"
None
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0\n",
"next \n",
"method Cities\n",
"total_count 4\n",
"link https://api.meetup.com/2/cities\n",
"count 4\n",
"description Returns Meetup cities. This method supports se...\n",
"lon None\n",
"title Cities\n",
"url https://api.meetup.com/2/cities?country=us&off...\n",
"id \n",
"updated 1263132740000\n",
"lat None"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities_meta_df, cities_df = parse_response(cities_resp)\n",
"cities_meta_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Hmm, a count of 4 cities is suspicious...\n",
"\n",
"I only know of the one San Francisco, why are there 4 cities?"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"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",
"
San Francisco
\n",
"
us
\n",
"
94101
\n",
"
37.779999
\n",
"
USA
\n",
"
-122.419998
\n",
"
60351
\n",
"
San Francisco, California, USA
\n",
"
0
\n",
"
CA
\n",
"
94101
\n",
"
\n",
"
\n",
"
1
\n",
"
Bosque
\n",
"
us
\n",
"
87006
\n",
"
34.560001
\n",
"
USA
\n",
"
-106.779999
\n",
"
5
\n",
"
San Francisco, New Mexico, USA
\n",
"
1
\n",
"
NM
\n",
"
87006
\n",
"
\n",
"
\n",
"
2
\n",
"
San Luis
\n",
"
us
\n",
"
81152
\n",
"
37.080002
\n",
"
USA
\n",
"
-105.620003
\n",
"
4
\n",
"
San Francisco, Colorado, USA
\n",
"
2
\n",
"
CO
\n",
"
81152
\n",
"
\n",
"
\n",
"
3
\n",
"
Reserve
\n",
"
us
\n",
"
87830
\n",
"
33.650002
\n",
"
USA
\n",
"
-108.769997
\n",
"
1
\n",
"
San Francisco Plaza, New Mexico, USA
\n",
"
3
\n",
"
NM
\n",
"
87830
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" city country id lat localized_country_name lon \\\n",
"0 San Francisco us 94101 37.779999 USA -122.419998 \n",
"1 Bosque us 87006 34.560001 USA -106.779999 \n",
"2 San Luis us 81152 37.080002 USA -105.620003 \n",
"3 Reserve us 87830 33.650002 USA -108.769997 \n",
"\n",
" member_count name_string ranking state zip \n",
"0 60351 San Francisco, California, USA 0 CA 94101 \n",
"1 5 San Francisco, New Mexico, USA 1 NM 87006 \n",
"2 4 San Francisco, Colorado, USA 2 CO 81152 \n",
"3 1 San Francisco Plaza, New Mexico, USA 3 NM 87830 "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Oh, there are lots of San Franciscos! \n",
"\n",
"### Let's filter the dataframe with a query to give us only cities in California, US"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"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",
"
San Francisco
\n",
"
us
\n",
"
94101
\n",
"
37.779999
\n",
"
USA
\n",
"
-122.419998
\n",
"
60351
\n",
"
San Francisco, California, USA
\n",
"
0
\n",
"
CA
\n",
"
94101
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" city country id lat localized_country_name lon \\\n",
"0 San Francisco us 94101 37.779999 USA -122.419998 \n",
"\n",
" member_count name_string ranking state zip \n",
"0 60351 San Francisco, California, USA 0 CA 94101 "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"single_city_df = cities_df.loc[\n",
" (cities_df['state'] == 'CA')]\n",
"\n",
"single_city_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One San Francisco, perfect! \n",
"\n",
"### Let's store the latitude and longitude for later use as well"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(37.779998779296875, -122.41999816894531)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"latitude = single_city_df['lat'][0]\n",
"longitude = single_city_df['lon'][0]\n",
"latitude, longitude"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Now let's look at groups in San Francisco, CA"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Since we are going to grab lots of groups, let's make a function to help us call the API\n",
"\n",
"**Note**: This function will use the **tech_category_id, latitude, and longitude** values that we \n",
"found eariler."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"def get_a_group(page_number, category_id=tech_category_id, lat=latitude,\n",
" lon=longitude):\n",
" group = None\n",
" retry_counter, retry_max = 0, 3\n",
" print(f\"Getting page {page_number}\")\n",
" while retry_counter < retry_max:\n",
" try:\n",
" group = client.GetGroups(\n",
" category_id=category_id, lat=lat, lon=lon, offset=page_number)\n",
" return group\n",
" except:\n",
" print(f\"Fetch failure {retry_counter + 1}\")\n",
" retry_counter += 1\n",
"\n",
" raise Exception(f\"Unable to fetch page after {retry_counter} attempts\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Now, After grabbing the first group\n",
"\n",
"Let's review the **meta** to help us see what we are getting into"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
0
\n",
"
\n",
" \n",
" \n",
"
\n",
"
next
\n",
"
https://api.meetup.com/2/groups?offset=1&forma...
\n",
"
\n",
"
\n",
"
method
\n",
"
Groups
\n",
"
\n",
"
\n",
"
total_count
\n",
"
2197
\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",
"
-122.42
\n",
"
\n",
"
\n",
"
title
\n",
"
Meetup Groups v2
\n",
"
\n",
"
\n",
"
url
\n",
"
https://api.meetup.com/2/groups?offset=0&forma...
\n",
"
\n",
"
\n",
"
id
\n",
"
\n",
"
\n",
"
\n",
"
updated
\n",
"
1550965553000
\n",
"
\n",
"
\n",
"
lat
\n",
"
37.78
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0\n",
"next https://api.meetup.com/2/groups?offset=1&forma...\n",
"method Groups\n",
"total_count 2197\n",
"link https://api.meetup.com/2/groups\n",
"count 200\n",
"description None\n",
"lon -122.42\n",
"title Meetup Groups v2\n",
"url https://api.meetup.com/2/groups?offset=0&forma...\n",
"id \n",
"updated 1550965553000\n",
"lat 37.78"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%capture --no-display\n",
"group_resp = get_a_group(0)\n",
"group_meta, _ = parse_response(group_resp)\n",
"group_meta"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Wait! There's a meta[\\\"next\\\"].\n",
"\n",
"Remember earlier when I spoke about **response.meta\\[\"next\"\\]**? \n",
"\n",
"It seems as though our result will span mulitple API calls, each returning 200 new groups in \n",
"a **page**.\n",
"\n",
"Let's make a new helper that will grab each **page** in a series of API calls until we obtain the entire data set:\n",
"\n",
"We will use the pandas.DataFrame.[concat] function to collate all pages into a single useful dataframe\n",
"\n",
"[//]: # (References)\n",
"\n",
"[concat]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def get_all_groups_as_a_df():\n",
" \"\"\"Returns a single dataframe composed from data from multiple\n",
" successive calls to get_a_group.\n",
" \n",
" We will loop through get_a_group pages while our page.meta['next'] is \n",
" not the empty string.\n",
" \"\"\"\n",
" page_df_list = []\n",
" next_page = None\n",
" page_number = 0\n",
" while next_page != '': \n",
" page = get_a_group(page_number)\n",
" next_page = page.meta[\"next\"]\n",
" _, frame = parse_response(page)\n",
" page_number += 1\n",
" page_df_list.append(frame)\n",
" \n",
" return pd.concat(page_df_list, ignore_index=True)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Getting page 0\n",
"28/30 (5 seconds remaining)\n",
"Getting page 1\n",
"27/30 (3 seconds remaining)\n",
"Getting page 2\n",
"26/30 (3 seconds remaining)\n",
"Getting page 3\n",
"25/30 (2 seconds remaining)\n",
"Getting page 4\n",
"24/30 (1 seconds remaining)\n",
"Getting page 5\n",
"29/30 (10 seconds remaining)\n",
"Getting page 6\n",
"28/30 (9 seconds remaining)\n",
"Getting page 7\n",
"27/30 (8 seconds remaining)\n",
"Getting page 8\n",
"26/30 (7 seconds remaining)\n",
"Getting page 9\n",
"25/30 (6 seconds remaining)\n",
"Getting page 10\n",
"24/30 (5 seconds remaining)\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
category
\n",
"
city
\n",
"
country
\n",
"
created
\n",
"
description
\n",
"
group_photo
\n",
"
id
\n",
"
join_mode
\n",
"
lat
\n",
"
link
\n",
"
...
\n",
"
name
\n",
"
organizer
\n",
"
rating
\n",
"
state
\n",
"
timezone
\n",
"
topics
\n",
"
urlname
\n",
"
utc_offset
\n",
"
visibility
\n",
"
who
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
{'name': 'tech', 'id': 34, 'shortname': 'tech'}
\n",
"
San Francisco
\n",
"
US
\n",
"
1034097740000
\n",
"
<p>The SF PHP Community Meetup is an open foru...
\n",
"
{'highres_link': 'https://secure.meetupstatic....
\n",
"
120903
\n",
"
open
\n",
"
37.77
\n",
"
https://www.meetup.com/sf-php/
\n",
"
...
\n",
"
SF PHP Community
\n",
"
{'member_id': 126468982, 'name': 'Andre Marigo...
\n",
"
4.38
\n",
"
CA
\n",
"
US/Pacific
\n",
"
[{'urlkey': 'php', 'name': 'PHP', 'id': 455}, ...
\n",
"
sf-php
\n",
"
-28800000
\n",
"
public
\n",
"
PHP Developers
\n",
"
\n",
" \n",
"
\n",
"
1 rows × 22 columns
\n",
"
"
],
"text/plain": [
" category city country \\\n",
"0 {'name': 'tech', 'id': 34, 'shortname': 'tech'} San Francisco US \n",
"\n",
" created description \\\n",
"0 1034097740000
The SF PHP Community Meetup is an open foru... \n",
"\n",
" group_photo id join_mode lat \\\n",
"0 {'highres_link': 'https://secure.meetupstatic.... 120903 open 37.77 \n",
"\n",
" link ... name \\\n",
"0 https://www.meetup.com/sf-php/ ... SF PHP Community \n",
"\n",
" organizer rating state timezone \\\n",
"0 {'member_id': 126468982, 'name': 'Andre Marigo... 4.38 CA US/Pacific \n",
"\n",
" topics urlname utc_offset \\\n",
"0 [{'urlkey': 'php', 'name': 'PHP', 'id': 455}, ... sf-php -28800000 \n",
"\n",
" visibility who \n",
"0 public PHP Developers \n",
"\n",
"[1 rows x 22 columns]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Collect all groups into a single dataframe\n",
"all_groups_df = get_all_groups_as_a_df()\n",
"\n",
"# Show the first row in the dataframe\n",
"all_groups_df.head(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### That's too many columns\n",
"I really only care about a small list of columns, let's exclude the unneeded columns."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
name
\n",
"
members
\n",
"
rating
\n",
"
join_mode
\n",
"
urlname
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
120903
\n",
"
SF PHP Community
\n",
"
2702
\n",
"
4.38
\n",
"
open
\n",
"
sf-php
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id name members rating join_mode urlname\n",
"0 120903 SF PHP Community 2702 4.38 open sf-php"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"column_list = ['id', 'name', 'members', 'rating', 'join_mode', 'urlname']\n",
"all_groups_df = all_groups_df[column_list]\n",
"all_groups_df.head(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Let's double check the size of our new dataframe"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2197, 6)"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"all_groups_df.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That looks just about right:\n",
"* 2197 rows\n",
"* 6 columns\n",
"\n",
"---\n",
"## Explore Members per Group\n",
"\n",
"Each group has a different sized membership, let's explore this first!\n",
"\n",
"\n",
"### Let's start with with a histogram\n",
"\n",
"This visualization should give us a basic idea of how big our groups are."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Using seaborn's distplot function\n",
"plt.rcParams['figure.figsize'] = [11, 6]\n",
"sb.distplot(all_groups_df['members'], kde=False, color=\"g\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### It appears that most groups are relatively small\n",
"\n",
"Let's take a closer look at some basic stats for our data in a tabular \n",
"format for some hard numbers:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
members
\n",
"
\n",
" \n",
" \n",
"
\n",
"
count
\n",
"
2,197.00
\n",
"
\n",
"
\n",
"
mean
\n",
"
811.79
\n",
"
\n",
"
\n",
"
std
\n",
"
1,741.14
\n",
"
\n",
"
\n",
"
min
\n",
"
1.00
\n",
"
\n",
"
\n",
"
25%
\n",
"
86.00
\n",
"
\n",
"
\n",
"
50%
\n",
"
256.00
\n",
"
\n",
"
\n",
"
75%
\n",
"
780.00
\n",
"
\n",
"
\n",
"
max
\n",
"
36,058.00
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" members\n",
"count 2,197.00\n",
"mean 811.79\n",
"std 1,741.14\n",
"min 1.00\n",
"25% 86.00\n",
"50% 256.00\n",
"75% 780.00\n",
"max 36,058.00"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.options.display.float_format = '{:20,.2f}'.format\n",
"all_groups_df[[\"members\"]].describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As a table I can see some numbers:\n",
"\n",
"1. It looks like the average group size is about 812 persons.\n",
"2. Half of the group sits at or under 256 members.\n",
"3. The smallest group has a single person.\n",
"4. **the largest group has 36,000+ members!**\n",
"\n",
"What an outlier! But are there other **mega-groups** like this?\n",
"\n",
"### Maybe a box and whisker plot can visualize these stats for us"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAARiCAYAAABPrzvoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3X+QXWd95/nPV62WZWQDNlEc5B8xOyGhPb0zJOkFUuOdGmU22GY3/KidTKLMjtm4A8ST9DLFZGxC/5FxMsrYVA0Zo4JMyFob2AptUmEg3gxej0N6K6VN8UOeMEFYA/aGXzJgGyQTWbasVuvZP3SlavEYJF9d67ql16uqq28/fe7tpymLd5/znHNPtdYCACutGfcEAHjuEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA6a8c9gWF93/d9X7vyyivHPQ2AVeW+++77Zmtt48m2W7VxuPLKK7Nz585xTwNgVamqL5/Kdg4rAdARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIA4zIwsJCpqenMzExkenp6SwsLIx7SjC0teOeAJwNFhYWMj8/nzvuuCNXX311duzYkdnZ2STJli1bxjw7eOaqtTbuOQxlZmam7dy5c9zTgCTJ9PR0tm3bls2bNx8fW1xczNzcXHbt2jXGmcGJquq+1trMSbcTBzh9ExMTOXjwYCYnJ4+PLS0tZf369VleXh7jzOBEpxoHaw4wAlNTU9mxY8cJYzt27MjU1NSYZgSnRxxgBObn5zM7O5vFxcUsLS1lcXExs7OzmZ+fH/fUYCgWpGEEji06z83NZffu3ZmamsrWrVstRrNqWXMAOIdYcwBgaOIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAnZPGoarWV9Wnquq/VNXnquqWwfjvV9UXq+ozg4+XD8arqt5dVQ9W1V9V1Y+teK03VtUDg483rhj/8ar67OA5766qejZ+WQBOzdpT2OapJD/ZWnu8qiaT7Kiquwff+5ettT/6ju2vS/LSwccrk/xOkldW1cVJfj3JTJKW5L6ququ1tm+wzZuSfDLJx5Jcm+TuADAWJ91zaEc9PvhycvDRvsdTXpfkA4PnfSLJC6vqxUmuSXJva23vIAj3Jrl28L3nt9Y+0VprST6Q5PWn8TsBcJpOac2hqiaq6jNJHsnR/4P/5OBbWweHjn67qs4bjF2a5Ksrnr5nMPa9xvc8zTgAY3JKcWitLbfWXp7ksiSvqKrpJL+W5GVJ/rskFye5+Vmb5UBVvbmqdlbVzkcfffTZ/nEA56xndLZSa+2xJItJrm2tfX1w6OipJP9HklcMNnsoyeUrnnbZYOx7jV/2NONP9/Pf11qbaa3NbNy48ZlMHYBn4FTOVtpYVS8cPD4/yU8l+a+DtYIMzix6fZJdg6fcleT6wVlLr0ry7dba15Pck+TVVXVRVV2U5NVJ7hl872+q6lWD17o+yR+P9tcE4Jk4lbOVXpzk/VU1kaMx+cPW2p9U1Z9V1cYkleQzSX5psP3HkrwmyYNJnkjyC0nSWttbVb+Z5NOD7X6jtbZ38PifJfn9JOfn6FlKzlQCGKM6eoLQ6jMzM9N27tw57mkArCpVdV9rbeZk27lCGoCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdE4ah6paX1Wfqqr/UlWfq6pbBuMvqapPVtWDVfWhqlo3GD9v8PWDg+9fueK1fm0w/vmqumbF+LWDsQer6u2j/zUBeCZOZc/hqSQ/2Vr7u0lenuTaqnpVktuS/HZr7YeS7EsyO9h+Nsm+wfhvD7ZLVV2V5OeS/O0k1yZ5b1VNVNVEkvckuS7JVUm2DLYFYExOGod21OODLycHHy3JTyb5o8H4+5O8fvD4dYOvM/j+P6yqGozf2Vp7qrX2xSQPJnnF4OPB1tpft9YOJblzsC0AY3JKaw6Dv/A/k+SRJPcm+f+SPNZaOzzYZE+SSwePL03y1SQZfP/bSV60cvw7nvPdxgEYk1OKQ2ttubX28iSX5ehf+i97Vmf1XVTVm6tqZ1XtfPTRR8cxBYBzwjM6W6m19liSxSQ/keSFVbV28K3Lkjw0ePxQksuTZPD9FyT51srx73jOdxt/up//vtbaTGttZuPGjc9k6gA8A6dyttLGqnrh4PH5SX4qye4cjcQ/Gmz2xiR/PHh81+DrDL7/Z621Nhj/ucHZTC9J8tIkn0ry6SQvHZz9tC5HF63vGsUvB8Bw1p58k7w4yfsHZxWtSfKHrbU/qar7k9xZVf86yV8muWOw/R1J/s+qejDJ3hz9P/u01j5XVX+Y5P4kh5P8cmttOUmq6leS3JNkIsn21trnRvYbAvCM1dE/6lefmZmZtnPnznFPA2BVqar7WmszJ9vOFdIAdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKBz0jhU1eVVtVhV91fV56rqrYPxf1VVD1XVZwYfr1nxnF+rqger6vNVdc2K8WsHYw9W1dtXjL+kqj45GP9QVa0b9S8KwKk7lT2Hw0n+RWvtqiSvSvLLVXXV4Hu/3Vp7+eDjY0ky+N7PJfnbSa5N8t6qmqiqiSTvSXJdkquSbFnxOrcNXuuHkuxLMjui3w+AIZw0Dq21r7fW/vPg8f4ku5Nc+j2e8rokd7bWnmqtfTHJg0leMfh4sLX21621Q0nuTPK6qqokP5nkjwbPf3+S1w/7CwFw+p7RmkNVXZnkR5N8cjD0K1X1V1W1vaouGoxdmuSrK562ZzD23cZflOSx1trh7xgHYExOOQ5VdUGSDyf55621v0nyO0n+VpKXJ/l6kn/7rMzwxDm8uap2VtXORx999Nn+cQDnrFOKQ1VN5mgY/qC19h+SpLX2cGttubV2JMnv5ehhoyR5KMnlK55+2WDsu41/K8kLq2rtd4x3Wmvva63NtNZmNm7ceCpTB2AIp3K2UiW5I8nu1tq7Voy/eMVmb0iya/D4riQ/V1XnVdVLkrw0yaeSfDrJSwdnJq3L0UXru1prLclikn80eP4bk/zx6f1aAJyOtSffJH8vyT9N8tmq+sxg7B05erbRy5O0JF9K8pYkaa19rqr+MMn9OXqm0y+31paTpKp+Jck9SSaSbG+tfW7wejcnubOq/nWSv8zRGAEwJnX0D/fVZ2Zmpu3cuXPc0wBYVarqvtbazMm2c4U0AB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADonDQOVXV5VS1W1f1V9bmqeutg/OKqureqHhh8vmgwXlX17qp6sKr+qqp+bMVrvXGw/QNV9cYV4z9eVZ8dPOfdVVXPxi8LwKk5lT2Hw0n+RWvtqiSvSvLLVXVVkrcn+Xhr7aVJPj74OkmuS/LSwcebk/xOcjQmSX49ySuTvCLJrx8LymCbN6143rWn/6sBMKyTxqG19vXW2n8ePN6fZHeSS5O8Lsn7B5u9P8nrB49fl+QD7ahPJHlhVb04yTVJ7m2t7W2t7Utyb5JrB997fmvtE621luQDK14LgDF4RmsOVXVlkh9N8skkl7TWvj741jeSXDJ4fGmSr6542p7B2Pca3/M04wCMySnHoaouSPLhJP+8tfY3K783+Iu/jXhuTzeHN1fVzqra+eijjz7bPw7gnHVKcaiqyRwNwx+01v7DYPjhwSGhDD4/Mhh/KMnlK55+2WDse41f9jTjndba+1prM621mY0bN57K1AEYwqmcrVRJ7kiyu7X2rhXfuivJsTOO3pjkj1eMXz84a+lVSb49OPx0T5JXV9VFg4XoVye5Z/C9v6mqVw1+1vUrXguAMVh7Ctv8vST/NMlnq+ozg7F3JLk1yR9W1WySLyf5x4PvfSzJa5I8mOSJJL+QJK21vVX1m0k+PdjuN1preweP/1mS309yfpK7Bx8AjEkdXS5YfWZmZtrOnTvHPQ2AVaWq7mutzZxsO1dIA9ARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAFGZGFhIdPT05mYmMj09HQWFhbGPSUY2tpxTwDOBgsLC5mfn88dd9yRq6++Ojt27Mjs7GySZMuWLWOeHTxz1Vob9xyGMjMz03bu3DnuaUCSZHp6Otu2bcvmzZuPjy0uLmZubi67du0a48zgRFV1X2tt5qTbiQOcvomJiRw8eDCTk5PHx5aWlrJ+/fosLy+PcWZwolONgzUHGIGpqans2LHjhLEdO3ZkampqTDOC0yMOMALz8/OZnZ3N4uJilpaWsri4mNnZ2czPz497ajAUC9IwAscWnefm5rJ79+5MTU1l69atFqNZtaw5AJxDrDkAMDRxAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHGJGFhYVMT09nYmIi09PTWVhYGPeUYGhrxz0BOBssLCxkfn4+d9xxR66++urs2LEjs7OzSZItW7aMeXbwzFVrbdxzGMrMzEzbuXPnuKcBSZLp6els27YtmzdvPj62uLiYubm57Nq1a4wzgxNV1X2ttZmTbicOcPomJiZy8ODBTE5OHh9bWlrK+vXrs7y8PMaZwYlONQ7WHGAEpqamsmPHjhPGduzYkampqTHNCE6POMAIzM/PZ3Z2NouLi1laWsri4mJmZ2czPz8/7qnBUCxIwwgcW3Sem5vL7t27MzU1la1bt1qMZtWy5gBwDrHmAMDQxAGAjjgA0BEHADonjUNVba+qR6pq14qxf1VVD1XVZwYfr1nxvV+rqger6vNVdc2K8WsHYw9W1dtXjL+kqj45GP9QVa0b5S8IwDN3KnsOv5/k2qcZ/+3W2ssHHx9Lkqq6KsnPJfnbg+e8t6omqmoiyXuSXJfkqiRbBtsmyW2D1/qhJPuSzJ7OLwTA6TtpHFprf55k7ym+3uuS3Nlae6q19sUkDyZ5xeDjwdbaX7fWDiW5M8nrqqqS/GSSPxo8//1JXv8MfwcARux01hx+par+anDY6aLB2KVJvrpimz2Dse82/qIkj7XWDn/HOABjNGwcfifJ30ry8iRfT/JvRzaj76Gq3lxVO6tq56OPPnomfiTAOWmoOLTWHm6tLbfWjiT5vRw9bJQkDyW5fMWmlw3Gvtv4t5K8sKrWfsf4d/u572utzbTWZjZu3DjM1OFZ42Y/nE2GikNVvXjFl29IcuxMpruS/FxVnVdVL0ny0iSfSvLpJC8dnJm0LkcXre9qR9+7YzHJPxo8/41J/niYOcE4HbvZz7Zt23Lw4MFs27Yt8/PzAsGqddL3VqqqhST/IMn3JXk4ya8Pvn55kpbkS0ne0lr7+mD7+SQ3JDmc5J+31u4ejL8myb9LMpFke2tt62D8v8nRBeqLk/xlkv+ltfbUySbuvZV4LnGzH1YLN/uBM8jNflgtvPEenEFu9sPZRhxgBNzsh7ONm/3ACLjZD2cbaw4A5xBrDgAMTRwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHGBEFhYWMj09nYmJiUxPT2dhYWHcU4KhrR33BOBssLCwkPn5+dxxxx25+uqrs2PHjszOziZJtmzZMubZwTNXrbVxz2EoMzMzbefOneOeBiRJpqens23btmzevPn42OLiYubm5rJr164xzgxOVFX3tdZmTrqdOMDpm5iYyMGDBzM5OXl8bGlpKevXr8/y8vIYZwYnOtU4WHOAEZiamsqOHTtOGNuxY0empqbGNCM4PeIAIzA/P5/Z2dksLi5maWkpi4uLmZ2dzfz8/LinBkOxIA0jcGzReW5uLrt3787U1FS2bt1qMZpVy5oDwDnEmgOcYa5z4GzisBKMgOscONs4rAQj4DoHVgvXOcAZ5DoHVgtrDnAGuc6Bs404wAi4zoGzjQVpGAHXOXC2seYAcA6x5gDA0MQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDjAi7ufA2cTbZ8AIuJ8DZxtvnwEj4H4OrBbePgPOoN27d2fPnj0nHFbas2dPdu/ePe6pwVDEAUZg06ZNmZuby4EDB5IkBw4cyNzcXDZt2jTmmcFwxAFG4Iknnsjjjz+eubm57N+/P3Nzc3n88cfzxBNPjHtqMBRxgBHYu3dvbrrppmzfvj0XXnhhtm/fnptuuil79+4d99RgKOIAI7J58+bs2rUry8vL2bVr1wmL07DaiAOMwGWXXZbrr7/+hNuEXn/99bnsssvGPTUYijjACLzzne/M8vJybrjhhpx33nm54YYbsry8nHe+853jnhoMRRxgBLZs2ZLbb789GzZsSFVlw4YNuf32210Ax6rlIjiAc4iL4AAYmjgA0BEHADriAEBHHADoiAOMiJv9cDZxsx8YATf74WzjOgcYATf7YbU41escxAFGYGJiIgcPHszk5OTxsaWlpaxfvz7Ly8tjnBmcyEVwcAZNTU3llltuOWHN4ZZbbsnU1NS4pwZDEQcYgc2bN+e2227LDTfckP379+eGG27Ibbfd5m27WbXEAUZgcXExN9988wk3+7n55puzuLg47qnBUKw5wAhYc2C1sOYAZ9DU1FR27NhxwtiOHTusObBquc4BRmB+fj4/+7M/mw0bNuQrX/lKrrjiihw4cCC33377uKcGQ7HnACO2Wg/VwkriACOwdevWfOhDH8oXv/jFHDlyJF/84hfzoQ99KFu3bh331GAoFqRhBCxIs1pYkIYzyII0ZxtxgBGYn5/P7OxsFhcXs7S0lMXFxczOzmZ+fn7cU4OhOFsJRuDYO6/Ozc1l9+7dmZqaytatW70jK6uWNQeAc4g1BwCGJg4AdMQBRsRtQjmbWJCGEXCbUM42FqRhBNwmlNXCbULhDHKFNKuFs5XgDHKFNGcbcYARcIU0ZxsL0jACrpDmbGPNAeAcYs0BzjDXOXA2cVgJRsB1DpxtHFaCEXCdA6uF6xzgDHKdA6uFNQc4g1znwNlGHGAEXOfA2caCNIyA6xw421hzADiHWHMAYGjiAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAI+JmP5xNvLcSjICb/XC28d5KMAJu9sNq4WY/cAa52Q+rhTfegzPIzX4424gDjICb/XC2OWkcqmp7VT1SVbtWjF1cVfdW1QODzxcNxquq3l1VD1bVX1XVj614zhsH2z9QVW9cMf7jVfXZwXPeXVU16l8Snm1btmzJ1q1bMzc3l/Xr12dubs7NfljVTrrmUFV/P8njST7QWpsejL0zyd7W2q1V9fYkF7XWbq6q1ySZS/KaJK9Mcntr7ZVVdXGSnUlmkrQk9yX58dbavqr6VJL/Lcknk3wsybtba3efbOLWHACeuZGtObTW/jzJ3u8Yfl2S9w8evz/J61eMf6Ad9YkkL6yqFye5Jsm9rbW9rbV9Se5Ncu3ge89vrX2iHa3UB1a8FgBjMuyawyWtta8PHn8jySWDx5cm+eqK7fYMxr7X+J6nGQdgjE57QXrwF/8ZOR+2qt5cVTurauejjz56Jn4kwDlp2Dg8PDgklMHnRwbjDyW5fMV2lw3Gvtf4ZU8z/rRaa+9rrc201mY2btw45NQBOJlh43BXkmNnHL0xyR+vGL9+cNbSq5J8e3D46Z4kr66qiwZnNr06yT2D7/1NVb1qcJbS9SteC4AxOel7K1XVQpJ/kOT7qmpPkl9PcmuSP6yq2SRfTvKPB5t/LEfPVHowyRNJfiFJWmt7q+o3k3x6sN1vtNaOLXL/syS/n+T8JHcPPgAYI2+fAXAO8fYZAAxNHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4wIgsLC5mens7ExESmp6ezsLAw7inB0MQBRmBhYSFvfetbc+DAgbTWcuDAgbz1rW8VCFYtcYARuOmmm3Lo0KEkydH7ViWHDh3KTTfdNM5pwdDEAUZgz549Of/887N9+/YcPHgw27dvz/nnn589e/aMe2owFHGAEXnb296WzZs3Z3JyMps3b87b3va2cU8JhiYOMCLvete7sri4mKWlpSwuLuZd73rXuKcEQzvpPaSBk7vsssuyf//+3HDDDfnKV76SK664Ik8++WQuu+yycU8NhmLPAUbgne98Z9atW5ckOXZf9nXr1uWd73znOKcFQxMHGIEtW7bk9ttvz4YNG1JV2bBhQ26//fZs2bJl3FODodSxv3JWm5mZmbZz585xTwNgVamq+1prMyfbzp4DAB1xAKAjDgB0xAGAjjgA0BEHGBFv2c3ZxBXSMAILCwuZn5/PHXfckauvvjo7duzI7OxskrjWgVXJdQ4wAtPT09m2bVs2b958fGxxcTFzc3PZtWvXGGcGJzrV6xzEAUZgYmIiBw8ezOTk5PGxpaWlrF+/PsvLy2OcGZzIRXBwBk1NTWXHjh0njO3YsSNTU1NjmhGcHnGAEZifn8/s7OwJb9k9Ozub+fn5cU8NhmJBGkbg2KLz3Nxcdu/enampqWzdutViNKuWNQeAc4g1BwCGJg4AdMQBgI44wIjMzc1l/fr1qaqsX78+c3Nz454SDE0cYATm5ubynve85/gFb8vLy3nPe94jEKxa4gAj8N73vjdVldtuuy0HDhzIbbfdlqrKe9/73nFPDYbiOgcYgSNHjuTf/Jt/k7e97W1Jkre97W05dOhQfu3Xfm3MM4Ph2HMAoGPPAUazuGcDAAAUcUlEQVRgYmIi73jHO7Ju3br80i/9Uv79v//3ecc73pGJiYlxTw2GYs8BRuDGG29Mktx0003ZsGFDbrrpphPGYbWx5wAjsG3btiTJ7/3e72V5eTlr167Nm970puPjsNp4byWAc4j3VgJgaOIAI7KwsJDp6elMTExkeno6CwsL454SDM2aA4zAwsJC5ufnc8cdd+Tqq6/Ojh07Mjs7myTu6cCqZM0BRmB6ejrbtm3L5s2bj48tLi5mbm4uu3btGuPM4ETWHOAM2r17d/bs2XPCYaU9e/Zk9+7d454aDMVhJRiBTZs25eabb84f/MEfHD+s9E/+yT/Jpk2bxj01GIo9BxiR7zxEu1oP2UIiDjASX/va1/KGN7wh1113XdatW5frrrsub3jDG/K1r31t3FODoYgDjMCmTZvykY98JHfffXcOHTqUu+++Ox/5yEccVmLVsuYAI3Lw4MHccMMN+fKXv5wf/MEfzMGDB3PBBReMe1owFHsOMAIPPfRQlpeX89BDD6W1dsLXsBqJA4zAxMREJicnc8899+TQoUO55557Mjk56S27WbUcVoIROHz4cI4cOXLCYaUjR47k8OHD454aDMWeA4zIsVNXq+qEr2E1EgcYgbVr12bNmjXZvn17Dh48mO3bt2fNmjVZu9bOOauT/3JhBJaXlzMxMXHCYaWJiYksLy+Pe2owFHsOMAJXXXVV3vKWt2TDhg2pqmzYsCFvectbctVVV417ajAUcYARmJ+fzwc/+MFs27YtBw8ezLZt2/LBD34w8/Pz454aDMVhJRiBY/dsmJuby+7duzM1NZWtW7e6lwOrlvs5AJxD3M8BgKGJAwAdcQCgIw4AdMQBgI44ANARBxiRhYWFTE9PZ2JiItPT01lYWBj3lGBoLoKDEVhYWMj8/HzuuOOOXH311dmxY0dmZ2eTxIVwrEougoMRmJ6ezutf//p89KMfPX6F9LGvd+3aNe7pwXGnehGcPQcYgfvvvz+PPPJINmzYkNZaDhw4kPe973355je/Oe6pwVCsOcAITExM5PDhw9m+fXueeuqpbN++PYcPH3abUFYtew4wAitvE/qVr3wlV1xxhduEsqrZc4ARW63reLCSOMAIrF279vhewrF7SB8+fNhtQlm1/JcLI3D48OEcPnw4Bw4cSJJ86UtfGu+E4DTZc4AROLbwfMkll5zw2YI0q5U4wAgsLy9n3bp12bt3b5Jk7969WbduXZaXl8c8MxiOOMCIHDp0KC960YuyZs2avOhFL8qhQ4fGPSUYmjjAiDzvec/LBz/4wRw8eDAf/OAH87znPW/cU4KhWZCGETl48GB+/ud/Po888ki+//u/PwcPHhz3lGBo9hxgBM4777z8xE/8RPbt25cjR45k3759+Ymf+Imcd955454aDEUcYATe9KY35ZOf/GR+67d+KwcOHMhv/dZv5ZOf/GTe9KY3jXtqMBTvygojcs011+Tee+9Nay1VlZ/6qZ/KPffcM+5pwQlO9V1Z7TnACCwsLOSBBx7Ixz/+8Rw6dCgf//jH88ADD7jhD6uWPQcYgenp6Wzbti2bN28+Pra4uJi5uTn3c+A55VT3HMQBRmBiYiIHDx7M5OTk8bGlpaWsX7/ehXA8pzisBGfQ1NRUbrnllhPuIX3LLbdkampq3FODoYgDjMDmzZtz22235YYbbsj+/ftzww035LbbbjvhMBOsJg4rwQhMT0/npS99ae6+++489dRTOe+883LdddflgQcesObAc4p7SMMZdP/99+crX/lKjhw5kiQ5cuRIPv7xj+fxxx8f88xgOA4rwQhUVQ4cOJBbb731hM/HbvwDq43DSjACVZWJiYkTzkw69vVq/TfG2cnZSnCGLS8v56KLLkqSXHTRRU5hZVUTBxiRycnJfPjDH86hQ4fy4Q9/+IRrHmC1sSANI7K8vJwtW7bk4YcfziWXXGLPgVXNngOMQFVl06ZNeeSRR5IkjzzySDZt2mRBmlVLHGAEpqens2fPnlxwwQVZs2ZNLrjgguzZsyfT09PjnhoMxWElGIF9+/ZlzZo12b9/f5Jk//79WbNmTfbt2zfmmcFw7DnACOzZsyettVxyySVJkksuuSSttezZs2fMM4PhiAOMyIYNG7KwsJBDhw5lYWEhGzZsGPeUYGjiACOydu3a7/k1rCb+64URefLJJ3PNNddkaWkpk5OTWbPG316sXv7rhRHYsGFDnnrqqVxwwQWpqlxwwQV56qmnHFpi1bLnACNw0UUX5ciRI3n88cfTWsvjjz+e888///jbacBqY88BRuBrX/tafvd3fzc//MM/nDVr1uSHf/iH87u/+7v52te+Nu6pwVDEAUZgamoqn//8508Y+/znP+82oaxa4gAj4DahnG3EAUZgcXExN998c7Zv354LL7ww27dvz80335zFxcVxTw2GIg4wArt3786P/MiPnDD2Iz/yI9m9e/eYZgSnRxxgBDZt2pS5ubkcOHAgSXLgwIHMzc1l06ZNY54ZDMeprDACTzzxRPbv35/169fnyJEjefLJJ7N///5MTEyMe2owFHsOMAJ79+7NhRdemPPPPz9r1qzJ+eefnwsvvDB79+4d99RgKOIAI/Ka17zm+BXRGzZsyGte85oxzwiGJw4wInfeeWe++c1vprWWb37zm7nzzjvHPSUYmjjACExMTKS1liQnfLbmwGolDjACy8vLecELXnDCmsMLXvCCLC8vj3tqMBRxgBG58cYbT1hzuPHGG8c8IxheHdsFXm1mZmbazp07xz0NSJJcfvnl2bt3b5aWlo7fz2FycjIXX3xxvvrVr457enBcVd3XWps52Xb2HGAErrrqqjzxxBNZWlpKkiwtLeWJJ57IVVddNeaZwXDEAUbgT//0T5Pk+AL0sc/HxmG1EQcYgSNHjmTDhg25/PLLU1W5/PLLs2HDhhw5cmTcU4OhnFYcqupLVfXZqvpMVe0cjF1cVfdW1QODzxcNxquq3l1VD1bVX1XVj614nTcOtn+gqt54er8SjM/27dvz1FNPZfv27eOeCpyWUby30ubW2jdXfP32JB9vrd1aVW8ffH1zkuuSvHTw8cokv5PklVV1cZJfTzKTpCW5r6ruaq3tG8Hc4Iw5cOBAtmzZkkceeSTf//3ff/xN+GA1ejYOK70uyfsHj9+f5PUrxj/QjvpEkhdW1YuTXJPk3tba3kEQ7k1y7bMwL3jWPfzww2mt5eGHHx73VOC0nG4cWpL/VFX3VdWbB2OXtNa+Pnj8jSSXDB5fmmTlOX17BmPfbRxWjTVrnv6f0ncbh+e60z2sdHVr7aGq+v4k91bVf135zdZaq6qRXUgxCNCbk+SKK64Y1cvCaTu28HzRRRfl29/+dl7wghdk3759FqRZtU7rz5rW2kODz48k+UiSVyR5eHC4KIPPjww2fyjJ5Sueftlg7LuNP93Pe19rbaa1NrNx48bTmTqM3ObNm4/f3GfTpk3uH82qNnQcqmpDVV147HGSVyfZleSuJMfOOHpjkj8ePL4ryfWDs5ZeleTbg8NP9yR5dVVdNDiz6dWDMVhVPvGJT+QLX/hCjhw5ki984Qv5xCc+Me4pwdBO57DSJUk+UlXHXueDrbX/u6o+neQPq2o2yZeT/OPB9h9L8pokDyZ5IskvJElrbW9V/WaSTw+2+43WmjuksKpUVZ588slcdNFF2bdvXy644ILs27cvg38fsOp4byUYgbVr1z7tO7BOTEzk8OHDY5gRPD3vrQRn0LEwfOfbZ3jLblYrcYARee1rX5vDhw+ntZbDhw/nta997binBEMbxRXSQJI/+ZM/yQ/8wA8cv0L60UcfHfeUYGjiACOwdu3aTExMZO/evWmtZe/evZmcnHRYiVXLYSUYgec///k5fPhwbr311hw4cCC33nprDh8+nOc///njnhoMRRxgBB577LFs3rw5v/qrv5oNGzbkV3/1V7N58+Y89thj454aDEUcYAQ2bdqUv/iLv8jatUeP1K5duzZ/8Rd/cfyKaVhtxAFGYN++fXniiSfyi7/4i3nsscfyi7/4i3niiSeyb593nmd1chEcjEBV5Qd+4AfyjW984/jYsa9X678xzk4ugoMz7Bvf+EZuvPHGPPbYY7nxxhtPCAWsNuIAI7Ju3br8zM/8TJ73vOflZ37mZ7Ju3bpxTwmG5joHGJGlpaVs2bIlDz/8cC655JIsLS2Ne0owNHsOMAJVlUsvvTSPPHL09iWPPPJILr30Uu/KyqolDjAC09PT2bNnT376p386jz76aH76p386e/bsyfT09LinBkNxWAlG4MiRI3nJS16Su+66K8fuUviSl7zEbUJZtew5wAjcf//9efzxx3PllVemqnLllVfm8ccfz/333z/uqcFQxAFG4NhNfbZv356nnnoq27dvz+HDh4/f1wFWG4eVYAQOHz6cgwcP5pprrsnS0lImJyezdu1ad4Fj1bLnACPy5JNPHl9jOHLkSJ588skxzwiGJw4AdMQBRujY+yh5PyVWO3GAEZmcnMwVV1yRNWvW5Iorrsjk5OS4pwRDEwcYkaWlpePrDk8++aS3z2BVEwcYoYcffviEz7BaiQOMwLH3UFqzZs0Jn723EquVOMAIHFuAPhaDY58tTLNaiQOMyJYtW/Kyl70sa9asycte9rJs2bJl3FOCoblCGkbkox/9aA4fPpwjR47kC1/4Qv76r/963FOCoYkDjMCGDRty4MCB42sNy8vLWVpayoYNG8Y8MxiOw0owAgcPHkzSrzkcG4fVRhxgBJaXl1NVWV5eftqvYbURBxiR1toJew7OVGI1EwcYoZW3CYXVzII0jNDK24TCambPAYCOOADQEQcAOuIAQEccYIRuvPHGPPbYY7nxxhvHPRU4LbVaz8WemZlpO3fuHPc0IMn3fmvu1fpvjLNTVd3XWps52Xb2HADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBxih1772tXn00Ufz2te+dtxTgdOydtwTgLPJXXfdlY0bN457GnDa7DkA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHGKGJiYkTPsNqJQ4wQsvLyyd8htVq7bgnAM91VXVGnt9aO62fA6NkzwFOorV20o+LL774aZ978cUXn9LzhYHnGnGAEfjWt77VBeLiiy/Ot771rTHNCE6POMCIfOtb30prLT9485+ktSYMrGriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADprxz0BOJP+7i3/Kd9+culZ/zlXvv0/Pquv/4LzJ/Nffv3Vz+rP4NwmDpxTvv3kUr506/847mmctmc7PuCwEgAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjfe45xy4dTb89++/+3jnsZpu3AqSVb/Gwjy3CUOnFP2777Vu7LCKXBYCYCOOADQec7EoaqurarPV9WDVbX6DwoDrGLPiTWHqppI8p4kP5VkT5JPV9VdrbX7xzszzkZnw/H6F5w/Oe4pcJZ7TsQhySuSPNha++skqao7k7wuiTgwUmdiMfrKt//Hs2LRm3PbcyUOlyb56oqv9yR55XduVFVvTvLmJLniiivOzMw451XVM3/Obc/857TWnvmT4FnynFlzOBWttfe11mZaazMbN24c93Q4R7TWzsgHPJc8V+LwUJLLV3x92WAMgDF4rsTh00leWlUvqap1SX4uyV1jnhPAOes5sebQWjtcVb+S5J4kE0m2t9Y+N+ZpAZyznhNxSJLW2seSfGzc8wDguXNYCYDnEHEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGAjjgA0BEHADriAEBHHADoiAMAHXEAoCMOAHTEAYCOOADQEQcAOuIAQEccAOiIAwAdcQCgIw4AdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKAjDgB0xAGATrXWxj2HoVTVo0m+PO55wNP4viTfHPck4Lv4wdbaxpNttGrjAM9VVbWztTYz7nnA6XBYCYCOOADQEQcYvfeNewJwuqw5ANCx5wBARxzgWVJV/09VOWuJVUkc4DmoqtaOew6c28SBc1JVXVlV/7Wqfr+qvlBVf1BV/0NV/b9V9UBVvaKqNlTV9qr6VFX9ZVW9bvDc/7WqPlpV91bVl6rqV6rqbYNtPlFVF6/4Uf+0qj5TVbuq6hWD53+v172rqv4sycer6sVV9ecrnv/fn/n/pThX+euEc9kPJfmZJDck+XSSn09ydZLXJnlHkvuT/Flr7YaqemGST1XVnw6eO53kR5OsT/Jgkptbaz9aVb+d5Pok/26w3fNaay+vqr+fZPvgefPf43V/LMnfaa3trap/keSe1trWqppI8rxn8X8LOIE4cC77Ymvts0lSVZ9L8vHWWquqzya5MsllSV5bVb862H59kisGjxdba/uT7K+qbyf5vwbjn03yd1b8jIUkaa39eVU9fxCDV3+P1723tbZ38PjTSbZX1WSSj7bWPjOy3xxOwmElzmVPrXh8ZMXXR3L0D6dK8j+31l4++Liitbb7FJ97zHeeK95O8roHjm/Y2p8n+ftJHkry+1V1/VC/JQxBHOC7uyfJXFVVklTVjw7xGj87eO7VSb7dWvv2qb5uVf1gkodba7+X5H/P0UNOcEY4rATf3W/m6NrBX1XVmiRfTPI/PcPXOFhVf5lkMkfXNp7J6/6DJP+yqpaSPJ6jaxlwRrhCGoCOw0oAdMQBgI44ANARBwA64gBARxwA6IgDAB1xAKDz/wOyc1Kfm6L0GwAAAABJRU5ErkJggg==\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.rcParams['figure.figsize'] = [6, 20]\n",
"all_groups_df['members'].plot.box();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wow, there are quite a few **mega-groups**, as indicated by the circles above our top whisker!\n",
"\n",
"---\n",
"\n",
"Why are the groups so big?\n",
"\n",
"In fact...\n",
"\n",
"### What are the 10 biggest tech groups in the area?"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
name
\n",
"
members
\n",
"
\n",
" \n",
" \n",
"
\n",
"
19
\n",
"
Silicon Valley Entrepreneurs & Startups
\n",
"
36058
\n",
"
\n",
"
\n",
"
107
\n",
"
SFHTML5
\n",
"
17718
\n",
"
\n",
"
\n",
"
106
\n",
"
Designers + Geeks
\n",
"
15467
\n",
"
\n",
"
\n",
"
426
\n",
"
SF Data Science
\n",
"
14874
\n",
"
\n",
"
\n",
"
28
\n",
"
The SF JavaScript Meetup
\n",
"
13359
\n",
"
\n",
"
\n",
"
250
\n",
"
Tech in Motion Events: San Francisco
\n",
"
13090
\n",
"
\n",
"
\n",
"
540
\n",
"
Docker Online Meetup
\n",
"
12475
\n",
"
\n",
"
\n",
"
191
\n",
"
SF Data Mining
\n",
"
12378
\n",
"
\n",
"
\n",
"
201
\n",
"
Women Who Code SF
\n",
"
12334
\n",
"
\n",
"
\n",
"
706
\n",
"
SF Big Analytics
\n",
"
11889
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name members\n",
"19 Silicon Valley Entrepreneurs & Startups 36058\n",
"107 SFHTML5 17718\n",
"106 Designers + Geeks 15467\n",
"426 SF Data Science 14874\n",
"28 The SF JavaScript Meetup 13359\n",
"250 Tech in Motion Events: San Francisco 13090\n",
"540 Docker Online Meetup 12475\n",
"191 SF Data Mining 12378\n",
"201 Women Who Code SF 12334\n",
"706 SF Big Analytics 11889"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"biggest_ten_df = all_groups_df.sort_values('members',\n",
" ascending=False).head(10)\n",
"biggest_ten_df[[\"name\", \"members\"]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get Group Events"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### We need to do some data shaping before the next api call\n",
"\n",
"Mostly we need to:\n",
"1. pass in a string with group ids from our 10 biggest groups\n",
"2. convert our human-readable date ranges to milliseconds since Jan 1, 1970\n",
"3. Call the GetEvents API filtering for past events using our group IDs and our date range\n",
"\n",
"#### First, let's make that string of group ids\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'844726,1619955,1615633,9226282,1060260,3483762,13402242,2065031,2252591,18354966'"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"id_list = biggest_ten_df['id'].tolist()\n",
"id_list\n",
"ids = ','.join(str(x) for x in id_list)\n",
"ids"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now, let's get the epoch milliseconds for a date range between now and 9 months ago"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Now: 1550937159472, nine months ago: 1535385159472\n"
]
}
],
"source": [
"def to_millis(dt):\n",
" return int(pd.to_datetime(dt).value / 1000000)\n",
"\n",
"right_now = to_millis(datetime.datetime.now())\n",
"nine_months_ago = int(right_now - 180 * 24 * 60 * 60 * 1000)\n",
"print(f\"Now: {right_now}, nine months ago: {nine_months_ago}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Finally, let's look at those events."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"%%capture --no-display\n",
"events_resp = client.GetEvents(group_id=ids, status='past',\n",
" time=f\"{nine_months_ago},{right_now}\");\n",
"\n",
"events_meta, events_df = parse_response(events_resp)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Again, our events_df dataframe has extra columns that I don't care about"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
Demo Session is free to meetup attendees. U... 7200000 \n",
"\n",
" event_url \\\n",
"0 https://www.meetup.com/sventrepreneurs/events/... \n",
"\n",
" group headcount \\\n",
"0 {'join_mode': 'open', 'created': 1196203591000... 0 \n",
"\n",
" how_to_find_us id maybe_rsvp_count \\\n",
"0 NaN 253824506 0 \n",
"\n",
" name ... \\\n",
"0 Demo Session @ Mars Blockchain Summit by Mars ... ... \n",
"\n",
" rating rsvp_limit status time \\\n",
"0 {'count': 0, 'average': 0} nan past 1535495400000 \n",
"\n",
" updated utc_offset \\\n",
"0 1535527171000 -25200000 \n",
"\n",
" venue visibility \\\n",
"0 {'country': 'us', 'localized_country_name': 'U... public \n",
"\n",
" waitlist_count yes_rsvp_count \n",
"0 0 66 \n",
"\n",
"[1 rows x 21 columns]"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"events_df.head(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### So again, let's filter down to just what's relevant"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
group
\n",
"
time
\n",
"
duration
\n",
"
yes_rsvp_count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
{'join_mode': 'open', 'created': 1196203591000...
\n",
"
1535495400000
\n",
"
7200000
\n",
"
66
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" group time duration \\\n",
"0 {'join_mode': 'open', 'created': 1196203591000... 1535495400000 7200000 \n",
"\n",
" yes_rsvp_count \n",
"0 66 "
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"column_list = ['group', 'time', 'duration', 'yes_rsvp_count']\n",
"events_df = events_df[column_list]\n",
"events_df.head(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### The group column\n",
"\n",
"The **group** column is actually a JSON object full of metadata about the group.\n",
"\n",
"I really only need the **group\\[\"id\"\\]** for now, so let's focus on that."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
time
\n",
"
duration
\n",
"
yes_rsvp_count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
844726
\n",
"
1535495400000
\n",
"
7200000
\n",
"
66
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id time duration yes_rsvp_count\n",
"0 844726 1535495400000 7200000 66"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def get_id(my_dict):\n",
" \"\"\"Extract the id member of a python dictionary\"\"\"\n",
" return my_dict[\"id\"]\n",
"\n",
"events_df[\"id\"] = events_df[\"group\"].apply(get_id)\n",
"\n",
"# Let's \n",
"columns = ['id', 'time', 'duration', 'yes_rsvp_count']\n",
"events_df = events_df[columns]\n",
"events_df.head(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Hmm, it seems that our **time** is numeric\n",
"\n",
"The **time** is stored in **Epoch milliseconds** format.\n",
"\n",
"This is great if you want to see time as the number of milliseconds since Jan 1, 1970.\n",
"\n",
"This is not-so-great if you just want to see a human-readable date and time equivalent.\n",
"\n",
"Let's make a new human-readable column called **time_dt**"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
time
\n",
"
time_dt
\n",
"
duration
\n",
"
yes_rsvp_count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
844726
\n",
"
1535495400000
\n",
"
08/28/18 22:30
\n",
"
7200000
\n",
"
66
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id time time_dt duration yes_rsvp_count\n",
"0 844726 1535495400000 08/28/18 22:30 7200000 66"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"events_df[\"time_dt\"] = pd.to_datetime(\n",
" events_df[\"time\"], unit='ms').dt.strftime('%m/%d/%y %H:%M')\n",
" \n",
"columns = ['id', 'time','time_dt', 'duration', 'yes_rsvp_count']\n",
"events_df = events_df[columns]\n",
"events_df.head(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Now let's convert the duration column to something human-readable\n",
"\n",
"Let's convert the column to a string that shows hours and minutes."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
time
\n",
"
time_dt
\n",
"
duration
\n",
"
yes_rsvp_count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
844726
\n",
"
1535495400000
\n",
"
08/28/18 22:30
\n",
"
2 hours, 0 minutes
\n",
"
66
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id time time_dt duration yes_rsvp_count\n",
"0 844726 1535495400000 08/28/18 22:30 2 hours, 0 minutes 66"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def millis_2_hours_and_minutes(ms):\n",
" \"\"\"Converts milliseconds to hours and minutes.\"\"\"\n",
" seconds = ms / 1000\n",
" minutes, seconds = divmod(seconds, 60)\n",
" hours, minutes = divmod(minutes, 60)\n",
"\n",
" return f\"{int(hours)} hours, {int(minutes)} minutes\" \n",
"\n",
"events_df[\"duration\"] = events_df[\"duration\"].apply(\n",
" millis_2_hours_and_minutes)\n",
"\n",
"events_df.head(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Now let's join our top ten mega-groups dataframe with our events dataframe\n",
"\n",
"If you are familiar with SQL this is similar to a left join from **raw_results_df**\n",
"to **biggest_ten_df** on **id**\n",
"\n",
"Then we sort the output by **name** ascending and then **time** descending."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
name
\n",
"
time
\n",
"
time_dt
\n",
"
duration
\n",
"
yes_rsvp_count
\n",
"
id
\n",
"
\n",
" \n",
" \n",
"
\n",
"
101
\n",
"
Designers + Geeks
\n",
"
1550804400000
\n",
"
02/22/19 03:00
\n",
"
2 hours, 0 minutes
\n",
"
178
\n",
"
1615633
\n",
"
\n",
"
\n",
"
55
\n",
"
Designers + Geeks
\n",
"
1542337200000
\n",
"
11/16/18 03:00
\n",
"
2 hours, 0 minutes
\n",
"
71
\n",
"
1615633
\n",
"
\n",
"
\n",
"
46
\n",
"
Designers + Geeks
\n",
"
1541124000000
\n",
"
11/02/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
71
\n",
"
1615633
\n",
"
\n",
"
\n",
"
32
\n",
"
Designers + Geeks
\n",
"
1539914400000
\n",
"
10/19/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
41
\n",
"
1615633
\n",
"
\n",
"
\n",
"
24
\n",
"
Designers + Geeks
\n",
"
1538704800000
\n",
"
10/05/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
29
\n",
"
1615633
\n",
"
\n",
"
\n",
"
14
\n",
"
Designers + Geeks
\n",
"
1537495200000
\n",
"
09/21/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
37
\n",
"
1615633
\n",
"
\n",
"
\n",
"
4
\n",
"
Designers + Geeks
\n",
"
1536285600000
\n",
"
09/07/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
87
\n",
"
1615633
\n",
"
\n",
"
\n",
"
40
\n",
"
Docker Online Meetup
\n",
"
1540915200000
\n",
"
10/30/18 16:00
\n",
"
1 hours, 0 minutes
\n",
"
1
\n",
"
13402242
\n",
"
\n",
"
\n",
"
97
\n",
"
SF Big Analytics
\n",
"
1549591200000
\n",
"
02/08/19 02:00
\n",
"
2 hours, 30 minutes
\n",
"
418
\n",
"
18354966
\n",
"
\n",
"
\n",
"
80
\n",
"
SF Big Analytics
\n",
"
1547690400000
\n",
"
01/17/19 02:00
\n",
"
3 hours, 0 minutes
\n",
"
450
\n",
"
18354966
\n",
"
\n",
"
\n",
"
78
\n",
"
SF Big Analytics
\n",
"
1547604000000
\n",
"
01/16/19 02:00
\n",
"
3 hours, 0 minutes
\n",
"
5
\n",
"
18354966
\n",
"
\n",
"
\n",
"
64
\n",
"
SF Big Analytics
\n",
"
1544061600000
\n",
"
12/06/18 02:00
\n",
"
3 hours, 0 minutes
\n",
"
7
\n",
"
18354966
\n",
"
\n",
"
\n",
"
53
\n",
"
SF Big Analytics
\n",
"
1542247200000
\n",
"
11/15/18 02:00
\n",
"
3 hours, 0 minutes
\n",
"
16
\n",
"
18354966
\n",
"
\n",
"
\n",
"
51
\n",
"
SF Big Analytics
\n",
"
1542160800000
\n",
"
11/14/18 02:00
\n",
"
2 hours, 30 minutes
\n",
"
478
\n",
"
18354966
\n",
"
\n",
"
\n",
"
50
\n",
"
SF Big Analytics
\n",
"
1541782800000
\n",
"
11/09/18 17:00
\n",
"
57 hours, 0 minutes
\n",
"
16
\n",
"
18354966
\n",
"
\n",
"
\n",
"
44
\n",
"
SF Big Analytics
\n",
"
1541120400000
\n",
"
11/02/18 01:00
\n",
"
3 hours, 0 minutes
\n",
"
152
\n",
"
18354966
\n",
"
\n",
"
\n",
"
29
\n",
"
SF Big Analytics
\n",
"
1539909000000
\n",
"
10/19/18 00:30
\n",
"
2 hours, 30 minutes
\n",
"
390
\n",
"
18354966
\n",
"
\n",
"
\n",
"
16
\n",
"
SF Big Analytics
\n",
"
1538010000000
\n",
"
09/27/18 01:00
\n",
"
2 hours, 45 minutes
\n",
"
245
\n",
"
18354966
\n",
"
\n",
"
\n",
"
8
\n",
"
SF Big Analytics
\n",
"
1536800400000
\n",
"
09/13/18 01:00
\n",
"
2 hours, 30 minutes
\n",
"
218
\n",
"
18354966
\n",
"
\n",
"
\n",
"
10
\n",
"
SF Data Mining
\n",
"
1537200000000
\n",
"
09/17/18 16:00
\n",
"
104 hours, 0 minutes
\n",
"
6
\n",
"
2065031
\n",
"
\n",
"
\n",
"
93
\n",
"
SF Data Science
\n",
"
1548988200000
\n",
"
02/01/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
94
\n",
"
9226282
\n",
"
\n",
"
\n",
"
89
\n",
"
SF Data Science
\n",
"
1548383400000
\n",
"
01/25/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
48
\n",
"
9226282
\n",
"
\n",
"
\n",
"
82
\n",
"
SF Data Science
\n",
"
1547778600000
\n",
"
01/18/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
26
\n",
"
9226282
\n",
"
\n",
"
\n",
"
81
\n",
"
SF Data Science
\n",
"
1547692200000
\n",
"
01/17/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
59
\n",
"
9226282
\n",
"
\n",
"
\n",
"
60
\n",
"
SF Data Science
\n",
"
1543539600000
\n",
"
11/30/18 01:00
\n",
"
3 hours, 30 minutes
\n",
"
18
\n",
"
9226282
\n",
"
\n",
"
\n",
"
52
\n",
"
SF Data Science
\n",
"
1542211200000
\n",
"
11/14/18 16:00
\n",
"
10 hours, 0 minutes
\n",
"
1
\n",
"
9226282
\n",
"
\n",
"
\n",
"
38
\n",
"
SF Data Science
\n",
"
1540774800000
\n",
"
10/29/18 01:00
\n",
"
4 hours, 0 minutes
\n",
"
21
\n",
"
9226282
\n",
"
\n",
"
\n",
"
30
\n",
"
SF Data Science
\n",
"
1539910800000
\n",
"
10/19/18 01:00
\n",
"
2 hours, 0 minutes
\n",
"
95
\n",
"
9226282
\n",
"
\n",
"
\n",
"
26
\n",
"
SF Data Science
\n",
"
1539306000000
\n",
"
10/12/18 01:00
\n",
"
3 hours, 0 minutes
\n",
"
15
\n",
"
9226282
\n",
"
\n",
"
\n",
"
102
\n",
"
SFHTML5
\n",
"
1550883600000
\n",
"
02/23/19 01:00
\n",
"
4 hours, 0 minutes
\n",
"
336
\n",
"
1619955
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
95
\n",
"
Women Who Code SF
\n",
"
1549420200000
\n",
"
02/06/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
47
\n",
"
2252591
\n",
"
\n",
"
\n",
"
92
\n",
"
Women Who Code SF
\n",
"
1548815400000
\n",
"
01/30/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
37
\n",
"
2252591
\n",
"
\n",
"
\n",
"
86
\n",
"
Women Who Code SF
\n",
"
1548210600000
\n",
"
01/23/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
29
\n",
"
2252591
\n",
"
\n",
"
\n",
"
79
\n",
"
Women Who Code SF
\n",
"
1547605800000
\n",
"
01/16/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
32
\n",
"
2252591
\n",
"
\n",
"
\n",
"
76
\n",
"
Women Who Code SF
\n",
"
1547001000000
\n",
"
01/09/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
57
\n",
"
2252591
\n",
"
\n",
"
\n",
"
71
\n",
"
Women Who Code SF
\n",
"
1545271200000
\n",
"
12/20/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
199
\n",
"
2252591
\n",
"
\n",
"
\n",
"
69
\n",
"
Women Who Code SF
\n",
"
1545186600000
\n",
"
12/19/18 02:30
\n",
"
1 hours, 30 minutes
\n",
"
50
\n",
"
2252591
\n",
"
\n",
"
\n",
"
70
\n",
"
Women Who Code SF
\n",
"
1545186600000
\n",
"
12/19/18 02:30
\n",
"
2 hours, 0 minutes
\n",
"
23
\n",
"
2252591
\n",
"
\n",
"
\n",
"
67
\n",
"
Women Who Code SF
\n",
"
1544581800000
\n",
"
12/12/18 02:30
\n",
"
2 hours, 0 minutes
\n",
"
22
\n",
"
2252591
\n",
"
\n",
"
\n",
"
65
\n",
"
Women Who Code SF
\n",
"
1544149800000
\n",
"
12/07/18 02:30
\n",
"
2 hours, 0 minutes
\n",
"
17
\n",
"
2252591
\n",
"
\n",
"
\n",
"
63
\n",
"
Women Who Code SF
\n",
"
1543977000000
\n",
"
12/05/18 02:30
\n",
"
2 hours, 0 minutes
\n",
"
29
\n",
"
2252591
\n",
"
\n",
"
\n",
"
62
\n",
"
Women Who Code SF
\n",
"
1543975200000
\n",
"
12/05/18 02:00
\n",
"
3 hours, 0 minutes
\n",
"
1
\n",
"
2252591
\n",
"
\n",
"
\n",
"
58
\n",
"
Women Who Code SF
\n",
"
1542767400000
\n",
"
11/21/18 02:30
\n",
"
2 hours, 0 minutes
\n",
"
31
\n",
"
2252591
\n",
"
\n",
"
\n",
"
54
\n",
"
Women Who Code SF
\n",
"
1542335400000
\n",
"
11/16/18 02:30
\n",
"
2 hours, 0 minutes
\n",
"
50
\n",
"
2252591
\n",
"
\n",
"
\n",
"
49
\n",
"
Women Who Code SF
\n",
"
1541557800000
\n",
"
11/07/18 02:30
\n",
"
2 hours, 0 minutes
\n",
"
27
\n",
"
2252591
\n",
"
\n",
"
\n",
"
45
\n",
"
Women Who Code SF
\n",
"
1541122200000
\n",
"
11/02/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
50
\n",
"
2252591
\n",
"
\n",
"
\n",
"
43
\n",
"
Women Who Code SF
\n",
"
1540949400000
\n",
"
10/31/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
29
\n",
"
2252591
\n",
"
\n",
"
\n",
"
39
\n",
"
Women Who Code SF
\n",
"
1540859400000
\n",
"
10/30/18 00:30
\n",
"
2 hours, 30 minutes
\n",
"
64
\n",
"
2252591
\n",
"
\n",
"
\n",
"
34
\n",
"
Women Who Code SF
\n",
"
1540400400000
\n",
"
10/24/18 17:00
\n",
"
1 hours, 0 minutes
\n",
"
2
\n",
"
2252591
\n",
"
\n",
"
\n",
"
33
\n",
"
Women Who Code SF
\n",
"
1540344600000
\n",
"
10/24/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
36
\n",
"
2252591
\n",
"
\n",
"
\n",
"
31
\n",
"
Women Who Code SF
\n",
"
1539912600000
\n",
"
10/19/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
50
\n",
"
2252591
\n",
"
\n",
"
\n",
"
25
\n",
"
Women Who Code SF
\n",
"
1539135000000
\n",
"
10/10/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
25
\n",
"
2252591
\n",
"
\n",
"
\n",
"
23
\n",
"
Women Who Code SF
\n",
"
1538703000000
\n",
"
10/05/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
50
\n",
"
2252591
\n",
"
\n",
"
\n",
"
21
\n",
"
Women Who Code SF
\n",
"
1538530200000
\n",
"
10/03/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
10
\n",
"
2252591
\n",
"
\n",
"
\n",
"
22
\n",
"
Women Who Code SF
\n",
"
1538530200000
\n",
"
10/03/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
27
\n",
"
2252591
\n",
"
\n",
"
\n",
"
13
\n",
"
Women Who Code SF
\n",
"
1537493400000
\n",
"
09/21/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
33
\n",
"
2252591
\n",
"
\n",
"
\n",
"
11
\n",
"
Women Who Code SF
\n",
"
1537320600000
\n",
"
09/19/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
14
\n",
"
2252591
\n",
"
\n",
"
\n",
"
9
\n",
"
Women Who Code SF
\n",
"
1537030800000
\n",
"
09/15/18 17:00
\n",
"
3 hours, 0 minutes
\n",
"
10
\n",
"
2252591
\n",
"
\n",
"
\n",
"
7
\n",
"
Women Who Code SF
\n",
"
1536715800000
\n",
"
09/12/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
25
\n",
"
2252591
\n",
"
\n",
"
\n",
"
1
\n",
"
Women Who Code SF
\n",
"
1535506200000
\n",
"
08/29/18 01:30
\n",
"
2 hours, 0 minutes
\n",
"
35
\n",
"
2252591
\n",
"
\n",
" \n",
"
\n",
"
103 rows × 6 columns
\n",
"
"
],
"text/plain": [
" name time time_dt \\\n",
"101 Designers + Geeks 1550804400000 02/22/19 03:00 \n",
"55 Designers + Geeks 1542337200000 11/16/18 03:00 \n",
"46 Designers + Geeks 1541124000000 11/02/18 02:00 \n",
"32 Designers + Geeks 1539914400000 10/19/18 02:00 \n",
"24 Designers + Geeks 1538704800000 10/05/18 02:00 \n",
"14 Designers + Geeks 1537495200000 09/21/18 02:00 \n",
"4 Designers + Geeks 1536285600000 09/07/18 02:00 \n",
"40 Docker Online Meetup 1540915200000 10/30/18 16:00 \n",
"97 SF Big Analytics 1549591200000 02/08/19 02:00 \n",
"80 SF Big Analytics 1547690400000 01/17/19 02:00 \n",
"78 SF Big Analytics 1547604000000 01/16/19 02:00 \n",
"64 SF Big Analytics 1544061600000 12/06/18 02:00 \n",
"53 SF Big Analytics 1542247200000 11/15/18 02:00 \n",
"51 SF Big Analytics 1542160800000 11/14/18 02:00 \n",
"50 SF Big Analytics 1541782800000 11/09/18 17:00 \n",
"44 SF Big Analytics 1541120400000 11/02/18 01:00 \n",
"29 SF Big Analytics 1539909000000 10/19/18 00:30 \n",
"16 SF Big Analytics 1538010000000 09/27/18 01:00 \n",
"8 SF Big Analytics 1536800400000 09/13/18 01:00 \n",
"10 SF Data Mining 1537200000000 09/17/18 16:00 \n",
"93 SF Data Science 1548988200000 02/01/19 02:30 \n",
"89 SF Data Science 1548383400000 01/25/19 02:30 \n",
"82 SF Data Science 1547778600000 01/18/19 02:30 \n",
"81 SF Data Science 1547692200000 01/17/19 02:30 \n",
"60 SF Data Science 1543539600000 11/30/18 01:00 \n",
"52 SF Data Science 1542211200000 11/14/18 16:00 \n",
"38 SF Data Science 1540774800000 10/29/18 01:00 \n",
"30 SF Data Science 1539910800000 10/19/18 01:00 \n",
"26 SF Data Science 1539306000000 10/12/18 01:00 \n",
"102 SFHTML5 1550883600000 02/23/19 01:00 \n",
".. ... ... ... \n",
"95 Women Who Code SF 1549420200000 02/06/19 02:30 \n",
"92 Women Who Code SF 1548815400000 01/30/19 02:30 \n",
"86 Women Who Code SF 1548210600000 01/23/19 02:30 \n",
"79 Women Who Code SF 1547605800000 01/16/19 02:30 \n",
"76 Women Who Code SF 1547001000000 01/09/19 02:30 \n",
"71 Women Who Code SF 1545271200000 12/20/18 02:00 \n",
"69 Women Who Code SF 1545186600000 12/19/18 02:30 \n",
"70 Women Who Code SF 1545186600000 12/19/18 02:30 \n",
"67 Women Who Code SF 1544581800000 12/12/18 02:30 \n",
"65 Women Who Code SF 1544149800000 12/07/18 02:30 \n",
"63 Women Who Code SF 1543977000000 12/05/18 02:30 \n",
"62 Women Who Code SF 1543975200000 12/05/18 02:00 \n",
"58 Women Who Code SF 1542767400000 11/21/18 02:30 \n",
"54 Women Who Code SF 1542335400000 11/16/18 02:30 \n",
"49 Women Who Code SF 1541557800000 11/07/18 02:30 \n",
"45 Women Who Code SF 1541122200000 11/02/18 01:30 \n",
"43 Women Who Code SF 1540949400000 10/31/18 01:30 \n",
"39 Women Who Code SF 1540859400000 10/30/18 00:30 \n",
"34 Women Who Code SF 1540400400000 10/24/18 17:00 \n",
"33 Women Who Code SF 1540344600000 10/24/18 01:30 \n",
"31 Women Who Code SF 1539912600000 10/19/18 01:30 \n",
"25 Women Who Code SF 1539135000000 10/10/18 01:30 \n",
"23 Women Who Code SF 1538703000000 10/05/18 01:30 \n",
"21 Women Who Code SF 1538530200000 10/03/18 01:30 \n",
"22 Women Who Code SF 1538530200000 10/03/18 01:30 \n",
"13 Women Who Code SF 1537493400000 09/21/18 01:30 \n",
"11 Women Who Code SF 1537320600000 09/19/18 01:30 \n",
"9 Women Who Code SF 1537030800000 09/15/18 17:00 \n",
"7 Women Who Code SF 1536715800000 09/12/18 01:30 \n",
"1 Women Who Code SF 1535506200000 08/29/18 01:30 \n",
"\n",
" duration yes_rsvp_count id \n",
"101 2 hours, 0 minutes 178 1615633 \n",
"55 2 hours, 0 minutes 71 1615633 \n",
"46 2 hours, 0 minutes 71 1615633 \n",
"32 2 hours, 0 minutes 41 1615633 \n",
"24 2 hours, 0 minutes 29 1615633 \n",
"14 2 hours, 0 minutes 37 1615633 \n",
"4 2 hours, 0 minutes 87 1615633 \n",
"40 1 hours, 0 minutes 1 13402242 \n",
"97 2 hours, 30 minutes 418 18354966 \n",
"80 3 hours, 0 minutes 450 18354966 \n",
"78 3 hours, 0 minutes 5 18354966 \n",
"64 3 hours, 0 minutes 7 18354966 \n",
"53 3 hours, 0 minutes 16 18354966 \n",
"51 2 hours, 30 minutes 478 18354966 \n",
"50 57 hours, 0 minutes 16 18354966 \n",
"44 3 hours, 0 minutes 152 18354966 \n",
"29 2 hours, 30 minutes 390 18354966 \n",
"16 2 hours, 45 minutes 245 18354966 \n",
"8 2 hours, 30 minutes 218 18354966 \n",
"10 104 hours, 0 minutes 6 2065031 \n",
"93 2 hours, 0 minutes 94 9226282 \n",
"89 2 hours, 0 minutes 48 9226282 \n",
"82 2 hours, 0 minutes 26 9226282 \n",
"81 2 hours, 0 minutes 59 9226282 \n",
"60 3 hours, 30 minutes 18 9226282 \n",
"52 10 hours, 0 minutes 1 9226282 \n",
"38 4 hours, 0 minutes 21 9226282 \n",
"30 2 hours, 0 minutes 95 9226282 \n",
"26 3 hours, 0 minutes 15 9226282 \n",
"102 4 hours, 0 minutes 336 1619955 \n",
".. ... ... ... \n",
"95 2 hours, 0 minutes 47 2252591 \n",
"92 2 hours, 0 minutes 37 2252591 \n",
"86 2 hours, 0 minutes 29 2252591 \n",
"79 2 hours, 0 minutes 32 2252591 \n",
"76 2 hours, 0 minutes 57 2252591 \n",
"71 2 hours, 0 minutes 199 2252591 \n",
"69 1 hours, 30 minutes 50 2252591 \n",
"70 2 hours, 0 minutes 23 2252591 \n",
"67 2 hours, 0 minutes 22 2252591 \n",
"65 2 hours, 0 minutes 17 2252591 \n",
"63 2 hours, 0 minutes 29 2252591 \n",
"62 3 hours, 0 minutes 1 2252591 \n",
"58 2 hours, 0 minutes 31 2252591 \n",
"54 2 hours, 0 minutes 50 2252591 \n",
"49 2 hours, 0 minutes 27 2252591 \n",
"45 2 hours, 0 minutes 50 2252591 \n",
"43 2 hours, 0 minutes 29 2252591 \n",
"39 2 hours, 30 minutes 64 2252591 \n",
"34 1 hours, 0 minutes 2 2252591 \n",
"33 2 hours, 0 minutes 36 2252591 \n",
"31 2 hours, 0 minutes 50 2252591 \n",
"25 2 hours, 0 minutes 25 2252591 \n",
"23 2 hours, 0 minutes 50 2252591 \n",
"21 2 hours, 0 minutes 10 2252591 \n",
"22 2 hours, 0 minutes 27 2252591 \n",
"13 2 hours, 0 minutes 33 2252591 \n",
"11 2 hours, 0 minutes 14 2252591 \n",
"9 3 hours, 0 minutes 10 2252591 \n",
"7 2 hours, 0 minutes 25 2252591 \n",
"1 2 hours, 0 minutes 35 2252591 \n",
"\n",
"[103 rows x 6 columns]"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"merged_df = pd.merge(\n",
" events_df,\n",
" biggest_ten_df[['id', 'name']],\n",
" on='id',\n",
" how='left')\n",
"\n",
"columns = ['name', 'time', 'time_dt', 'duration', 'yes_rsvp_count', 'id']\n",
"final_df = merged_df[columns]\n",
"\n",
"# Sort the output by name and time\n",
"final_df = final_df.sort_values(by=['name', 'time'], ascending=[True, False])\n",
"final_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Hmm, those ID numbers are numeric, but take a while to type\n",
"\n",
"Let's convert those to something easier.\n"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
name
\n",
"
time
\n",
"
time_dt
\n",
"
duration
\n",
"
yes_rsvp_count
\n",
"
id
\n",
"
\n",
" \n",
" \n",
"
\n",
"
101
\n",
"
Designers + Geeks
\n",
"
1550804400000
\n",
"
02/22/19 03:00
\n",
"
2 hours, 0 minutes
\n",
"
178
\n",
"
0
\n",
"
\n",
"
\n",
"
55
\n",
"
Designers + Geeks
\n",
"
1542337200000
\n",
"
11/16/18 03:00
\n",
"
2 hours, 0 minutes
\n",
"
71
\n",
"
0
\n",
"
\n",
"
\n",
"
46
\n",
"
Designers + Geeks
\n",
"
1541124000000
\n",
"
11/02/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
71
\n",
"
0
\n",
"
\n",
"
\n",
"
32
\n",
"
Designers + Geeks
\n",
"
1539914400000
\n",
"
10/19/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
41
\n",
"
0
\n",
"
\n",
"
\n",
"
24
\n",
"
Designers + Geeks
\n",
"
1538704800000
\n",
"
10/05/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
29
\n",
"
0
\n",
"
\n",
"
\n",
"
14
\n",
"
Designers + Geeks
\n",
"
1537495200000
\n",
"
09/21/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
37
\n",
"
0
\n",
"
\n",
"
\n",
"
4
\n",
"
Designers + Geeks
\n",
"
1536285600000
\n",
"
09/07/18 02:00
\n",
"
2 hours, 0 minutes
\n",
"
87
\n",
"
0
\n",
"
\n",
"
\n",
"
40
\n",
"
Docker Online Meetup
\n",
"
1540915200000
\n",
"
10/30/18 16:00
\n",
"
1 hours, 0 minutes
\n",
"
1
\n",
"
1
\n",
"
\n",
"
\n",
"
97
\n",
"
SF Big Analytics
\n",
"
1549591200000
\n",
"
02/08/19 02:00
\n",
"
2 hours, 30 minutes
\n",
"
418
\n",
"
2
\n",
"
\n",
"
\n",
"
80
\n",
"
SF Big Analytics
\n",
"
1547690400000
\n",
"
01/17/19 02:00
\n",
"
3 hours, 0 minutes
\n",
"
450
\n",
"
2
\n",
"
\n",
"
\n",
"
78
\n",
"
SF Big Analytics
\n",
"
1547604000000
\n",
"
01/16/19 02:00
\n",
"
3 hours, 0 minutes
\n",
"
5
\n",
"
2
\n",
"
\n",
"
\n",
"
64
\n",
"
SF Big Analytics
\n",
"
1544061600000
\n",
"
12/06/18 02:00
\n",
"
3 hours, 0 minutes
\n",
"
7
\n",
"
2
\n",
"
\n",
"
\n",
"
53
\n",
"
SF Big Analytics
\n",
"
1542247200000
\n",
"
11/15/18 02:00
\n",
"
3 hours, 0 minutes
\n",
"
16
\n",
"
2
\n",
"
\n",
"
\n",
"
51
\n",
"
SF Big Analytics
\n",
"
1542160800000
\n",
"
11/14/18 02:00
\n",
"
2 hours, 30 minutes
\n",
"
478
\n",
"
2
\n",
"
\n",
"
\n",
"
50
\n",
"
SF Big Analytics
\n",
"
1541782800000
\n",
"
11/09/18 17:00
\n",
"
57 hours, 0 minutes
\n",
"
16
\n",
"
2
\n",
"
\n",
"
\n",
"
44
\n",
"
SF Big Analytics
\n",
"
1541120400000
\n",
"
11/02/18 01:00
\n",
"
3 hours, 0 minutes
\n",
"
152
\n",
"
2
\n",
"
\n",
"
\n",
"
29
\n",
"
SF Big Analytics
\n",
"
1539909000000
\n",
"
10/19/18 00:30
\n",
"
2 hours, 30 minutes
\n",
"
390
\n",
"
2
\n",
"
\n",
"
\n",
"
16
\n",
"
SF Big Analytics
\n",
"
1538010000000
\n",
"
09/27/18 01:00
\n",
"
2 hours, 45 minutes
\n",
"
245
\n",
"
2
\n",
"
\n",
"
\n",
"
8
\n",
"
SF Big Analytics
\n",
"
1536800400000
\n",
"
09/13/18 01:00
\n",
"
2 hours, 30 minutes
\n",
"
218
\n",
"
2
\n",
"
\n",
"
\n",
"
10
\n",
"
SF Data Mining
\n",
"
1537200000000
\n",
"
09/17/18 16:00
\n",
"
104 hours, 0 minutes
\n",
"
6
\n",
"
3
\n",
"
\n",
"
\n",
"
93
\n",
"
SF Data Science
\n",
"
1548988200000
\n",
"
02/01/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
94
\n",
"
4
\n",
"
\n",
"
\n",
"
89
\n",
"
SF Data Science
\n",
"
1548383400000
\n",
"
01/25/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
48
\n",
"
4
\n",
"
\n",
"
\n",
"
82
\n",
"
SF Data Science
\n",
"
1547778600000
\n",
"
01/18/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
26
\n",
"
4
\n",
"
\n",
"
\n",
"
81
\n",
"
SF Data Science
\n",
"
1547692200000
\n",
"
01/17/19 02:30
\n",
"
2 hours, 0 minutes
\n",
"
59
\n",
"
4
\n",
"
\n",
"
\n",
"
60
\n",
"
SF Data Science
\n",
"
1543539600000
\n",
"
11/30/18 01:00
\n",
"
3 hours, 30 minutes
\n",
"
18
\n",
"
4
\n",
"
\n",
"
\n",
"
52
\n",
"
SF Data Science
\n",
"
1542211200000
\n",
"
11/14/18 16:00
\n",
"
10 hours, 0 minutes
\n",
"
1
\n",
"
4
\n",
"
\n",
"
\n",
"
38
\n",
"
SF Data Science
\n",
"
1540774800000
\n",
"
10/29/18 01:00
\n",
"
4 hours, 0 minutes
\n",
"
21
\n",
"
4
\n",
"
\n",
"
\n",
"
30
\n",
"
SF Data Science
\n",
"
1539910800000
\n",
"
10/19/18 01:00
\n",
"
2 hours, 0 minutes
\n",
"
95
\n",
"
4
\n",
"
\n",
"
\n",
"
26
\n",
"
SF Data Science
\n",
"
1539306000000
\n",
"
10/12/18 01:00
\n",
"
3 hours, 0 minutes
\n",
"
15
\n",
"
4
\n",
"
\n",
"
\n",
"
102
\n",
"
SFHTML5
\n",
"
1550883600000
\n",
"
02/23/19 01:00
\n",
"
4 hours, 0 minutes
\n",
"
336
\n",
"
5
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name time time_dt \\\n",
"101 Designers + Geeks 1550804400000 02/22/19 03:00 \n",
"55 Designers + Geeks 1542337200000 11/16/18 03:00 \n",
"46 Designers + Geeks 1541124000000 11/02/18 02:00 \n",
"32 Designers + Geeks 1539914400000 10/19/18 02:00 \n",
"24 Designers + Geeks 1538704800000 10/05/18 02:00 \n",
"14 Designers + Geeks 1537495200000 09/21/18 02:00 \n",
"4 Designers + Geeks 1536285600000 09/07/18 02:00 \n",
"40 Docker Online Meetup 1540915200000 10/30/18 16:00 \n",
"97 SF Big Analytics 1549591200000 02/08/19 02:00 \n",
"80 SF Big Analytics 1547690400000 01/17/19 02:00 \n",
"78 SF Big Analytics 1547604000000 01/16/19 02:00 \n",
"64 SF Big Analytics 1544061600000 12/06/18 02:00 \n",
"53 SF Big Analytics 1542247200000 11/15/18 02:00 \n",
"51 SF Big Analytics 1542160800000 11/14/18 02:00 \n",
"50 SF Big Analytics 1541782800000 11/09/18 17:00 \n",
"44 SF Big Analytics 1541120400000 11/02/18 01:00 \n",
"29 SF Big Analytics 1539909000000 10/19/18 00:30 \n",
"16 SF Big Analytics 1538010000000 09/27/18 01:00 \n",
"8 SF Big Analytics 1536800400000 09/13/18 01:00 \n",
"10 SF Data Mining 1537200000000 09/17/18 16:00 \n",
"93 SF Data Science 1548988200000 02/01/19 02:30 \n",
"89 SF Data Science 1548383400000 01/25/19 02:30 \n",
"82 SF Data Science 1547778600000 01/18/19 02:30 \n",
"81 SF Data Science 1547692200000 01/17/19 02:30 \n",
"60 SF Data Science 1543539600000 11/30/18 01:00 \n",
"52 SF Data Science 1542211200000 11/14/18 16:00 \n",
"38 SF Data Science 1540774800000 10/29/18 01:00 \n",
"30 SF Data Science 1539910800000 10/19/18 01:00 \n",
"26 SF Data Science 1539306000000 10/12/18 01:00 \n",
"102 SFHTML5 1550883600000 02/23/19 01:00 \n",
"\n",
" duration yes_rsvp_count id \n",
"101 2 hours, 0 minutes 178 0 \n",
"55 2 hours, 0 minutes 71 0 \n",
"46 2 hours, 0 minutes 71 0 \n",
"32 2 hours, 0 minutes 41 0 \n",
"24 2 hours, 0 minutes 29 0 \n",
"14 2 hours, 0 minutes 37 0 \n",
"4 2 hours, 0 minutes 87 0 \n",
"40 1 hours, 0 minutes 1 1 \n",
"97 2 hours, 30 minutes 418 2 \n",
"80 3 hours, 0 minutes 450 2 \n",
"78 3 hours, 0 minutes 5 2 \n",
"64 3 hours, 0 minutes 7 2 \n",
"53 3 hours, 0 minutes 16 2 \n",
"51 2 hours, 30 minutes 478 2 \n",
"50 57 hours, 0 minutes 16 2 \n",
"44 3 hours, 0 minutes 152 2 \n",
"29 2 hours, 30 minutes 390 2 \n",
"16 2 hours, 45 minutes 245 2 \n",
"8 2 hours, 30 minutes 218 2 \n",
"10 104 hours, 0 minutes 6 3 \n",
"93 2 hours, 0 minutes 94 4 \n",
"89 2 hours, 0 minutes 48 4 \n",
"82 2 hours, 0 minutes 26 4 \n",
"81 2 hours, 0 minutes 59 4 \n",
"60 3 hours, 30 minutes 18 4 \n",
"52 10 hours, 0 minutes 1 4 \n",
"38 4 hours, 0 minutes 21 4 \n",
"30 2 hours, 0 minutes 95 4 \n",
"26 3 hours, 0 minutes 15 4 \n",
"102 4 hours, 0 minutes 336 5 "
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Helper function to transform long id number to easy id numbers\n",
"# Get an enumeration of unique ids\n",
"unique_ids = final_df['id'].unique()\n",
"ids_2_new_ids = {k: v for v, k in enumerate(unique_ids)}\n",
"ids_2_new_ids\n",
"def get_new_id(old_id):\n",
" return ids_2_new_ids[old_id]\n",
"\n",
"# re-write those ids as something simpler\n",
"final_df['id'] = final_df['id'].apply(get_new_id)\n",
"\n",
"final_df.head(30)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"This is nice, but which groups have regular meetings, which ones have growing interest (increasing RSVP-yes)?\n",
"How do any of these groups compare to each other?\n",
"\n",
"### Let's visualize the trend lines for the top ten mega-groups\n",
"\n",
"Let's just use linear regression to draw trend lines for each mega-group.\n",
"\n",
"We'll use seaborn's **lmplot** to visualize all ten mega-groups.\n",
"\n",
"We need to use epoch milliseconds **time** column of our dataframe, since it is numeric and can be used to generate trend lines."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArEAAAKACAYAAACL/CAlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd8VuX5x/HPlR0IAQIBmQICMhUkyBIHIDIErLa1VauMtuKstlr9afewtbbVDlGrIrg7RAFRQIYSWbL3HsombALZuX9/nJOYhBXIOHmS7/v18pU8Z15PZHy5n+vctznnEBEREREJJWFBFyAiIiIicr4UYkVEREQk5CjEioiIiEjIUYgVERERkZCjECsiIiIiIUchVkRERERCjkKsiIiIiIQchVgRERERCTkKsSIiIiISciKCLqCsDRgwwE2dOjXoMkREpGKxoAsQkZKp9COxBw4cCLoEERERESlllT7EioiIiEjloxArIiIiIiFHIVZEREREQo5CrIiIiIiEHIVYEREREQk5CrEiIiIiEnIUYkVEREQk5CjEioiIiEjIUYgVERERkZCjECsiIiIiIUchVkRERERCjkKsiIiIiIQchVgRERERCTkKsSIiIiISchRiRURERCTkKMSKiIiISMhRiBURERGRkKMQKyIiIiIhRyFWREREREKOQqyIiIiIhByFWBEREREJOQqxIiIiIhJyFGJFREREJOREBF2ASJDS1h8idc5Osg+nE1E7hrirGxPbJiHoskREROQcFGKlykpbf4gjk7ZAuGGxEWQfz/Reg4KsiIhIBad2AqmyUufshHAjLCocM+8r4eZtFxERkQpNIVaqrOzD6Vhk4d8CFhlG9uH0gCoSERGR4lKIlSoronYMLiu30DaXlUtE7ZiAKhIREZHiUoiVKivu6saQ48jNzME57ys5ztsuIiIiFZoe7JIqK+/hLc1OICIiEnoUYqVKi22ToNAqIiISgtROICIiIiIhRyFWREREREKOQqyIiIiIhByFWBEREREJOQqxIiIiIhJyFGJFREREJOQoxIqIiIhIyFGIFREREZGQoxArIiIiIiFHIVZEREREQo5CrIiIiIiEHIVYEREREQk5CrEiIiIiEnIUYkVEREQk5CjEioiIiEjIUYgVERERkZCjECsiIiIiIUchVkRERERCjkKsiIiIiIQchVgRERERCTkKsSIiIiISchRiRURERCTkKMSKiIiISMhRiBURERGRkKMQKyIiIiIhRyFWREREREKOQqyIiIiIhByFWBEREREJOQqxIiIiIhJyFGJFREREJOQoxIqIiIhIyFGIFREREZGQoxArIiIiIiFHIVZEREREQo5CrIiIiIiEHIVYEREREQk5CrEiIiIiEnIUYkVEREQk5CjEioiIiEjIUYgVERERkZCjECsiIiIiIUchVkRERERCjkKsiIiIiIQchVgRERERCTkKsSIiIiISchRiRURERCTkKMSKiIiISMhRiC0HJ06c4OTJk0GXISIiIlJpKMSWsfXr1/P888/z4YcfBl2KiIiISKUReIg1s1pm9j8zW29m68ysh5klmNknZrbJ/1rbP9bM7O9mttnMVprZFUHXfy5paWmcPHmStWvXsmbNmqDLEREREakUAg+xwN+Aqc65NsDlwDrgcWCmc64VMNN/DTAQaOX/90PghfIv9/x06tSJVq1aATBlyhRSU1MDrkhEREQk9AUaYs2sJnA18CqAcy7TOXcEGAaM9w8bD9zkfz8MeN15FgC1zKxBOZd9XsyMIUOGEB0dzcmTJ/noo4+CLklEREQk5AU9EtscSAFeM7NlZvaKmVUH6jvn9vjH7AXq+983AnYUOH+nv60QM/uhmS02s8UpKSllWH7xxMfHM2DAAADWrl3L6tWrA65IREREJLQFHWIjgCuAF5xznYETfN06AIBzzgHufC7qnPuXcy7JOZeUmJhYasWWhNoKREREREpP0CF2J7DTObfQf/0/vFC7L69NwP+639+/C2hS4PzG/rYKL6+tICYmhrS0NKZMmYKXz0VERETkfAUaYp1ze4EdZnapv6kvsBaYBNzlb7sLmOh/Pwm405+loDtwtEDbQYVXsK1g3bp1aisQERERuUARQRcAPAC8ZWZRwFZgBF64/o+ZjQK+BL7tH/sRMAjYDJz0jw0pl19+OWvXrmXjxo189NFHNG/enLi4uKDLEhEREQkpVtk/0k5KSnKLFy8OuoxCjh07xpgxY0hPT6dNmzbceuutmFnQZYmIVCX6Q1ckxAXdE1slxcfHM3DgQMBb0WvVqlUBVyRlIW39IVL+tZI9T39Byr9Wkrb+UNAliYiIVBoKsQG57LLLuPRSrxX4448/5vjx4wFXJKUpbf0hjkzaQvbx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3o1780S3J0iMTeRY5jESYxN5otsT6ocVEZEqw5xzQddQppKSktzixVom9ELt2LGDsWPH4pzjmmuu4brrrgu6JBGR0mBBFyAiJaORWDmrJk2a5LcVJCcnq61AREREKgSFWDmn6667jrp166qtQERERCoMhVg5p8jISG666SbMjH379jFnzpygSxIREZEqTiFWiqVx48b07NkT8NoKdu/eHXBFIiIiUpUpxEqxXXvttSQmJuKcU1uBiIiIBEohVoqtYFvB/v37+eyzz4IuSURERKoohVg5L40aNaJXr14AfP755+zapWVOpXQl70xm1LRRDHhvAKOmjSJ5p1aMExGRUynEynlTW4GUleSdyTy18ClS0lKIj4onJS2FpxY+pSArIiKnUIiV8xYREcE3vvENzIyUlBQ+/fTToEuSSmLcmnFEhkcSGxGLmREbEUtkeCTj1owLujQREalgFGLlgjRs2JCrrroKgLlz57Jz586AK5LKYFfqLmLCYwptiwmPYVeq2lZERKQwhVi5YNdccw316tXLbyvIysoKuiQJcY3iGpGek15oW3pOOo3iGgVUkYiIVFQKsXLBIiIi8mcrOHDggNoKpMSGtx9OVk4WadlpOOdIy04jKyeL4e2HB12aiIhUMAqxUiINGzakd+/eAMybN09tBVIivRv35oluT5AYm8ixzGMkxibyRLcn6N24d9CliYhIBWPOuaBrKFNJSUlu8eLFQZdRqWVnZ/Pyyy+zb98+6taty913301kZGTQZYmInI0FXYCIlIxGYqXE8toKwsLCOHDgALNnzw66JBEREankFGKlVDRo0CC/rWD+/Pns2LEj4IpERESkMlOIlVLTu3dv6tevr9kKREREpMwpxEqpKdhWcPDgQbUViIiISJlRiJVS1aBBA66++mrAm63gq6++CrgiERERqYwUYqXU9e7dm4suugiAiRMnqq1ARERESp1CrJS68PDwQm0Fs2bNCrokERERqWQUYqVMXHTRRVxzzTWAN1uB2gpERESkNCnESpm56qqraNCgAQAffPABmZmZAVckIiIilUVE0AVI5ZXXVvDSSy9x6NAhZs2axYABA4IuS0LctmWLWTR5Akf376Nmvfp0HXIzzTsnnfbY5J3JjFszjl2pu2gU14jh7YdrCVsRkUpCI7FSpurXr8+1114LwIIFC/jyyy+DLUhC2rZli5k5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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# import statsmodels.api as sm\n",
"ax = sb.lmplot(\"time\", \"yes_rsvp_count\", data=final_df, hue=\"name\",\n",
" height=9, aspect=0.75, order=1, ci=None)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Ah, this is interesting\n",
"\n",
"From the top 10 mega-groups I can see that several groups have major problems.\n",
"For instance, the **Docker Online Meetup** group has almost no yes_rsvp_counts.\n",
"\n",
"Let's take a closer look."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"