SlideShare a Scribd company logo
MongoDB Days UK: Using MongoDB and Python for Data Analysis Pipelines
Using MongoDB and Python for data analysis
pipelines
Eoin Brazil, PhD, MSc
Proactive Technical Services, MongoDB
Github repo for this talk: http://github.com/braz/mongodbdays2015_talk/
3
From once off
to real scale
production
What this talk will cover
5
Challenges for an operational pipeline:
• Combining
• Cleaning / formatting
• Supporting free flow
6
Reproducibility Production
7
• Data
• State
• Operations /
Transformation
8
Data set and aggregation
•Python dictionary ~12 million numbers per second
•Python List 110 million numbers per second
•numpy.ndarray 500 million numbers per second
ndarray or n-dimensional array, provides high-
performance c-style arrays uses built-in maths
libraries.
9
Workflows to / from MongoDB
PyMongo Workflow: ~150,000 documents per second
MongoDB PyMongo Python Dicts NumPy
Monary Workflow: 1,700,000 documents per second
MongoDB Monary NumPy
10
• Monary
• MongoDB
An example of connecting the stages of a
data pipe
• Python
• Airflow
Firstly dive into
MongoDB’s
Aggregation & Monary
11
Averaging a data set
12
Monary Query
13
Monary Query
>>> from monary import Monary
>>> m = Monary()
>>> pipeline = [{"$group" : {"_id" : "$state", "totPop" :
{"$sum" : “$pop"}}}]
>>> states, population = m.aggregate("zips","data",
pipeline, ["_id","totpop"], ["string:2", "int64"])
14
Monary Query
>>> from monary import Monary
>>> m = Monary()
>>> pipeline = [{"$group" : {"_id" : "$state", "totPop" :
{"$sum" : “$pop"}}}]
>>> states, population = m.aggregate("zips","data",
pipeline, ["_id","totpop"], ["string:2", "int64"])
Database
15
Monary Query
>>> from monary import Monary
>>> m = Monary()
>>> pipeline = [{"$group" : {"_id" : "$state", "totPop" :
{"$sum" : “$pop"}}}]
>>> states, population = m.aggregate("zips","data",
pipeline, ["_id","totpop"], ["string:2", "int64"])
Collection
16
Monary Query
>>> from monary import Monary
>>> m = Monary()
>>> pipeline = [{"$group" : {"_id" : "$state", "totPop" :
{"$sum" : “$pop"}}}]
>>> states, population = m.aggregate("zips","data",
pipeline, ["_id","totpop"], ["string:2", "int64"])
Aggregation
17
Monary Query
>>> from monary import Monary
>>> m = Monary()
>>> pipeline = [{"$group" : {"_id" : "$state", "totPop" :
{"$sum" : “$pop"}}}]
>>> states, population = m.aggregate("zips","data",
pipeline, ["_id","totpop"], ["string:2", "int64"])
Field Name/s
18
Monary Query
>>> from monary import Monary
>>> m = Monary()
>>> pipeline = [{"$group" : {"_id" : "$state", "totPop" :
{"$sum" : “$pop"}}}]
>>> states, population = m.aggregate("zips","data",
pipeline, ["_id","totpop"], ["string:2", "int64"])
Return type/s
19
Aggregation Result
[u'WA: 4866692', u'HI: 1108229', u'CA: 29754890', u'OR: 2842321', u'NM: 1515069',
u'UT: 1722850', u'OK: 3145585', u'LA: 4217595', u'NE: 1578139', u'TX: 16984601', u'MO:
5110648', u'MT: 798948', u'ND: 638272', u'AK: 544698', u'SD: 695397', u'DC: 606900',
u'MN: 4372982', u'ID: 1006749', u'KY: 3675484', u'WI: 4891769', u'TN: 4876457', u'AZ:
3665228', u'CO: 3293755', u'KS: 2475285', u'MS: 2573216', u'FL: 12686644', u'IA:
2776420', u'NC: 6628637', u'VA: 6181479', u'IN: 5544136', u'ME: 1226648', u'WV:
1793146', u'MD: 4781379', u'GA: 6478216', u'NH: 1109252', u'NV: 1201833', u'DE:
666168', u'AL: 4040587', u'CT: 3287116', u'SC: 3486703', u'RI: 1003218', u'PA:
11881643', u'VT: 562758', u'MA: 6016425', u'WY: 453528', u'MI: 9295297', u'OH:
10846517', u'AR: 2350725', u'IL: 11427576', u'NJ: 7730188', u'NY: 17990402']
20
Aggregation Result
[u'WA: 4866692', u'HI: 1108229', u'CA: 29754890', u'OR: 2842321', u'NM: 1515069',
u'UT: 1722850', u'OK: 3145585', u'LA: 4217595', u'NE: 1578139', u'TX: 16984601', u'MO:
5110648', u'MT: 798948', u'ND: 638272', u'AK: 544698', u'SD: 695397', u'DC: 606900',
u'MN: 4372982', u'ID: 1006749', u'KY: 3675484', u'WI: 4891769', u'TN: 4876457', u'AZ:
3665228', u'CO: 3293755', u'KS: 2475285', u'MS: 2573216', u'FL: 12686644', u'IA:
2776420', u'NC: 6628637', u'VA: 6181479', u'IN: 5544136', u'ME: 1226648', u'WV:
1793146', u'MD: 4781379', u'GA: 6478216', u'NH: 1109252', u'NV: 1201833', u'DE:
666168', u'AL: 4040587', u'CT: 3287116', u'SC: 3486703', u'RI: 1003218', u'PA:
11881643', u'VT: 562758', u'MA: 6016425', u'WY: 453528', u'MI: 9295297', u'OH:
10846517', u'AR: 2350725', u'IL: 11427576', u'NJ: 7730188', u'NY: 17990402']
21
MonaryNumPy
Python
Matlibplot
Pandas
PyTables
Cron
Luigi
Airflow
Scikit -
learn
22
Fitting your pipelines together:
• Schedule/Repeatable
• Monitoring
• Checkpoints
• Dependencies
23
24
25
Visual
Graph
Code
example_monary_operator.py
from __future__ import print_function
from builtins import range
from airflow.operators import PythonOperator
from airflow.models import DAG
from datetime import datetime, timedelta
import time
from monary import Monary
seven_days_ago = datetime.combine(datetime.today() - timedelta(7),
datetime.min.time())
default_args = {
'owner': 'airflow',
'start_date': seven_days_ago,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
dag = DAG(dag_id='example_monary_operator', default_args=default_args)
def my_sleeping_function(random_base):
'''This is a function that will run within the DAG execution'''
time.sleep(random_base)
IMPORTS
SETTINGS
DAG &
Functions
example_monary_operator.py
def connect_to_monary_and_print_aggregation(ds, **kwargs):
m = Monary()
pipeline = [{"$group": {"_id": "$state", "totPop": {"$sum": "$pop"}}}]
states, population = m.aggregate("zips", "data", pipeline, ["_id", "totPop"], ["string:2", "int64"])
strs = list(map(lambda x: x.decode("utf-8"), states))
result = list("%s: %d" % (state, pop) for (state, pop) in zip(strs, population))
print (result)
return 'Whatever you return gets printed in the logs'
run_this = PythonOperator(
task_id='connect_to_monary_and_print_aggregation',
provide_context=True,
python_callable=connect_to_monary_and_print_aggregation,
dag=dag)
AGGREGATION
DAG SETUP
example_monary_operator.py
for i in range(10):
'''
Generating 10 sleeping tasks, sleeping from 0 to 9 seconds
respectively
'''
task = PythonOperator(
task_id='sleep_for_'+str(i),
python_callable=my_sleeping_function,
op_kwargs={'random_base': i},
dag=dag)
task.set_upstream(run_this)
LOOP
DAG SETUP
Airflow command line output for example
$ airflow backfill example_monary_operator -s 2015-01-01 -e 2015-01-02
2015-10-08 15:08:09,532 INFO - Filling up the DagBag from /Users/braz/airflow/dags
2015-10-08 15:08:09,532 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_bash_operator.py
2015-10-08 15:08:09,533 INFO - Loaded DAG <DAG: example_bash_operator>
2015-10-08 15:08:09,533 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_branch_operator.py
2015-10-08 15:08:09,534 INFO - Loaded DAG <DAG: example_branch_operator>
2015-10-08 15:08:09,534 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_http_operator.py
2015-10-08 15:08:09,535 INFO - Loaded DAG <DAG: example_http_operator>
2015-10-08 15:08:09,535 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_monary_operator.py
2015-10-08 15:08:09,719 INFO - Loaded DAG <DAG: example_monary_operator>
2015-10-08 15:08:09,719 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_pymongo_operator.py
2015-10-08 15:08:09,738 INFO - Loaded DAG <DAG: example_pymongo_operator>
2015-10-08 15:08:09,738 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_python_operator.py
2015-10-08 15:08:09,739 INFO - Loaded DAG <DAG: example_python_operator>
2015-10-08 15:08:09,739 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_xcom.py
2015-10-08 15:08:09,739 INFO - Loaded DAG <DAG: example_xcom>
2015-10-08 15:08:09,739 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/tutorial.py
2015-10-08 15:08:09,740 INFO - Loaded DAG <DAG: tutorial>
2015-10-08 15:08:09,819 INFO - Adding to queue: airflow run example_monary_operator connect_to_monary_and_print_aggregation 2015-01-02T00:00:00 --local -sd
DAGS_FOLDER/example_dags/example_monary_operator.py -s 2015-01-01T00:00:00
2015-10-08 15:08:09,865 INFO - Adding to queue: airflow run example_monary_operator connect_to_monary_and_print_aggregation 2015-01-01T00:00:00 --local -sd
DAGS_FOLDER/example_dags/example_monary_operator.py -s 2015-01-01T00:00:00
2015-10-08 15:08:14,765 INFO - [backfill progress] waiting: 22 | succeeded: 0 | kicked_off: 2 | failed: 0 | skipped: 0
2015-10-08 15:08:19,765 INFO - commandairflow run example_monary_operator connect_to_monary_and_print_aggregation 2015-01-02T00:00:00 --local -sd
DAGS_FOLDER/example_dags/example_monary_operator.py -s 2015-01-01T00:00:00
Logging into: /Users/braz/airflow/logs/example_monary_operator/connect_to_monary_and_print_aggregation/2015-01-02T00:00:00
[u'WA: 4866692', u'HI: 1108229', u'CA: 29754890', u'OR: 2842321', u'NM: 1515069', u'UT: 1722850', u'OK: 3145585', u'LA: 4217595', u'NE: 1578139', u'TX: 16984601', u'MO: 5110648', u'MT: 798948', u'ND: 638272',
u'AK: 544698', u'SD: 695397', u'DC: 606900', u'MN: 4372982', u'ID: 1006749', u'KY: 3675484', u'WI: 4891769', u'TN: 4876457', u'AZ: 3665228', u'CO: 3293755', u'KS: 2475285', u'MS: 2573216', u'FL: 12686644', u'IA:
2776420', u'NC: 6628637', u'VA: 6181479', u'IN: 5544136', u'ME: 1226648', u'WV: 1793146', u'MD: 4781379', u'GA: 6478216', u'NH: 1109252', u'NV: 1201833', u'DE: 666168', u'AL: 4040587', u'CT: 3287116', u'SC:
3486703', u'RI: 1003218', u'PA: 11881643', u'VT: 562758', u'MA: 6016425', u'WY: 453528', u'MI: 9295297', u'OH: 10846517', u'AR: 2350725', u'IL: 11427576', u'NJ: 7730188', u'NY: 17990402']
2015-10-08 15:08:26,097 INFO - commandairflow run example_monary_operator connect_to_monary_and_print_aggregation 2015-01-01T00:00:00 --local -sd
DAGS_FOLDER/example_dags/example_monary_operator.py -s 2015-01-01T00:00:00
Logging into: /Users/braz/airflow/logs/example_monary_operator/connect_to_monary_and_print_aggregation/2015-01-01T00:00:00
[u'WA: 4866692', u'HI: 1108229', u'CA: 29754890', u'OR: 2842321', u'NM: 1515069', u'UT: 1722850', u'OK: 3145585', u'LA: 4217595', u'NE: 1578139', u'TX: 16984601', u'MO: 5110648', u'MT: 798948', u'ND: 638272',
u'AK: 544698', u'SD: 695397', u'DC: 606900', u'MN: 4372982', u'ID: 1006749', u'KY: 3675484', u'WI: 4891769', u'TN: 4876457', u'AZ: 3665228', u'CO: 3293755', u'KS: 2475285', u'MS: 2573216', u'FL: 12686644', u'IA:
2776420', u'NC: 6628637', u'VA: 6181479', u'IN: 5544136', u'ME: 1226648', u'WV: 1793146', u'MD: 4781379', u'GA: 6478216', u'NH: 1109252', u'NV: 1201833', u'DE: 666168', u'AL: 4040587', u'CT: 3287116', u'SC:
3486703', u'RI: 1003218', u'PA: 11881643', u'VT: 562758', u'MA: 6016425', u'WY: 453528', u'MI: 9295297', u'OH: 10846517', u'AR: 2350725', u'IL: 11427576', u'NJ: 7730188', u'NY: 17990402']
30
Aggregation Features in MongoDB 3.2 for Data Pipelines
• $sample, $lookup
• $indexStats
• $filter,$slice,$arrayElemAt, $isArray, $concatArrays
• Partial Indexes
• Document Validation
• 4 bit testing operators
• 2 new Accumulators for $group
• 10 new Arithmetic expression operators
31
Aggregation Features in MongoDB 3.2 for Data Pipelines
• $sample, $lookup
• $indexStats
• $filter,$slice,$arrayElemAt, $isArray, $concatArrays
• Partial Indexes
• Document Validation
• 4 bit testing operators
• 2 new Accumulators for $group
• 10 new Arithmetic expression operators
Building your pipeline
pipeline = [{"$project":{'page': '$PAGE', 'time': { 'y':
{'$year':'$DATE'} , 'm':{'$month':'$DATE'},
'day':{'$dayOfMonth':'$DATE'}}}},
{'$group':{'_id':{'p':'$page','y':'$time.y','m':'$time.m','d':'$time.d
ay'}, 'daily':{'$sum':1}}},{'$out':
tmp_created_collection_per_day_name}]
Building your pipeline
mongoexport -d test -c page_per_day_hits_tmp --type=csv -f=_id,daily -o
page_per_day_hits_tmp.csv
_id.d,_id.m,_id.y,_id.p,daily
3,2,2014,cart.do,115
4,2,2014,cart.do,681
5,2,2014,cart.do,638
6,2,2014,cart.do,610
....
3,2,2014,cart/error.do,2
4,2,2014,cart/error.do,14
5,2,2014,cart/error.do,23
CONVERSION
CSV FILE CONTENTS
Visualising the results
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import matplotlib.pyplot as plt
In [4]: df1 = pd.read_csv('page_per_day_hits_tmp.csv', names=['day', 'month', 'year', 'page', 'daily'],
header=0)
Out[4]:
day month year page daily
0 3 2 2014 cart.do 115
1 4 2 2014 cart.do 681
.. ... ... ... ... ...
103 10 2 2014 stuff/logo.ico 3
[104 rows x 5 columns]
In [5]: grouped = df1.groupby(['page'])
Out[5]: <pandas.core.groupby.DataFrameGroupBy object at 0x10f6b0dd0>
In [6]: grouped.agg({'daily':'sum'}).plot(kind='bar')
Out[6]: <matplotlib.axes.AxesSubplot at 0x10f8f4d10>
Scikit-learn churn data
['State', 'Account Length', 'Area Code', 'Phone', "Int'l Plan", 'VMail Plan', 'VMail Message', 'Day Mins', 'Day
Calls', 'Day Charge', 'Eve Mins', 'Eve Calls', 'Eve Charge', 'Night Mins', 'Night Calls', 'Night Charge', 'Intl
Mins', 'Intl Calls', 'Intl Charge', 'CustServ Calls', 'Churn?']
State Account Length Area Code Phone Intl Plan VMail Plan 
0 KS 128 415 382-4657 no yes
1 OH 107 415 371-7191 no yes
2 NJ 137 415 358-1921 no no
3 OH 84 408 375-9999 yes no
Night Charge Intl Mins Intl Calls Intl Charge CustServ Calls Churn?
0 11.01 10.0 3 2.70 1 False.
1 11.45 13.7 3 3.70 1 False.
2 7.32 12.2 5 3.29 0 False.
3 8.86 6.6 7 1.78 2 False.
Scikit-learn churn example
from __future__ import division
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import json
from sklearn.cross_validation import KFold
from sklearn.preprocessing import StandardScaler
from sklearn.cross_validation import train_test_split
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier as RF
%matplotlib inline
churn_df = pd.read_csv('churn.csv')
col_names = churn_df.columns.tolist()
print "Column names:"
print col_names
to_show = col_names[:6] + col_names[-6:]
IMPORTS
LOAD FILE / EXPLORE DATA
Scikit-learn churn example
print "nSample data:"
churn_df[to_show].head(2)
# Isolate target data
churn_result = churn_df['Churn?']
y = np.where(churn_result == 'True.',1,0)
to_drop = ['State','Area Code','Phone','Churn?']
churn_feat_space = churn_df.drop(to_drop,axis=1)
# 'yes'/'no' has to be converted to boolean values
# NumPy converts these from boolean to 1. and 0. later
yes_no_cols = ["Int'l Plan","VMail Plan"]
churn_feat_space[yes_no_cols] = churn_feat_space[yes_no_cols] == 'yes'
# Pull out features for future use
features = churn_feat_space.columns
X = churn_feat_space.as_matrix().astype(np.float)
scaler = StandardScaler()
X = scaler.fit_transform(X)
print "Feature space holds %d observations and %d features" % X.shape
print "Unique target labels:", np.unique(y)
FORMAT
DATA FOR
USAGE
FORMAT
DATA FOR
USAGE
38
Machine Learning references
https://speakerdeck.com/braz/introduction-to-machine-learning-with-r
https://speakerdeck.com/braz/machine-learning-of-machines-with-r
Scikit-learn churn example
from sklearn.svm import SVC
from sklearn.ensemble import
RandomForestClassifier as RF
from sklearn.metrics import
average_precision_score
from sklearn.cross_validation import KFold
def accuracy(y_true,y_pred):
# NumPy interpretes True and False as 1. and
0.
return np.mean(y_true == y_pred)
def run_cv(X,y,clf_class,**kwargs):
# Construct a kfolds object
kf = KFold(len(y),n_folds=3,shuffle=True)
y_pred = y.copy()
# Iterate through folds
for train_index, test_index in kf:
X_train, X_test = X[train_index],
X[test_index]
y_train = y[train_index]
clf = clf_class(**kwargs)
clf.fit(X_train,y_train)
y_pred[test_index] = clf.predict(X_test)
return y_pred
print "Support vector machines:"
print "%.3f" % accuracy(y, run_cv(X,y,SVC))
print "Random forest:"
print "%.3f" % accuracy(y, run_cv(X,y,RF))
Cross Fold
K=3
40
• Data
• State
• Operations /
Transformation
41
42
43
44
https://www.flickr.com/photos/rcbodden/272
5787927/in, Ray Bodden
https://www.flickr.com/photos/iqremix/15390
466616/in, iqremix
https://www.flickr.com/photos/storem/12996
3685/in, storem
https://www.flickr.com/photos/diversey/1574
2075527/in, Tony Webster
https://www.flickr.com/photos/acwa/8291889
208/in, PEO ACWA
https://www.flickr.com/photos/rowfoundation/
8938333357/in, Rajita Majumdar
https://www.flickr.com/photos/54268887@N
00/5057515604/in, Rob Pearce
https://www.flickr.com/photos/seeweb/61154
45165/in, seeweb
https://www.flickr.com/photos/98640399@N
08/9290143742/in, Barta IV
https://www.flickr.com/photos/aisforangie/68
77291681/in, Angie Harms
https://www.flickr.com/photos/jakerome/
3551143912/in, Jakerome
https://www.flickr.com/photos/ifyr/110639048
3/, Jack Shainsky
https://www.flickr.com/photos/rioncm/46437
92436/in, rioncm
https://www.flickr.com/photos/druidsnectar/4
605414895/in, druidsnectar
Photo Credits
Thanks!
Questions?
Eoin Brazil
eoin.brazil@mongodb.com
#MDBDays
mongodb.com
Get your technical questions answered
Benjamin Britten lounge (3rd floor), 10:00 - 17:00
By appointment only – register in person

More Related Content

Similar to MongoDB Days UK: Using MongoDB and Python for Data Analysis Pipelines (20)

PDF
Introduction to Data Analtics with Pandas [PyCon Cz]
Alexander Hendorf
 
PDF
Apache Airflow in the Cloud: Programmatically orchestrating workloads with Py...
Kaxil Naik
 
PDF
MongoDB at MapMyFitness from a DevOps Perspective
MongoDB
 
PDF
Managing transactions on Ethereum with Apache Airflow
Michael Ghen
 
PDF
FireWorks workflow software
Anubhav Jain
 
PDF
Airflow presentation
Ilias Okacha
 
PPT
Realtime Analytics Using MongoDB, Python, Gevent, and ZeroMQ
Rick Copeland
 
PPTX
Time Series Analysis for Network Secruity
mrphilroth
 
PPTX
Airflow Operators: Python, Bash, Dummy, and More
Shaik Dasthagiri
 
PPTX
MongoDB's New Aggregation framework
Chris Westin
 
PPTX
Operational Intelligence with MongoDB Webinar
MongoDB
 
PDF
Wes McKinney - Python for Data Analysis-O'Reilly Media (2012).pdf
Blue Sea
 
PPTX
Apache Airflow in Production
Robert Sanders
 
PDF
What's coming in Airflow 2.0? - NYC Apache Airflow Meetup
Kaxil Naik
 
PPTX
How to leverage MongoDB for Big Data Analysis and Operations with MongoDB's A...
Gianfranco Palumbo
 
PPTX
mongodb-aggregation-may-2012
Chris Westin
 
PDF
Introduction to Apache Airflow
mutt_data
 
PDF
How I learned to time travel, or, data pipelining and scheduling with Airflow
Laura Lorenz
 
PPTX
Airflow 101
SaarBergerbest
 
PDF
(Ebook) Data Science with Python by coll.
ecrioqxnae955
 
Introduction to Data Analtics with Pandas [PyCon Cz]
Alexander Hendorf
 
Apache Airflow in the Cloud: Programmatically orchestrating workloads with Py...
Kaxil Naik
 
MongoDB at MapMyFitness from a DevOps Perspective
MongoDB
 
Managing transactions on Ethereum with Apache Airflow
Michael Ghen
 
FireWorks workflow software
Anubhav Jain
 
Airflow presentation
Ilias Okacha
 
Realtime Analytics Using MongoDB, Python, Gevent, and ZeroMQ
Rick Copeland
 
Time Series Analysis for Network Secruity
mrphilroth
 
Airflow Operators: Python, Bash, Dummy, and More
Shaik Dasthagiri
 
MongoDB's New Aggregation framework
Chris Westin
 
Operational Intelligence with MongoDB Webinar
MongoDB
 
Wes McKinney - Python for Data Analysis-O'Reilly Media (2012).pdf
Blue Sea
 
Apache Airflow in Production
Robert Sanders
 
What's coming in Airflow 2.0? - NYC Apache Airflow Meetup
Kaxil Naik
 
How to leverage MongoDB for Big Data Analysis and Operations with MongoDB's A...
Gianfranco Palumbo
 
mongodb-aggregation-may-2012
Chris Westin
 
Introduction to Apache Airflow
mutt_data
 
How I learned to time travel, or, data pipelining and scheduling with Airflow
Laura Lorenz
 
Airflow 101
SaarBergerbest
 
(Ebook) Data Science with Python by coll.
ecrioqxnae955
 

More from MongoDB (20)

PDF
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB
 
PDF
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB
 
PDF
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB
 
PDF
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB
 
PDF
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB
 
PDF
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB
 
PDF
MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB
 
PDF
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB
 
PDF
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB
 
PDF
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB
 
PDF
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB
 
PDF
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB
 
PDF
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB
 
PDF
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB
 
PDF
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB
 
PDF
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB
 
PDF
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB
 
PDF
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB
 
PDF
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB
 
PDF
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB
 
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB
 
Ad

Recently uploaded (20)

PDF
Kit-Works Team Study_20250627_한달만에만든사내서비스키링(양다윗).pdf
Wonjun Hwang
 
PPTX
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
PDF
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
PDF
Automating Feature Enrichment and Station Creation in Natural Gas Utility Net...
Safe Software
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PDF
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
PDF
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PPTX
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Kit-Works Team Study_20250627_한달만에만든사내서비스키링(양다윗).pdf
Wonjun Hwang
 
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
Automating Feature Enrichment and Station Creation in Natural Gas Utility Net...
Safe Software
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Ad

MongoDB Days UK: Using MongoDB and Python for Data Analysis Pipelines

  • 2. Using MongoDB and Python for data analysis pipelines Eoin Brazil, PhD, MSc Proactive Technical Services, MongoDB Github repo for this talk: http://github.com/braz/mongodbdays2015_talk/
  • 3. 3 From once off to real scale production
  • 4. What this talk will cover
  • 5. 5 Challenges for an operational pipeline: • Combining • Cleaning / formatting • Supporting free flow
  • 7. 7 • Data • State • Operations / Transformation
  • 8. 8 Data set and aggregation •Python dictionary ~12 million numbers per second •Python List 110 million numbers per second •numpy.ndarray 500 million numbers per second ndarray or n-dimensional array, provides high- performance c-style arrays uses built-in maths libraries.
  • 9. 9 Workflows to / from MongoDB PyMongo Workflow: ~150,000 documents per second MongoDB PyMongo Python Dicts NumPy Monary Workflow: 1,700,000 documents per second MongoDB Monary NumPy
  • 10. 10 • Monary • MongoDB An example of connecting the stages of a data pipe • Python • Airflow Firstly dive into MongoDB’s Aggregation & Monary
  • 13. 13 Monary Query >>> from monary import Monary >>> m = Monary() >>> pipeline = [{"$group" : {"_id" : "$state", "totPop" : {"$sum" : “$pop"}}}] >>> states, population = m.aggregate("zips","data", pipeline, ["_id","totpop"], ["string:2", "int64"])
  • 14. 14 Monary Query >>> from monary import Monary >>> m = Monary() >>> pipeline = [{"$group" : {"_id" : "$state", "totPop" : {"$sum" : “$pop"}}}] >>> states, population = m.aggregate("zips","data", pipeline, ["_id","totpop"], ["string:2", "int64"]) Database
  • 15. 15 Monary Query >>> from monary import Monary >>> m = Monary() >>> pipeline = [{"$group" : {"_id" : "$state", "totPop" : {"$sum" : “$pop"}}}] >>> states, population = m.aggregate("zips","data", pipeline, ["_id","totpop"], ["string:2", "int64"]) Collection
  • 16. 16 Monary Query >>> from monary import Monary >>> m = Monary() >>> pipeline = [{"$group" : {"_id" : "$state", "totPop" : {"$sum" : “$pop"}}}] >>> states, population = m.aggregate("zips","data", pipeline, ["_id","totpop"], ["string:2", "int64"]) Aggregation
  • 17. 17 Monary Query >>> from monary import Monary >>> m = Monary() >>> pipeline = [{"$group" : {"_id" : "$state", "totPop" : {"$sum" : “$pop"}}}] >>> states, population = m.aggregate("zips","data", pipeline, ["_id","totpop"], ["string:2", "int64"]) Field Name/s
  • 18. 18 Monary Query >>> from monary import Monary >>> m = Monary() >>> pipeline = [{"$group" : {"_id" : "$state", "totPop" : {"$sum" : “$pop"}}}] >>> states, population = m.aggregate("zips","data", pipeline, ["_id","totpop"], ["string:2", "int64"]) Return type/s
  • 19. 19 Aggregation Result [u'WA: 4866692', u'HI: 1108229', u'CA: 29754890', u'OR: 2842321', u'NM: 1515069', u'UT: 1722850', u'OK: 3145585', u'LA: 4217595', u'NE: 1578139', u'TX: 16984601', u'MO: 5110648', u'MT: 798948', u'ND: 638272', u'AK: 544698', u'SD: 695397', u'DC: 606900', u'MN: 4372982', u'ID: 1006749', u'KY: 3675484', u'WI: 4891769', u'TN: 4876457', u'AZ: 3665228', u'CO: 3293755', u'KS: 2475285', u'MS: 2573216', u'FL: 12686644', u'IA: 2776420', u'NC: 6628637', u'VA: 6181479', u'IN: 5544136', u'ME: 1226648', u'WV: 1793146', u'MD: 4781379', u'GA: 6478216', u'NH: 1109252', u'NV: 1201833', u'DE: 666168', u'AL: 4040587', u'CT: 3287116', u'SC: 3486703', u'RI: 1003218', u'PA: 11881643', u'VT: 562758', u'MA: 6016425', u'WY: 453528', u'MI: 9295297', u'OH: 10846517', u'AR: 2350725', u'IL: 11427576', u'NJ: 7730188', u'NY: 17990402']
  • 20. 20 Aggregation Result [u'WA: 4866692', u'HI: 1108229', u'CA: 29754890', u'OR: 2842321', u'NM: 1515069', u'UT: 1722850', u'OK: 3145585', u'LA: 4217595', u'NE: 1578139', u'TX: 16984601', u'MO: 5110648', u'MT: 798948', u'ND: 638272', u'AK: 544698', u'SD: 695397', u'DC: 606900', u'MN: 4372982', u'ID: 1006749', u'KY: 3675484', u'WI: 4891769', u'TN: 4876457', u'AZ: 3665228', u'CO: 3293755', u'KS: 2475285', u'MS: 2573216', u'FL: 12686644', u'IA: 2776420', u'NC: 6628637', u'VA: 6181479', u'IN: 5544136', u'ME: 1226648', u'WV: 1793146', u'MD: 4781379', u'GA: 6478216', u'NH: 1109252', u'NV: 1201833', u'DE: 666168', u'AL: 4040587', u'CT: 3287116', u'SC: 3486703', u'RI: 1003218', u'PA: 11881643', u'VT: 562758', u'MA: 6016425', u'WY: 453528', u'MI: 9295297', u'OH: 10846517', u'AR: 2350725', u'IL: 11427576', u'NJ: 7730188', u'NY: 17990402']
  • 22. 22 Fitting your pipelines together: • Schedule/Repeatable • Monitoring • Checkpoints • Dependencies
  • 23. 23
  • 24. 24
  • 26. example_monary_operator.py from __future__ import print_function from builtins import range from airflow.operators import PythonOperator from airflow.models import DAG from datetime import datetime, timedelta import time from monary import Monary seven_days_ago = datetime.combine(datetime.today() - timedelta(7), datetime.min.time()) default_args = { 'owner': 'airflow', 'start_date': seven_days_ago, 'retries': 1, 'retry_delay': timedelta(minutes=5), } dag = DAG(dag_id='example_monary_operator', default_args=default_args) def my_sleeping_function(random_base): '''This is a function that will run within the DAG execution''' time.sleep(random_base) IMPORTS SETTINGS DAG & Functions
  • 27. example_monary_operator.py def connect_to_monary_and_print_aggregation(ds, **kwargs): m = Monary() pipeline = [{"$group": {"_id": "$state", "totPop": {"$sum": "$pop"}}}] states, population = m.aggregate("zips", "data", pipeline, ["_id", "totPop"], ["string:2", "int64"]) strs = list(map(lambda x: x.decode("utf-8"), states)) result = list("%s: %d" % (state, pop) for (state, pop) in zip(strs, population)) print (result) return 'Whatever you return gets printed in the logs' run_this = PythonOperator( task_id='connect_to_monary_and_print_aggregation', provide_context=True, python_callable=connect_to_monary_and_print_aggregation, dag=dag) AGGREGATION DAG SETUP
  • 28. example_monary_operator.py for i in range(10): ''' Generating 10 sleeping tasks, sleeping from 0 to 9 seconds respectively ''' task = PythonOperator( task_id='sleep_for_'+str(i), python_callable=my_sleeping_function, op_kwargs={'random_base': i}, dag=dag) task.set_upstream(run_this) LOOP DAG SETUP
  • 29. Airflow command line output for example $ airflow backfill example_monary_operator -s 2015-01-01 -e 2015-01-02 2015-10-08 15:08:09,532 INFO - Filling up the DagBag from /Users/braz/airflow/dags 2015-10-08 15:08:09,532 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_bash_operator.py 2015-10-08 15:08:09,533 INFO - Loaded DAG <DAG: example_bash_operator> 2015-10-08 15:08:09,533 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_branch_operator.py 2015-10-08 15:08:09,534 INFO - Loaded DAG <DAG: example_branch_operator> 2015-10-08 15:08:09,534 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_http_operator.py 2015-10-08 15:08:09,535 INFO - Loaded DAG <DAG: example_http_operator> 2015-10-08 15:08:09,535 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_monary_operator.py 2015-10-08 15:08:09,719 INFO - Loaded DAG <DAG: example_monary_operator> 2015-10-08 15:08:09,719 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_pymongo_operator.py 2015-10-08 15:08:09,738 INFO - Loaded DAG <DAG: example_pymongo_operator> 2015-10-08 15:08:09,738 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_python_operator.py 2015-10-08 15:08:09,739 INFO - Loaded DAG <DAG: example_python_operator> 2015-10-08 15:08:09,739 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/example_xcom.py 2015-10-08 15:08:09,739 INFO - Loaded DAG <DAG: example_xcom> 2015-10-08 15:08:09,739 INFO - Importing /usr/local/lib/python2.7/site-packages/airflow/example_dags/tutorial.py 2015-10-08 15:08:09,740 INFO - Loaded DAG <DAG: tutorial> 2015-10-08 15:08:09,819 INFO - Adding to queue: airflow run example_monary_operator connect_to_monary_and_print_aggregation 2015-01-02T00:00:00 --local -sd DAGS_FOLDER/example_dags/example_monary_operator.py -s 2015-01-01T00:00:00 2015-10-08 15:08:09,865 INFO - Adding to queue: airflow run example_monary_operator connect_to_monary_and_print_aggregation 2015-01-01T00:00:00 --local -sd DAGS_FOLDER/example_dags/example_monary_operator.py -s 2015-01-01T00:00:00 2015-10-08 15:08:14,765 INFO - [backfill progress] waiting: 22 | succeeded: 0 | kicked_off: 2 | failed: 0 | skipped: 0 2015-10-08 15:08:19,765 INFO - commandairflow run example_monary_operator connect_to_monary_and_print_aggregation 2015-01-02T00:00:00 --local -sd DAGS_FOLDER/example_dags/example_monary_operator.py -s 2015-01-01T00:00:00 Logging into: /Users/braz/airflow/logs/example_monary_operator/connect_to_monary_and_print_aggregation/2015-01-02T00:00:00 [u'WA: 4866692', u'HI: 1108229', u'CA: 29754890', u'OR: 2842321', u'NM: 1515069', u'UT: 1722850', u'OK: 3145585', u'LA: 4217595', u'NE: 1578139', u'TX: 16984601', u'MO: 5110648', u'MT: 798948', u'ND: 638272', u'AK: 544698', u'SD: 695397', u'DC: 606900', u'MN: 4372982', u'ID: 1006749', u'KY: 3675484', u'WI: 4891769', u'TN: 4876457', u'AZ: 3665228', u'CO: 3293755', u'KS: 2475285', u'MS: 2573216', u'FL: 12686644', u'IA: 2776420', u'NC: 6628637', u'VA: 6181479', u'IN: 5544136', u'ME: 1226648', u'WV: 1793146', u'MD: 4781379', u'GA: 6478216', u'NH: 1109252', u'NV: 1201833', u'DE: 666168', u'AL: 4040587', u'CT: 3287116', u'SC: 3486703', u'RI: 1003218', u'PA: 11881643', u'VT: 562758', u'MA: 6016425', u'WY: 453528', u'MI: 9295297', u'OH: 10846517', u'AR: 2350725', u'IL: 11427576', u'NJ: 7730188', u'NY: 17990402'] 2015-10-08 15:08:26,097 INFO - commandairflow run example_monary_operator connect_to_monary_and_print_aggregation 2015-01-01T00:00:00 --local -sd DAGS_FOLDER/example_dags/example_monary_operator.py -s 2015-01-01T00:00:00 Logging into: /Users/braz/airflow/logs/example_monary_operator/connect_to_monary_and_print_aggregation/2015-01-01T00:00:00 [u'WA: 4866692', u'HI: 1108229', u'CA: 29754890', u'OR: 2842321', u'NM: 1515069', u'UT: 1722850', u'OK: 3145585', u'LA: 4217595', u'NE: 1578139', u'TX: 16984601', u'MO: 5110648', u'MT: 798948', u'ND: 638272', u'AK: 544698', u'SD: 695397', u'DC: 606900', u'MN: 4372982', u'ID: 1006749', u'KY: 3675484', u'WI: 4891769', u'TN: 4876457', u'AZ: 3665228', u'CO: 3293755', u'KS: 2475285', u'MS: 2573216', u'FL: 12686644', u'IA: 2776420', u'NC: 6628637', u'VA: 6181479', u'IN: 5544136', u'ME: 1226648', u'WV: 1793146', u'MD: 4781379', u'GA: 6478216', u'NH: 1109252', u'NV: 1201833', u'DE: 666168', u'AL: 4040587', u'CT: 3287116', u'SC: 3486703', u'RI: 1003218', u'PA: 11881643', u'VT: 562758', u'MA: 6016425', u'WY: 453528', u'MI: 9295297', u'OH: 10846517', u'AR: 2350725', u'IL: 11427576', u'NJ: 7730188', u'NY: 17990402']
  • 30. 30 Aggregation Features in MongoDB 3.2 for Data Pipelines • $sample, $lookup • $indexStats • $filter,$slice,$arrayElemAt, $isArray, $concatArrays • Partial Indexes • Document Validation • 4 bit testing operators • 2 new Accumulators for $group • 10 new Arithmetic expression operators
  • 31. 31 Aggregation Features in MongoDB 3.2 for Data Pipelines • $sample, $lookup • $indexStats • $filter,$slice,$arrayElemAt, $isArray, $concatArrays • Partial Indexes • Document Validation • 4 bit testing operators • 2 new Accumulators for $group • 10 new Arithmetic expression operators
  • 32. Building your pipeline pipeline = [{"$project":{'page': '$PAGE', 'time': { 'y': {'$year':'$DATE'} , 'm':{'$month':'$DATE'}, 'day':{'$dayOfMonth':'$DATE'}}}}, {'$group':{'_id':{'p':'$page','y':'$time.y','m':'$time.m','d':'$time.d ay'}, 'daily':{'$sum':1}}},{'$out': tmp_created_collection_per_day_name}]
  • 33. Building your pipeline mongoexport -d test -c page_per_day_hits_tmp --type=csv -f=_id,daily -o page_per_day_hits_tmp.csv _id.d,_id.m,_id.y,_id.p,daily 3,2,2014,cart.do,115 4,2,2014,cart.do,681 5,2,2014,cart.do,638 6,2,2014,cart.do,610 .... 3,2,2014,cart/error.do,2 4,2,2014,cart/error.do,14 5,2,2014,cart/error.do,23 CONVERSION CSV FILE CONTENTS
  • 34. Visualising the results In [1]: import pandas as pd In [2]: import numpy as np In [3]: import matplotlib.pyplot as plt In [4]: df1 = pd.read_csv('page_per_day_hits_tmp.csv', names=['day', 'month', 'year', 'page', 'daily'], header=0) Out[4]: day month year page daily 0 3 2 2014 cart.do 115 1 4 2 2014 cart.do 681 .. ... ... ... ... ... 103 10 2 2014 stuff/logo.ico 3 [104 rows x 5 columns] In [5]: grouped = df1.groupby(['page']) Out[5]: <pandas.core.groupby.DataFrameGroupBy object at 0x10f6b0dd0> In [6]: grouped.agg({'daily':'sum'}).plot(kind='bar') Out[6]: <matplotlib.axes.AxesSubplot at 0x10f8f4d10>
  • 35. Scikit-learn churn data ['State', 'Account Length', 'Area Code', 'Phone', "Int'l Plan", 'VMail Plan', 'VMail Message', 'Day Mins', 'Day Calls', 'Day Charge', 'Eve Mins', 'Eve Calls', 'Eve Charge', 'Night Mins', 'Night Calls', 'Night Charge', 'Intl Mins', 'Intl Calls', 'Intl Charge', 'CustServ Calls', 'Churn?'] State Account Length Area Code Phone Intl Plan VMail Plan 0 KS 128 415 382-4657 no yes 1 OH 107 415 371-7191 no yes 2 NJ 137 415 358-1921 no no 3 OH 84 408 375-9999 yes no Night Charge Intl Mins Intl Calls Intl Charge CustServ Calls Churn? 0 11.01 10.0 3 2.70 1 False. 1 11.45 13.7 3 3.70 1 False. 2 7.32 12.2 5 3.29 0 False. 3 8.86 6.6 7 1.78 2 False.
  • 36. Scikit-learn churn example from __future__ import division import pandas as pd import numpy as np import matplotlib.pyplot as plt import json from sklearn.cross_validation import KFold from sklearn.preprocessing import StandardScaler from sklearn.cross_validation import train_test_split from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier as RF %matplotlib inline churn_df = pd.read_csv('churn.csv') col_names = churn_df.columns.tolist() print "Column names:" print col_names to_show = col_names[:6] + col_names[-6:] IMPORTS LOAD FILE / EXPLORE DATA
  • 37. Scikit-learn churn example print "nSample data:" churn_df[to_show].head(2) # Isolate target data churn_result = churn_df['Churn?'] y = np.where(churn_result == 'True.',1,0) to_drop = ['State','Area Code','Phone','Churn?'] churn_feat_space = churn_df.drop(to_drop,axis=1) # 'yes'/'no' has to be converted to boolean values # NumPy converts these from boolean to 1. and 0. later yes_no_cols = ["Int'l Plan","VMail Plan"] churn_feat_space[yes_no_cols] = churn_feat_space[yes_no_cols] == 'yes' # Pull out features for future use features = churn_feat_space.columns X = churn_feat_space.as_matrix().astype(np.float) scaler = StandardScaler() X = scaler.fit_transform(X) print "Feature space holds %d observations and %d features" % X.shape print "Unique target labels:", np.unique(y) FORMAT DATA FOR USAGE FORMAT DATA FOR USAGE
  • 39. Scikit-learn churn example from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier as RF from sklearn.metrics import average_precision_score from sklearn.cross_validation import KFold def accuracy(y_true,y_pred): # NumPy interpretes True and False as 1. and 0. return np.mean(y_true == y_pred) def run_cv(X,y,clf_class,**kwargs): # Construct a kfolds object kf = KFold(len(y),n_folds=3,shuffle=True) y_pred = y.copy() # Iterate through folds for train_index, test_index in kf: X_train, X_test = X[train_index], X[test_index] y_train = y[train_index] clf = clf_class(**kwargs) clf.fit(X_train,y_train) y_pred[test_index] = clf.predict(X_test) return y_pred print "Support vector machines:" print "%.3f" % accuracy(y, run_cv(X,y,SVC)) print "Random forest:" print "%.3f" % accuracy(y, run_cv(X,y,RF)) Cross Fold K=3
  • 40. 40 • Data • State • Operations / Transformation
  • 41. 41
  • 42. 42
  • 43. 43
  • 44. 44 https://www.flickr.com/photos/rcbodden/272 5787927/in, Ray Bodden https://www.flickr.com/photos/iqremix/15390 466616/in, iqremix https://www.flickr.com/photos/storem/12996 3685/in, storem https://www.flickr.com/photos/diversey/1574 2075527/in, Tony Webster https://www.flickr.com/photos/acwa/8291889 208/in, PEO ACWA https://www.flickr.com/photos/rowfoundation/ 8938333357/in, Rajita Majumdar https://www.flickr.com/photos/54268887@N 00/5057515604/in, Rob Pearce https://www.flickr.com/photos/seeweb/61154 45165/in, seeweb https://www.flickr.com/photos/98640399@N 08/9290143742/in, Barta IV https://www.flickr.com/photos/aisforangie/68 77291681/in, Angie Harms https://www.flickr.com/photos/jakerome/ 3551143912/in, Jakerome https://www.flickr.com/photos/ifyr/110639048 3/, Jack Shainsky https://www.flickr.com/photos/rioncm/46437 92436/in, rioncm https://www.flickr.com/photos/druidsnectar/4 605414895/in, druidsnectar Photo Credits
  • 46. #MDBDays mongodb.com Get your technical questions answered Benjamin Britten lounge (3rd floor), 10:00 - 17:00 By appointment only – register in person