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 这样的其他语言。这里给出了 主要的绘图和可视化库的概览,是不详尽的。让我们集中在可视化的例子上面。
在进入可视化之前,要在所采集的数据上做些准备工作:
12345678910111213141516171819202122 | In [16]:# Read harvested data stored in csv in a Panda DFimport pandas as pdcsv_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 7540id 7540created_at 7540user_id 7540user_name 7538tweet_text 7540dtype: 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 中的数据:
1234567891011121314151617181920 | In [21]:pddf_in.head()Out[21]:Unnamed: 0 id created_at user_id user_name tweet_text0 0 638830426971181057 Tue Sep 01 21:46:57 +0000 20153276255125 True Equality ernestsgantt: BeyHiveInFrance: 9_A_6:dreamint...1 1 638830426727911424 Tue Sep 01 21:46:57 +0000 20153276255125 True Equality ernestsgantt: BeyHiveInFrance:PhuketDailyNews...2 2 638830425402556417 Tue Sep 01 21:46:56 +0000 20153276255125 True Equality ernestsgantt: BeyHiveInFrance: 9_A_6:ernestsg... 3 3 638830424563716097 Tue Sep 01 21:46:56 +0000 20153276255125 True Equality ernestsgantt: BeyHiveInFrance:PhuketDailyNews...4 4 638830422256816132 Tue Sep 01 21:46:56 +0000 20153276255125 True Equality ernestsgantt: elsahel12: 9_A_6:dreamintention... |
现在创建一下工具函数来清空 tweet 文本并解析twitter 的日期 。首先,导入 Python 正则表达式库 re 和时间库:
123 | In [72]:import reimport 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:// 开头的字符 :
1234567891011121314 | 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]:regexpOut[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\\/\\.]+)\’)} |
创建一些工具函数:
1234 | In [77]:def getAttributeRT(tweet): \”\”\” see if tweet is a RT \”\”\” return re.search(regexp[\”RT\”], tweet.strip()) != None |
然后,提取一个tweet中的用户句柄:
123 | def getUserHandles(tweet): \”\”\” given a tweet we try and extract all user handles\”\”\” return re.findall(regexp[\”ALNUM\”], tweet) |
从一个tweet 中提取所有 hashtags :
123 | def getHashtags(tweet): \”\”\” return all hashtags\”\”\” return re.findall(regexp[\”HASHTAG\”], tweet) |
提取所有的URL 链接:
123 | def getURLs(tweet): \”\”\” URL : [http://]?[\\w\\.?/]+\”\”\” return re.findall(regexp[\”URL\”], tweet) |
处理tweet 文本中的@符号,这个函数是 接下来wordcloud 的基础 :
123456 | 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分组:
123456 | def se |
上一篇:一行 Python 代码