You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dev-wiki/docs/jupyter/Spark上手示例2:DataFrame操作.ipynb

1029 lines
89 KiB
Plaintext

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<script>requirejs.config({paths: { 'plotly': ['https://cdn.plot.ly/plotly-latest.min']},});if(!window.Plotly) {{require(['plotly'],function(plotly) {window.Plotly=plotly;});}}</script>"
],
"text/vnd.plotly.v1+html": [
"<script>requirejs.config({paths: { 'plotly': ['https://cdn.plot.ly/plotly-latest.min']},});if(!window.Plotly) {{require(['plotly'],function(plotly) {window.Plotly=plotly;});}}</script>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 导入相关库\n",
"from pyspark.sql import Row, SparkSession,SQLContext\n",
"from pyspark.sql.types import IntegerType,DateType, TimestampType\n",
"from pyspark.sql.functions import col, udf,to_date,from_unixtime,countDistinct\n",
"\n",
"# 计算处理\n",
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"import time\n",
"\n",
"# 图表相关\n",
"import plotly.plotly as py\n",
"import plotly\n",
"plotly.offline.init_notebook_mode(connected=True)\n",
"import plotly.graph_objs as go\n",
"\n",
"# jupyter使用matplot的配置\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# 创建spark上下文并设置10个分区\n",
"spark = SparkSession.builder.appName(\"vas项目\").config(\"spark.default.parallelism\", 10).getOrCreate()\n",
"sc = spark.sparkContext"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 8 ms, sys: 0 ns, total: 8 ms\n",
"Wall time: 41.3 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"logPaths = ['/var/log/vas-project/vas_data/201807',\n",
" '/var/log/vas-project/vas_data/201808', \n",
" '/var/log/vas-project/vas_data/201809',\n",
" '/var/log/vas-project/vas_data/201810'\n",
" ];\n",
"df = spark.read.format('json').load(logPaths)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"+-----+------------+------+--------------------+---------------+-----+-----------+---+\n",
"|brand|country_code|device| events| ip_address|model| partner|ref|\n",
"+-----+------------+------+--------------------+---------------+-----+-----------+---+\n",
"| Itel| ML| sp|[[click, 15358391...| 217.64.103.74| P13|searchturbo| m|\n",
"| Itel| EG| sp|[[click, 15358391...|196.141.135.133| A32F|searchturbo| m|\n",
"| Itel| NG| sp|[[click, 15358391...| 197.210.226.58| P32|searchturbo| m|\n",
"| Itel| IN| sp|[[click, 15358391...| 157.48.123.237| A22|searchturbo| m|\n",
"| Itel| EG| sp|[[click, 15358391...| 105.199.93.33| A32F|searchturbo| m|\n",
"| Itel| EG| sp|[[click, 15358391...|196.141.135.133| A32F|searchturbo| m|\n",
"| Itel| MA| sp|[[click, 15358391...| 41.249.147.213| A32F|searchturbo| m|\n",
"| Itel| CI| sp|[[click, 15358391...| 154.0.26.115| P32| Unknown| m|\n",
"| Itel| BJ| sp|[[click, 15358391...|197.234.221.243| A32F|searchturbo| m|\n",
"| Itel| EG| sp|[[click, 15358391...|196.141.135.133| A32F|searchturbo| m|\n",
"+-----+------------+------+--------------------+---------------+-----+-----------+---+\n",
"\n",
"CPU times: user 0 ns, sys: 0 ns, total: 0 ns\n",
"Wall time: 11.6 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# 查看前10条数据\n",
"\n",
"df.limit(10).show()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 0 ns, sys: 0 ns, total: 0 ns\n",
"Wall time: 6.31 s\n"
]
},
{
"data": {
"text/plain": [
"2075513"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"\n",
"# 查看总共记录数\n",
"\n",
"df.count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 例1. 按品牌机型统计"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"+-----+---------+------+\n",
"|brand| model| count|\n",
"+-----+---------+------+\n",
"| Itel| A52B| 19|\n",
"| Itel| A14| 10136|\n",
"| Itel| S13 Pro| 151|\n",
"| Itel| A16 Plus| 229|\n",
"| Itel| A52| 12812|\n",
"| Itel| A45| 68690|\n",
"| Itel| A22| 69811|\n",
"| Itel| A16| 4210|\n",
"| Itel| S11X| 27366|\n",
"| Itel| A62| 11161|\n",
"|Spice| Z213| 77393|\n",
"| Itel| S11XB| 137|\n",
"| Itel| A15| 11744|\n",
"| Itel| P32|550753|\n",
"| Itel| P13 Plus| 176|\n",
"| Itel|A44 Power| 32|\n",
"| Itel| A32F|537792|\n",
"| Itel|itel A32F| 67001|\n",
"| Itel| A23| 1493|\n",
"| Itel| S13| 19634|\n",
"+-----+---------+------+\n",
"only showing top 20 rows\n",
"\n",
"CPU times: user 8 ms, sys: 0 ns, total: 8 ms\n",
"Wall time: 10.8 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# 按照品牌(brand)和机型(model)进行聚合\n",
"\n",
"brand_model_count = df.select('brand', 'partner', 'model').groupBy('brand','model').count()\n",
"\n",
"# 打印一下\n",
"brand_model_count.show()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4 ms, sys: 8 ms, total: 12 ms\n",
"Wall time: 10.1 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# 换行成pandas\n",
"\n",
"pd_df = brand_model_count.toPandas()\n",
"\n",
"# 查看前5条\n",
"pd_df.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>brand</th>\n",
" <th>model</th>\n",
" <th>count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Itel_S13Pro</th>\n",
" <td>Itel</td>\n",
" <td>S13Pro</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Itel_A52B</th>\n",
" <td>Itel</td>\n",
" <td>A52B</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Itel_A44 Power</th>\n",
" <td>Itel</td>\n",
" <td>A44 Power</td>\n",
" <td>32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Itel_S11XB</th>\n",
" <td>Itel</td>\n",
" <td>S11XB</td>\n",
" <td>137</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Itel_S13 Pro</th>\n",
" <td>Itel</td>\n",
" <td>S13 Pro</td>\n",
" <td>151</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" brand model count\n",
"Itel_S13Pro Itel S13Pro 3\n",
"Itel_A52B Itel A52B 19\n",
"Itel_A44 Power Itel A44 Power 32\n",
"Itel_S11XB Itel S11XB 137\n",
"Itel_S13 Pro Itel S13 Pro 151"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 数据转换,排序处理下\n",
"\n",
"pd_df.index = pd_df['brand'] + '_' + pd_df['model']\n",
"pd_df = pd_df.sort_values(by = ['brand', 'count'])\n",
"\n",
"pd_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Itel_S13Pro</th>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Itel_A52B</th>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Itel_A44 Power</th>\n",
" <td>32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Itel_S11XB</th>\n",
" <td>137</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Itel_S13 Pro</th>\n",
" <td>151</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" count\n",
"Itel_S13Pro 3\n",
"Itel_A52B 19\n",
"Itel_A44 Power 32\n",
"Itel_S11XB 137\n",
"Itel_S13 Pro 151"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 只取count列\n",
"pd_df = pd_df[['count']]\n",
"\n",
"# 查看一下\n",
"pd_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fa5fcf692b0>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 图表显示下\n",
"\n",
"pd_df.plot(kind='bar', figsize=(15, 5))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 例2. 按国家查看访问量"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 8 ms, sys: 0 ns, total: 8 ms\n",
"Wall time: 62.6 ms\n"
]
}
],
"source": [
"%%time\n",
"# 按照country_code 进行聚合\n",
"\n",
"country_code_count = df.select('country_code').groupBy('country_code').count()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4 ms, sys: 0 ns, total: 4 ms\n",
"Wall time: 7.5 s\n"
]
},
{
"data": {
"text/plain": [
"[Row(country_code='DZ', count=1027),\n",
" Row(country_code='LT', count=12),\n",
" Row(country_code='MM', count=18),\n",
" Row(country_code='CI', count=95814),\n",
" Row(country_code='SC', count=8)]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"# 显示前5条数据\n",
"\n",
"country_code_count.limit(5).collect()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>country_code</th>\n",
" <th>count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>DZ</td>\n",
" <td>1027</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>LT</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>MM</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>CI</td>\n",
" <td>95814</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>SC</td>\n",
" <td>8</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" country_code count\n",
"0 DZ 1027\n",
"1 LT 12\n",
"2 MM 18\n",
"3 CI 95814\n",
"4 SC 8"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 转换成pandas\n",
"\n",
"codePandas = country_code_count.toPandas()\n",
"\n",
"codePandas.head()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>country_code</th>\n",
" <th>count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>74</th>\n",
" <td>IN</td>\n",
" <td>440134</td>\n",
" </tr>\n",
" <tr>\n",
" <th>139</th>\n",
" <td>NG</td>\n",
" <td>432983</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58</th>\n",
" <td>Unknown</td>\n",
" <td>309625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>BD</td>\n",
" <td>192363</td>\n",
" </tr>\n",
" <tr>\n",
" <th>146</th>\n",
" <td>VN</td>\n",
" <td>96927</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>CI</td>\n",
" <td>95814</td>\n",
" </tr>\n",
" <tr>\n",
" <th>130</th>\n",
" <td>MA</td>\n",
" <td>69185</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>GH</td>\n",
" <td>49175</td>\n",
" </tr>\n",
" <tr>\n",
" <th>77</th>\n",
" <td>CM</td>\n",
" <td>44962</td>\n",
" </tr>\n",
" <tr>\n",
" <th>115</th>\n",
" <td>SN</td>\n",
" <td>42320</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" country_code count\n",
"74 IN 440134\n",
"139 NG 432983\n",
"58 Unknown 309625\n",
"39 BD 192363\n",
"146 VN 96927\n",
"3 CI 95814\n",
"130 MA 69185\n",
"33 GH 49175\n",
"77 CM 44962\n",
"115 SN 42320"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 按照访问量排序下\n",
"\n",
"codePandas = codePandas.sort_values(by='count', ascending=False)\n",
"\n",
"codePandas.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "550385a639cf43a1824e9ab6bcac42d3",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HTML(value='<embed src=data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTg…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 图表展示下\n",
"\n",
"codes = {}\n",
"for code in codePandas.values[:30]:\n",
" codes[code[0].lower()] = code[1]\n",
" \n",
"import pygal\n",
"from ipywidgets import HTML\n",
"import base64\n",
"worldmap_chart = pygal.maps.world.World()\n",
"worldmap_chart.title = '访问量最多的30个国家'\n",
"worldmap_chart.add('访问量top30', codes)\n",
"b64 = base64.b64encode(worldmap_chart.render())\n",
"src = 'data:image/svg+xml;charset=utf-8;base64,'+b64.decode(\"utf-8\")\n",
"HTML('<embed src={}></embed>'.format(src))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 例3. 每小时访问量走势图"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4 ms, sys: 0 ns, total: 4 ms\n",
"Wall time: 387 ms\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# 增加3个栏位 timestamp, hour, month\n",
"\n",
"df = df.withColumn('timestamp', df.events[0].timestamp)\n",
"df = df.withColumn('hour', from_unixtime(df.events[0].timestamp, 'HH'))\n",
"df = df.withColumn('month', from_unixtime(df.events[0].timestamp, 'yyyy-MM'))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"+-----+------------+------+--------------------+---------------+-----+-----------+---+----------+----+-------+\n",
"|brand|country_code|device| events| ip_address|model| partner|ref| timestamp|hour| month|\n",
"+-----+------------+------+--------------------+---------------+-----+-----------+---+----------+----+-------+\n",
"| Itel| ML| sp|[[click, 15358391...| 217.64.103.74| P13|searchturbo| m|1535839148| 05|2018-09|\n",
"| Itel| EG| sp|[[click, 15358391...|196.141.135.133| A32F|searchturbo| m|1535839156| 05|2018-09|\n",
"| Itel| NG| sp|[[click, 15358391...| 197.210.226.58| P32|searchturbo| m|1535839161| 05|2018-09|\n",
"| Itel| IN| sp|[[click, 15358391...| 157.48.123.237| A22|searchturbo| m|1535839162| 05|2018-09|\n",
"| Itel| EG| sp|[[click, 15358391...| 105.199.93.33| A32F|searchturbo| m|1535839163| 05|2018-09|\n",
"| Itel| EG| sp|[[click, 15358391...|196.141.135.133| A32F|searchturbo| m|1535839164| 05|2018-09|\n",
"| Itel| MA| sp|[[click, 15358391...| 41.249.147.213| A32F|searchturbo| m|1535839167| 05|2018-09|\n",
"| Itel| CI| sp|[[click, 15358391...| 154.0.26.115| P32| Unknown| m|1535839174| 05|2018-09|\n",
"| Itel| BJ| sp|[[click, 15358391...|197.234.221.243| A32F|searchturbo| m|1535839174| 05|2018-09|\n",
"| Itel| EG| sp|[[click, 15358391...|196.141.135.133| A32F|searchturbo| m|1535839175| 05|2018-09|\n",
"+-----+------------+------+--------------------+---------------+-----+-----------+---+----------+----+-------+\n",
"only showing top 10 rows\n",
"\n",
"CPU times: user 4 ms, sys: 0 ns, total: 4 ms\n",
"Wall time: 370 ms\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# 按照小时聚合下\n",
"\n",
"group_by_hour = df.select('hour').groupBy('hour').count()\n",
"df.show(10)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 8 ms, sys: 4 ms, total: 12 ms\n",
"Wall time: 10.4 s\n"
]
}
],
"source": [
"%%time\n",
"# dataframe 转换成padnas\n",
"group_by_hour_pandas_df = group_by_hour.toPandas()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>hour</th>\n",
" <th>count</th>\n",
" </tr>\n",
" <tr>\n",
" <th>hour</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>118156</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>112722</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>85696</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>85365</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>77598</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" hour count\n",
"hour \n",
"0 0 118156\n",
"1 1 112722\n",
"2 2 85696\n",
"3 3 85365\n",
"4 4 77598"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 按照访问量进行排序下\n",
"group_by_hour_pandas_df = group_by_hour_pandas_df.sort_values(by='hour')\n",
"\n",
"# 强制转换整数类型\n",
"group_by_hour_pandas_df.hour = group_by_hour_pandas_df['hour'].map(int)\n",
"\n",
"# 将小时设置pandas索引\n",
"group_by_hour_pandas_df.index = group_by_hour_pandas_df.hour\n",
"\n",
"group_by_hour_pandas_df.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fa5fc0c82e8>"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 画个图表\n",
"hourcount = (group_by_hour_pandas_df.to_dict())['count']\n",
"index = list(range(0,24))\n",
"cols = []\n",
"for i in index:\n",
" if i not in hourcount:\n",
" cols.append(0)\n",
" else:\n",
" cols.append(hourcount[i])\n",
"\n",
"group_by_hour_pandas_df = pd.DataFrame({'num': cols})\n",
"\n",
"\n",
"group_by_hour_pandas_df.plot(title='vas project-access count by hour', kind='line', figsize=(15, 5), xticks=group_by_hour_pandas_df.index)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 例4. 每个月访问量"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 116 ms, sys: 0 ns, total: 116 ms\n",
"Wall time: 10.3 s\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%%time\n",
"group_by_month =df.select('month').groupBy('month').count()\n",
"\n",
"group_by_month_pandas = group_by_month.limit(5).toPandas()\n",
"group_by_month_pandas.index = group_by_month_pandas['month']\n",
"group_by_month_pandas.index.name = 'm';\n",
"group_by_month_pandas = group_by_month_pandas.sort_values(by='month', ascending=True)\n",
"\n",
"## 每月uv\n",
"group_by_month_pandas[['count']].plot(kind='bar', figsize=(15, 5))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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": 2
}