Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save AndrewGreen/3a512d0cfe01c5cf8db6ae217d7b66c7 to your computer and use it in GitHub Desktop.
Save AndrewGreen/3a512d0cfe01c5cf8db6ae217d7b66c7 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" SUM(view_count) AS n,\n",
" country_code,\n",
" access_method\n",
"FROM\n",
" wmf.pageview_hourly\n",
"WHERE year = 2016\n",
" AND month = 12\n",
" AND day = 7\n",
" AND agent_type = 'user'\n",
" AND project = 'en.wikipedia'\n",
" AND country_code in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
" AND NOT (page_title LIKE \"%Special:%\")\n",
"GROUP BY\n",
" country_code,\n",
" access_method\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_pageviews_for_cn_from_hourly.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" count(*) AS n,\n",
" country,\n",
" access_method\n",
"FROM\n",
" andyrussg.t152122beaconimpression20161207\n",
"WHERE\n",
" country in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
"GROUP BY\n",
" country,\n",
" access_method\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_impressions_by_country_and_acccess_method.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" SUM(view_count) AS n,\n",
" user_agent_map['browser_family'] as browser_family,\n",
" user_agent_map['browser_major'] as browser_major,\n",
" user_agent_map['os_family'] as os_family\n",
"FROM\n",
" wmf.pageview_hourly\n",
"WHERE year = 2016\n",
" AND month = 12\n",
" AND day = 7\n",
" AND agent_type = 'user'\n",
" AND project = 'en.wikipedia'\n",
" AND access_method = 'mobile web'\n",
" AND country_code = 'IE'\n",
" AND NOT (page_title LIKE \"%Special:%\")\n",
"GROUP BY\n",
" user_agent_map['browser_family'],\n",
" user_agent_map['browser_major'],\n",
" user_agent_map['os_family']\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_mobile_pageviews_for_cn_in_IE_from_hourly_by_platform.csv')"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" count(*) AS n,\n",
" user_agent_map['browser_family'] as browser_family,\n",
" user_agent_map['browser_major'] as browser_major,\n",
" user_agent_map['os_family'] as os_family\n",
"FROM\n",
" andyrussg.t152122beaconimpression20161207\n",
"WHERE\n",
" country = 'IE'\n",
" AND access_method = 'mobile web'\n",
"GROUP BY\n",
" user_agent_map['browser_family'],\n",
" user_agent_map['browser_major'],\n",
" user_agent_map['os_family']\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_mobile_impressions_in_IE_by_platform.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": "*"
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"pv = pandas.read_csv('T152650_2016-12-07_mobile_pageviews_for_cn_in_IE_from_hourly_by_platform.csv', index_col=0)\n",
"imp = pandas.read_csv('T152650_2016-12-07_mobile_impressions_in_IE_by_platform.csv', index_col=0)\n",
"ratios = pandas.merge(pv, imp, how='left', on=['browser_family', 'browser_major', 'os_family'])\n",
"ratios['ratio'] = ratios.apply(lambda row: 0 if math.isnan(row.n_y) else row.n_y/row.n_x, axis=1)\n",
"ratios.sort(columns='ratio', inplace=True)\n",
"ratios.to_csv('T152650_2016-12-07_mobile_pv-impressions_in_IE.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" count(*) AS n,\n",
" country,\n",
" geocoded_data['country_code']\n",
"FROM\n",
" andyrussg.t152122beaconimpression20161207\n",
"WHERE\n",
" access_method = 'mobile web'\n",
" AND country in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
"GROUP BY\n",
" country,\n",
" geocoded_data['country_code']\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_mobile_impressions_country_vs_geocoded.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" count(*) AS n,\n",
" client_ip LIKE '%.%' as IPv4,\n",
" client_ip LIKE '%:%' as IPv6,\n",
" geocoded_data['country_code'] as country\n",
"FROM\n",
" andyrussg.t152122beaconimpression20161207\n",
"WHERE\n",
" access_method = 'mobile web'\n",
" AND country in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
"GROUP BY\n",
" client_ip LIKE '%.%',\n",
" client_ip LIKE '%:%',\n",
" geocoded_data['country_code']\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_mobile_impressions_ip_version.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" SUM(view_count) AS n,\n",
" subdivision\n",
"FROM\n",
" wmf.pageview_hourly\n",
"WHERE year = 2016\n",
" AND month = 12\n",
" AND day = 7\n",
" AND agent_type = 'user'\n",
" AND project = 'en.wikipedia'\n",
" AND access_method = 'mobile web'\n",
" AND country_code = 'IE'\n",
" AND NOT (page_title LIKE \"%Special:%\")\n",
"GROUP BY\n",
" subdivision\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_mobile_pageviews_for_cn_in_IE_from_hourly_by_subdivision.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" count(*) AS n, \n",
" geocoded_data['subdivision'] as subdivision\n",
"FROM\n",
" andyrussg.t152122beaconimpression20161207\n",
"WHERE\n",
" geocoded_data['country_code'] = 'IE'\n",
" AND access_method = 'mobile web'\n",
"GROUP BY\n",
" geocoded_data['subdivision']\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_mobile_impressions_in_IE_by_subdivision.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"from __future__ import division\n",
"pv = pandas.read_csv('T152650_2016-12-07_mobile_pageviews_for_cn_in_IE_from_hourly_by_subdivision.csv', index_col=0)\n",
"imp = pandas.read_csv('T152650_2016-12-07_mobile_impressions_in_IE_by_subdivision.csv', index_col=0)\n",
"ratios = pandas.merge(pv, imp, how='left', on=['subdivision'])\n",
"ratios['ratio'] = ratios.apply(lambda row: row.n_y/row.n_x, axis=1)\n",
"ratios.sort(columns='ratio', inplace=True)\n",
"ratios.to_csv('T152650_2016-12-07_mobile_pv-impressions_in_IE_by_subdivision.csv')\n",
"ratios"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>n_x</th>\n",
" <th>subdivision</th>\n",
" <th>n_y</th>\n",
" <th>ratio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 1035039</td>\n",
" <td> Unknown</td>\n",
" <td> 307740</td>\n",
" <td> 0.297322</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 406375</td>\n",
" <td> Leinster</td>\n",
" <td> 375794</td>\n",
" <td> 0.924747</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 23929</td>\n",
" <td> Connaught</td>\n",
" <td> 22421</td>\n",
" <td> 0.936980</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 9738</td>\n",
" <td> Ulster</td>\n",
" <td> 9133</td>\n",
" <td> 0.937872</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> 71813</td>\n",
" <td> Munster</td>\n",
" <td> 67421</td>\n",
" <td> 0.938841</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows \u00d7 4 columns</p>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
" n_x subdivision n_y ratio\n",
"0 1035039 Unknown 307740 0.297322\n",
"1 406375 Leinster 375794 0.924747\n",
"2 23929 Connaught 22421 0.936980\n",
"3 9738 Ulster 9133 0.937872\n",
"4 71813 Munster 67421 0.938841\n",
"\n",
"[5 rows x 4 columns]"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" avg(time_firstbyte) AS avg_time_firstbyte,\n",
" geocoded_data['country_code'] as country,\n",
" geocoded_data['subdivision'] as subdivision\n",
"FROM\n",
" wmf.webrequest\n",
"WHERE\n",
" geocoded_data['country_code'] in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
" AND access_method = 'mobile web'\n",
" AND is_pageview = true\n",
" AND year = 2016\n",
" AND month = 12\n",
" AND day = 7\n",
"GROUP BY\n",
" geocoded_data['country_code'],\n",
" geocoded_data['subdivision']\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_mobile_pageviews_time_first_byte_by_country_and_subdivision.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" SUM(view_count) AS n,\n",
" country_code,\n",
" subdivision\n",
"FROM\n",
" wmf.pageview_hourly\n",
"WHERE year = 2016\n",
" AND month = 12\n",
" AND day = 7\n",
" AND agent_type = 'user'\n",
" AND project = 'en.wikipedia'\n",
" AND access_method = 'mobile web'\n",
" AND country_code in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
" AND NOT (page_title LIKE \"%Special:%\")\n",
"GROUP BY\n",
" country_code,\n",
" subdivision\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_mobile_pageviews_for_cn_by_country_and_subdivision.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" count(*) AS n,\n",
" geocoded_data['country_code'] as country_code,\n",
" geocoded_data['subdivision'] as subdivision\n",
"FROM\n",
" andyrussg.t152122beaconimpression20161207\n",
"WHERE\n",
" geocoded_data['country_code'] in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
" AND access_method = 'mobile web'\n",
"GROUP BY\n",
" geocoded_data['country_code'],\n",
" geocoded_data['subdivision']\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-07_mobile_impressions_by_country_and_subdivision.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"from __future__ import division\n",
"pv = pandas.read_csv('T152650_2016-12-07_mobile_pageviews_for_cn_by_country_and_subdivision.csv', index_col=0)\n",
"imp = pandas.read_csv('T152650_2016-12-07_mobile_impressions_by_country_and_subdivision.csv', index_col=0)\n",
"ratios = pandas.merge(pv, imp, how='left', on=['country_code','subdivision'])\n",
"ratios['ratio'] = ratios.apply(lambda row: row.n_y/row.n_x, axis=1)\n",
"ratios.sort(columns='ratio', inplace=True)\n",
"fp = pandas.read_csv('T152650_2016-12-07_mobile_pageviews_time_first_byte_by_country_and_subdivision.csv', index_col=0)\n",
"ratios_and_fp = pandas.merge(ratios, fp, left_on=['country_code','subdivision'], right_on=['country','subdivision'])\n",
"ratios_and_fp.to_csv('T152650_2016-12-07_mobile_pv-impressions_by_country_and_subdivision.csv')\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"T152650_2016-12-07_to_09_mobile_reponse_start_by_country_and_subdivision.csv\n",
"# Note: unable to get this query to run here. Ran it directly on beeline.\n",
"\"\"\"\n",
"SELECT\n",
" avg(get_json_object(reflect('java.net.URLDecoder', 'decode', substr(uri_query, 2)), '$.event.responseStart')) AS avg_response_start,\n",
" count(*) as n,\n",
" geocoded_data['country_code'] as country_code,\n",
" geocoded_data['subdivision'] as subdivision\n",
"FROM\n",
" wmf.webrequest\n",
"WHERE\n",
" uri_path LIKE '%beacon%event%'\n",
" AND get_json_object(reflect('java.net.URLDecoder', 'decode', substr(uri_query, 2)), '$.schema') = 'NavigationTiming'\n",
" AND get_json_object(reflect('java.net.URLDecoder', 'decode', substr(uri_query, 2)), '$.event.responseStart') IS NOT NULL\n",
" AND get_json_object(reflect('java.net.URLDecoder', 'decode', substr(uri_query, 2)), '$.event.mobileMode') IS NOT NULL\n",
" AND agent_type = 'user'\n",
" AND geocoded_data['country_code'] in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
" AND year = 2016\n",
" AND month = 12\n",
" AND day >= 7\n",
" AND day <= 9\n",
"GROUP BY\n",
" geocoded_data['country_code'],\n",
" geocoded_data['subdivision'];\n",
"\"\"\" \n",
"# => T152650_2016-12-07_to_09_mobile_reponse_start_by_country_and_subdivision.csv\n",
"# See https://tools.wmflabs.org/paste/view/008b38f7 for error log when run in ipython\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"from __future__ import division\n",
"pv = pandas.read_csv('T152650_2016-12-07_mobile_pageviews_for_cn_by_country_and_subdivision.csv', index_col=0)\n",
"imp = pandas.read_csv('T152650_2016-12-07_mobile_impressions_by_country_and_subdivision.csv', index_col=0)\n",
"ratios = pandas.merge(pv, imp, how='left', on=['country_code','subdivision'])\n",
"ratios['ratio'] = ratios.apply(lambda row: row.n_y/row.n_x, axis=1)\n",
"ratios.sort(columns='ratio', inplace=True)\n",
"rs = pandas.read_csv('T152650_2016-12-07_to_09_mobile_reponse_start_by_country_and_subdivision.csv')\n",
"ratios_and_rs = pandas.merge(rs, ratios, how='left', on=['country_code','subdivision'])\n",
"ratios_and_rs.to_csv('T152650_2016-12-07_mobile_pv-impressions_and_rs_by_country_and_subdivision.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"% matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import pandas\n",
"\n",
"ratios_and_rs = pandas.read_csv('T152650_2016-12-07_mobile_pv-impressions_and_rs_by_country_and_subdivision.csv', index_col=0)\n",
"\n",
"# filter out regions with too little data from NavigationTimings\n",
"ratios_and_rs = ratios_and_rs[ratios_and_rs.n>=200]\n",
"\n",
"plt.figure(figsize=(10,7))\n",
"plt.plot(ratios_and_rs.avg_response_start, ratios_and_rs.ratio, 'bo')\n",
"plt.xlabel('responseStart (ms)')\n",
"plt.ylabel('Impression rate')\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n+qPmLqzNn5+p06cXl3rM6dOq1B9s58N4mdq5M0cJCa+UG+qqTFCraOhTaiJpsqTfXb9d0Y/nDyEh\nP/9u7dx5Sm+8kaC0tOnKyflGX399UoWFt0l6RVJ/lR4mLD+8euVKlNLSNrqcDycdl5Qq6aCkNeVe\nX2BgYpn9t0naoHPnVpcKaKGhZ5Sd/Ydyjy/bFs6HY59xWllV5upVddjZF07MAABfQvDyE67CWk0m\n158/n6OSABMoKUdSqKTf6fvvpczMkjDx6ac/zJvav/+w3M2JctZDFxb2glq1KtDVq4U6fvwnKi6+\nRQUFF1ToNCfcCAkpkp5Sfv6Hjtc+adIGFRYuvGnfadf/7SubbaQsa7jT47mbDyfdJSlVISHPKD+/\n/L2Fhfbrz3XjNZXvrcvOnqXmzYc4PXrZtnDe83aX08dWdq6eVNne0R9444kZ/oqTHoD6geDlA2r6\nH3J1J9enp2/TqVOhkv7t+pZXbvq+RHb2LP3610/qypWbe4F+CDvOnst5D91PnQ61TZo0rUwASbn+\n73THc4SEbJRUUViZJSlJ0kZZVk9JG1Q6FI6UFKL9+y8pIeEV3X9/63LBpFGjFLVvL0VETNc33zTR\n3r1yoqmkeN0Yzg0M/KvT0GhZZYdTS5RtC+eBp7+kcZL+07HFVWhypqpD2TU9MQOVw5AuUI8YnGtW\nbT5Spkc4nxj/QpUmOFdnwr5lOZuI/WoFk+KdbX+lSs/lqvYWLZ64/hyvlJnk/kqpY/frV5n6tl4/\nzjOWNMqSSr+3dvtU69VXf28lJLxi9ev3qpWQ8Eqp2p1Pvn+5TF2W1bz5k05r6dHjuUq1RcUnIIy6\nXv+rVosWT3p8ont1f3ZQNdU56QGA93KVW+jxMqyqvVfTp6/W6dOl15E6ffp3+td//XmlPwlXZ8K+\n5KzXpaJhuPK9H82bH1e3bqkKCSnSffdFaP78TM2b92GVe+wGDuyrt98uPyE9JGSsoqIKHYurpqdv\n0xdfHKxEfX0l9VXz5sMkXdS5c+XnW+3cOV0ZGTMrrEf64b384ouD+u67H5a4uKFt2ya67bbyQ3qv\nvfZkqcdX1BbOhgSlqSqZ59VXdvtUvfHGcx7vDanuzw6qhiFdoP4geBlUneGEo0cvVbD9YpWeuzIT\n9suGwvPn/15mj/4qPY9JathwjK5efbrcsdq1a6KsrNRaGUJx/sd/aLlLIpUEoNL1NWqUoitXnip3\nzN6971J+fgPHxPebuftjd/N7+cPr++G12O1TNXPmM05q/iGwVGbx1RsnDOTnN9CFC9/KsgoUGvqh\nQkI2Gg0/VT3ZA1XHkK5/Yb4eXDLY81ZtPlKmW9UZTqhoyKp588G1WpuzIaWwsJFOhjlHWD16POcY\nhmvfPtkqv9bWy1Zs7Khqv+aqKv0cN4YSX7UCAx+12rdPLvcabgyV1VZt69dvrXBosrKPr+n6XPBt\nDOn6D36fYVkMNXqN6gwnNG9u6dy50r040lQ1b27Vam3OJqafPr1YsbGjFRNzc6/N8FKf3OLiUnXk\nyEMqvUbYAIWGfijJzBBK6efoqxvDfoWFqTpyJFVhYaPUo8fP1bTpHeV6nqpyhl9Fatoj5C9LNvAp\nv/oY0vUf/vL7DM8heBlUneGEW29tKum0Sgeb07r11ia1WltFASk0NEIZGakVPq7kNf0Qdm64caah\niSGUipeAKHmO06cXKyZmernX4S1/7Pxhfg9n5dUcQ7qeZ+LDgS/9PvNhqeaq8x4SvAyq6hpKUknw\nkR6StPGmrcMdPUq1pboByd1rqs5rrqqKJ6L/8BwV/afnDX/s/GF+D5/y4e1MfTjwld/n8u/HNn30\n0e9lt/9JrVs3IYRVgqufKVcIXgZVp4fFXY9SbaluQHL3mkz0Kt38HLt2HVde3l0qCV3O1xHzNibC\nqaf50qd81E+e/HBQ+vJepxUWNlmnT//Ocb83/j6Xfj9KrrRx5coaffGF9MUX9FhXhqufKVcIXoZV\ntYfF1B/lmgQkd6/JRK/Sjeeo6CxDb/tP72beMuRZE77yKR/1l6c+HDjr9XA1r9RblH4/nF9pgx5r\n16r7M0Xw8nIm/yh7w7BbTflqiPH1994feu3g3zz14aCiE5OczSv1JqXfD3qsq6O6P1MELx/g63+U\nTeP9Ms9XAy/qD099OPDVYfbS7wc91tXh6mdqw4Z/q/BxBC8AtYLAWz/46plwnvpw4KvD7De/Hzk5\n3+rIkbG6cuVNx/30WLtX3Z8p2/WFvryazWaTD5QJAH7N2Xwmu32a3ngjwSfClyc4f0+m6o03fKvH\nNz19m9LSNt4UIOJ9qn5v4yq3ELwAAJWSkPCKMjPLD6EkJFR8fdP6gNCCslzlFoYaAQCV4qvzmTyN\nYXZURUBdFwAA8A2+Op8J8CYELwBApUyc2F92e+mVuUsmYcfXUUWA72GOF+BBvnoGGFAR5jMB7jG5\nHqgDnAEGAPWTq9zCUCPgIRVfx6t2r7MJAPAdBC/AQzgDDABQFsEL8BDOAAMAlEXwAjyEM8AAAGUx\nuR7wIM4AA4D6h7MaAQAADOGSQQD8BmujAfBlBC8APsPZ2mjZ2SXz6AhfAHwBk+sB+AzWRgPg6whe\nAHwGa6MB8HUELwA+g7XRAPg6ghcAn8HaaAB8HctJ1AOcBVYzvH/ehbXRAHg7lpOoxzgLrGZ4/7zP\nwIF9ee8B+CyGGv0cZ4HVDO8fAKA2Ebz8HGeB1QzvHwCgNhG8/BxngdUM7x8AoDYRvPwcZ4HVDO8f\nAKA2cVZjPcBZYDXD+wcAqApXuYXgBQAAUItc5RaGGgEAAAwheAEAABhC8AIAADCE4AUAAGAIwQsA\nAMAQghcAAIAhBC8AAABDCF4AAACGELwAAAAMIXgBAAAYQvACAAAwhOAFAABgCMELAADAEIIXAACA\nIQQvAAAAQwheAAAAhng0eGVkZKhTp06KjIzU3Llzy91/9uxZDRgwQN27d1fXrl21bNkyT5YDAABQ\np2yWZVmeOHBRUZE6duyoTZs2KTw8XL169dKqVasUFRXl2Cc1NVUFBQWaPXu2zp49q44dO+rMmTMK\nDAwsXaTNJg+VCR+Unr5N8+dnqqAgUMHBhZo4sb8GDuxb12UBACDJdW4JdLq1FuzevVsdOnRQ27Zt\nJUmDBw/W2rVrSwWvVq1aaf/+/ZKk8+fPq0WLFuVCF3Cz9PRtmjRpg7KzZzm2ZWdPkyTCFwDA63ls\nqDE3N1dt2rRx3I6IiFBubm6pfcaMGaMvv/xSrVu3VkxMjN544w1PlQM/MX9+ZqnQJUnZ2bOUlrax\njioCAKDyPNa9ZLPZ3O7zq1/9St27d1dWVpays7MVHx+vzz//XE2bNi23b2pqquP7uLg4xcXF1WK1\n8BUFBc5/ZPPzGxiuBACAEllZWcrKyqrUvh4LXuHh4Tpx4oTj9okTJxQREVFqn08++UTTppUME9nt\ndrVr105ff/21evbsWe54Nwcv1F/BwYVOt4eEFBmuBACAEmU7hGbMmFHhvh4bauzZs6cOHTqkY8eO\n6erVq1qzZo2SkpJK7dOpUydt2rRJknTmzBl9/fXXat++vadKgh+YOLG/7PZppbbZ7VM1YUJ8HVUE\nAEDleazHKzAwUAsWLFBCQoKKioo0atQoRUVFaeHChZKklJQUTZ06VSNGjFBMTIyKi4v161//Wrfd\ndpunSoIfuDGBPi1tuvLzGygkpEgTJgxgYj0AwCd4bDmJ2sRyEgAAwFe4yi2sXA8AAGAIwQsAAMAQ\nghcAAIAhBC8AAABDuD4P/BbXdAQAeBuCF/wS13QEAHgjhhrhl7imIwDAGxG84Je4piMAwBsRvOCX\nuKYjAMAbEbzgl7imIwDAG3HJIPit9PRtSkvbeNM1HeOZWA8A8DhXuYXgBQAAUIu4ViMAAIAXIHgB\nAAAYQvACAAAwhOAFAABgCMELAADAEIIXAACAIQQvAAAAQwheAAAAhhC8AAAADCF4AQAAGELwAgAA\nMKRSwevYsWPatGmTJOny5cs6f/68R4sCAADwR26D11tvvaXHH39cKSkpkqScnBz99Kc/9XhhAAAA\n/sZt8Pr973+v7du3KzQ0VJJ0zz336JtvvvF4YQAAAP7GbfAKDg5WcHCw43ZhYaFsNptHiwIAAPBH\nboNXv379NGvWLF2+fFkbN27U448/rsTERBO1AQAA+BWbZVmWqx2Ki4v1hz/8QZmZmZKkhIQEjR49\n2mivl81mk5syAQAAvIKr3OI2eL3xxhuaNGmS222eRPACAAC+wlVucTvUuGzZsnLbli5dWuOiAAAA\n6pvAiu5YtWqVVq5cqaNHj5aa03XhwgW1aNHCSHEAAAD+pMLg1adPH7Vq1UrffvutXnzxRUeXWdOm\nTRUTE2OsQAAAAH/hdo6XN2COFwAA8BU1muO1Y8cO9erVS02aNFFQUJACAgIci6kCAACg8twGr/Hj\nx2vlypWKjIxUfn6+Fi9erOeee85EbQAAAH6lUhfJjoyMVFFRkRo0aKARI0YoIyPD03UBAAD4nQon\n19/QuHFjFRQUKCYmRr/4xS8UFhbGfCsAAIBqcNvjtXz5chUXF2vBggW65ZZblJOToz/+8Y8magMA\nAPArLs9qLCws1LBhw7RixQqTNZXDWY0AAMBXVPusxsDAQP3tb39TQUGBRwoDAACoT9zO8WrXrp3+\n4R/+QUlJSbrlllsklSS5yZMne7w4AAAAf+I2eNntdtntdhUXF+vixYsmagIAAPBLrFwPAABQi2q0\ncj0AAABqB8ELAADAEIIXAACAIW4n13/zzTdatGiRjh07psLCQkklY5dLlizxeHEAAAD+xG3weuyx\nx9S3b1/Fx8crIKCkg8xms3m8MAAAAH/j9qzG7t27a9++fabqcYqzGgEAgK+o0VmNjz76qNLT02u9\nKAAAgPrGbY9XkyZNdPnyZTVs2FBBQUElD7LZdP78eSMF3ng+erwAAIAvcJVbWEAVAACgFrnKLW4n\n10vS2rVrtW3bNtlsNvXr10+JiYm1WiAAAEB94LbH65e//KU+/fRTPfXUU7IsS6tXr1bPnj01e/Zs\nUzXS4wUAAHxGjYYao6OjtW/fPjVo0ECSVFRUpO7du+vAgQO1X2kFCF4AAMBX1OisRpvNpry8PMft\nvLw81vECAACoBrdzvF5++WX16NFDcXFxkqStW7dqzpw5nq4LAADA71TqrMaTJ0/q008/lc1mU+/e\nvRUWFmaiNgeGGgEAgK+o1hyvgwcPKioqSp999lmpA9wYZuzRo4eHynVSJMELAAD4iGoFrzFjxmjR\nokWKi4tzOqdry5YttVulCwQvAADgK1hAFQAAwJAandX43nvvOS4PNHPmTCUnJ2vPnj21WyEAAEA9\n4DZ4vfbaawoNDdX27du1efNmjRw5UmPHjjVRGwAAgF9xG7xuLJy6fv16jRkzRo8++qiuXbvm8cIA\nAAD8jdvgFR4ermeffVZr1qzRwIEDlZ+fr+LiYhO1AQAA+BW3k+svXbqkjIwMdevWTZGRkTp16pQO\nHDig/v37m6qRyfUAAMBn1OisxuzsbIWHhyskJERbtmzR/v37NWzYMDVr1swjxTpD8AIAAL6iRmc1\nJicnKzAwUIcPH1ZKSopycnI0dOjQWi8SAADA37kNXgEBAQoMDNSf/vQnTZgwQfPmzdOpU6dM1AYA\nAOBX3Aavhg0bauXKlXrnnXf06KOPShJnNQIAAFSD2+C1ZMkS7dy5U9OmTVO7du109OhRPf300yZq\nAwAA8CuVumTQ5cuXdfz4cXXq1MlETeUwuR4AAPiKGk2uX7dunWJjYzVgwABJ0t69e5WUlFS7FQIA\nANQDboNXamqqdu3apebNm0uSYmNjdeTIEY8XBgAA4G/cBq+goKBya3YFBLh9GAAAAMpwm6C6dOmi\nFStWqLCwUIcOHdKECRPUp08fE7UBAAD4FbfBa8GCBfryyy8VHBysIUOGKDQ0VK+//rqJ2gAAAPyK\ny7MaCwsLFR8fry1btlTr4BkZGXr++edVVFSk0aNHa8qUKeX2ycrK0gsvvKBr167p9ttvV1ZWVvki\nOasRAAD4CFe5JdDVAwMDAxUQEKC8vLwqX5uxqKhI48eP16ZNmxQeHq5evXopKSlJUVFRjn3y8vL0\n85//XBs2bFBERITOnj1bpecAAADwJS6DlyQ1btxY0dHRio+PV+PGjSWVJLn58+e7fNzu3bvVoUMH\ntW3bVpI0ePBgrV27tlTwWrlypX72s58pIiJCknT77bdX93UAAAB4PbfBKzk5WcnJybLZbJIky7Ic\n37uSm5urNm3aOG5HRERo165dpfY5dOiQrl27pn/8x3/UhQsXNGnSJFbFBwAAfstt8Bo+fLgKCgr0\nf//3f7LZbOrUqZMaNmzo9sCVCWfXrl3Tnj17tHnzZl2+fFn333+/7rvvPkVGRpbbNzU11fF9XFyc\n4uLi3B4fAADA07KyspzOUXfGbfBKT0/X2LFj1b59e0nSkSNHtHDhQj3yyCMuHxceHq4TJ044bp84\nccIxpHhDmzZtdPvtt6tRo0Zq1KiR+vbtq88//9xt8AIAAPAWZTuEZsyYUeG+bpeTmDx5srZs2aKt\nW7dq69atjrMQ3enZs6cOHTqkY8eO6erVq1qzZk25Sw099thj2r59u4qKinT58mXt2rVLnTt3dnts\nAAAAX+S2xys0NFQdOnRw3G7fvr1CQ0PdHzgwUAsWLFBCQoKKioo0atQoRUVFaeHChZKklJQUderU\nSQMGDFC3bt0UEBCgMWPGELwAAIDfcrmOlySNHTtWx48f1xNPPCFJeu+993TXXXcpPj5eUsnke48X\nyTpeAADAR7jKLW6D1/Dhwx0Hkcqf1bh06dJaKrNiBC8AAOArahS8vAHBCwAA+Ipqr1wvlZzFmJaW\npmPHjqmwsNBxwHXr1tVulQAAAH7ObfD6yU9+otGjRysxMVEBASUnQVZmjS4AAACU5naosXfv3tq9\ne7epepxiqBEAAPiKGs3xWr58ubKzs5WQkKDg4GDH9h49etRulS4QvAAAgK+o0RyvL7/8UsuXL9eW\nLVscQ42StGXLltqrEAAAoB5w2+Nlt9t18ODBSl2f0VPo8QIAAL7CVW5xe8mg6OhonTt3rtaLAgAA\nqG/cDjWeO3dOnTp1Uq9evRxzvFhOAgAAoOrcBi9XV9gGAABA5bFyPQAAQC2q1lmNTZo0qXChVJvN\npvPnz9dOdQAAAPUEPV4AAAC1qEZnNQIAAKB2ELwAAAAMIXgBAAAYQvACAAAwhOAFAABgCMELAADA\nEIIXAACAIQQvAAAAQwheAAAAhhC8AAAADCF4AQAAGELwAgAAMITgBQAAYAjBCwAAwBCCFwAAgCEE\nLwAAAEMIXgAAAIYQvAAAAAwheAEAABhC8AIAADCE4AUAAGAIwQsAAMAQghcAAIAhBC8AAABDCF4A\nAACGELwAAAAMIXgBAAAYQvACAAAwhOAFAABgCMELAADAEIIXAACAIQQvAAAAQwheAAAAhhC8AAAA\nDCF4AQAAGELwAgAAMITgBQAAYAjBCwAAwBCCFwAAgCEELwAAAEMIXgAAAIYQvAAAAAwheAEAABhC\n8AIAADCE4AUAAGAIwQsAAMAQghcAAIAhBC8AAABDCF4AAACGELwAAAAMIXgBAAAYQvACAAAwhOAF\nAABgCMELAADAEIIXAACAIQQvAAAAQwheAAAAhhC8AAAADCF4AQAAGELwAgAAMITgBQAAYAjBCwAA\nwBCCFwAAgCEELwAAAEM8GrwyMjLUqVMnRUZGau7cuRXu9+mnnyowMFB/+tOfPFkOAABAnfJY8Coq\nKtL48eOVkZGhr776SqtWrdLBgwed7jdlyhQNGDBAlmV5qhwAAIA657HgtXv3bnXo0EFt27ZVUFCQ\nBg8erLVr15bbLy0tTYMGDdIdd9zhqVIAAAC8gseCV25urtq0aeO4HRERodzc3HL7rF27VuPGjZMk\n2Ww2T5UDAABQ5wI9deDKhKjnn39ec+bMkc1mk2VZLocaU1NTHd/HxcUpLi6uFqoEAAComaysLGVl\nZVVqX5vloYlVO3fuVGpqqjIyMiRJs2fPVkBAgKZMmeLYp3379o6wdfbsWd1yyy1atGiRkpKSShd5\nPZgBAAB4O1e5xWPBq7CwUB07dtTmzZvVunVr9e7dW6tWrVJUVJTT/UeMGKHExEQlJyeXL5LgBQAA\nfISr3OKxocbAwEAtWLBACQkJKioq0qhRoxQVFaWFCxdKklJSUjz11AAAAF7JYz1etYkeLwAA4Ctc\n5RZWrgcAADCE4AUAAGAIwQsAAMAQghcAAIAhBC8AAABDCF4AAACGELwAAAAMIXgBAAAYQvACAAAw\nhOAFAABgCMELAADAEIIXAACAIQQvAAAAQwheAAAAhhC8AAAADCF4AQAAGELwAgAAMITgBQAAYAjB\nCwAAwBCCFwAAgCEELwAAAEMIXgAAAIYQvAAAAAwheAEAABhC8AIAADCE4AUAAGAIwQsAAMAQghcA\nAIAhBC8AAABDCF4AAACGELwAAAAMIXgBAAAYQvACAAAwhOAFAABgCMELAADAEIIXAACAIQQvAAAA\nQwLrugAAAABvlZ6+TfPnZ6qgIFDBwYWaOLG/Bg7sW+3jEbwAAACcSE/fpkmTNig7e5ZjW3b2NEmq\ndvhiqBGS+cj9AAAO/klEQVQAAMCJ+fMzS4UuScrOnqW0tI3VPibBCwAAwImCAucDg/n5Dap9TIIX\nAACAE8HBhU63h4QUVfuYBC8AAAAnJk7sL7t9WqltdvtUTZgQX+1j2izLsmpamKfZbDb5QJkAAMDP\npKdvU1raRuXnN1BISJEmTIh3O7HeVW4heAEAANQiV7mFoUYAAABDCF4AAACGELwAAAAMIXgBAAAY\nQvACAAAwhOAFAABgCMELAADAEIIXAACAIQQvAAAAQwheAAAAhhC8AAAADCF4AQAAGELwAgAAMITg\nBQAAYAjBCwAAwBCCFwAAgCEELwAAAEMIXgAAAIYQvAAAAAwheAEAABhC8AIAADCE4AUAAGAIwQsA\nAMAQghcAAIAhBC8AAABDCF4AAACGELwAAAAMIXgBAAAYQvACAAAwhOAFAABgCMELAADAEIIXAACA\nIQQvAAAAQzwevDIyMtSpUydFRkZq7ty55e5fsWKFYmJi1K1bNz3wwAPav3+/p0vyOllZWXVdAqqJ\ntvNttJ9vo/18V31uO48Gr6KiIo0fP14ZGRn66quvtGrVKh08eLDUPu3bt9e2bdu0f/9+TZ8+Xc8+\n+6wnS/JK9fkH0NfRdr6N9vNttJ/vqs9t59HgtXv3bnXo0EFt27ZVUFCQBg8erLVr15ba5/7779et\nt94qSbr33nuVk5PjyZIAAADqjEeDV25urtq0aeO4HRERodzc3Ar3X7x4sR555BFPlgQAAFB3LA/6\n7//+b2v06NGO28uXL7fGjx/vdN8PP/zQioqKsv7+97+Xuy8mJsaSxBdffPHFF1988eX1XzExMRVm\no0B5UHh4uE6cOOG4feLECUVERJTbb//+/RozZowyMjLUvHnzcvfv27fPk2UCAAAY4dGhxp49e+rQ\noUM6duyYrl69qjVr1igpKanUPsePH1dycrLeffdddejQwZPlAAAA1CmP9ngFBgZqwYIFSkhIUFFR\nkUaNGqWoqCgtXLhQkpSSkqLXXntN586d07hx4yRJQUFB2r17tyfLAgAAqBM2y7Ksui4CAACgPmDl\nekOKiooUGxurxMRESdLf//53xcfH65577lH//v2Vl5fn2Hf27NmKjIxUp06dlJmZWVcl47q8vDwN\nGjRIUVFR6ty5s3bt2kX7+YjZs2erS5cuio6O1tChQ1VQUEDbebGRI0eqZcuWio6OdmyrTnt99tln\nio6OVmRkpCZNmmT0NdRXztrupZdeUlRUlGJiYpScnKzvv//ecV+9bruanrmIyvntb39rDR061EpM\nTLQsy7Jeeukla+7cuZZlWdacOXOsKVOmWJZlWV9++aUVExNjXb161Tp69Khlt9utoqKiOqsblvXM\nM89YixcvtizLsq5du2bl5eXRfj7g6NGjVrt27az8/HzLsizriSeesJYtW0bbebFt27ZZe/bssbp2\n7erYVpX2Ki4utizLsnr16mXt2rXLsizL+vGPf2z97//+r+FXUv84a7vMzEzH79CUKVNou+vo8TIg\nJydHH3zwgUaPHi3r+sjuunXrNGzYMEnSsGHD9P7770uS1q5dqyFDhigoKEht27ZVhw4dmPNWh77/\n/nt99NFHGjlypKSSeYu33nor7ecDQkNDFRQUpMuXL6uwsFCXL19W69ataTsv9uCDD5Y7s70q7bVr\n1y6dOnVKFy5cUO/evSVJzzzzjOMx8BxnbRcfH6+AgJKYcfMC6fW97QheBrzwwguaN2+e4wdQks6c\nOaOWLVtKklq2bKkzZ85Ikk6ePFlqyQ13i87Cs44ePao77rhDI0aMUI8ePTRmzBhdunSJ9vMBt912\nm/7lX/5Fd911l1q3bq1mzZopPj6etvMxVW2vstvDw8NpRy+wZMkSxwLp9b3tCF4etn79et15552K\njY119HaVZbPZZLPZKjyGq/vgWYWFhdqzZ4+ee+457dmzR40bN9acOXNK7UP7eafs7Gy9/vrrOnbs\nmE6ePKmLFy/q3XffLbUPbedb3LUXvNOsWbPUsGFDDR06tK5L8QoELw/75JNPtG7dOrVr105DhgzR\nhx9+qKefflotW7bU6dOnJUmnTp3SnXfeKan8orM5OTkKDw+vk9pR8kksIiJCvXr1kiQNGjRIe/bs\nUVhYGO3n5f7yl7+oT58+atGihQIDA5WcnKwdO3bQdj6mKv9XRkREKDw8vNQ1f2nHurVs2TJ98MEH\nWrFihWNbfW87gpeH/epXv9KJEyd09OhRrV69Wg899JCWL1+upKQkvf3225Kkt99+Wz/5yU8kSUlJ\nSVq9erWuXr2qo0eP6tChQ47xbpgXFhamNm3a6K9//askadOmTerSpYsSExNpPy/XqVMn7dy5U1eu\nXJFlWdq0aZM6d+5M2/mYqv5fGRYWptDQUO3atUuWZWn58uWOx8CsjIwMzZs3T2vXrlVISIhje71v\nuzqd2l/PZGVlOc5q/O6776yHH37YioyMtOLj461z58459ps1a5Zlt9utjh07WhkZGXVVLq7bt2+f\n1bNnT6tbt27WT3/6UysvL4/28xFz5861OnfubHXt2tV65plnrKtXr9J2Xmzw4MFWq1atrKCgICsi\nIsJasmRJtdrrL3/5i9W1a1fLbrdbEyZMqIuXUu+UbbvFixdbHTp0sO666y6re/fuVvfu3a1x48Y5\n9q/PbccCqgAAAIYw1AgAAGAIwQsAAMAQghcAAIAhBC8AAABDCF4AAACGELwAAAAMIXgBqJfWr1+v\nHj16qHv37urSpYveeustSdL777+vgwcPVvl4W7du1Y4dO1w+X2pqanXLdZg8ebI++uijGh8HQN0g\neAGoNZZlVXhNUm9y7do1paSkaP369dq3b5/27dunuLg4SSXB66uvvqrS8QoLC7VlyxZ98sknFe7z\n29/+VuPGjatJ2ZKkcePGad68eTU+DoC6QfACUCPHjh1Tx44dNWzYMEVHR+vEiROaN2+eevfurZiY\nGEcvz6VLlzRw4EB1795d0dHReu+99yRJbdu21ZQpU9StWzfde++9ys7Odhz3oYceUkxMjP7pn/7J\ncW234cOHa9KkSXrggQdkt9v1xz/+UVLJdfz69u2r2NhYRUdHa/v27ZKkzMxM9enTRz/60Y/0xBNP\n6NKlS7pw4YIKCwt12223SZKCgoJ0zz336JNPPtGf//xnvfTSS+rRo4eOHDmiRYsWqXfv3urevbsG\nDRqkK1euOOoYO3as7rvvPj355JNauHCh/v3f/12xsbGO577hxIkTunr1qlq2bOl47HPPPaf7779f\ndrtdWVlZGjZsmDp37qwRI0ZIkoqKijR8+HBFR0erW7duev311yVJkZGROnbsmPLy8jzSngA8K7Cu\nCwDg+w4fPqzly5erd+/eyszM1OHDh7V7924VFxfrscce00cffaRvv/1W4eHhSk9PlySdP39ekmSz\n2dSsWTPt379fy5cv1/PPP68///nPmjBhgkaMGKGnn35aS5cu1cSJE/U///M/kqTTp0/r448/1sGD\nB5WUlKSf/exnWrlypQYMGKCpU6equLhYly9f1tmzZzVr1ixt3rxZjRo10ty5c/W73/1O06dPV1JS\nku6++249/PDDevTRRzVkyBD16dNHSUlJSkxMVHJysiSpWbNmGjNmjCRp+vTpWrx4scaPHy9JOnny\npHbs2CGbzaYZM2aoadOmmjx5crn35+OPP1aPHj0ct202m/Ly8rRjxw6tW7dOSUlJ2rFjhzp37qxe\nvXrp888/V2FhoU6ePKkDBw5Ikr7//nvH42NjY7Vjxw79+Mc/ru2mBOBh9HgBqLG7777bcUHpzMxM\nZWZmKjY2Vj/60Y/09ddf6/Dhw4qOjtbGjRv1y1/+Utu3b1doaKjj8UOGDJEkDR482DFPaufOnRo6\ndKgk6Z//+Z8dvUg2m81x4dyoqCidOXNGktS7d28tXbpUM2bM0IEDB9SkSRPt3LlTX331lfr06aPY\n2Fi98847On78uCRp0aJF2rx5s3r37q3f/OY3GjlypKOem4dLDxw4oAcffFDdunXTihUrHMOQNptN\njz/+uGw2m9PH3ez48eNq1apVqW2JiYmSpK5duyosLExdunSRzWZTly5d9Le//U12u11HjhzRxIkT\ntWHDhlLvV+vWrXXs2DH3DQPA69DjBaDGGjduXOr2yy+/rGeffbbcfnv37lV6erpeeeUVPfzww5o+\nfXq5fSoTZBo2bFhunwcffFAfffSR1q9fr+HDh2vy5Mlq3ry54uPjtXLlSqfH6dq1q7p27aqnn35a\n7dq109KlS8vVMHz4cK1bt07R0dF6++23lZWV5bjvlltucXpcZ8q+lhuvISAgQMHBwY7tAQEBunbt\nmpo1a6bPP/9cGzZs0Jtvvqn/+q//0uLFix3HurlGAL6DHi8AtSohIUFLlizRpUuXJEm5ubn69ttv\nderUKYWEhOipp57Siy++qL179zoes2bNGse/ffr0kST16dNHq1evliStWLFCffv2dfm8x48f1x13\n3KHRo0dr9OjR2rt3r+677z59/PHHjnljly5d0qFDh3Tp0qVSAWrv3r1q27atJKlp06aOYVBJunjx\nosLCwnTt2jW9++67FQaepk2b6sKFC07vu/vuu3X69GmX9Zf13XffqaioSMnJyZo5c6b27NnjuO/U\nqVOOegH4Fnq8ANTYzWEkPj5eBw8e1P333y+pJJAsX75chw8f1ksvvaSAgAAFBQXpzTffdDzm3Llz\niomJUUhIiFatWiVJSktL04gRIzRv3jzdeeedjt6oss934/stW7boN7/5jYKCgtS0aVO98847uv32\n27Vs2TINGTJEBQUFkqRZs2apVatWmjdvnsaOHatGjRqpSZMmWrZsmaSS4c4xY8YoLS1N7733nmbO\nnKl7771Xd9xxh+69915dvHjRaR2JiYkaNGiQ1q5dqwULFuiBBx5w3PfAAw9o/vz5Fb5nZcOczWZT\nbm6uRowYoeLiYknSnDlzHPfv3bu33PEA+Aab5QvnfgPwW+3atdNnn33mOMPQXz300ENasWJFuble\nVfXXv/5VL774otatW1dLlQEwiaFGAHWqvsxVevHFF0v18lXXm2++qV/84he1UBGAukCPFwAAgCH0\neAEAABhC8AIAADCE4AUAAGAIwQsAAMAQghcAAIAh/w/bpQTr7BKnNQAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x7fdb18950950>"
]
}
],
"prompt_number": 36
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" SUM(view_count) AS n,\n",
" country_code,\n",
" subdivision\n",
"FROM\n",
" wmf.pageview_hourly\n",
"WHERE year = 2016\n",
" AND month = 12\n",
" AND day = 18\n",
" AND agent_type = 'user'\n",
" AND project = 'en.wikipedia'\n",
" AND access_method = 'mobile web'\n",
" AND country_code in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
" AND NOT (page_title LIKE \"%Special:%\")\n",
"GROUP BY\n",
" country_code,\n",
" subdivision\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-18_mobile_pageviews_for_cn_by_country_and_subdivision.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" count(*) AS n,\n",
" geocoded_data['country_code'] as country_code,\n",
" geocoded_data['subdivision'] as subdivision\n",
"FROM\n",
" andyrussg.beaconimpression20161218\n",
"WHERE\n",
" geocoded_data['country_code'] in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
" AND access_method = 'mobile web'\n",
" AND uselang = 'en'\n",
"GROUP BY\n",
" geocoded_data['country_code'],\n",
" geocoded_data['subdivision']\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-18_mobile_impressions_by_country_and_subdivision.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"from __future__ import division\n",
"pv = pandas.read_csv('T152650_2016-12-18_mobile_pageviews_for_cn_by_country_and_subdivision.csv', index_col=0)\n",
"imp = pandas.read_csv('T152650_2016-12-18_mobile_impressions_by_country_and_subdivision.csv', index_col=0)\n",
"ratios = pandas.merge(pv, imp, how='left', on=['country_code','subdivision'])\n",
"ratios['ratio'] = ratios.apply(lambda row: row.n_y/row.n_x, axis=1)\n",
"ratios.sort(columns='ratio', inplace=True)\n",
"ratios.to_csv('T152650_2016-12-18_mobile_pv-impressions_by_country_and_subdivision.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"ratios = pandas.read_csv('T152650_2016-12-18_mobile_pv-impressions_by_country_and_subdivision.csv', index_col=0)\n",
"ratios.rename(columns = {'n_x':'pageviews', 'n_y':'impressions'}, inplace = True )\n",
"ratios[ratios.pageviews >= 10000].head(10)\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>pageviews</th>\n",
" <th>country_code</th>\n",
" <th>subdivision</th>\n",
" <th>impressions</th>\n",
" <th>ratio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>68</th>\n",
" <td> 848178</td>\n",
" <td> IE</td>\n",
" <td> Unknown</td>\n",
" <td> 327272</td>\n",
" <td> 0.385853</td>\n",
" </tr>\n",
" <tr>\n",
" <th>62</th>\n",
" <td> 11021080</td>\n",
" <td> US</td>\n",
" <td> California</td>\n",
" <td> 6807169</td>\n",
" <td> 0.617650</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52</th>\n",
" <td> 27219</td>\n",
" <td> CA</td>\n",
" <td> Unknown</td>\n",
" <td> 21770</td>\n",
" <td> 0.799809</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td> 63530</td>\n",
" <td> US</td>\n",
" <td> Wyoming</td>\n",
" <td> 52610</td>\n",
" <td> 0.828113</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td> 192477</td>\n",
" <td> US</td>\n",
" <td> West Virginia</td>\n",
" <td> 160738</td>\n",
" <td> 0.835102</td>\n",
" </tr>\n",
" <tr>\n",
" <th>66</th>\n",
" <td> 455872</td>\n",
" <td> US</td>\n",
" <td> Utah</td>\n",
" <td> 409134</td>\n",
" <td> 0.897476</td>\n",
" </tr>\n",
" <tr>\n",
" <th>67</th>\n",
" <td> 1895920</td>\n",
" <td> GB</td>\n",
" <td> Unknown</td>\n",
" <td> 1703326</td>\n",
" <td> 0.898417</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td> 930421</td>\n",
" <td> US</td>\n",
" <td> Missouri</td>\n",
" <td> 846675</td>\n",
" <td> 0.909991</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78</th>\n",
" <td> 24184</td>\n",
" <td> AU</td>\n",
" <td> Unknown</td>\n",
" <td> 22076</td>\n",
" <td> 0.912835</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80</th>\n",
" <td> 1637987</td>\n",
" <td> US</td>\n",
" <td> Virginia</td>\n",
" <td> 1499993</td>\n",
" <td> 0.915754</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>10 rows \u00d7 5 columns</p>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 20,
"text": [
" pageviews country_code subdivision impressions ratio\n",
"68 848178 IE Unknown 327272 0.385853\n",
"62 11021080 US California 6807169 0.617650\n",
"52 27219 CA Unknown 21770 0.799809\n",
"36 63530 US Wyoming 52610 0.828113\n",
"16 192477 US West Virginia 160738 0.835102\n",
"66 455872 US Utah 409134 0.897476\n",
"67 1895920 GB Unknown 1703326 0.898417\n",
"41 930421 US Missouri 846675 0.909991\n",
"78 24184 AU Unknown 22076 0.912835\n",
"80 1637987 US Virginia 1499993 0.915754\n",
"\n",
"[10 rows x 5 columns]"
]
}
],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" count(DISTINCT client_ip) AS distinct_ips,\n",
" geocoded_data['country_code'] as country_code,\n",
" geocoded_data['subdivision'] as subdivision\n",
"FROM\n",
" wmf.webrequest\n",
"WHERE\n",
" geocoded_data['country_code'] in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
" AND access_method = 'mobile web'\n",
" AND is_pageview = TRUE\n",
" AND agent_type = 'user'\n",
" AND pageview_info['project'] = 'en.wikipedia'\n",
" AND NOT (pageview_info['page_title'] LIKE \"%Special:%\")\n",
" AND year = 2016\n",
" AND month = 12\n",
" AND day = 18\n",
"GROUP BY\n",
" geocoded_data['country_code'],\n",
" geocoded_data['subdivision']\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-18_distinct_ips_for_mobile_pageviews_by_country_and_subdivision.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"from __future__ import division\n",
"% matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"\n",
"distinct_ips = pandas.read_csv('T152650_2016-12-18_distinct_ips_for_mobile_pageviews_by_country_and_subdivision.csv', index_col=0)\n",
"ratios = pandas.read_csv('T152650_2016-12-18_mobile_pv-impressions_by_country_and_subdivision.csv', index_col=0)\n",
"ratios.rename(columns = {'n_x':'pageviews', 'n_y':'impressions', 'ratio':'imp_ratio'}, inplace = True)\n",
"imps_and_ips = pandas.merge(distinct_ips, ratios, on=['country_code','subdivision'])\n",
"imps_and_ips['dist_ip_ratio'] = imps_and_ips.apply(lambda row: row.distinct_ips/row.pageviews, axis=1)\n",
"\n",
"\n",
"# filter out regions with too little pageviews for relevant data\n",
"imps_and_ips = imps_and_ips[imps_and_ips.pageviews>=10000]\n",
"\n",
"plt.figure(figsize=(10,7))\n",
"plt.plot(imps_and_ips.dist_ip_ratio, imps_and_ips.imp_ratio, 'bo')\n",
"plt.xlabel('Distinct IPs/pageviews')\n",
"plt.ylabel('Impression rate')\n",
"plt.show()\n",
"\n",
"imps_and_ips.sort(columns='dist_ip_ratio', inplace=True)\n",
"imps_and_ips.head(40)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nIk/aTuKz52773XTTTbrpppv0xRdf6I477tD333/v48qCQ33bb/fu3ZJC+/PnTtv98Y9/1HPPPSeL\nxSLDMOz5pT6/9wLag+bOYrYXb3PgwAFFRUVJkjp06CCpYijq5ptvVk5Ojh+qNoe6LgTsrX0bCk/b\noH379pJC87Mnud9+27Zt0+TJk7VixQpdeumlddq3ofKk7SQ+e/VdBP2nn35SdHR0SH/2JM8WkZdC\n+/PnTttt2bJF48ePV+fOnfXRRx/p/vvv14oVK+r3e8+7l9DVzdmzZ42YmBhj//79RmlpqctJAl9/\n/bX9YtmTJ08axcXFhmFUXND4u9/9zli1apV/30AAudN2lebMmVPtIve67NtQedJ+of7ZMwz32u+H\nH34wYmNjja+//rrO+zZknrQdnz332m/v3r3GuXPnDMMwjC1bthgxMTFu79vQedJ+of75q+vn5+67\n7zY++uijeu1rGD681ZM73FnMduTIkfr000/VpUsXtWjRQm+++aYk6dChQxo7dqwkqaysTLfffruG\nDRsWsPfib+603aFDh9SvXz8VFxerUaNGmjdvnnbu3KmWLVs63DeUeNJ+R44cCenPnuRe+/35z3/W\niRMn7NdiNG7cWDk5OU73DRWetF2o/96TPFsEPdQ/e5Jn7Rfqnz932q6u+9aGhWoBAABMJuAL1QIA\nAKA6AhoAAIDJENAAAABMhoAGAABgMgQ0AAAAkyGgAQAAmAwBDUCtwsLCZLVa1aNHD/Xu3Vsvvvii\n/fYlW7Zs0cyZM53u+8MPP2jJkiX2x662r83y5cu1a9cuh6+lpqbqhRdekCTdfffdiomJkdVqVd++\nfbVx48Zaj/vjjz/KZrPVqyZvWblypebOnRvQGgCYS0AXqgVgfs2bN1dubq4k6ejRo/rDH/6g4uJi\npaamqm/fvurbt6/Tfffv36/FixdrwoQJkuRy+9r84x//0OjRox0u7mixWOz3urNYLHr++ec1duxY\nrVmzRlOmTNHWrVudHjczM1PDhw+vV03eMnr0aI0ePTqgNQAwF3rQALitbdu2evXVVzV//nxJUlZW\nlj1YbNiwQVar1d5z9euvv+rRRx/VF198IavVqpdeeqna9qmpqbr33nt13XXXKTY2Vunp6fbzvPPO\nO0pMTFTv3r1155136uuvv9bKlSv18MMPy2q1at++fTVqq7rmduX3gwYN0t69eyVJjz76qK666iol\nJibq4Ycftm+7atUqjRgxQllZWRo8eLBuuOEGxcfHa9q0afbj3H///erXr5969Oih1NRU+76ffvqp\nEhISlJSUpJSUFPt7O3nypO69914NGDBAffr00YoVKyRJAwcO1M6dO+37Jycna8uWLXrrrbc0Y8YM\nSRUh+JZbblH//v3Vv39/ffXVV5KkXr16qbi4WIZhqE2bNlq0aJEk6c4779TatWu1Y8cODRgwQFar\nVYmJifb3DSBIeecOVQAaqpYtW9Z4rnXr1saRI0eM9evXGzfccINhGIYxevRo46uvvjIMo+KefWVl\nZUZWVpb9dcMwqm0/Z84c45prrjHOnDljHDt2zGjTpo1RVlZmbN++3ejatatx/PhxwzAM48SJE4Zh\nVL+v3cVSU1Pt90u9++67jWXLlhmGYRgffPCBcfXVVxvHjx83unXrZt++qKjIMAzDKCsrM3r37m2v\nLSIiwti/f79RXl5uDB061H6cn376yb59cnKysW3bNuP06dNGx44djfz8fMMwDGPChAnG6NGjDcMw\njMcee8x499137fV37drVOHnypPH3v//dmDNnjmEYhnHw4EF7TW+++aYxffp0+3G+/PJLwzAq7smZ\nkJBgGIZhTJ061cjIyDC+++47o1+/fsZ9991nGIZhxMXFGSdPnjRmzJhhvPfee4ZhVNz37/Tp0w7b\nCkBwoAcNgFdcc801evDBB5Wenq4TJ04oLCysWq/WxSwWi0aNGqXGjRurTZs2uuKKK3To0CGtW7dO\nt912my677DJJUuvWre371Ha8qttU9rS99tprev3113XJJZcoIiJCEydO1D/+8Q81b95ckrRp0yYN\nGDDAvm///v3VqVMnNWrUSBMmTNCXX34pSVq6dKn69u2rPn36aMeOHdq5c6e+//57xcTE6Morr5Qk\nTZgwwV7f6tWr9dxzz8lqteq6665TaWmpCgoKdNttt2nZsmWSpA8++EC33nprjfrXrl2r6dOny2q1\n6sYbb9Qvv/yikydPatCgQcrOztYXX3yhadOmadu2bTp48KAuvfRSNW/eXAMHDtRf/vIX/fWvf1V+\nfr4iIiJcthUA8yKgAaiTffv2KSwsTG3btq32/COPPKLXX39dp0+f1jXXXKPdu3e7PFaTJk3s34eF\nhamsrEwWi8VpEKu8zqy21yqvQcvNzdWqVavUvXt3hYWFKScnR7fccos++eQT+zVnn332mUaMGOHw\n+IZhyGKxKD8/Xy+88ILWrVunrVu3atSoUSopKalRy8U1f/zxx8rNzVVubq7y8/PVrVs3dejQQW3a\ntNF3332nDz74QOPGjXN43k2bNtn3LSgoUIsWLTR48GB7QEtOTlbbtm21bNkyDRo0SFJFQFy5cqWa\nNWumkSNHav369c4bHoDpEdAAuO3o0aOaOnWq/XqpqvLy8nTVVVfpT3/6k/r166fdu3crMjJSv/zy\ni8NjOQphFotFv//97/Xhhx/qp59+kiSdOHFCktSqVSsVFxc7rc1wcA1apZMnT6qoqEgjRozQiy++\naJ80sG7dOl1//fX27XJycpSfn69z587pgw8+0KBBg1RcXKwWLVooMjJShw8f1meffSaLxaJu3bpp\n3759+uGHHyRV9LJVBi2bzaa0tDT7cSsnWUjSuHHjNHfuXBUXF6tHjx416h02bFi1fb/99ltJUnR0\ntI4dO6a9e/eqc+fOuvbaa/X8889ryJAhkiomZHTu3FkzZszQjTfeqO+++85pWwEwPwIagFqdPn3a\nvszG0KFDNXz4cM2ZM0dS9dmT8+bNU8+ePZWYmKgmTZpoxIgR6tWrl8LCwtS7d2+99NJLNWZbOuoR\n6969u2bNmqUhQ4aod+/e+q//+i9J0vjx4/W3v/1Nffv2dThJoOqxLj7uL7/8otGjRysxMVGDBg3S\n3//+dx09elQRERFq0aKFfZ9+/fpp+vTp6t69u2JiYnTzzTerV69eslqtio+P1+23365rr71WkhQR\nEaFXXnlFw4cPV1JSkiIjIxUZGSlJmj17ts6ePatevXqpR48e9vaSpFtuuUVLly7VbbfdVq3eyprT\n0tL0v//7v0pMTNRVV12lV1991b7d1Vdfra5du0qSrr32Wh08eNBezwcffKAePXrIarVqx44duvPO\nO138ZAGYmcVw56IOAGhg3nvvPRUWFupPf/qTpIoZqS+88IJWrlzp9jFOnjxpD3gPPPCAunbtWu91\n3gCgKtZBAxCSbr/99mqPnfXo1WbhwoV6++23debMGfXp00dTpkzxZokAQhg9aAAAACbDNWgAAAAm\nQ0ADAAAwGQIaAACAyRDQAAAATIaABgAAYDL/H3apTg+SGiZGAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x7f9a5940e990>"
]
},
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>distinct_ips</th>\n",
" <th>country_code</th>\n",
" <th>subdivision</th>\n",
" <th>pageviews</th>\n",
" <th>impressions</th>\n",
" <th>imp_ratio</th>\n",
" <th>dist_ip_ratio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>68 </th>\n",
" <td> 65655</td>\n",
" <td> IE</td>\n",
" <td> Unknown</td>\n",
" <td> 848178</td>\n",
" <td> 327272</td>\n",
" <td> 0.385853</td>\n",
" <td> 0.077407</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5 </th>\n",
" <td> 119140</td>\n",
" <td> US</td>\n",
" <td> Unknown</td>\n",
" <td> 1285578</td>\n",
" <td> 1183996</td>\n",
" <td> 0.920983</td>\n",
" <td> 0.092674</td>\n",
" </tr>\n",
" <tr>\n",
" <th>67 </th>\n",
" <td> 225527</td>\n",
" <td> GB</td>\n",
" <td> Unknown</td>\n",
" <td> 1895920</td>\n",
" <td> 1703326</td>\n",
" <td> 0.898417</td>\n",
" <td> 0.118954</td>\n",
" </tr>\n",
" <tr>\n",
" <th>62 </th>\n",
" <td> 2115296</td>\n",
" <td> US</td>\n",
" <td> California</td>\n",
" <td> 11021080</td>\n",
" <td> 6807169</td>\n",
" <td> 0.617650</td>\n",
" <td> 0.191932</td>\n",
" </tr>\n",
" <tr>\n",
" <th>73 </th>\n",
" <td> 112734</td>\n",
" <td> IE</td>\n",
" <td> Leinster</td>\n",
" <td> 522659</td>\n",
" <td> 496033</td>\n",
" <td> 0.949057</td>\n",
" <td> 0.215693</td>\n",
" </tr>\n",
" <tr>\n",
" <th>95 </th>\n",
" <td> 183499</td>\n",
" <td> US</td>\n",
" <td> Alabama</td>\n",
" <td> 827200</td>\n",
" <td> 785214</td>\n",
" <td> 0.949243</td>\n",
" <td> 0.221831</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52 </th>\n",
" <td> 21484</td>\n",
" <td> IE</td>\n",
" <td> Munster</td>\n",
" <td> 93401</td>\n",
" <td> 89078</td>\n",
" <td> 0.953716</td>\n",
" <td> 0.230019</td>\n",
" </tr>\n",
" <tr>\n",
" <th>93 </th>\n",
" <td> 39874</td>\n",
" <td> CA</td>\n",
" <td> Saskatchewan</td>\n",
" <td> 172408</td>\n",
" <td> 164275</td>\n",
" <td> 0.952827</td>\n",
" <td> 0.231277</td>\n",
" </tr>\n",
" <tr>\n",
" <th>99 </th>\n",
" <td> 54792</td>\n",
" <td> US</td>\n",
" <td> Delaware</td>\n",
" <td> 231865</td>\n",
" <td> 223748</td>\n",
" <td> 0.964993</td>\n",
" <td> 0.236310</td>\n",
" </tr>\n",
" <tr>\n",
" <th>45 </th>\n",
" <td> 1143571</td>\n",
" <td> US</td>\n",
" <td> New York</td>\n",
" <td> 4653867</td>\n",
" <td> 4414674</td>\n",
" <td> 0.948603</td>\n",
" <td> 0.245725</td>\n",
" </tr>\n",
" <tr>\n",
" <th>89 </th>\n",
" <td> 362160</td>\n",
" <td> US</td>\n",
" <td> Maryland</td>\n",
" <td> 1473376</td>\n",
" <td> 1426787</td>\n",
" <td> 0.968379</td>\n",
" <td> 0.245803</td>\n",
" </tr>\n",
" <tr>\n",
" <th>77 </th>\n",
" <td> 48681</td>\n",
" <td> CA</td>\n",
" <td> Manitoba</td>\n",
" <td> 195098</td>\n",
" <td> 186520</td>\n",
" <td> 0.956032</td>\n",
" <td> 0.249521</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31 </th>\n",
" <td> 3437</td>\n",
" <td> IE</td>\n",
" <td> Ulster</td>\n",
" <td> 13627</td>\n",
" <td> 12775</td>\n",
" <td> 0.937477</td>\n",
" <td> 0.252220</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12 </th>\n",
" <td> 1286620</td>\n",
" <td> US</td>\n",
" <td> Texas</td>\n",
" <td> 4989874</td>\n",
" <td> 4659077</td>\n",
" <td> 0.933706</td>\n",
" <td> 0.257846</td>\n",
" </tr>\n",
" <tr>\n",
" <th>88 </th>\n",
" <td> 272108</td>\n",
" <td> AU</td>\n",
" <td> Victoria</td>\n",
" <td> 1050177</td>\n",
" <td> 980226</td>\n",
" <td> 0.933391</td>\n",
" <td> 0.259107</td>\n",
" </tr>\n",
" <tr>\n",
" <th>51 </th>\n",
" <td> 7092</td>\n",
" <td> CA</td>\n",
" <td> Unknown</td>\n",
" <td> 27219</td>\n",
" <td> 21770</td>\n",
" <td> 0.799809</td>\n",
" <td> 0.260553</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36 </th>\n",
" <td> 16559</td>\n",
" <td> US</td>\n",
" <td> Wyoming</td>\n",
" <td> 63530</td>\n",
" <td> 52610</td>\n",
" <td> 0.828113</td>\n",
" <td> 0.260649</td>\n",
" </tr>\n",
" <tr>\n",
" <th>96 </th>\n",
" <td> 563398</td>\n",
" <td> US</td>\n",
" <td> New Jersey</td>\n",
" <td> 2153138</td>\n",
" <td> 2001100</td>\n",
" <td> 0.929388</td>\n",
" <td> 0.261664</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18 </th>\n",
" <td> 8058</td>\n",
" <td> IE</td>\n",
" <td> Connaught</td>\n",
" <td> 30537</td>\n",
" <td> 29688</td>\n",
" <td> 0.972198</td>\n",
" <td> 0.263877</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1 </th>\n",
" <td> 3213345</td>\n",
" <td> GB</td>\n",
" <td> England</td>\n",
" <td> 12143451</td>\n",
" <td> 11505835</td>\n",
" <td> 0.947493</td>\n",
" <td> 0.264615</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15 </th>\n",
" <td> 25507</td>\n",
" <td> CA</td>\n",
" <td> New Brunswick</td>\n",
" <td> 96016</td>\n",
" <td> 91392</td>\n",
" <td> 0.951841</td>\n",
" <td> 0.265654</td>\n",
" </tr>\n",
" <tr>\n",
" <th>55 </th>\n",
" <td> 177587</td>\n",
" <td> AU</td>\n",
" <td> Queensland</td>\n",
" <td> 667756</td>\n",
" <td> 626550</td>\n",
" <td> 0.938292</td>\n",
" <td> 0.265946</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10 </th>\n",
" <td> 346087</td>\n",
" <td> AU</td>\n",
" <td> New South Wales</td>\n",
" <td> 1283987</td>\n",
" <td> 1204797</td>\n",
" <td> 0.938325</td>\n",
" <td> 0.269541</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65 </th>\n",
" <td> 146947</td>\n",
" <td> US</td>\n",
" <td> Oklahoma</td>\n",
" <td> 544084</td>\n",
" <td> 524712</td>\n",
" <td> 0.964395</td>\n",
" <td> 0.270081</td>\n",
" </tr>\n",
" <tr>\n",
" <th>69 </th>\n",
" <td> 201382</td>\n",
" <td> CA</td>\n",
" <td> Alberta</td>\n",
" <td> 744956</td>\n",
" <td> 708100</td>\n",
" <td> 0.950526</td>\n",
" <td> 0.270327</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16 </th>\n",
" <td> 52195</td>\n",
" <td> US</td>\n",
" <td> West Virginia</td>\n",
" <td> 192477</td>\n",
" <td> 160738</td>\n",
" <td> 0.835102</td>\n",
" <td> 0.271175</td>\n",
" </tr>\n",
" <tr>\n",
" <th>72 </th>\n",
" <td> 68876</td>\n",
" <td> AU</td>\n",
" <td> South Australia</td>\n",
" <td> 252776</td>\n",
" <td> 237422</td>\n",
" <td> 0.939258</td>\n",
" <td> 0.272478</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21 </th>\n",
" <td> 85531</td>\n",
" <td> GB</td>\n",
" <td> Northern Ireland</td>\n",
" <td> 311877</td>\n",
" <td> 298619</td>\n",
" <td> 0.957490</td>\n",
" <td> 0.274246</td>\n",
" </tr>\n",
" <tr>\n",
" <th>46 </th>\n",
" <td> 307987</td>\n",
" <td> US</td>\n",
" <td> Colorado</td>\n",
" <td> 1119822</td>\n",
" <td> 1066224</td>\n",
" <td> 0.952137</td>\n",
" <td> 0.275032</td>\n",
" </tr>\n",
" <tr>\n",
" <th>102</th>\n",
" <td> 103607</td>\n",
" <td> AU</td>\n",
" <td> Western Australia</td>\n",
" <td> 376571</td>\n",
" <td> 350395</td>\n",
" <td> 0.930489</td>\n",
" <td> 0.275133</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9 </th>\n",
" <td> 320299</td>\n",
" <td> GB</td>\n",
" <td> Scotland</td>\n",
" <td> 1162243</td>\n",
" <td> 1111489</td>\n",
" <td> 0.956331</td>\n",
" <td> 0.275587</td>\n",
" </tr>\n",
" <tr>\n",
" <th>76 </th>\n",
" <td> 162255</td>\n",
" <td> CA</td>\n",
" <td> Quebec</td>\n",
" <td> 588474</td>\n",
" <td> 539247</td>\n",
" <td> 0.916348</td>\n",
" <td> 0.275722</td>\n",
" </tr>\n",
" <tr>\n",
" <th>81 </th>\n",
" <td> 452893</td>\n",
" <td> US</td>\n",
" <td> Virginia</td>\n",
" <td> 1637987</td>\n",
" <td> 1499993</td>\n",
" <td> 0.915754</td>\n",
" <td> 0.276494</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48 </th>\n",
" <td> 68732</td>\n",
" <td> US</td>\n",
" <td> Mississippi</td>\n",
" <td> 248575</td>\n",
" <td> 236573</td>\n",
" <td> 0.951717</td>\n",
" <td> 0.276504</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41 </th>\n",
" <td> 257729</td>\n",
" <td> US</td>\n",
" <td> Missouri</td>\n",
" <td> 930421</td>\n",
" <td> 846675</td>\n",
" <td> 0.909991</td>\n",
" <td> 0.277003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>92 </th>\n",
" <td> 820012</td>\n",
" <td> US</td>\n",
" <td> Illinois</td>\n",
" <td> 2947215</td>\n",
" <td> 2844968</td>\n",
" <td> 0.965307</td>\n",
" <td> 0.278233</td>\n",
" </tr>\n",
" <tr>\n",
" <th>53 </th>\n",
" <td> 23086</td>\n",
" <td> US</td>\n",
" <td> Alaska</td>\n",
" <td> 82854</td>\n",
" <td> 77779</td>\n",
" <td> 0.938748</td>\n",
" <td> 0.278635</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24 </th>\n",
" <td> 39629</td>\n",
" <td> CA</td>\n",
" <td> Nova Scotia</td>\n",
" <td> 141247</td>\n",
" <td> 133905</td>\n",
" <td> 0.948020</td>\n",
" <td> 0.280565</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26 </th>\n",
" <td> 706156</td>\n",
" <td> CA</td>\n",
" <td> Ontario</td>\n",
" <td> 2512885</td>\n",
" <td> 2380529</td>\n",
" <td> 0.947329</td>\n",
" <td> 0.281014</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11 </th>\n",
" <td> 18903</td>\n",
" <td> NZ</td>\n",
" <td> Wellington</td>\n",
" <td> 66793</td>\n",
" <td> 63519</td>\n",
" <td> 0.950983</td>\n",
" <td> 0.283009</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>40 rows \u00d7 7 columns</p>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
" distinct_ips country_code subdivision pageviews impressions \\\n",
"68 65655 IE Unknown 848178 327272 \n",
"5 119140 US Unknown 1285578 1183996 \n",
"67 225527 GB Unknown 1895920 1703326 \n",
"62 2115296 US California 11021080 6807169 \n",
"73 112734 IE Leinster 522659 496033 \n",
"95 183499 US Alabama 827200 785214 \n",
"52 21484 IE Munster 93401 89078 \n",
"93 39874 CA Saskatchewan 172408 164275 \n",
"99 54792 US Delaware 231865 223748 \n",
"45 1143571 US New York 4653867 4414674 \n",
"89 362160 US Maryland 1473376 1426787 \n",
"77 48681 CA Manitoba 195098 186520 \n",
"31 3437 IE Ulster 13627 12775 \n",
"12 1286620 US Texas 4989874 4659077 \n",
"88 272108 AU Victoria 1050177 980226 \n",
"51 7092 CA Unknown 27219 21770 \n",
"36 16559 US Wyoming 63530 52610 \n",
"96 563398 US New Jersey 2153138 2001100 \n",
"18 8058 IE Connaught 30537 29688 \n",
"1 3213345 GB England 12143451 11505835 \n",
"15 25507 CA New Brunswick 96016 91392 \n",
"55 177587 AU Queensland 667756 626550 \n",
"10 346087 AU New South Wales 1283987 1204797 \n",
"65 146947 US Oklahoma 544084 524712 \n",
"69 201382 CA Alberta 744956 708100 \n",
"16 52195 US West Virginia 192477 160738 \n",
"72 68876 AU South Australia 252776 237422 \n",
"21 85531 GB Northern Ireland 311877 298619 \n",
"46 307987 US Colorado 1119822 1066224 \n",
"102 103607 AU Western Australia 376571 350395 \n",
"9 320299 GB Scotland 1162243 1111489 \n",
"76 162255 CA Quebec 588474 539247 \n",
"81 452893 US Virginia 1637987 1499993 \n",
"48 68732 US Mississippi 248575 236573 \n",
"41 257729 US Missouri 930421 846675 \n",
"92 820012 US Illinois 2947215 2844968 \n",
"53 23086 US Alaska 82854 77779 \n",
"24 39629 CA Nova Scotia 141247 133905 \n",
"26 706156 CA Ontario 2512885 2380529 \n",
"11 18903 NZ Wellington 66793 63519 \n",
"\n",
" imp_ratio dist_ip_ratio \n",
"68 0.385853 0.077407 \n",
"5 0.920983 0.092674 \n",
"67 0.898417 0.118954 \n",
"62 0.617650 0.191932 \n",
"73 0.949057 0.215693 \n",
"95 0.949243 0.221831 \n",
"52 0.953716 0.230019 \n",
"93 0.952827 0.231277 \n",
"99 0.964993 0.236310 \n",
"45 0.948603 0.245725 \n",
"89 0.968379 0.245803 \n",
"77 0.956032 0.249521 \n",
"31 0.937477 0.252220 \n",
"12 0.933706 0.257846 \n",
"88 0.933391 0.259107 \n",
"51 0.799809 0.260553 \n",
"36 0.828113 0.260649 \n",
"96 0.929388 0.261664 \n",
"18 0.972198 0.263877 \n",
"1 0.947493 0.264615 \n",
"15 0.951841 0.265654 \n",
"55 0.938292 0.265946 \n",
"10 0.938325 0.269541 \n",
"65 0.964395 0.270081 \n",
"69 0.950526 0.270327 \n",
"16 0.835102 0.271175 \n",
"72 0.939258 0.272478 \n",
"21 0.957490 0.274246 \n",
"46 0.952137 0.275032 \n",
"102 0.930489 0.275133 \n",
"9 0.956331 0.275587 \n",
"76 0.916348 0.275722 \n",
"81 0.915754 0.276494 \n",
"48 0.951717 0.276504 \n",
"41 0.909991 0.277003 \n",
"92 0.965307 0.278233 \n",
"53 0.938748 0.278635 \n",
"24 0.948020 0.280565 \n",
"26 0.947329 0.281014 \n",
"11 0.950983 0.283009 \n",
"\n",
"[40 rows x 7 columns]"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" *\n",
"FROM (\n",
" SELECT\n",
" count(*) AS ip_pageviews,\n",
" client_ip,\n",
" geocoded_data['country_code'] as country_code,\n",
" geocoded_data['subdivision'] as subdivision\n",
" FROM\n",
" wmf.webrequest\n",
" WHERE\n",
" geocoded_data['subdivision'] in ('Unknown', 'California', 'Wyoming', 'West Virginia', 'Utah', 'Virginia', 'Missouri')\n",
" AND access_method = 'mobile web'\n",
" AND is_pageview = TRUE\n",
" AND agent_type = 'user'\n",
" AND pageview_info['project'] = 'en.wikipedia'\n",
" AND NOT (pageview_info['page_title'] LIKE \"%Special:%\")\n",
" AND year = 2016\n",
" AND month = 12\n",
" AND day = 18\n",
" GROUP BY\n",
" client_ip,\n",
" geocoded_data['country_code'],\n",
" geocoded_data['subdivision']\n",
") unique_ips\n",
"SORT BY\n",
" ip_pageviews DESC\n",
"LIMIT 10000\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-18_top_ips_in_mobile_pageviews_in_low_imp_regions.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": "*"
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" *\n",
"FROM (\n",
" SELECT\n",
" count(*) AS ip_impressions,\n",
" client_ip,\n",
" geocoded_data['country_code'] as country_code,\n",
" geocoded_data['subdivision'] as subdivision\n",
" FROM\n",
" andyrussg.beaconimpression20161218\n",
" WHERE\n",
" geocoded_data['subdivision'] in ('Unknown', 'California', 'Wyoming', 'West Virginia', 'Utah', 'Virginia', 'Missouri')\n",
" AND access_method = 'mobile web'\n",
" AND uselang = 'en'\n",
" GROUP BY\n",
" client_ip,\n",
" geocoded_data['country_code'],\n",
" geocoded_data['subdivision']\n",
") unique_ips\n",
"SORT BY\n",
" ip_impressions DESC\n",
"LIMIT 100000\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-18_top_ips_in_mobile_impressions_in_low_imp_regions.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"from __future__ import division\n",
"pv = pandas.read_csv('T152650_2016-12-18_top_ips_in_mobile_pageviews_in_low_imp_regions.csv', index_col=0)\n",
"imp = pandas.read_csv('T152650_2016-12-18_top_ips_in_mobile_impressions_in_low_imp_regions.csv', index_col=0)\n",
"ratios = pandas.merge(pv, imp, how='left', on=['client_ip'])\n",
"ratios['ratio'] = ratios.apply(lambda row: 0 if math.isnan(row.ip_impressions) else row.ip_impressions/row.ip_pageviews, axis=1)\n",
"ratios.sort(columns='ip_pageviews', ascending=True, inplace=True)\n",
"ratios.to_csv('T152650_2016-12-18_top_ips_in_mobile_pageviews_in_low_imp_regions.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"sqlContext = HiveContext(sc)\n",
"r = sqlContext.sql( \"\"\"\n",
"SELECT\n",
" *\n",
"FROM (\n",
" SELECT\n",
" count(*) AS ip_pageviews,\n",
" client_ip,\n",
" user_agent,\n",
" geocoded_data['country_code'] as country_code,\n",
" geocoded_data['subdivision'] as subdivision\n",
" FROM\n",
" wmf.webrequest\n",
" WHERE\n",
" geocoded_data['subdivision'] in ('Unknown', 'California', 'Wyoming', 'West Virginia', 'Utah', 'Virginia', 'Missouri')\n",
" AND geocoded_data['country_code'] in ('AU', 'CA', 'IE', 'NZ', 'US', 'GB')\n",
" AND access_method = 'mobile web'\n",
" AND is_pageview = TRUE\n",
" AND agent_type = 'user'\n",
" AND pageview_info['project'] = 'en.wikipedia'\n",
" AND NOT (pageview_info['page_title'] LIKE \"%Special:%\")\n",
" AND year = 2016\n",
" AND month = 12\n",
" AND day = 18\n",
" GROUP BY\n",
" client_ip,\n",
" user_agent,\n",
" geocoded_data['country_code'],\n",
" geocoded_data['subdivision']\n",
") unique_ips\n",
"SORT BY\n",
" ip_pageviews DESC\n",
"LIMIT 10000\n",
"\"\"\"\n",
")\n",
"pr = r.toPandas()\n",
"pr.to_csv('T152650_2016-12-18_top_ips_and_uas_in_mobile_pageviews_in_low_imp_regions.csv')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment