Skip to content

Instantly share code, notes, and snippets.

@Mossop
Created December 9, 2015 20:23
Show Gist options
  • Save Mossop/808c53479968ed8c3178 to your computer and use it in GitHub Desktop.
Save Mossop/808c53479968ed8c3178 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{"nbformat_minor": 0, "cells": [{"execution_count": 1, "cell_type": "code", "source": "import matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np\n%pylab inline\nfrom IPython.display import display, display_html\n\nimport re\nimport ujson as json\nfrom datetime import datetime, timedelta\nfrom urllib2 import Request, urlopen\n\nfrom moztelemetry.spark import get_pings, get_one_ping_per_client", "outputs": [{"output_type": "stream", "name": "stdout", "text": "Populating the interactive namespace from numpy and matplotlib\n"}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 2, "cell_type": "code", "source": "def load_data():\n global bc_amo_extensions \n amo_extensions = dict()\n req = Request(\"http://www.oxymoronical.com/files/allextensions.txt\", headers={'User-Agent' : \"Firefox\"})\n lines = urlopen(req).readlines()[3:-1]\n for line in lines:\n start, id, uid, status, disabled, end = re.sub(r'\\s*\\|\\s*', \"|\", line).split(\"|\")\n amo_extensions[id] = {\n \"status\": status,\n \"disabled\": disabled == 1,\n }\n bc_amo_extensions = sc.broadcast(amo_extensions)\n\nload_data()\n\ndef is_amo(addon):\n return addon[\"id\"] in bc_amo_extensions.value", "outputs": [], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 3, "cell_type": "code", "source": "def extract(pingstr):\n data = json.loads(pingstr)\n\n ping = {\n \"clientID\": data[\"clientID\"],\n \"os\": data[\"environment\"][\"system\"][\"os\"],\n \"addons\": []\n }\n\n if \"addons\" in data[\"environment\"]:\n activeAddons = data[\"environment\"][\"addons\"][\"activeAddons\"]\n for (id, addon) in activeAddons.iteritems():\n addon = activeAddons[id]\n if \"signedState\" in addon:\n addon[\"id\"] = id\n addon[\"isAMO\"] = is_amo(addon)\n ping[\"addons\"].append(addon)\n\n return ping\n\n# Dates are inclusive so count from one week till yesterday\nnow = datetime.now()\nstart = now - timedelta(7)\nend = now - timedelta(1)\n\npings = get_pings(sc, \n app=\"Firefox\",\n channel=\"nightly\",\n submission_date=(start.strftime(\"%Y%m%d\"), end.strftime(\"%Y%m%d\")),\n build_id=(\"20150603000000\", \"99999999999999\"),\n fraction=1)\n\n# Extracts fields\npings = pings.map(extract)\n\n# Reduce to one per client\npings = get_one_ping_per_client(pings).cache()\nostypes = pings.map(lambda p: p[\"os\"][\"name\"]).distinct().collect()", "outputs": [], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 4, "cell_type": "code", "source": "SIGNED_STATES = {\n \"Broken\": -2,\n \"Unknown\": -1,\n \"Missing\": 0,\n \"Preliminary\": 1,\n \"Fully Signed\": 2\n}\n\ndef is_foreign(addon):\n if not \"foreignInstall\" in addon:\n return False\n return addon[\"foreignInstall\"]\n\ndef is_valid(addon):\n if addon[\"signedState\"] <= 0:\n return False\n if is_foreign(addon) and addon[\"signedState\"] < 2:\n return False\n return True\n\ndef reduce_addons(check):\n def mapper(ping):\n ping[\"addons\"] = list(filter(check, ping[\"addons\"]))\n return ping\n\n return mapper\n\ndef check_any_addon(check):\n def reducer(ping):\n for addon in ping[\"addons\"]:\n if check(addon):\n return True\n return False\n\n return reducer\n\ndef check_all_addons(check):\n def reducer(ping):\n for addon in ping[\"addons\"]:\n if not check(addon):\n return False\n return True\n\n return reducer\n\ndef reduce_addon_state(check):\n def mapper(addons):\n return list(filter(check, addons))\n\n return mapper\n\ndef check_any_unsigned(ping):\n for addon in ping[\"addons\"]:\n if not is_valid(addon):\n return True\n return False\n\ndef check_any_signed(ping):\n for addon in ping[\"addons\"]:\n if is_valid(addon):\n return True\n return False\n\ndef check_some_signed(ping): \n return check_any_signed(ping) and check_any_unsigned(ping)", "outputs": [], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 5, "cell_type": "code", "source": "noaddons = pings.filter(lambda p: len(p[\"addons\"]) == 0)\nanyaddons = pings.filter(lambda p: len(p[\"addons\"]) > 0).cache()\n\nnonesigned = anyaddons.filter(check_all_addons(lambda a: not is_valid(a)))\nsomesigned = anyaddons.filter(check_some_signed)\nallsigned = anyaddons.filter(check_all_addons(is_valid))", "outputs": [], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 6, "cell_type": "code", "source": "def count_by_os(rdd):\n base = { \"All\": 0 }\n for os in ostypes:\n base[os] = 0\n\n def apply(b, p):\n b[\"All\"] += 1\n b[p[\"os\"][\"name\"]] += 1\n return b\n\n def combine(b1, b2):\n for os in base:\n b1[os] += b2[os]\n return b1\n\n return pd.Series(rdd.aggregate(base, apply, combine))\n\noscounts = pd.DataFrame({\n \"No Add-ons\": count_by_os(noaddons),\n \"None Signed\": count_by_os(nonesigned),\n \"Some Signed\": count_by_os(somesigned),\n \"All Signed\": count_by_os(allsigned),\n})\n\ntotals = oscounts.sum(1)\nfor index in oscounts:\n oscounts[index] = 100.0 * oscounts[index] / totals\n\nplt.figure(figsize=(30, 7))\noscounts.plot(kind='bar', stacked=True)\nplt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\nplt.show()", "outputs": [{"output_type": "display_data", "data": {"text/plain": "<matplotlib.figure.Figure at 0x7f4bbc92e150>"}, "metadata": {}}, {"output_type": "display_data", "data": {"image/png": "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\nb2Zm1gD/HwzhEiPI0zq7AAAAAElFTkSuQmCC\n", "text/plain": "<matplotlib.figure.Figure at 0x7f4b9c940550>"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 7, "cell_type": "code", "source": "alladdons = anyaddons.flatMap(lambda p: p[\"addons\"]).cache()\ndisplay(alladdons.count())", "outputs": [{"output_type": "display_data", "data": {"text/plain": "12392"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 8, "cell_type": "code", "source": "amostates = alladdons.filter(lambda a: a[\"isAMO\"]).map(lambda a: a[\"signedState\"]).countByValue()\nnonamostates = alladdons.filter(lambda a: not a[\"isAMO\"]).map(lambda a: a[\"signedState\"]).countByValue()\n\ndef get_state_counts(state):\n return pd.Series({ \"AMO\": amostates[state], \"Non AMO\": nonamostates[state] })\n\nstatecounts = {}\nfor (name, state) in SIGNED_STATES.iteritems():\n statecounts[name] = get_state_counts(state)\n\nstatecounts = pd.DataFrame(statecounts)\n\nplt.figure(figsize=(30, 7))\nstatecounts.plot(kind='bar', stacked=True)\nplt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\nplt.show()", "outputs": [{"output_type": "display_data", "data": {"text/plain": "<matplotlib.figure.Figure at 0x7f4b9cf99dd0>"}, "metadata": {}}, {"output_type": "display_data", "data": {"image/png": "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\n", "text/plain": "<matplotlib.figure.Figure at 0x7f4b98127a10>"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 9, "cell_type": "code", "source": "foreignstates = alladdons.filter(is_foreign).map(lambda a: a[\"signedState\"]).countByValue()\nfor (name, state) in SIGNED_STATES.iteritems():\n foreignstates[name] = foreignstates.pop(state)\n\nplt.figure(figsize=(10, 7))\npd.Series(foreignstates).plot(kind='bar')\nplt.show()", "outputs": [{"output_type": "display_data", "data": {"image/png": "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\ntKD/H2PgrJqNDBb/AAAAAElFTkSuQmCC\n", "text/plain": "<matplotlib.figure.Figure at 0x7f4b9cf999d0>"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 10, "cell_type": "code", "source": "unsigned = anyaddons.filter(check_any_unsigned).map(reduce_addons(lambda a: not is_valid(a)))", "outputs": [], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 11, "cell_type": "code", "source": "def sorted_table(map):\n return sorted(map.items(), key = lambda i: i[1], reverse = True)\n\ndef ordered_ids(pings):\n total = pings.count()\n allids = pings.flatMap(lambda p: [a[\"id\"] for a in p[\"addons\"]])\n return (100.0 / total) * pd.Series(allids.countByValue())\n\ndisplay(ordered_ids(unsigned).nlargest(20))", "outputs": [{"output_type": "display_data", "data": {"text/plain": "firefox@mega.co.nz 6.294086\nadbhelper@mozilla.org 5.100380\nhttps-everywhere@eff.org 3.852415\nfirebug@software.joehewitt.com 3.309821\nabs@avira.com 2.984265\n{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d} 2.604449\nhelper@savefrom.net 2.550190\nwrc@avast.com 2.495931\niobitascsurfingprotection@iobit.com 2.278893\nsweetsearch@gmail.com 2.170374\n9tffxtbr@free.internetspeedtracker.com 2.007596\nuBlock0@raymondhill.net 1.899078\nvb@yandex.ru 1.736300\nyasearch@yandex.ru 1.627781\n{195A3098-0BD5-4e90-AE22-BA1C540AFD1E} 1.519262\n{e4f94d1e-2f53-401e-8885-681602c0ddd8} 1.519262\nsupport@lastpass.com 1.465003\n{73a6fe31-595d-460b-a920-fcc0f8843232} 1.356484\n{4ED1F68A-5463-4931-9384-8FFF5ED91D92} 1.302225\nanti_banner@kaspersky.com 1.247965\ndtype: float64"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 12, "cell_type": "code", "source": "for os in ostypes:\n display_html(\"<h2>\" + os + \"</h2>\", raw=True)\n idcounts = unsigned.filter(lambda p: p[\"os\"][\"name\"] == os)\n display(ordered_ids(idcounts).nlargest(20))", "outputs": [{"output_type": "display_data", "data": {"text/html": "<h2>Darwin</h2>"}, "metadata": {}}, {"output_type": "display_data", "data": {"text/plain": "adbhelper@mozilla.org 21.666667\nfirebug@software.joehewitt.com 16.666667\nhttps-everywhere@eff.org 11.666667\nonepassword4@agilebits.com 8.333333\nsupport@lastpass.com 8.333333\njid1-MnnxcxisBPnSXQ@jetpack 6.666667\n{6AC85730-7D0F-4de0-B3FA-21142DD85326} 6.666667\nfxos_2_1_simulator@mozilla.org 5.000000\n{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d} 5.000000\nfirefox@mega.co.nz 3.333333\nfxos_1_3_simulator@mozilla.org 3.333333\nfxos_2_0_simulator@mozilla.org 3.333333\nfxos_2_2_simulator@mozilla.org 3.333333\njid0-edalmuivkozlouyij0lpdx548bc@jetpack 3.333333\njid1-AQqSMBYb0a8ADg@jetpack 3.333333\njid1-cwbvBTE216jjpg@jetpack 3.333333\nreadability@readability.com 3.333333\nshumway@research.mozilla.org 3.333333\nuriloader@pdf.js 3.333333\n{1280606b-2510-4fe0-97ef-9b5a22eafe30} 3.333333\ndtype: float64"}, "metadata": {}}, {"output_type": "display_data", "data": {"text/html": "<h2>Linux</h2>"}, "metadata": {}}, {"output_type": "display_data", "data": {"text/plain": "https-everywhere@eff.org 18.918919\nadbhelper@mozilla.org 16.216216\nfirebug@software.joehewitt.com 8.108108\nfxos_2_0_simulator@mozilla.org 8.108108\njid1-MnnxcxisBPnSXQ@jetpack 8.108108\n{73a6fe31-595d-460b-a920-fcc0f8843232} 8.108108\npl@dictionaries.addons.mozilla.org 5.405405\nr2d2b2g@mozilla.org 5.405405\nshumway@research.mozilla.org 5.405405\nuBlock0@raymondhill.net 5.405405\n@mystart-newtab 2.702703\nanti_tumblr_infinite_scroll@davidk.se 2.702703\nbetterkongregate@matthewammann.com 2.702703\ncitizenex@jetpack 2.702703\ndta@downthemall.net 2.702703\nel-GR@dictionaries.addons.mozilla.org 2.702703\nelemhidehelper@adblockplus.org 2.702703\nen-GB@dictionaries.addons.mozilla.org 2.702703\neo-EO@dictionaries.addons.mozilla.org 2.702703\nes-MX@dictionaries.addons.mozilla.org 2.702703\ndtype: float64"}, "metadata": {}}, {"output_type": "display_data", "data": {"text/html": "<h2>Windows_NT</h2>"}, "metadata": {}}, {"output_type": "display_data", "data": {"text/plain": "firefox@mega.co.nz 6.471936\nadbhelper@mozilla.org 4.295533\nhttps-everywhere@eff.org 3.264605\nabs@avira.com 3.150057\nfirebug@software.joehewitt.com 2.749141\nhelper@savefrom.net 2.691867\nwrc@avast.com 2.577320\n{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d} 2.520046\niobitascsurfingprotection@iobit.com 2.405498\nsweetsearch@gmail.com 2.290951\n9tffxtbr@free.internetspeedtracker.com 2.119129\nuBlock0@raymondhill.net 1.832761\nvb@yandex.ru 1.832761\nyasearch@yandex.ru 1.718213\n{e4f94d1e-2f53-401e-8885-681602c0ddd8} 1.603666\n{195A3098-0BD5-4e90-AE22-BA1C540AFD1E} 1.489118\n{4ED1F68A-5463-4931-9384-8FFF5ED91D92} 1.374570\nanti_banner@kaspersky.com 1.317297\n{B64D9B05-48E1-4CEB-BF58-E0643994E900} 1.260023\nsupport@lastpass.com 1.202749\ndtype: float64"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}], "nbformat": 4, "metadata": {"kernelspec": {"display_name": "Python 2", "name": "python2", "language": "python"}, "language_info": {"mimetype": "text/x-python", "nbconvert_exporter": "python", "version": "2.7.9", "name": "python", "file_extension": ".py", "pygments_lexer": "ipython2", "codemirror_mode": {"version": 2, "name": "ipython"}}}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment