spark for python developer 一书,说实在的,质量一般,但勉强可以作为python 工程师的入门资料,至此,这一时段的地铁译结束了,开始新的阅读旅程……
对于 Python 的图形绘制和可视化, 有大量的工具和库,和我们最相关并且有趣的是:
• Matplotlib 是Python 绘图库的鼻祖. Matplotlib 最初7由 John Hunter 创作, 他是开源软件的支持者,建立的 Matplotlib 是学术界和数据科学界最流行的绘图库之一。 Matplotlib 支持生成线图,直方图,功率谱,饼图,误差图,散点图等等。 从 Matplotlib 网站可以看到大量的例子 http://matplotlib.org/examples/index.html.
• Seaborn, 由 Michael Waskom 开发, 是一个快速可视化统计信息的很棒的库,构建在Matplotlib 之上,无缝集成了 Pandas 和 Python 的数据栈, 包括Numpy. Seaborn 图库 在 http://stanford.edu/~mwaskom/ software/seaborn/examples/index.html 展示了这个库的潜力。
• ggplot 是一个新的库,目标是提供R 生态系统中著名的ggplot2 的等价物,是一本Python 的数据封装。它有着和 ggplot2 相同的外观和感觉,使用了由Hadley Wickham 做详细说明的图语法,,由yhat 团队完成了Python 移植。更多信息参考 http://ggplot.
yhathq.com.
• Bokeh 使用了大量的D3.js 的概念,目标是在大数据集或流式数据集上提供高性能的可交互性,而不需要写一些令人恐惧的 javascript and css 代码. Bokeh 在浏览器上交付了动态可视化,有没有服务器都可以。它无缝集成了
Matplotlib, Seaborn and ggplot ,可以在 IPython notebooks 或者 Jupyter notebooks 中漂亮地渲染. Bokeh 由 Continuum.io 的一个团队开发, 是Anaconda Python数据栈中有机的一部分。
Bokeh server 提供一个成熟的动态绘图引擎,从JSON中实现了反应式场景图。它使用web sockets 保持状态, 通过Backbone.js 和Coffee-script 更新 HTML5 canvas。 Bokeh, 由于从JSON中读取数据, 能容易地绑定例如 R, Scala, and Julia 这样的其他语言。这里给出了 主要的绘图和可视化库的概览,是不详尽的。让我们集中在可视化的例子上面。
数据可视化的预处理
在进入可视化之前,要在所采集的数据上做些准备工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
In [16]: # Read harvested data stored in csv in a Panda DF import pandas as pd csv_in = '/home/an/spark/spark-1.5.0-bin-hadoop2.6/examples/AN_Spark/ data/unq_tweetstxt.csv' pddf_in = pd.read_csv(csv_in, index_col=None, header=0, sep=';', encoding='utf-8') In [20]: print('tweets pandas dataframe - count:', pddf_in.count()) print('tweets pandas dataframe - shape:', pddf_in.shape) print('tweets pandas dataframe - colns:', pddf_in.columns) ('tweets pandas dataframe - count:', Unnamed: 0 7540 id 7540 created_at 7540 user_id 7540 user_name 7538 tweet_text 7540 dtype: int64) ('tweets pandas dataframe - shape:', (7540, 6)) ('tweets pandas dataframe - colns:', Index([u'Unnamed: 0', u'id', u'created_at', u'user_id', u'user_name', u'tweet_text'], dtype='object')) |
为了可视化活动, 使用了一个7,540 tweets的数据集。 关键信息存储在 tweet_text 字段. 先调用head()函数来预览一下存储在dataframe 中的数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
In [21]: pddf_in.head() Out[21]: Unnamed: 0 id created_at user_id user_name tweet_text 0 0 638830426971181057 Tue Sep 01 21:46:57 +0000 2015 3276255125 True Equality ernestsgantt: BeyHiveInFrance: 9_A_6: dreamint... 1 1 638830426727911424 Tue Sep 01 21:46:57 +0000 2015 3276255125 True Equality ernestsgantt: BeyHiveInFrance: PhuketDailyNews... 2 2 638830425402556417 Tue Sep 01 21:46:56 +0000 2015 3276255125 True Equality ernestsgantt: BeyHiveInFrance: 9_A_6: ernestsg... 3 3 638830424563716097 Tue Sep 01 21:46:56 +0000 2015 3276255125 True Equality ernestsgantt: BeyHiveInFrance: PhuketDailyNews... 4 4 638830422256816132 Tue Sep 01 21:46:56 +0000 2015 3276255125 True Equality ernestsgantt: elsahel12: 9_A_6: dreamintention... |
现在创建一下工具函数来清空 tweet 文本并解析twitter 的日期 。首先,导入 Python 正则表达式库 re 和时间库:
1 2 3 |
In [72]: import re import time |
创建一个 regex 字典,将被编译,然后昨晚函数传递:
• RT: 第一个以RT作为主键的 regex 在tweet 文本中寻找以 RT 开头的关键字 :
re.compile(r'^RT')
,
• ALNUM: 第二个以ALNUM 为主键的regex 在tweet文本中寻找包含字母和下划线的@:
re.compile(r'(@[a-zA-Z0-9_]+)')
,
• HASHTAG: 第三个 以HASHTAG 为主键的 regex 在tweet 文本中寻找#符号中的字符:
re.compile(r'(#[wd]+)')
,
• SPACES: 第四个以SPACES 为主键的 regex 寻找tweet 文本中的空格或分行符 :
re.compile(r's+')
,
• URL: 第5个以URL 为主键的 regex 寻找tweet 文本中以https:// or http:// 开头的字符 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
re.compile(r'([https://|http://]?[a-zA-Z\d\/]+[\.]+[a-zA-
Z\d\/\.]+)')
In [24]:
regexp = {"RT": "^RT", "ALNUM": r"(@[a-zA-Z0-9_]+)",
"HASHTAG": r"(#[\w\d]+)", "URL":
r"([https://|http://]?[a-zA-Z\d\/]+[\.]+[a-zA-Z\d\/\.]+)","SPACES":r"\s+"} regexp = dict((key, re.compile(value)) for key, value in regexp.items()) In [25]: regexp Out[25]: {'ALNUM': re.compile(r'(@[a-zA-Z0-9_]+)'), 'HASHTAG': re.compile(r'(#[\w\d]+)'), 'RT': re.compile(r'^RT'), 'SPACES': re.compile(r'\s+'), 'URL': re.compile(r'([https://|http://]?[a-zA-Z\d\/]+[\.]+[a-zA- Z\d\/\.]+)')} |
创建一些工具函数:
1 2 3 4 |
In [77]: def getAttributeRT(tweet): """ see if tweet is a RT """ return re.search(regexp["RT"], tweet.strip()) != None |
然后,提取一个tweet中的用户句柄:
1 2 3 |
def getUserHandles(tweet): """ given a tweet we try and extract all user handles""" return re.findall(regexp["ALNUM"], tweet) |
从一个tweet 中提取所有 hashtags :
1 2 3 |
def getHashtags(tweet): """ return all hashtags""" return re.findall(regexp["HASHTAG"], tweet) |
提取所有的URL 链接:
1 2 3 |
def getURLs(tweet): """ URL : [http://]?[\w\.?/]+""" return re.findall(regexp["URL"], tweet) |
处理tweet 文本中的@符号,这个函数是 接下来wordcloud 的基础 :
1 2 3 4 5 6 |
def getTextNoURLsUsers(tweet): """ return parsed text terms stripped of URLs and User Names in tweet text ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\ S+)"," ",x).split()) """ return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\ w+:\/\/\S+)|(RT)"," ", tweet).lower().split()) |
标注数据后,创建数据集wordcloud分组:
1 2 3 4 5 6 |
def se |