Skip to content

Instantly share code, notes, and snippets.

@Saurabh7
Created August 18, 2017 05:49
Show Gist options
  • Save Saurabh7/324fe4ab90eef03db3858280770ee79d to your computer and use it in GitHub Desktop.
Save Saurabh7/324fe4ab90eef03db3858280770ee79d to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<script>jQuery(function() {if (jQuery(\"body.notebook_app\").length == 0) { jQuery(\".input_area\").toggle(); jQuery(\".prompt\").toggle();}});</script>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<button onclick=\"jQuery('.input_area').toggle(); jQuery('.prompt').toggle();\">Toggle code</button>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import IPython.core.display as di\n",
"\n",
"# This line will hide code by default when the notebook is exported as HTML\n",
"di.display_html('<script>jQuery(function() {if (jQuery(\"body.notebook_app\").length == 0) { jQuery(\".input_area\").toggle(); jQuery(\".prompt\").toggle();}});</script>', raw=True)\n",
"\n",
"# This line will add a button to toggle visibility of code blocks, for use with the HTML export version\n",
"di.display_html('''<button onclick=\"jQuery('.input_area').toggle(); jQuery('.prompt').toggle();\">Toggle code</button>''', raw=True)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from IPython.display import display, HTML\n",
"from itertools import combinations, product\n",
"import pandas as pd\n",
"import json\n",
"from jarvis.brain.insights.paths.path_pipeline import PathPipeline"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"goal_metric = {\"value\": \"aw_cost_per_conv\", \"base_metrics\": {\"numerator\": \"aw_cost\", \"denominator\":\"aw_conversions\"}, \"diff\": -1}"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# {\n",
"# \t\"account_ids\":{\"adwords\":[221,223,222]},\n",
"# \t\"start_date\":\"2017-08-10\",\n",
"# \t\"end_date\":\"2017-08-16\",\n",
"# \t\"goal_metric\":{\"value\":\"aw_cost_per_conv\",\"name\":\"AW: Cost / conv.\",\"visible\":true,\"currency\":true,\"precision\":2,\"ratio\":true,\"diff\":-1,\"base_metrics\":{\"numerator\":\"fb_spend+aw_cost\",\"denominator\":\"ga_transactions+af_custom_column_int_9_30day\"},\"group\":\"aw\"},\n",
"# \t\"num_results\":10,\n",
"# \t\"staging\":0,\n",
"# \t\"imp_factor\":8\n",
"# }\n",
"# {\n",
"# \"account_ids\":{\"facebook\":[261,260]},\n",
"# \"start_date\":\"2017-07-01\",\n",
"# \"end_date\":\"2017-07-31\",\n",
"# \"goal_metric\":{\"value\":\"ga_fb_cpt\",\"name\":\"GA-FB: CPT\",\"visible\":true,\"ratio\":true,\"precision\":2,\"currency\":true,\"diff\":-1,\"base_metrics\":{\"numerator_channel\":\"ad\",\"numerator_metric\":\"spend\",\"denominator_channel\":\"analytics\",\"denominator_metric\":\"transactions\",\"numerator\":\"fb_spend\",\"denominator\":\"ga_transactions\"},\"ad_channel\":\"facebook\",\"group\":\"ga\"},\n",
"# \"num_results\":20,\"staging\":0,\"imp_factor\":8,\n",
"# \"filters\":[{\"operator\":\"$nin\",\"dimension\":\"custom_tags.Campaigns.metadata.name\",\"value\":[\"International_1\",\"AdWyze - DPA\"]},{\"operator\":\"$in\",\"dimension\":\"custom_tags.Sale Campaign.name\",\"value\":[\"non-sale\"]}],\n",
"# \"tag_list\":[\"Adsets\",\"Audience Types\",\"Behaviors\",\"Custom Audiences\",\"Image\",\"Interests\",\"Lookalike Types\",\"Product Category\"], \n",
"# \"num_trees\":1}"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"TIME USED 5.085964918136597\n",
"TIME USED 4.719149827957153\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/sabby/jarvis/jarvis/brain/insights/paths/path_processor.py:150: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" new_df['prop'] = new_df[self.spend] / self.total_spend\n",
"/home/sabby/jarvis/jarvis/brain/insights/paths/path_processor.py:152: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" new_df['score'] = abs(new_df[self.goal_metric] - self.overall_goal_metric) * new_df['prop']\n",
"/home/sabby/anaconda3/envs/jarvis1/lib/python3.5/site-packages/pandas/computation/expressions.py:62: RuntimeWarning: divide by zero encountered in true_divide\n",
" return op(a, b)\n",
"/home/sabby/jarvis/jarvis/brain/insights/paths/path_processor.py:275: RuntimeWarning: divide by zero encountered in double_scalars\n",
" new_goal_metric = new_num / new_deno\n",
"/home/sabby/anaconda3/envs/jarvis1/lib/python3.5/site-packages/pandas/computation/expressions.py:62: RuntimeWarning: invalid value encountered in true_divide\n",
" return op(a, b)\n"
]
}
],
"source": [
"account_ids = {'facebook': [260, 261]}#{'adwords': [1]} #,\n",
"date_range = {'start': '2017-07-01', 'end': '2017-07-31'}\n",
"goal_metric = {'value': 'ga_fb_cpt',\n",
" 'base_metrics': {'numerator': 'fb_spend',\n",
" 'denominator': 'ga_transactions'},\n",
" 'diff': -1}\n",
"\n",
"args = {}\n",
"args['account_ids'] = account_ids\n",
"args['dimensions'] = None\n",
"args['tag_list'] = [\"Audience Types\",\"Custom Audiences\",\"Lookalike Types\",\"Interests\",\"Behaviors\"]#[\"Adsets\",\"Audience Types\",\"Behaviors\",\"Custom Audiences\",\"Image\",\"Interests\",\"Lookalike Types\",\"Product Category\"]\n",
"# args['goal'] = None\n",
"args['num_trees'] = None\n",
"args['staging'] = None\n",
"args['filters'] = [{\"operator\":\"$in\",\"dimension\":\"custom_tags.Sale Campaign.name\",\"value\":[\"non-sale\"]}]\n",
"args['start_date'] = date_range['start']\n",
"args['end_date'] = date_range['end'] \n",
"args['goal_metric'] = goal_metric\n",
"args['num_results'] = 20\n",
"args['imp_factor'] = 8\n",
"args['spend_metric'] = None\n",
"args['goal'] = None\n",
"args['spend_diff'] = 20\n",
"path_pipeline = PathPipeline(args)\n",
"df, tag_list, spend = path_pipeline.pre_process()\n",
"data = path_pipeline.execute()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"df[goal_metric['value']] = df[goal_metric['base_metrics']['numerator']] / df[goal_metric['base_metrics']['denominator']]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"path_model = path_pipeline.path_model"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"binwidth=0.01"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data1 = []\n",
"dff= df[df[goal_metric['value']] != pd.np.inf]\n",
"for idx in range(len(dff)):\n",
" data1 += [dff[goal_metric['value']].iloc[idx]]*int(dff[path_model.spend].iloc[idx])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1294.0296307692302"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path_model.overall_goal_metric"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"a = path_model.overall_goal_metric + path_model.check_threshold[1]*path_model.overall_goal_metric\n",
"b = path_model.overall_goal_metric - path_model.check_threshold[0]*path_model.overall_goal_metric"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1826.98"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"829.35315315315313"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"b"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.33154471816517445"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1 = df\n",
"df1['cpt'] = df1['fb_spend'] / df1['ga_transactions']\n",
"df1[df1.cpt > a].fb_spend.sum() / df.fb_spend.sum()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.lines.Line2D at 0x7f53226f7eb8>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nMAShCwAAAIAhCF0AAAAADEHoAgAAAGAIQhcAAAAAQxC6AAAAABiC0AUAAADAEIQuAAAAAIYgdAEA\nAAAwBKELAAAAgCEIXQAAAAAMQegCAAAAYAhCFwAAAABDELoAAAAAGILQBQAAAMAQhC4AAAAAhiB0\nAQAAADAEoQsAAACAIQhdAAAAAAxB6AIAAABgCEIXAAAAAEMQugAAAAAYgtAFAAAAwBCELgAAAACG\nIHQBAAAAMAShCwAAAIAhCF0AAAAADEHoAgAAAGAIQhcAAAAAQxC6AAAAABiC0AUAAADAEIQuAAAA\nAIYgdAEAAAAwBKELAAAAgCEIXQAAAAAMQegCAAAAYAhCFwAAAABDELoAAAAAGILQBQAAAMAQhC4A\nAAAAhiB0AQAAADAEoQsAAACAIQhdAAAAAAxB6AIAAABgCEIXAAAAAEMQugAAAAAYgtAFAAAAwBCE\nLgAAAACGIHQBAAAAMAShCwAAAIAhCF0AAAAADEHoAgAAAGAIQhcAAAAAQxC6AAAAABiC0AUAAADA\nEBYauqrqsqp6V1V9pKr+uKp+ehq/uKruqqp7q+rOqrpo02Nurar7q+qeqnrmpvEbq+q+6TEv3jR+\nVVV9aLrtlk3j2x4DAAAAgOWz6BVdX0nyM9399CTfl+QVVfVdSW5K8s7uflqSdyV5bZJU1XOTPLW7\nr0jyU0neNI1fnOR1SZ6V5NlJXr8pXL0xycu6+8okV1bVddP4zGMAAAAAsJwWGrq6+6Huvmf6+j8m\n+WiSy5LckOS26W63Td9n+vX26f7vTXJRVV2S5Lokd3X3F7v74SR3Jbm+qk4keWx33z09/vYkL9j0\nXJuPcWYcAAAAgCW06BVdX1dVlyd5ZpI/SHJJd59ONmJYkidNd7s0yQObHnZqGts6/qlN46dm3D8z\njvHEwzsbAAAAAM61YxG6quq/TPKbSV49rezq7e464/ueMZ5dxgEAAAAYzAWLnkBVXZCNyPWPu/vt\n0/Dpqrqku09Plx9+Zho/leTJmx5+WZIHp/G1LePv3uH+SfLQNsc4y8mTJ7/+9draWtbW1ra7KwAA\nAABbrK+vZ319/ciPU92LXeBUVbcn+Vx3/8ymsZuTfL67b66qm5I8rrtvqqrnJXlFd/9wVV2b5Jbu\nvnbajP79Sa7Kxiq19ye5ursfrqr3JnlVkvcl+d0kt3b37205xmuSXNzdN82YXy/6NVoaNWMB3XF9\n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\nRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f53224df4a8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from matplotlib.pyplot import hist\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.ticker as ticker\n",
"\n",
"tick_spacing = 10\n",
"\n",
"plt.figure(figsize=(20,10))\n",
"binwidth = 0.1\n",
"h = hist(dff[goal_metric['value']], weights=dff.fb_spend, bins=pd.np.linspace((min(dff[goal_metric['value']])),\n",
" (max(dff[goal_metric['value']])), 500))\n",
"plt.xlabel(goal_metric['value'], fontsize=18)\n",
"plt.ylabel('Spend', fontsize=18)\n",
"# ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))\n",
"plt.axvline(path_model.overall_goal_metric, linewidth=5, color='red')\n",
"plt.axvline(path_model.overall_goal_metric + path_model.check_threshold[1]*path_model.overall_goal_metric, linewidth=5, color='red')\n",
"plt.axvline(path_model.overall_goal_metric - path_model.check_threshold[0]*path_model.overall_goal_metric, linewidth=5, color='red')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data_1 = {key: value for (key, value) in enumerate(data['under_valued'])}\n",
"data_2 = {key: value for (key, value) in enumerate(data['strategic_wins'])}\n",
"data_3 = {key: value for (key, value) in enumerate(data['quick_wins'])}\n",
"data_4 = {key: value for (key, value) in enumerate(data['over_valued'])}\n",
"\n",
"df_1 = pd.DataFrame().from_dict(data_1, orient='index')\n",
"df_2 = pd.DataFrame().from_dict(data_2, orient='index')\n",
"df_3 = pd.DataFrame().from_dict(data_3, orient='index')\n",
"df_4 = pd.DataFrame().from_dict(data_4, orient='index')"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/sabby/anaconda3/envs/jarvis1/lib/python3.5/site-packages/bokeh/util/deprecation.py:34: BokehDeprecationWarning: \n",
"The bokeh.charts API has moved to a separate 'bkcharts' package.\n",
"\n",
"This compatibility shim will remain until Bokeh 1.0 is released.\n",
"After that, if you want to use this API you will have to install\n",
"the bkcharts package explicitly.\n",
"\n",
" warn(message)\n"
]
}
],
"source": [
"from bokeh.charts import Scatter, output_file, show\n",
"from bokeh.io import output_notebook, push_notebook\n",
"from bokeh.plotting import figure, ColumnDataSource\n",
"from bokeh.models import HoverTool\n",
"from bokeh.models.widgets.tables import DataTable, TableColumn\n",
"from bokeh.models import Span"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div class=\"bk-root\">\n",
" <a href=\"http://bokeh.pydata.org\" target=\"_blank\" class=\"bk-logo bk-logo-small bk-logo-notebook\"></a>\n",
" <span id=\"39583516-6eca-4a70-977a-69bf91829e67\">Loading BokehJS ...</span>\n",
" </div>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
"(function(global) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
"\n",
" var force = true;\n",
"\n",
" if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n",
" window._bokeh_onload_callbacks = [];\n",
" window._bokeh_is_loading = undefined;\n",
" }\n",
"\n",
"\n",
" \n",
" if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n",
" window._bokeh_timeout = Date.now() + 5000;\n",
" window._bokeh_failed_load = false;\n",
" }\n",
"\n",
" var NB_LOAD_WARNING = {'data': {'text/html':\n",
" \"<div style='background-color: #fdd'>\\n\"+\n",
" \"<p>\\n\"+\n",
" \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
" \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
" \"</p>\\n\"+\n",
" \"<ul>\\n\"+\n",
" \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
" \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
" \"</ul>\\n\"+\n",
" \"<code>\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"</code>\\n\"+\n",
" \"</div>\"}};\n",
"\n",
" function display_loaded() {\n",
" if (window.Bokeh !== undefined) {\n",
" var el = document.getElementById(\"39583516-6eca-4a70-977a-69bf91829e67\");\n",
" el.textContent = \"BokehJS \" + Bokeh.version + \" successfully loaded.\";\n",
" } else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(display_loaded, 100)\n",
" }\n",
" }\n",
"\n",
" function run_callbacks() {\n",
" try {\n",
" window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n",
" }\n",
" finally {\n",
" delete window._bokeh_onload_callbacks\n",
" }\n",
" console.info(\"Bokeh: all callbacks have finished\");\n",
" }\n",
"\n",
" function load_libs(js_urls, callback) {\n",
" window._bokeh_onload_callbacks.push(callback);\n",
" if (window._bokeh_is_loading > 0) {\n",
" console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
" return null;\n",
" }\n",
" if (js_urls == null || js_urls.length === 0) {\n",
" run_callbacks();\n",
" return null;\n",
" }\n",
" console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" window._bokeh_is_loading = js_urls.length;\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" var s = document.createElement('script');\n",
" s.src = url;\n",
" s.async = false;\n",
" s.onreadystatechange = s.onload = function() {\n",
" window._bokeh_is_loading--;\n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: all BokehJS libraries loaded\");\n",
" run_callbacks()\n",
" }\n",
" };\n",
" s.onerror = function() {\n",
" console.warn(\"failed to load library \" + url);\n",
" };\n",
" console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
" }\n",
" };var element = document.getElementById(\"39583516-6eca-4a70-977a-69bf91829e67\");\n",
" if (element == null) {\n",
" console.log(\"Bokeh: ERROR: autoload.js configured with elementid '39583516-6eca-4a70-977a-69bf91829e67' but no matching script tag was found. \")\n",
" return false;\n",
" }\n",
"\n",
" var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.6.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.6.min.js\"];\n",
"\n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" Bokeh.set_log_level(\"info\");\n",
" },\n",
" \n",
" function(Bokeh) {\n",
" \n",
" },\n",
" \n",
" function(Bokeh) {\n",
" \n",
" document.getElementById(\"39583516-6eca-4a70-977a-69bf91829e67\").textContent = \"BokehJS is loading...\";\n",
" },\n",
" function(Bokeh) {\n",
" console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.6.min.css\");\n",
" Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.6.min.css\");\n",
" console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.6.min.css\");\n",
" Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.6.min.css\");\n",
" }\n",
" ];\n",
"\n",
" function run_inline_js() {\n",
" \n",
" if ((window.Bokeh !== undefined) || (force === true)) {\n",
" for (var i = 0; i < inline_js.length; i++) {\n",
" inline_js[i](window.Bokeh);\n",
" }if (force === true) {\n",
" display_loaded();\n",
" }} else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(run_inline_js, 100);\n",
" } else if (!window._bokeh_failed_load) {\n",
" console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
" window._bokeh_failed_load = true;\n",
" } else if (force !== true) {\n",
" var cell = $(document.getElementById(\"39583516-6eca-4a70-977a-69bf91829e67\")).parents('.cell').data().cell;\n",
" cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
" }\n",
"\n",
" }\n",
"\n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
" run_inline_js();\n",
" } else {\n",
" load_libs(js_urls, function() {\n",
" console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n",
" run_inline_js();\n",
" });\n",
" }\n",
"}(this));"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"output_notebook()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# from sklearn.cluster import DBSCAN\n",
"\n",
"# m = DBSCAN(eps=0.1, min_samples=1).fit(scale(pd.np.array([0.33, 0.0976, 0.0483, 0.244]).reshape(-1,1)))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# m.labels_"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# scale(pd.np.array([0.33, 0.0976, 0.0483, 0.244]).reshape(-1,1))"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# from sklearn.preprocessing import scale"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# path_pipeline.path_pre_process.score_df"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"None\n"
]
}
],
"source": [
"df = path_pipeline.path_pre_process.df\n",
"df1 = df.groupby('Lookalike Types').sum()\n",
"df1['cpt'] = df1['fb_spend'] / df1['ga_transactions']\n",
"df1['prop'] = df1.fb_spend / df.fb_spend.sum()\n",
"df1[df1.prop > 0.01]\n",
"\n",
"df = path_pipeline.path_pre_process.df\n",
"df1 = df.groupby('Audience Types').sum()\n",
"df1['cpt'] = df1['fb_spend'] / df1['ga_transactions']\n",
"df1['prop'] = df1.fb_spend / df.fb_spend.sum()\n",
"df1[df1.prop > 0.01]\n",
"\n",
"df = path_pipeline.path_pre_process.df\n",
"df1 = df.groupby('Lookalike Types').sum()\n",
"df1['cpt'] = df1['fb_spend'] / df1['ga_transactions']\n",
"df1['prop'] = df1.fb_spend / df.fb_spend.sum()\n",
"df1[df1.prop > 0.01]\n",
"\n",
"df = path_pipeline.path_pre_process.df\n",
"df1 = df.groupby('Interests').sum()\n",
"df1['cpt'] = df1['fb_spend'] / df1['ga_transactions']\n",
"df1['prop'] = df1.fb_spend / df.fb_spend.sum()\n",
"df1[df1.prop > 0.01]\n",
"\n",
"df = path_pipeline.path_pre_process.df\n",
"df1 = df.groupby('Custom Audiences').sum()\n",
"df1['cpt'] = df1['fb_spend'] / df1['ga_transactions']\n",
"df1['prop'] = df1.fb_spend / df.fb_spend.sum()\n",
"df1[df1.prop > 0.01]\n",
"\n",
"print('None')"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" <div class=\"bk-root\">\n",
" <div class=\"bk-plotdiv\" id=\"c338449c-a889-4038-907f-603b6b30380a\"></div>\n",
" </div>\n",
"<script type=\"text/javascript\">\n",
" \n",
" (function(global) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
" \n",
" var force = false;\n",
" \n",
" if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n",
" window._bokeh_onload_callbacks = [];\n",
" window._bokeh_is_loading = undefined;\n",
" }\n",
" \n",
" \n",
" \n",
" if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n",
" window._bokeh_timeout = Date.now() + 0;\n",
" window._bokeh_failed_load = false;\n",
" }\n",
" \n",
" var NB_LOAD_WARNING = {'data': {'text/html':\n",
" \"<div style='background-color: #fdd'>\\n\"+\n",
" \"<p>\\n\"+\n",
" \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
" \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
" \"</p>\\n\"+\n",
" \"<ul>\\n\"+\n",
" \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
" \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
" \"</ul>\\n\"+\n",
" \"<code>\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"</code>\\n\"+\n",
" \"</div>\"}};\n",
" \n",
" function display_loaded() {\n",
" if (window.Bokeh !== undefined) {\n",
" var el = document.getElementById(\"c338449c-a889-4038-907f-603b6b30380a\");\n",
" el.textContent = \"BokehJS \" + Bokeh.version + \" successfully loaded.\";\n",
" } else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(display_loaded, 100)\n",
" }\n",
" }if ((window.Jupyter !== undefined) && Jupyter.notebook.kernel) {\n",
" comm_manager = Jupyter.notebook.kernel.comm_manager\n",
" comm_manager.register_target(\"f25ea439-c69d-426c-8d0f-f8a29fdc8ed2\", function () {});\n",
" }\n",
" \n",
" function run_callbacks() {\n",
" try {\n",
" window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n",
" }\n",
" finally {\n",
" delete window._bokeh_onload_callbacks\n",
" }\n",
" console.info(\"Bokeh: all callbacks have finished\");\n",
" }\n",
" \n",
" function load_libs(js_urls, callback) {\n",
" window._bokeh_onload_callbacks.push(callback);\n",
" if (window._bokeh_is_loading > 0) {\n",
" console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
" return null;\n",
" }\n",
" if (js_urls == null || js_urls.length === 0) {\n",
" run_callbacks();\n",
" return null;\n",
" }\n",
" console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" window._bokeh_is_loading = js_urls.length;\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" var s = document.createElement('script');\n",
" s.src = url;\n",
" s.async = false;\n",
" s.onreadystatechange = s.onload = function() {\n",
" window._bokeh_is_loading--;\n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: all BokehJS libraries loaded\");\n",
" run_callbacks()\n",
" }\n",
" };\n",
" s.onerror = function() {\n",
" console.warn(\"failed to load library \" + url);\n",
" };\n",
" console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
" }\n",
" };var element = document.getElementById(\"c338449c-a889-4038-907f-603b6b30380a\");\n",
" if (element == null) {\n",
" console.log(\"Bokeh: ERROR: autoload.js configured with elementid 'c338449c-a889-4038-907f-603b6b30380a' but no matching script tag was found. \")\n",
" return false;\n",
" }\n",
" \n",
" var js_urls = [];\n",
" \n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" (function() {\n",
" var fn = function() {\n",
" var docs_json = {\"874fc39b-a46a-4ea9-aa1d-9aee52a6d440\":{\"roots\":{\"references\":[{\"attributes\":{\"line_width\":{\"value\":3},\"location\":1294.0296307692302,\"plot\":{\"id\":\"c5e19238-4c5e-4344-b93d-f80da4226028\",\"subtype\":\"Figure\",\"type\":\"Plot\"}},\"id\":\"63fa7aca-4158-41e6-af26-098f089316d1\",\"type\":\"Span\"},{\"attributes\":{},\"id\":\"89ae8209-874e-40c8-b279-319547d27286\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_color\":{\"value\":\"green\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"field\":\"size\",\"units\":\"screen\"},\"x\":{\"field\":\"spend_prop\"},\"y\":{\"field\":\"metric\"}},\"id\":\"f31482d4-d5fa-4ec6-a5a1-a870d341e9a5\",\"type\":\"Circle\"},{\"attributes\":{\"data_source\":{\"id\":\"7a97e141-f52b-4026-b5ae-15f7bd1c20fe\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"b533d17b-5f74-496a-94f7-9acea6419420\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"631442c8-9299-4f01-8ee1-8dfd44cc639a\",\"type\":\"Circle\"},\"selection_glyph\":null},\"id\":\"917b0300-3f01-4f41-81fb-f8bd5c04d46d\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"field\":\"size\",\"units\":\"screen\"},\"x\":{\"field\":\"spend_prop\"},\"y\":{\"field\":\"metric\"}},\"id\":\"631442c8-9299-4f01-8ee1-8dfd44cc639a\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"8e5bf3d4-f0bf-4689-a0f8-c8d9235665ba\",\"type\":\"ToolEvents\"},{\"attributes\":{},\"id\":\"a3b1d7d7-3db2-4296-a5df-40e32cd76e43\",\"type\":\"LinearScale\"},{\"attributes\":{\"callback\":null,\"column_names\":[\"spend_prop\",\"index\",\"idx\",\"overall_spend_prop\",\"other_ga_fb_cpt\",\"level_2\",\"denominator\",\"level_0\",\"imp_factor\",\"metric\",\"precision\",\"overall\",\"levels\",\"level_3\",\"size\",\"recall\",\"numerator\",\"level_1\"],\"data\":{\"denominator\":{\"__ndarray__\":\"AAAAAABAU0AAAAAAAAAwQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"idx\":[0,1],\"imp_factor\":{\"__ndarray__\":\"mpmZmZmZ9T8QWDm0yHbyPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"index\":[0,1],\"level_0\":[\"Audience Types : Lookalike\",\"Audience Types : Interests\"],\"level_1\":[\"Lookalike Types : 1-2%\",\"Interests : Education or Higher education or Hotels or Travel or University\"],\"level_2\":[\"- : -\",\"- : -\"],\"level_3\":[\"- : -\",\"- : -\"],\"levels\":[[{\"Audience Types\":{\"name\":\"Lookalike\",\"value\":\"Lookalike\"}},{\"Lookalike Types\":{\"name\":\"1-2%\",\"value\":\"1-2%\"}}],[{\"Audience Types\":{\"name\":\"Interests\",\"value\":\"Interests\"}},{\"Interests\":{\"name\":\"Education or Higher education or Hotels or Travel or University\",\"value\":\"Education or Higher education or Hotels or Travel or University\"}}]],\"metric\":{\"__ndarray__\":\"hetRuJ4RpkC4HoXrUfCfQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"numerator\":{\"__ndarray__\":\"UrgehTWNCkGkcD0KV/DfQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"other_ga_fb_cpt\":{\"__ndarray__\":\"H4XrUbj3mUCkcD0K17aWQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"overall\":{\"__ndarray__\":\"MkOHVx44lEAyQ4dXHjiUQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"overall_spend_prop\":{\"__ndarray__\":\"PgrXo3D9J0A+CtejcP0nQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"precision\":{\"__ndarray__\":\"K4cW2c736z+LbOf7qfHuPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"recall\":{\"__ndarray__\":\"DAIrhxbZzj97FK5H4XqkPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"size\":{\"__ndarray__\":\"AAAAAAAANECKUcPfphgxQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"spend_prop\":{\"__ndarray__\":\"rkfhehSuJED2KFyPwvX4Pw==\",\"dtype\":\"float64\",\"shape\":[2]}}},\"id\":\"555cf7bb-c984-4045-9baf-b9c7c2b64de1\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"axis_label\":\"Spend Proportion\",\"formatter\":{\"id\":\"8626709a-860e-43ed-adab-e54779f28c91\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"c5e19238-4c5e-4344-b93d-f80da4226028\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"89ae8209-874e-40c8-b279-319547d27286\",\"type\":\"BasicTicker\"}},\"id\":\"fea79007-781d-4a8f-92c1-506717e6aa3d\",\"type\":\"LinearAxis\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"14e8447e-78f3-4374-940c-165d2e50c5ce\",\"type\":\"HoverTool\"}]},\"id\":\"fa23fc05-2085-49c5-8b25-af4f88b506d2\",\"type\":\"Toolbar\"},{\"attributes\":{\"dimension\":\"height\",\"line_width\":{\"value\":3},\"location\":11.995000000000001,\"plot\":{\"id\":\"c5e19238-4c5e-4344-b93d-f80da4226028\",\"subtype\":\"Figure\",\"type\":\"Plot\"}},\"id\":\"6ef59291-2f12-42d8-9d84-e99f486a5a3c\",\"type\":\"Span\"},{\"attributes\":{\"callback\":null},\"id\":\"9c8952a5-5b97-4b61-98cd-ff851141c6ce\",\"type\":\"DataRange1d\"},{\"attributes\":{\"plot\":null,\"text\":\"Performance by paths.\"},\"id\":\"d7cd8131-647f-404d-b10f-54afe08327b4\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"95fb0591-09c9-4793-b78d-49b66ec10539\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"132af120-bf4f-4509-a6a2-e74b6e91292d\",\"type\":\"BasicTicker\"},{\"attributes\":{\"plot\":{\"id\":\"c5e19238-4c5e-4344-b93d-f80da4226028\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"89ae8209-874e-40c8-b279-319547d27286\",\"type\":\"BasicTicker\"}},\"id\":\"82da1b41-c599-4171-a725-7f37c580242c\",\"type\":\"Grid\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"c5e19238-4c5e-4344-b93d-f80da4226028\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"132af120-bf4f-4509-a6a2-e74b6e91292d\",\"type\":\"BasicTicker\"}},\"id\":\"846775e9-fc74-4940-8c99-2b70823d93eb\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"8626709a-860e-43ed-adab-e54779f28c91\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis_label\":\"ga_fb_cpt\",\"formatter\":{\"id\":\"f9c761ca-f3bc-4806-b417-9267a2c5808e\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"c5e19238-4c5e-4344-b93d-f80da4226028\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"132af120-bf4f-4509-a6a2-e74b6e91292d\",\"type\":\"BasicTicker\"}},\"id\":\"1c55e781-ea3d-4ee2-a7c1-e8cdd9c0bc0b\",\"type\":\"LinearAxis\"},{\"attributes\":{\"callback\":null,\"plot\":{\"id\":\"c5e19238-4c5e-4344-b93d-f80da4226028\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"tooltips\":[[\"lvl 0:\",\"@level_0\"],[\"lvl 1:\",\"@level_1\"],[\"lvl 2:\",\"@level_2\"],[\"lvl 3:\",\"@level_3\"],[\"ga_fb_cpt\",\"@metric\"],[\"Precision\",\"@precision\"],[\"Recall\",\"@recall\"],[\"mcc\",\"@imp_factor\"],[\"Spend Prop\",\"@spend_prop\"]]},\"id\":\"14e8447e-78f3-4374-940c-165d2e50c5ce\",\"type\":\"HoverTool\"},{\"attributes\":{\"fill_color\":{\"value\":\"blue\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"field\":\"size\",\"units\":\"screen\"},\"x\":{\"field\":\"spend_prop\"},\"y\":{\"field\":\"metric\"}},\"id\":\"b533d17b-5f74-496a-94f7-9acea6419420\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null,\"column_names\":[\"spend_prop\",\"index\",\"idx\",\"overall_spend_prop\",\"other_ga_fb_cpt\",\"level_2\",\"denominator\",\"level_0\",\"imp_factor\",\"metric\",\"precision\",\"overall\",\"levels\",\"level_3\",\"size\",\"recall\",\"numerator\",\"level_1\"],\"data\":{\"denominator\":{\"__ndarray__\":\"AAAAAAAAbkAAAAAAAMBgQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"idx\":[0,1],\"imp_factor\":{\"__ndarray__\":\"GQRWDi2y9T+PwvUoXI/yPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"index\":[0,1],\"level_0\":[\"Audience Types : Lookalike\",\"Audience Types : Open Targeting\"],\"level_1\":[\"- : -\",\"- : -\"],\"level_2\":[\"- : -\",\"- : -\"],\"level_3\":[\"- : -\",\"- : -\"],\"levels\":[[{\"Audience Types\":{\"name\":\"Lookalike\",\"value\":\"Lookalike\"}}],[{\"Audience Types\":{\"name\":\"Open Targeting\",\"value\":\"Open Targeting\"}}]],\"metric\":{\"__ndarray__\":\"rkfhehTMn0DNzMzMzIGfQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"numerator\":{\"__ndarray__\":\"mpmZmVfPHUGPwvUo730QQQ==\",\"dtype\":\"float64\",\"shape\":[2]},\"other_ga_fb_cpt\":{\"__ndarray__\":\"7FG4HoU2kkBmZmZmZjSTQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"overall\":{\"__ndarray__\":\"MkOHVx44lEAyQ4dXHjiUQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"overall_spend_prop\":{\"__ndarray__\":\"PgrXo3D9J0A+CtejcP0nQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"precision\":{\"__ndarray__\":\"lkOLbOf75T8730+Nl27iPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"recall\":{\"__ndarray__\":\"3SQGgZVD2z/y0k1iEFjJPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"size\":{\"__ndarray__\":\"AAAAAAAANEAOv5Hl8BsxQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"spend_prop\":{\"__ndarray__\":\"exSuR+E6N0AzMzMzM7MpQA==\",\"dtype\":\"float64\",\"shape\":[2]}}},\"id\":\"7a97e141-f52b-4026-b5ae-15f7bd1c20fe\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"data_source\":{\"id\":\"555cf7bb-c984-4045-9baf-b9c7c2b64de1\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"f31482d4-d5fa-4ec6-a5a1-a870d341e9a5\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"d404a7ab-f405-42e6-86b8-cab5ce2db277\",\"type\":\"Circle\"},\"selection_glyph\":null},\"id\":\"282cc5e5-bc10-4aff-91a9-c3bcc27bb6b3\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"f9c761ca-f3bc-4806-b417-9267a2c5808e\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"field\":\"size\",\"units\":\"screen\"},\"x\":{\"field\":\"spend_prop\"},\"y\":{\"field\":\"metric\"}},\"id\":\"d404a7ab-f405-42e6-86b8-cab5ce2db277\",\"type\":\"Circle\"},{\"attributes\":{\"below\":[{\"id\":\"fea79007-781d-4a8f-92c1-506717e6aa3d\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"1c55e781-ea3d-4ee2-a7c1-e8cdd9c0bc0b\",\"type\":\"LinearAxis\"}],\"plot_height\":500,\"plot_width\":800,\"renderers\":[{\"id\":\"fea79007-781d-4a8f-92c1-506717e6aa3d\",\"type\":\"LinearAxis\"},{\"id\":\"82da1b41-c599-4171-a725-7f37c580242c\",\"type\":\"Grid\"},{\"id\":\"1c55e781-ea3d-4ee2-a7c1-e8cdd9c0bc0b\",\"type\":\"LinearAxis\"},{\"id\":\"846775e9-fc74-4940-8c99-2b70823d93eb\",\"type\":\"Grid\"},{\"id\":\"282cc5e5-bc10-4aff-91a9-c3bcc27bb6b3\",\"type\":\"GlyphRenderer\"},{\"id\":\"917b0300-3f01-4f41-81fb-f8bd5c04d46d\",\"type\":\"GlyphRenderer\"},{\"id\":\"6ef59291-2f12-42d8-9d84-e99f486a5a3c\",\"type\":\"Span\"},{\"id\":\"63fa7aca-4158-41e6-af26-098f089316d1\",\"type\":\"Span\"}],\"title\":{\"id\":\"d7cd8131-647f-404d-b10f-54afe08327b4\",\"type\":\"Title\"},\"tool_events\":{\"id\":\"8e5bf3d4-f0bf-4689-a0f8-c8d9235665ba\",\"type\":\"ToolEvents\"},\"toolbar\":{\"id\":\"fa23fc05-2085-49c5-8b25-af4f88b506d2\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"9c8952a5-5b97-4b61-98cd-ff851141c6ce\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"a3b1d7d7-3db2-4296-a5df-40e32cd76e43\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"b947ea64-c418-4e13-a908-6959d6c677ad\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"95fb0591-09c9-4793-b78d-49b66ec10539\",\"type\":\"LinearScale\"}},\"id\":\"c5e19238-4c5e-4344-b93d-f80da4226028\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"callback\":null},\"id\":\"b947ea64-c418-4e13-a908-6959d6c677ad\",\"type\":\"DataRange1d\"}],\"root_ids\":[\"c5e19238-4c5e-4344-b93d-f80da4226028\"]},\"title\":\"Bokeh Application\",\"version\":\"0.12.6\"}};\n",
" var render_items = [{\"docid\":\"874fc39b-a46a-4ea9-aa1d-9aee52a6d440\",\"elementid\":\"c338449c-a889-4038-907f-603b6b30380a\",\"modelid\":\"c5e19238-4c5e-4344-b93d-f80da4226028\",\"notebook_comms_target\":\"f25ea439-c69d-426c-8d0f-f8a29fdc8ed2\"}];\n",
" \n",
" Bokeh.embed.embed_items(docs_json, render_items);\n",
" };\n",
" if (document.readyState != \"loading\") fn();\n",
" else document.addEventListener(\"DOMContentLoaded\", fn);\n",
" })();\n",
" },\n",
" function(Bokeh) {\n",
" }\n",
" ];\n",
" \n",
" function run_inline_js() {\n",
" \n",
" if ((window.Bokeh !== undefined) || (force === true)) {\n",
" for (var i = 0; i < inline_js.length; i++) {\n",
" inline_js[i](window.Bokeh);\n",
" }if (force === true) {\n",
" display_loaded();\n",
" }} else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(run_inline_js, 100);\n",
" } else if (!window._bokeh_failed_load) {\n",
" console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
" window._bokeh_failed_load = true;\n",
" } else if (force !== true) {\n",
" var cell = $(document.getElementById(\"c338449c-a889-4038-907f-603b6b30380a\")).parents('.cell').data().cell;\n",
" cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
" }\n",
" \n",
" }\n",
" \n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
" run_inline_js();\n",
" } else {\n",
" load_libs(js_urls, function() {\n",
" console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n",
" run_inline_js();\n",
" });\n",
" }\n",
" }(this));\n",
"</script>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Under Valued\n",
"Strategic Wins\n",
"Quick Wins\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" <div class=\"bk-root\">\n",
" <div class=\"bk-plotdiv\" id=\"d6ba6359-37b0-484c-bedb-8fc7180ff2a5\"></div>\n",
" </div>\n",
"<script type=\"text/javascript\">\n",
" \n",
" (function(global) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
" \n",
" var force = false;\n",
" \n",
" if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n",
" window._bokeh_onload_callbacks = [];\n",
" window._bokeh_is_loading = undefined;\n",
" }\n",
" \n",
" \n",
" \n",
" if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n",
" window._bokeh_timeout = Date.now() + 0;\n",
" window._bokeh_failed_load = false;\n",
" }\n",
" \n",
" var NB_LOAD_WARNING = {'data': {'text/html':\n",
" \"<div style='background-color: #fdd'>\\n\"+\n",
" \"<p>\\n\"+\n",
" \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
" \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
" \"</p>\\n\"+\n",
" \"<ul>\\n\"+\n",
" \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
" \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
" \"</ul>\\n\"+\n",
" \"<code>\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"</code>\\n\"+\n",
" \"</div>\"}};\n",
" \n",
" function display_loaded() {\n",
" if (window.Bokeh !== undefined) {\n",
" var el = document.getElementById(\"d6ba6359-37b0-484c-bedb-8fc7180ff2a5\");\n",
" el.textContent = \"BokehJS \" + Bokeh.version + \" successfully loaded.\";\n",
" } else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(display_loaded, 100)\n",
" }\n",
" }if ((window.Jupyter !== undefined) && Jupyter.notebook.kernel) {\n",
" comm_manager = Jupyter.notebook.kernel.comm_manager\n",
" comm_manager.register_target(\"8495be70-9382-4ce7-90cf-8f76b0a1c60d\", function () {});\n",
" }\n",
" \n",
" function run_callbacks() {\n",
" try {\n",
" window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n",
" }\n",
" finally {\n",
" delete window._bokeh_onload_callbacks\n",
" }\n",
" console.info(\"Bokeh: all callbacks have finished\");\n",
" }\n",
" \n",
" function load_libs(js_urls, callback) {\n",
" window._bokeh_onload_callbacks.push(callback);\n",
" if (window._bokeh_is_loading > 0) {\n",
" console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
" return null;\n",
" }\n",
" if (js_urls == null || js_urls.length === 0) {\n",
" run_callbacks();\n",
" return null;\n",
" }\n",
" console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" window._bokeh_is_loading = js_urls.length;\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" var s = document.createElement('script');\n",
" s.src = url;\n",
" s.async = false;\n",
" s.onreadystatechange = s.onload = function() {\n",
" window._bokeh_is_loading--;\n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: all BokehJS libraries loaded\");\n",
" run_callbacks()\n",
" }\n",
" };\n",
" s.onerror = function() {\n",
" console.warn(\"failed to load library \" + url);\n",
" };\n",
" console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
" }\n",
" };var element = document.getElementById(\"d6ba6359-37b0-484c-bedb-8fc7180ff2a5\");\n",
" if (element == null) {\n",
" console.log(\"Bokeh: ERROR: autoload.js configured with elementid 'd6ba6359-37b0-484c-bedb-8fc7180ff2a5' but no matching script tag was found. \")\n",
" return false;\n",
" }\n",
" \n",
" var js_urls = [];\n",
" \n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" (function() {\n",
" var fn = function() {\n",
" var docs_json = {\"d5429ca3-0ec7-4ef7-9584-575890d2e7ea\":{\"roots\":{\"references\":[{\"attributes\":{},\"id\":\"954c9211-cf52-4817-b5cb-c49fb7225cd8\",\"type\":\"StringEditor\"},{\"attributes\":{\"editor\":{\"id\":\"6b421785-6c06-42fe-a2cd-b9acbaffc66d\",\"type\":\"StringEditor\"},\"field\":\"level_2\",\"formatter\":{\"id\":\"b4b5d7a7-529f-4348-bcaa-2d63684ce4fe\",\"type\":\"StringFormatter\"},\"title\":\"level 2\"},\"id\":\"f594bf8f-e0d0-49e5-a251-5910dc6e3665\",\"type\":\"TableColumn\"},{\"attributes\":{},\"id\":\"8e5e1d27-9324-4d66-a0c0-abe0cf792333\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"eca2633c-1e69-47bc-a9f7-627abb567f13\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"5c102168-f606-45f8-a22e-82d2933361cf\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"878daeac-ab11-4228-ac03-fbd36de8275a\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"e1bdebeb-dc02-406e-ba48-24f1785746f8\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"6b421785-6c06-42fe-a2cd-b9acbaffc66d\",\"type\":\"StringEditor\"},{\"attributes\":{\"editor\":{\"id\":\"29e85159-67f9-4a86-acfb-1c5d7d571cfc\",\"type\":\"StringEditor\"},\"field\":\"metric\",\"formatter\":{\"id\":\"e1bdebeb-dc02-406e-ba48-24f1785746f8\",\"type\":\"StringFormatter\"},\"title\":\"ga_fb_cpt\"},\"id\":\"9518fd38-c81c-46df-9a71-82580e35e8dd\",\"type\":\"TableColumn\"},{\"attributes\":{},\"id\":\"92c7f035-43ee-438c-8a30-253f47e61f81\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"eb31a1ff-4803-4272-8aaa-bfbbf79f03c5\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"b4b5d7a7-529f-4348-bcaa-2d63684ce4fe\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"a3fbee6d-4b36-4103-8747-30b865f65ba3\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"4a7fb853-ec3d-4d33-b3c5-35f37a53f869\",\"type\":\"StringFormatter\"},{\"attributes\":{\"columns\":[{\"id\":\"ad7fd315-272c-4033-acc4-4888d1f7a719\",\"type\":\"TableColumn\"},{\"id\":\"a3632451-9463-4d54-b561-20586e472843\",\"type\":\"TableColumn\"},{\"id\":\"f594bf8f-e0d0-49e5-a251-5910dc6e3665\",\"type\":\"TableColumn\"},{\"id\":\"a6cb7afa-4a95-4e71-82b1-5fb7c7ff8b8c\",\"type\":\"TableColumn\"},{\"id\":\"9518fd38-c81c-46df-9a71-82580e35e8dd\",\"type\":\"TableColumn\"},{\"id\":\"ee8f8a55-e154-4c8c-b489-0ab66ae830d7\",\"type\":\"TableColumn\"},{\"id\":\"1e39c6dd-6442-44d2-829d-56c64b38e618\",\"type\":\"TableColumn\"},{\"id\":\"360a163a-dc01-44b8-baaf-de7192aed19e\",\"type\":\"TableColumn\"},{\"id\":\"00690586-d0b7-49c9-b2d3-c1a4ba28ae2c\",\"type\":\"TableColumn\"}],\"source\":{\"id\":\"7b96d382-40f7-4784-af3f-00a1e11fc970\",\"type\":\"ColumnDataSource\"},\"width\":1000},\"id\":\"1a323afd-86f0-4445-84e6-bbdcaa9df2dc\",\"type\":\"DataTable\"},{\"attributes\":{},\"id\":\"ab8d6d21-6897-4a2d-b33b-54d68a70a0da\",\"type\":\"StringFormatter\"},{\"attributes\":{\"editor\":{\"id\":\"a48b14d4-6e6d-4e99-b8f8-8f6d1da438c0\",\"type\":\"StringEditor\"},\"field\":\"spend_prop\",\"formatter\":{\"id\":\"ab8d6d21-6897-4a2d-b33b-54d68a70a0da\",\"type\":\"StringFormatter\"},\"title\":\"Spend %\"},\"id\":\"ee8f8a55-e154-4c8c-b489-0ab66ae830d7\",\"type\":\"TableColumn\"},{\"attributes\":{\"editor\":{\"id\":\"878daeac-ab11-4228-ac03-fbd36de8275a\",\"type\":\"StringEditor\"},\"field\":\"level_1\",\"formatter\":{\"id\":\"4a7fb853-ec3d-4d33-b3c5-35f37a53f869\",\"type\":\"StringFormatter\"},\"title\":\"level 1\"},\"id\":\"a3632451-9463-4d54-b561-20586e472843\",\"type\":\"TableColumn\"},{\"attributes\":{\"editor\":{\"id\":\"954c9211-cf52-4817-b5cb-c49fb7225cd8\",\"type\":\"StringEditor\"},\"field\":\"precision\",\"formatter\":{\"id\":\"5c102168-f606-45f8-a22e-82d2933361cf\",\"type\":\"StringFormatter\"},\"title\":\"Precision\"},\"id\":\"1e39c6dd-6442-44d2-829d-56c64b38e618\",\"type\":\"TableColumn\"},{\"attributes\":{\"editor\":{\"id\":\"4395e634-d8d5-44ca-9695-e1f50da497c5\",\"type\":\"StringEditor\"},\"field\":\"imp_factor\",\"formatter\":{\"id\":\"eb31a1ff-4803-4272-8aaa-bfbbf79f03c5\",\"type\":\"StringFormatter\"},\"title\":\"MCC\"},\"id\":\"00690586-d0b7-49c9-b2d3-c1a4ba28ae2c\",\"type\":\"TableColumn\"},{\"attributes\":{},\"id\":\"bc67c652-db06-4814-87a2-8ec59582656d\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"4395e634-d8d5-44ca-9695-e1f50da497c5\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"a48b14d4-6e6d-4e99-b8f8-8f6d1da438c0\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"29e85159-67f9-4a86-acfb-1c5d7d571cfc\",\"type\":\"StringEditor\"},{\"attributes\":{\"callback\":null,\"column_names\":[\"spend_prop\",\"index\",\"other_ga_fb_cpt\",\"level_2\",\"denominator\",\"level_0\",\"imp_factor\",\"metric\",\"precision\",\"levels\",\"level_3\",\"recall\",\"numerator\",\"level_1\"],\"data\":{\"denominator\":{\"__ndarray__\":\"AAAAAABAU0AAAAAAAAAwQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"imp_factor\":{\"__ndarray__\":\"mpmZmZmZ9T8QWDm0yHbyPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"index\":[0,1],\"level_0\":[\"Audience Types : Lookalike\",\"Audience Types : Interests\"],\"level_1\":[\"Lookalike Types : 1-2%\",\"Interests : Education or Higher education or Hotels or Travel or University\"],\"level_2\":[\"- : -\",\"- : -\"],\"level_3\":[\"- : -\",\"- : -\"],\"levels\":[[{\"Audience Types\":{\"name\":\"Lookalike\",\"value\":\"Lookalike\"}},{\"Lookalike Types\":{\"name\":\"1-2%\",\"value\":\"1-2%\"}}],[{\"Audience Types\":{\"name\":\"Interests\",\"value\":\"Interests\"}},{\"Interests\":{\"name\":\"Education or Higher education or Hotels or Travel or University\",\"value\":\"Education or Higher education or Hotels or Travel or University\"}}]],\"metric\":{\"__ndarray__\":\"hetRuJ4RpkC4HoXrUfCfQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"numerator\":{\"__ndarray__\":\"UrgehTWNCkGkcD0KV/DfQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"other_ga_fb_cpt\":{\"__ndarray__\":\"H4XrUbj3mUCkcD0K17aWQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"precision\":{\"__ndarray__\":\"K4cW2c736z+LbOf7qfHuPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"recall\":{\"__ndarray__\":\"DAIrhxbZzj97FK5H4XqkPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"spend_prop\":{\"__ndarray__\":\"rkfhehSuJED2KFyPwvX4Pw==\",\"dtype\":\"float64\",\"shape\":[2]}}},\"id\":\"7b96d382-40f7-4784-af3f-00a1e11fc970\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"editor\":{\"id\":\"eca2633c-1e69-47bc-a9f7-627abb567f13\",\"type\":\"StringEditor\"},\"field\":\"level_3\",\"formatter\":{\"id\":\"501ada53-7207-4832-ae18-e2fda2fd684a\",\"type\":\"StringFormatter\"},\"title\":\"level 3\"},\"id\":\"a6cb7afa-4a95-4e71-82b1-5fb7c7ff8b8c\",\"type\":\"TableColumn\"},{\"attributes\":{\"editor\":{\"id\":\"bc67c652-db06-4814-87a2-8ec59582656d\",\"type\":\"StringEditor\"},\"field\":\"recall\",\"formatter\":{\"id\":\"a3fbee6d-4b36-4103-8747-30b865f65ba3\",\"type\":\"StringFormatter\"},\"title\":\"Recall\"},\"id\":\"360a163a-dc01-44b8-baaf-de7192aed19e\",\"type\":\"TableColumn\"},{\"attributes\":{\"editor\":{\"id\":\"92c7f035-43ee-438c-8a30-253f47e61f81\",\"type\":\"StringEditor\"},\"field\":\"level_0\",\"formatter\":{\"id\":\"8e5e1d27-9324-4d66-a0c0-abe0cf792333\",\"type\":\"StringFormatter\"},\"title\":\"level 0\"},\"id\":\"ad7fd315-272c-4033-acc4-4888d1f7a719\",\"type\":\"TableColumn\"},{\"attributes\":{},\"id\":\"501ada53-7207-4832-ae18-e2fda2fd684a\",\"type\":\"StringFormatter\"}],\"root_ids\":[\"1a323afd-86f0-4445-84e6-bbdcaa9df2dc\"]},\"title\":\"Bokeh Application\",\"version\":\"0.12.6\"}};\n",
" var render_items = [{\"docid\":\"d5429ca3-0ec7-4ef7-9584-575890d2e7ea\",\"elementid\":\"d6ba6359-37b0-484c-bedb-8fc7180ff2a5\",\"modelid\":\"1a323afd-86f0-4445-84e6-bbdcaa9df2dc\",\"notebook_comms_target\":\"8495be70-9382-4ce7-90cf-8f76b0a1c60d\"}];\n",
" \n",
" Bokeh.embed.embed_items(docs_json, render_items);\n",
" };\n",
" if (document.readyState != \"loading\") fn();\n",
" else document.addEventListener(\"DOMContentLoaded\", fn);\n",
" })();\n",
" },\n",
" function(Bokeh) {\n",
" }\n",
" ];\n",
" \n",
" function run_inline_js() {\n",
" \n",
" if ((window.Bokeh !== undefined) || (force === true)) {\n",
" for (var i = 0; i < inline_js.length; i++) {\n",
" inline_js[i](window.Bokeh);\n",
" }if (force === true) {\n",
" display_loaded();\n",
" }} else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(run_inline_js, 100);\n",
" } else if (!window._bokeh_failed_load) {\n",
" console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
" window._bokeh_failed_load = true;\n",
" } else if (force !== true) {\n",
" var cell = $(document.getElementById(\"d6ba6359-37b0-484c-bedb-8fc7180ff2a5\")).parents('.cell').data().cell;\n",
" cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
" }\n",
" \n",
" }\n",
" \n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
" run_inline_js();\n",
" } else {\n",
" load_libs(js_urls, function() {\n",
" console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n",
" run_inline_js();\n",
" });\n",
" }\n",
" }(this));\n",
"</script>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Over Valued\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" <div class=\"bk-root\">\n",
" <div class=\"bk-plotdiv\" id=\"38993bbb-f856-4a43-b006-d04055f57d95\"></div>\n",
" </div>\n",
"<script type=\"text/javascript\">\n",
" \n",
" (function(global) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
" \n",
" var force = false;\n",
" \n",
" if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n",
" window._bokeh_onload_callbacks = [];\n",
" window._bokeh_is_loading = undefined;\n",
" }\n",
" \n",
" \n",
" \n",
" if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n",
" window._bokeh_timeout = Date.now() + 0;\n",
" window._bokeh_failed_load = false;\n",
" }\n",
" \n",
" var NB_LOAD_WARNING = {'data': {'text/html':\n",
" \"<div style='background-color: #fdd'>\\n\"+\n",
" \"<p>\\n\"+\n",
" \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
" \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
" \"</p>\\n\"+\n",
" \"<ul>\\n\"+\n",
" \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
" \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
" \"</ul>\\n\"+\n",
" \"<code>\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"</code>\\n\"+\n",
" \"</div>\"}};\n",
" \n",
" function display_loaded() {\n",
" if (window.Bokeh !== undefined) {\n",
" var el = document.getElementById(\"38993bbb-f856-4a43-b006-d04055f57d95\");\n",
" el.textContent = \"BokehJS \" + Bokeh.version + \" successfully loaded.\";\n",
" } else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(display_loaded, 100)\n",
" }\n",
" }if ((window.Jupyter !== undefined) && Jupyter.notebook.kernel) {\n",
" comm_manager = Jupyter.notebook.kernel.comm_manager\n",
" comm_manager.register_target(\"cab8acb8-301d-41bd-8c8d-fe35e4832f34\", function () {});\n",
" }\n",
" \n",
" function run_callbacks() {\n",
" try {\n",
" window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n",
" }\n",
" finally {\n",
" delete window._bokeh_onload_callbacks\n",
" }\n",
" console.info(\"Bokeh: all callbacks have finished\");\n",
" }\n",
" \n",
" function load_libs(js_urls, callback) {\n",
" window._bokeh_onload_callbacks.push(callback);\n",
" if (window._bokeh_is_loading > 0) {\n",
" console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
" return null;\n",
" }\n",
" if (js_urls == null || js_urls.length === 0) {\n",
" run_callbacks();\n",
" return null;\n",
" }\n",
" console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" window._bokeh_is_loading = js_urls.length;\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" var s = document.createElement('script');\n",
" s.src = url;\n",
" s.async = false;\n",
" s.onreadystatechange = s.onload = function() {\n",
" window._bokeh_is_loading--;\n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: all BokehJS libraries loaded\");\n",
" run_callbacks()\n",
" }\n",
" };\n",
" s.onerror = function() {\n",
" console.warn(\"failed to load library \" + url);\n",
" };\n",
" console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
" }\n",
" };var element = document.getElementById(\"38993bbb-f856-4a43-b006-d04055f57d95\");\n",
" if (element == null) {\n",
" console.log(\"Bokeh: ERROR: autoload.js configured with elementid '38993bbb-f856-4a43-b006-d04055f57d95' but no matching script tag was found. \")\n",
" return false;\n",
" }\n",
" \n",
" var js_urls = [];\n",
" \n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" (function() {\n",
" var fn = function() {\n",
" var docs_json = {\"a3466de3-24af-4c53-ac32-910423b0bb9d\":{\"roots\":{\"references\":[{\"attributes\":{},\"id\":\"954c9211-cf52-4817-b5cb-c49fb7225cd8\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"eca2633c-1e69-47bc-a9f7-627abb567f13\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"8e5e1d27-9324-4d66-a0c0-abe0cf792333\",\"type\":\"StringFormatter\"},{\"attributes\":{\"editor\":{\"id\":\"6b421785-6c06-42fe-a2cd-b9acbaffc66d\",\"type\":\"StringEditor\"},\"field\":\"level_2\",\"formatter\":{\"id\":\"b4b5d7a7-529f-4348-bcaa-2d63684ce4fe\",\"type\":\"StringFormatter\"},\"title\":\"level 2\"},\"id\":\"f594bf8f-e0d0-49e5-a251-5910dc6e3665\",\"type\":\"TableColumn\"},{\"attributes\":{},\"id\":\"5c102168-f606-45f8-a22e-82d2933361cf\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"878daeac-ab11-4228-ac03-fbd36de8275a\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"e1bdebeb-dc02-406e-ba48-24f1785746f8\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"6b421785-6c06-42fe-a2cd-b9acbaffc66d\",\"type\":\"StringEditor\"},{\"attributes\":{\"callback\":null,\"column_names\":[\"spend_prop\",\"index\",\"other_ga_fb_cpt\",\"level_2\",\"denominator\",\"level_0\",\"imp_factor\",\"metric\",\"precision\",\"levels\",\"level_3\",\"recall\",\"numerator\",\"level_1\"],\"data\":{\"denominator\":{\"__ndarray__\":\"AAAAAAAAbkAAAAAAAMBgQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"imp_factor\":{\"__ndarray__\":\"GQRWDi2y9T+PwvUoXI/yPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"index\":[0,1],\"level_0\":[\"Audience Types : Lookalike\",\"Audience Types : Open Targeting\"],\"level_1\":[\"- : -\",\"- : -\"],\"level_2\":[\"- : -\",\"- : -\"],\"level_3\":[\"- : -\",\"- : -\"],\"levels\":[[{\"Audience Types\":{\"name\":\"Lookalike\",\"value\":\"Lookalike\"}}],[{\"Audience Types\":{\"name\":\"Open Targeting\",\"value\":\"Open Targeting\"}}]],\"metric\":{\"__ndarray__\":\"rkfhehTMn0DNzMzMzIGfQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"numerator\":{\"__ndarray__\":\"mpmZmVfPHUGPwvUo730QQQ==\",\"dtype\":\"float64\",\"shape\":[2]},\"other_ga_fb_cpt\":{\"__ndarray__\":\"7FG4HoU2kkBmZmZmZjSTQA==\",\"dtype\":\"float64\",\"shape\":[2]},\"precision\":{\"__ndarray__\":\"lkOLbOf75T8730+Nl27iPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"recall\":{\"__ndarray__\":\"3SQGgZVD2z/y0k1iEFjJPw==\",\"dtype\":\"float64\",\"shape\":[2]},\"spend_prop\":{\"__ndarray__\":\"exSuR+E6N0AzMzMzM7MpQA==\",\"dtype\":\"float64\",\"shape\":[2]}}},\"id\":\"2f075656-4869-4679-a760-909a34329f10\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"columns\":[{\"id\":\"ad7fd315-272c-4033-acc4-4888d1f7a719\",\"type\":\"TableColumn\"},{\"id\":\"a3632451-9463-4d54-b561-20586e472843\",\"type\":\"TableColumn\"},{\"id\":\"f594bf8f-e0d0-49e5-a251-5910dc6e3665\",\"type\":\"TableColumn\"},{\"id\":\"a6cb7afa-4a95-4e71-82b1-5fb7c7ff8b8c\",\"type\":\"TableColumn\"},{\"id\":\"9518fd38-c81c-46df-9a71-82580e35e8dd\",\"type\":\"TableColumn\"},{\"id\":\"ee8f8a55-e154-4c8c-b489-0ab66ae830d7\",\"type\":\"TableColumn\"},{\"id\":\"1e39c6dd-6442-44d2-829d-56c64b38e618\",\"type\":\"TableColumn\"},{\"id\":\"360a163a-dc01-44b8-baaf-de7192aed19e\",\"type\":\"TableColumn\"},{\"id\":\"00690586-d0b7-49c9-b2d3-c1a4ba28ae2c\",\"type\":\"TableColumn\"}],\"source\":{\"id\":\"2f075656-4869-4679-a760-909a34329f10\",\"type\":\"ColumnDataSource\"},\"width\":1000},\"id\":\"a23a6d5f-d551-4e12-9bbe-6d897d14aa53\",\"type\":\"DataTable\"},{\"attributes\":{\"editor\":{\"id\":\"29e85159-67f9-4a86-acfb-1c5d7d571cfc\",\"type\":\"StringEditor\"},\"field\":\"metric\",\"formatter\":{\"id\":\"e1bdebeb-dc02-406e-ba48-24f1785746f8\",\"type\":\"StringFormatter\"},\"title\":\"ga_fb_cpt\"},\"id\":\"9518fd38-c81c-46df-9a71-82580e35e8dd\",\"type\":\"TableColumn\"},{\"attributes\":{},\"id\":\"92c7f035-43ee-438c-8a30-253f47e61f81\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"eb31a1ff-4803-4272-8aaa-bfbbf79f03c5\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"b4b5d7a7-529f-4348-bcaa-2d63684ce4fe\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"4a7fb853-ec3d-4d33-b3c5-35f37a53f869\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"a3fbee6d-4b36-4103-8747-30b865f65ba3\",\"type\":\"StringFormatter\"},{\"attributes\":{},\"id\":\"ab8d6d21-6897-4a2d-b33b-54d68a70a0da\",\"type\":\"StringFormatter\"},{\"attributes\":{\"editor\":{\"id\":\"a48b14d4-6e6d-4e99-b8f8-8f6d1da438c0\",\"type\":\"StringEditor\"},\"field\":\"spend_prop\",\"formatter\":{\"id\":\"ab8d6d21-6897-4a2d-b33b-54d68a70a0da\",\"type\":\"StringFormatter\"},\"title\":\"Spend %\"},\"id\":\"ee8f8a55-e154-4c8c-b489-0ab66ae830d7\",\"type\":\"TableColumn\"},{\"attributes\":{\"editor\":{\"id\":\"878daeac-ab11-4228-ac03-fbd36de8275a\",\"type\":\"StringEditor\"},\"field\":\"level_1\",\"formatter\":{\"id\":\"4a7fb853-ec3d-4d33-b3c5-35f37a53f869\",\"type\":\"StringFormatter\"},\"title\":\"level 1\"},\"id\":\"a3632451-9463-4d54-b561-20586e472843\",\"type\":\"TableColumn\"},{\"attributes\":{\"editor\":{\"id\":\"954c9211-cf52-4817-b5cb-c49fb7225cd8\",\"type\":\"StringEditor\"},\"field\":\"precision\",\"formatter\":{\"id\":\"5c102168-f606-45f8-a22e-82d2933361cf\",\"type\":\"StringFormatter\"},\"title\":\"Precision\"},\"id\":\"1e39c6dd-6442-44d2-829d-56c64b38e618\",\"type\":\"TableColumn\"},{\"attributes\":{\"editor\":{\"id\":\"4395e634-d8d5-44ca-9695-e1f50da497c5\",\"type\":\"StringEditor\"},\"field\":\"imp_factor\",\"formatter\":{\"id\":\"eb31a1ff-4803-4272-8aaa-bfbbf79f03c5\",\"type\":\"StringFormatter\"},\"title\":\"MCC\"},\"id\":\"00690586-d0b7-49c9-b2d3-c1a4ba28ae2c\",\"type\":\"TableColumn\"},{\"attributes\":{},\"id\":\"bc67c652-db06-4814-87a2-8ec59582656d\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"4395e634-d8d5-44ca-9695-e1f50da497c5\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"a48b14d4-6e6d-4e99-b8f8-8f6d1da438c0\",\"type\":\"StringEditor\"},{\"attributes\":{},\"id\":\"29e85159-67f9-4a86-acfb-1c5d7d571cfc\",\"type\":\"StringEditor\"},{\"attributes\":{\"editor\":{\"id\":\"eca2633c-1e69-47bc-a9f7-627abb567f13\",\"type\":\"StringEditor\"},\"field\":\"level_3\",\"formatter\":{\"id\":\"501ada53-7207-4832-ae18-e2fda2fd684a\",\"type\":\"StringFormatter\"},\"title\":\"level 3\"},\"id\":\"a6cb7afa-4a95-4e71-82b1-5fb7c7ff8b8c\",\"type\":\"TableColumn\"},{\"attributes\":{\"editor\":{\"id\":\"bc67c652-db06-4814-87a2-8ec59582656d\",\"type\":\"StringEditor\"},\"field\":\"recall\",\"formatter\":{\"id\":\"a3fbee6d-4b36-4103-8747-30b865f65ba3\",\"type\":\"StringFormatter\"},\"title\":\"Recall\"},\"id\":\"360a163a-dc01-44b8-baaf-de7192aed19e\",\"type\":\"TableColumn\"},{\"attributes\":{\"editor\":{\"id\":\"92c7f035-43ee-438c-8a30-253f47e61f81\",\"type\":\"StringEditor\"},\"field\":\"level_0\",\"formatter\":{\"id\":\"8e5e1d27-9324-4d66-a0c0-abe0cf792333\",\"type\":\"StringFormatter\"},\"title\":\"level 0\"},\"id\":\"ad7fd315-272c-4033-acc4-4888d1f7a719\",\"type\":\"TableColumn\"},{\"attributes\":{},\"id\":\"501ada53-7207-4832-ae18-e2fda2fd684a\",\"type\":\"StringFormatter\"}],\"root_ids\":[\"a23a6d5f-d551-4e12-9bbe-6d897d14aa53\"]},\"title\":\"Bokeh Application\",\"version\":\"0.12.6\"}};\n",
" var render_items = [{\"docid\":\"a3466de3-24af-4c53-ac32-910423b0bb9d\",\"elementid\":\"38993bbb-f856-4a43-b006-d04055f57d95\",\"modelid\":\"a23a6d5f-d551-4e12-9bbe-6d897d14aa53\",\"notebook_comms_target\":\"cab8acb8-301d-41bd-8c8d-fe35e4832f34\"}];\n",
" \n",
" Bokeh.embed.embed_items(docs_json, render_items);\n",
" };\n",
" if (document.readyState != \"loading\") fn();\n",
" else document.addEventListener(\"DOMContentLoaded\", fn);\n",
" })();\n",
" },\n",
" function(Bokeh) {\n",
" }\n",
" ];\n",
" \n",
" function run_inline_js() {\n",
" \n",
" if ((window.Bokeh !== undefined) || (force === true)) {\n",
" for (var i = 0; i < inline_js.length; i++) {\n",
" inline_js[i](window.Bokeh);\n",
" }if (force === true) {\n",
" display_loaded();\n",
" }} else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(run_inline_js, 100);\n",
" } else if (!window._bokeh_failed_load) {\n",
" console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
" window._bokeh_failed_load = true;\n",
" } else if (force !== true) {\n",
" var cell = $(document.getElementById(\"38993bbb-f856-4a43-b006-d04055f57d95\")).parents('.cell').data().cell;\n",
" cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
" }\n",
" \n",
" }\n",
" \n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
" run_inline_js();\n",
" } else {\n",
" load_libs(js_urls, function() {\n",
" console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n",
" run_inline_js();\n",
" });\n",
" }\n",
" }(this));\n",
"</script>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"all_df = df_1.append(df_2, ignore_index=True)\n",
"all_df = all_df.append(df_3, ignore_index=True)\n",
"all_df = all_df.append(df_4, ignore_index=True)\n",
"\n",
"def round_float(s):\n",
" if s.dtype == 'float64':\n",
" s = s.round(3)\n",
" return s\n",
"\n",
"\n",
"avg_spend_prop = float(data['spend_axis'])\n",
"\n",
"tooltips=[\n",
" ('lvl 0:', '@level_0'),\n",
" ('lvl 1:', '@level_1'),\n",
" ('lvl 2:', '@level_2'),\n",
" ('lvl 3:', '@level_3'),\n",
" (args['goal_metric'][\"value\"], '@metric'),\n",
" ('Precision', '@precision'),\n",
" ('Recall', '@recall'),\n",
" ('mcc', '@imp_factor'),\n",
" ('Spend Prop', '@spend_prop')\n",
"]\n",
"\n",
"hover = HoverTool(tooltips=tooltips)\n",
"hover1 = HoverTool(tooltips=tooltips)\n",
"\n",
"def build_bokeh_trace(df_obj, num):\n",
" df_obj = df_obj.copy()\n",
" if len(df_obj):\n",
" df_obj = df_obj.sort_values(by='imp_factor', ascending=False)\n",
" df_plotly = df_obj.iloc[0:num].copy()\n",
" df_plotly['idx'] = df_plotly.index\n",
" df_plotly['size'] = df_plotly['imp_factor']\n",
" # range r1 to r2\n",
" r1=8\n",
" r2=30\n",
" min_r = df_plotly['size'].min()\n",
" max_r = df_plotly['size'].max()\n",
" df_plotly['size'] = ((df_plotly['size'])/ max_r)*20\n",
" df_plotly['overall'] = data['goal_axis']\n",
" df_plotly['overall_spend_prop'] = avg_spend_prop\n",
" else:\n",
" return ColumnDataSource(df_obj)\n",
"\n",
" source = ColumnDataSource(df_plotly)\n",
" return source\n",
"\n",
"spend_source_1 = build_bokeh_trace(df_1, 10)\n",
"spend_source_2 = build_bokeh_trace(df_2, 10)\n",
"spend_source_3 = build_bokeh_trace(df_3, 10)\n",
"spend_source_4 = build_bokeh_trace(df_4, 10)\n",
"\n",
"table_source_1 = ColumnDataSource(df_1.apply(round_float))\n",
"table_source_2 = ColumnDataSource(df_2.apply(round_float))\n",
"table_source_3 = ColumnDataSource(df_3.apply(round_float))\n",
"table_source_4 = ColumnDataSource(df_4.apply(round_float))\n",
"\n",
"columns = [\n",
" TableColumn(field=\"level_0\", title=\"level 0\"),\n",
" TableColumn(field=\"level_1\", title=\"level 1\"),\n",
" TableColumn(field=\"level_2\", title=\"level 2\"),\n",
" TableColumn(field=\"level_3\", title=\"level 3\"),\n",
"# TableColumn(field=\"other_{0}\".format(args['goal_metric'][\"value\"]), title=\"Other {0}\".format(args['goal_metric']['value'])),\n",
" TableColumn(field=\"metric\", title=args['goal_metric'][\"value\"],),\n",
"# TableColumn(field=\"Projected_change\", title=\"Projected % CPT change\"),\n",
" TableColumn(field=\"spend_prop\", title=\"Spend %\"),\n",
"# TableColumn(field=\"imp_factor\", title=\"Impact factor\"),\n",
" TableColumn(field=\"precision\", title=\"Precision\"),\n",
" TableColumn(field=\"recall\", title=\"Recall\"),\n",
" TableColumn(field=\"imp_factor\", title=\"MCC\") \n",
"]\n",
"\n",
"# Spend sorted.\n",
"p1 = figure(plot_width=800, plot_height=500, tools=[hover1],\n",
" title=\"Performance by paths.\")\n",
"p1.xaxis.axis_label = 'Spend Proportion'\n",
"p1.yaxis.axis_label = args['goal_metric'][\"value\"]\n",
"\n",
"if len(df_1):\n",
" prop_plot_1 = p1.circle('spend_prop', 'metric', fill_color='orange', source=spend_source_1, size='size')\n",
"if len(df_2):\n",
" prop_plot_2 = p1.circle('spend_prop', 'metric', fill_color='red', source=spend_source_2, size='size')\n",
"if len(df_3):\n",
" prop_plot_3 = p1.circle('spend_prop', 'metric', fill_color='green', source=spend_source_3, size='size')\n",
"if len(df_4):\n",
" prop_plot_4 = p1.circle('spend_prop', 'metric', fill_color='blue', source=spend_source_4, size='size')\n",
"\n",
"avg_spend = Span(location=avg_spend_prop, dimension='height', line_color='black', line_width=3)\n",
"avg_cpt = Span(location=data['goal_axis'], dimension='width', line_color='black', line_width=3)\n",
"\n",
"p1.add_layout(avg_spend)\n",
"p1.add_layout(avg_cpt)\n",
"\n",
"prop_plot = show(p1, notebook_handle=True)\n",
"\n",
"print('Under Valued')\n",
"if len(df_1):\n",
" data_table_1 = DataTable(source=table_source_1, columns=columns, width=1000)\n",
" table_1 = show(data_table_1, notebook_handle=True)\n",
"\n",
"print('Strategic Wins')\n",
"if len(df_2):\n",
" data_table_2 = DataTable(source=table_source_2, columns=columns, width=1000)\n",
" table_2 = show(data_table_2, notebook_handle=True)\n",
"\n",
"print('Quick Wins')\n",
"if len(df_3):\n",
" data_table_3 = DataTable(source=table_source_3, columns=columns, width=1000)\n",
" table_3 = show(data_table_3, notebook_handle=True)\n",
"\n",
"print('Over Valued')\n",
"if len(df_4):\n",
" data_table_4 = DataTable(source=table_source_4, columns=columns, width=1000)\n",
" table_4 = show(data_table_4, notebook_handle=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"ename": "KeyError",
"evalue": "'Audience Strategy'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m~/anaconda3/envs/jarvis1/lib/python3.5/site-packages/pandas/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 1875\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1876\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1877\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/index.pyx\u001b[0m in \u001b[0;36mpandas.index.IndexEngine.get_loc (pandas/index.c:4027)\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/index.pyx\u001b[0m in \u001b[0;36mpandas.index.IndexEngine.get_loc (pandas/index.c:3891)\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/hashtable.pyx\u001b[0m in \u001b[0;36mpandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12408)\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/hashtable.pyx\u001b[0m in \u001b[0;36mpandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12359)\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'Audience Strategy'",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-27-22fa0349b244>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdf_bigger\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Audience Strategy'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'Retention'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m&\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Ad Type'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'Carousel'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m&\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Landing Pages'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'www.zivame.com/no-sag-flat-30.html, www.zivame.com'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mdf_bigger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/envs/jarvis1/lib/python3.5/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1990\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1991\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1992\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_column\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1993\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1994\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_getitem_column\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/envs/jarvis1/lib/python3.5/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m_getitem_column\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1997\u001b[0m \u001b[0;31m# get column\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1998\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_unique\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1999\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_item_cache\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2000\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2001\u001b[0m \u001b[0;31m# duplicate columns & possible reduce dimensionality\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/envs/jarvis1/lib/python3.5/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m_get_item_cache\u001b[0;34m(self, item)\u001b[0m\n\u001b[1;32m 1343\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcache\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1344\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mres\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1345\u001b[0;31m \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1346\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_box_item_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1347\u001b[0m \u001b[0mcache\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mitem\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/envs/jarvis1/lib/python3.5/site-packages/pandas/core/internals.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, item, fastpath)\u001b[0m\n\u001b[1;32m 3223\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3224\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misnull\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3225\u001b[0;31m \u001b[0mloc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3226\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3227\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0misnull\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/envs/jarvis1/lib/python3.5/site-packages/pandas/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 1876\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1877\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1878\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_maybe_cast_indexer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1879\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1880\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_indexer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/index.pyx\u001b[0m in \u001b[0;36mpandas.index.IndexEngine.get_loc (pandas/index.c:4027)\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/index.pyx\u001b[0m in \u001b[0;36mpandas.index.IndexEngine.get_loc (pandas/index.c:3891)\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/hashtable.pyx\u001b[0m in \u001b[0;36mpandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12408)\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/hashtable.pyx\u001b[0m in \u001b[0;36mpandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12359)\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'Audience Strategy'"
]
}
],
"source": [
"df_bigger = df[(df['Audience Strategy'] == 'Retention') & (df['Ad Type'] == 'Carousel') & (df['Landing Pages'] == 'www.zivame.com/no-sag-flat-30.html, www.zivame.com')]\n",
"df_bigger.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"plt.figure(figsize=(20,10))\n",
"binwidth = 0.1\n",
"h = hist(df_bigger[goal_metric['value']], weights=df_bigger.fb_spend, bins=pd.np.linspace((min(df_bigger[goal_metric['value']])),\n",
" (max(df_bigger[goal_metric['value']])), 50))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true,
"scrolled": false
},
"outputs": [],
"source": [
"df_smaller = df[(df['Audience Strategy'] == 'Prospecting') & (df['Product Category'] == 'Shapewear')]\n",
"df_smaller.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"plt.figure(figsize=(20,10))\n",
"binwidth = 0.1\n",
"h = hist(df_smaller[goal_metric['value']], weights=df_smaller.fb_spend, bins=pd.np.linspace((min(df_smaller[goal_metric['value']])),\n",
" (max(df_smaller[goal_metric['value']])), 50))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy.stats import norm\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Fit a normal distribution to the data:\n",
"\n",
"\n",
"mu, std = norm.fit(data, loc = path_model.overall_goal_metric)\n",
"\n",
"# Plot the histogram.\n",
"plt.hist(data, bins=25, normed=True, alpha=0.6, color='g')\n",
"\n",
"# Plot the PDF.\n",
"xmin, xmax = plt.xlim()\n",
"x = np.linspace(xmin, xmax, 100)\n",
"p = norm.pdf(x, mu, std)\n",
"plt.plot(x, p, 'k', linewidth=2)\n",
"title = \"Fit results: mu = %.2f, std = %.2f\" % (mu, std)\n",
"plt.title(title)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"check_threshold*mu"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"check_threshold = std*0.675 / mu"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"positive_df = df[abs(df[goal_metric['value']] - path_model.overall_goal_metric) > check_threshold*path_model.overall_goal_metric] "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"positive_df.fb_spend.sum() / df.fb_spend.sum()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"path_model.check_threshold"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"(0.713 - 0.0181*0.430)/ (1-0.0181)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"(0.713 - 0.0189*0.410)/ (1-0.0189)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"path_model.overall_goal_metric - # + path_model.overall_goal_metric*path_model.check_threshold"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"(pd.np.percentile(data, 25) - path_model.overall_goal_metric) / path_model.overall_goal_metric"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"(pd.np.percentile(data, 75) - path_model.overall_goal_metric) / path_model.overall_goal_metric"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"pd.np.quant"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from scipy.stats import t\n",
"t.fit(data, loc=path_model.overall_goal_metric)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"len([d for d in data if d > 1000])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"df.fb_spend.sum()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [jarvis1]",
"language": "python",
"name": "Python [jarvis1]"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment